2017年11月27日月曜日

Visual Studio Communityのオフライン インストール

仕事柄、自室に有線を引いていない。
メイン回線は旧FREETELの使った分だけプラン。

他方、Visual Studioは以下の通り途方もないデータを要求する。
こんなのを落とした月には、帯域制限間違いなし。


これを回避するため、有線の通信環境で予めインストールデータを保存することに。

1. MSのサイトからインストーラを取得する
vs_community_***.exeという感じの名前になる。
2017/11/27時点だと、vs_community__434634640.1511793803.exeだった。
末尾はバージョンNoっぽいので無視してOK。

2. コマンドプロンプトでオフラインインストールを起動
>> vs_community_***.exe --layout <ディレクトリ>
最後のディレクトリで、保存場所を指定。
20GB以上食うので要注意。


以上。

Arduinoのクロック精度を試す

秋月のI2C接続8x2LCDを使ってみた。

変換基板付きで\600、なしだともっと安い。


写真はLCDのみだが、後でRTCも繋いでみた。
LCDとRTCの制御自体はI2Cの作例がいくつもあるので割愛。
コマンド通りに叩くだけ。

検証したいのは、水晶とセラロックや、基板ごとの周波数精度の違い。
1ヵ月くらいのロギングをやるのに、ATmega+セラロックでOKか、水晶が必要かを見極めたい。
使用予定はLeonardoとUno 3(ATmega単体動作も)とArduino Nanoクローン。
温度ログなのでそこまでずれても痛くないけど、せめて1ヵ月で数分くらいの誤差に収めたいところ。

時間はFlexiTimer2でカウント。
LCD表示器に時計を表示して、電波時計を基準にずれを測定。
目視なので、1秒未満の誤差は防げない。
キッチリやるならRTCを正として差分を蓄積していくべき?

↓↓至ってシンプルなコード。
void setup() {
  Wire.begin();
  init_LCD();
 
  FlexiTimer2::set(1000, timer);
  FlexiTimer2::start();
  pinMode(13, OUTPUT);
}


■結果














何と、正規品のArduino Uno 3が一番ずれずれ。
次いで、Ceralock動作のATmega。
Leonardoが最良なのは不思議ではないけど、Maid in Chinaのコピー品のNanoが大健闘。
たった400円なのに凄い。

MsTimer2にすると、Uno 3もいい結果なのかもしれない。
また、Nano以外はばらつきが小さいのでuSleepを適当に入れれば十分な精度になりそう。

■温度ロガー(Arduino Nano + microSD + RTC)
小さいし安いので、本番はArduino Nanoでロガー作成した。
結局、安いRTCが手に入ったのでArduinoのクロック評価は実は意味なし。
タッパーに入れて、サーバの温度データを外部で保存してみた。
会社だとN/W経由で情報を取れないので、ArduinoでMicroSDに貯めると非常に便利。



## 実験は'17/4~5月にやったが、まとめが延び延びになっていた。
  ブログって、気を抜くとすぐに間が空いてしまいますね。

2017年8月8日火曜日

nano SIMを買って普通サイズのSIMとして使う

■DMMの低速プラン
DMMモバイルと契約した。
Mining向けなので、最低料金\440の200kbpsプラン。
スマホ用にFreetel回線を持っているので、こっちのDMMは自室用。

普通に買うとSIM代だけで\3,000くらいかかるけど、
DMMやFreetelはAmazonで安く買うことができる。
これは送料別で\540だった。
回線開通の初回手数料で\420くらいかかったけど、合計千円以下なので満足。


Wireless GATEやロケモバの神プラン、Freetelの2回線目とも迷ったけど、結果的にいい買い物だったと思う。

Wireless GATEはSIMが入ったAndroid / iPhoneでないと新幹線でWifiが使えないので却下。
パソコンでWifiが使えたら神懸ってるのに・・・。
Freetelは低速モードで\299+税と大変安価で魅力的だけど、1社に絞るリスクは避けたい。
ロケモバは途中で契約容量を増やすことはできても減らせないのがネック。
また、Freetel以外は初期投資も\3,000程度と大きい。

総合的に考えて、容量が自在に変えられ、月額もそこそこ安く、初期投資も抑えられるDMMが最適解と判断。


■nano SIM⇒普通サイズのSIM
さて、今回購入したのはnano SIMだけど、手元で空いている通信端末は懐かしのGS02しかない。
昔emobile時代に活用していた3G専用機だが、こいつは普通サイズのSIMしか使えない。

 作戦1:カードからSIMを切り離さず、普通のSIMサイズで切り取ればOKでは??

やることはシンプルだが、手持ちの道具としてハサミとシャーペンしかない。
定規もどこかに仕舞い込んだまま。
サイズの参考にする普通のSIMもない!!

このままでは通信テストできない・・・。
Miningもできない・・・。




ということで、
 作戦2:トレスして紙に写し取る!!

まず、スマホでnano⇒通常SIMアダプタの正面から見た絵を検索する。
手元のnano SIMとアダプタの写真が同じサイズになるように調節し、
スマホの輝度を最大化してトレース台のようにし、薄い紙の上で線をなぞっていく。
このとき、映し出す画像はなるべく黒っぽいのがよい。よく透けるので。
 紙を置いて透けて見える線をなぞっていく

うまく紙にトレスできたら、紙を切り取る。
次に、実際のnano SIMの部分を紙に写し取った絵と一致させて、SIMの台紙カードに線を引く。 
こんな感じで線が引けた


カードにうまく線が引けたら、思い切りよく切断。
結構いい感じ!左端は細くなるので割らないように注意。


最後はスマホにセットして微調整。
それにしてもGS02とか懐かしすぎだ。
今時3Gって感じだけど、200kbps制限なら無理にLTEにする意味もない。

うまく認識![H]ってなってる。
DMMモバイルはAPN設定も簡単でいいね!




以上、DMMモバイルと、ハサミ・シャーペン・紙だけでできるnano SIMを通常SIMで使う小技について。


17/8/8現在、1日150円くらいマイニングできるので、
1週間もあれば初期投資は回収できる。
毎月3日回せば通信費もOK!
あとはパソコン分をどんどん回収したいな~。



2017年8月6日日曜日

GPU PC組立

久々にPCを組み上げた。
Deeplearningの勉強しつつ、空き時間でMiningするつもり。
Miningは遊びだけど、パーツ代を一部返却できたらいいな~。

前に組んだのはNorthwoodのPentium 4やAthron 64x2の時代だから相当昔だ。
DDR3は触らず仕舞いだ。

自作PCとも呼ぶけど、個人的にはあんまりしっくりこない。
経験してないけど、CバスやISAボードをはんだ付けしていた時代と比べると
ガンプラみたいなものだし。


構成は次の通り
【CPU】Intel Core i7 7700k (Kaby Lake)
【GPU】MSI GeForce GTX 1060 6GB(Short size)
【M/B】Asrock Z270M Extreme 4
【SSD】Crucial CT275MX300 275GB
【MEM】Crucial DDR4-2400 8GB x 2
【CASE】Thermaltake Core V21
【PSU】Seasonic SSR-650RMS (650W 80Plus Gold)
【FAN】Scythe 虎徹 Mark II
【OS】Windows 10 / ubuntu 16.04

ありきたりな構成と思うけど、某掲示板や価格サイトで悪くなさそうなのを選択。
MSIとAsrockは何となく技術が高そうなイメージ。
本当はGTX 1080/1070が欲しかったけど、売り切れ続出で高騰していたので断念。
ケースはネットで書かれている通り、デカイけど組みやすい。相当余裕がある。

パーツの持ち帰りが辛いので、主にTSUKUMOとAmazonから通販。
そこまで最安にこだわらなかったから14万くらいになった。
細かい部分を割り切れるならBTOのほうが早くて安いからオススメかも。


最近のM/Bって秘密の工場みたいでカッコいい。中二心が蘇る。

とにかく作業しやすいケースだった。今までMini-ITXばっか触ってたから余計かも。
安くて頑丈なので、置き場所に困らないならオススメできる。

ちょうどいいサイズのGPU。どれだけ計算が早くなるか楽しみ。


2017年4月22日土曜日

PICkit ICSPの簡単利用

ブレッドボードにICSPの回路を作るのすら面倒な貴方へ。

こうすれば、めちゃくちゃ楽です。
DIPテストクリップに、オス⇔メスのコードを5本繋いで使う。
IC単体、ブレッドボード、本番の回路問わずそのままプログラムできる。


秋月だと28PINか40PINしかないけど、aitendoなら8PINもある。
17/4/22現在で\850。私が秋葉で昔買ったときも\800くらいだったと思う。
 http://www.aitendo.com/product/14967

PICのICSPはだいたい8ピンの範囲に収まっていてありがたい。


フィラメント管で時計を作る(準備編)

昔買ったフィラメント管:IV-9で時計のような数字表示機を作った。
↓完成したものの動画。ケースはレゴで作成。



■フィラメント管IV-9
購入元は秋葉原の真空管屋さん。(サンエイ電機)
今売っているかはわからないけど、1個300円くらいだった。

データシートもネットですぐ見つかる。
 http://www.tube-tester.com/sites/nixie/data/IV-9/iv-9.htm

ニキシー管と違って数Vの低圧で動き、1セグは20mAくらい。
Typの電圧は4.5Vらしいが、アルカリ2本の3Vでも十分光る。
手持ちの4つだと、ピンに限らず3V~5Vの範囲では、消費電流はほとんど変わらなかった。

一般的には共通の1ピンをGNDにし、7セグ相当の3~9ピンと右下のドットの2ピンに正の電圧をかけるらしい。
ダイナミック制御でもうまく光ったが、ネットの作例を見るとスタティックのものが多い。
ロングランでは試していないけど、ダイナミックだとフィラメントにダメージがあるのだろうか?

■PICによるスタティックドライブ
スタティックで点灯させるなら、駆動は1管8個なので4つなら32個必要。
20mA×32個なので最大640mAになる。1管あたりは180mA。
Trをいっぱい並べるのも面倒なので普通は7セグドライバIC(74HC4511)とかTrアレイを使うけど、手持ちで古いPIC(PIC16F648A)が大量に余っていたのでこれを活用する。

このPICは1ピンでぎりぎり20mA出せて、チップ単位で200mAまでOK。
IOもDOがRA0~4, 6, 7とRB0~7の15本がある。
ただし、RA4はオープンドレインなのでDOだと電流吸い込みしかできないので注意。
また、シリアルを使うならRB1:RX, RB2:TXも埋まる。

今回は、アノードコモンとしRA系で7セグを点灯、RB0で2ピンのドットを点灯、baud 9600のUARTで数値を受けることにした。
ネットで作例を探すと、1つのTXから複数のRXを繋いでもうまくいくようだ。

最初の1字でA~Dを送り、管を区別させることにした。
2文字目で表示内容を送る。

2文字ファンクション
0~9数字表示
!全消灯
スペースドット消灯(2ピン)
.ドット表示(2ピン)

例えば「1234.」としたければ、シリアルで以下のコマンドを送る。
 [A1B2C3D4A B C D.]
すべて消灯なら次のコマンド。
 [A!B!C!D!]

■RX並列のテスト
基板を組んでからでは遅いので、RX並列でうまく管の切り分けが可能か確かめる。
上記ファンクションのうち、RB0にLEDを繋いでテストした。

左から順にA, B, C, Dで、[A!B.C.D!]とコマンドを送ると・・・。

結果、問題なく成功。
本当はPICごとに抵抗を繋いだほうがいいかもしれないけど、手抜きでPC側にだけ100Ωを繋いでいる。



あとは、基板を作ってIV-9とPICを繋ぐのみ。

ESP8266でデータロガー(UDP Client)

Switch ScienceのESPr Developperを使えばブレッドボードで即席ロガーが作れる。
左真ん中に繋がっている汚い線が秋月のドア開閉センサで、
左上のICが温度センサのLM61。


ESPr Developperは大事な端子が片側に集まっているので、凝ったことをしなければ小さいブレッドボードで十分。
左側には3.3Vがないので、2つのDiodeで5V⇒4.2V⇒3.4Vを作成。

・ケース入りリードスイッチ
 http://akizukidenshi.com/catalog/g/gP-04025/
・LM61BIZ(4個入りのほうがオススメ)
 http://akizukidenshi.com/catalog/g/gI-09691/

センサデータは、UDPを使ってRasPiで動くRubyのサーバアプリに送信、テキストに直接保存する。


■温度センサ
LM61はリニアな電圧で温度が測れる便利なICで、LM35と違って負電圧にならないので使いやすい。

↓データシートのTyp値。
温度電圧
+100℃+1600mV
+85℃+1450mV
+25℃+850mV
0℃+600mV
-25℃+350mV
-35℃+300mV

式を整理すると、次のようになる。
 <温度>[℃] = (<電圧>[V] - 0.6)×0.1

ESP8266のHTTP Clientと割り込み(Ticker, Timer)でハマる。

ESPr Developer / ESP8266 / ESP-WROOM-02でThingSpeakにデータ送信。
ThingSpeakは15秒の制限があるので、30秒周期でデータを送ることに。

自然な発想でTimerを仕込むが、何故かうまく通信できない。
UDPならうまく行ったのに何故??

参考にしたのは以下のサイト。
 http://www.esp8266.com/viewtopic.php?p=62981

// ソースはこんな感じ
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Ticker.h>
extern "C" {
  #include "user_interface.h"
}

const char* SSID = "<SSID>", PASS= "<PASS>";
Ticker tic1;
void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  IPAddress myIP = WiFi.localIP();
  tic1.attach_ms(30 * 1000, tic1_loop); // 30秒に1回、tic1_loopを実行
}

void sendMessage(String buf) {
  HTTPClient http;
  String url = "http://api.thingspeak.com/update?key=";
  String key = <ThingSpeak API KEY>;
  http.begin(url + key + buf);
  int httpCode = http.GET();
  if(httpCode) {
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);
      if(httpCode == 200) {
          String payload = http.getString();
          Serial.println(payload);
      }
  } else {
      Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
  }
  http.end();
}

void tic1_loop(){
  sendMessage(<センサデータ>);
}
void loop{}


いろいろ試行錯誤して気づいたのだが、HTTPClientも割り込みを使うので割り込みの中では使えない。
検証は以下の通り。
1)sendMessage()を単体で呼ぶ ⇒OK
2)loop内でdelayでsendMessage()を何度も動かす ⇒OK
3)Timer割り込みでsendMessage()を何度も動かす ⇒NG

noInterrupts()なのが問題なのでinterrupts()を明示的に呼び出せばHTTPClientも動くはずだが、今回はシンプルにフラグ処理で逃げることにした。


char flag = 0;void interruptFunc(){
  flag = 1;
}

void loop{
  if(flag){
    sendMessage(<センサデータ>);
    flag = 0;
  }
}

これでOKだった。
ESP8266は1か月以上動かしているけど、元気に温度とドアの開閉を記録してくれている。


2017年2月25日土曜日

無線LANマイコンの決定版 ESP-WROOM-02 / ESP8266(1/2)

遅ればせながら、無線LANマイコンを使ってみた。
ArduinoのIDEで開発できるところが素晴らしい。
簡単に無線LANに接続し、マイコン⇒Raspberry PiへUDPのデータ送信ができた。
こんな強力なデバイスを個人が数百円で買えるなんてすごい時代だ。

本稿では、幾つかハマったところを中心に記録します。

<前半>
①買い物
②基板概要
③ATコマンド実行
④ファームウェア焼き直し

<後半:次記事へ>
⑤Arduino環境構築
⑥UDPクライアント
⑦UDPサーバ(Raspberry Pi+Ruby)

#####################

①買い物
スイッチサイエンスか、秋月でESP8266でググればOK。
自前でピッチ変換やUSB⇔シリアル変換やスイッチ実装できるなら、秋月だと割安。
(狭ピッチのマイコンのみで550円、ピッチ変換実装済で650円くらい)

スイッチサイエンスは秋月よりは高いが、開発ボードが優れている。
オススメは「ESPr Developer」で、必要なスイッチや抵抗やUSB⇔シリアル変換も実装済。
2017/2月時点で2,160円だが、お金や小型実装に拘らないならこれ一択。
少なくともH/Wでは困らないので、時間短縮できる。


②基板概略
・3.3V動作
・IEEE802.11a/b/g対応、技適OK!(日本国内で無線LANが合法利用できる)
・32bitマイコン(非ARM)
・UART/I2C/SPI等対応
・10bit ADC 1ch
・GPIO 9ch

ATコマンドだけで無線接続を構成できるので、親機Arduino+無線機ESP8266という構成も見かける。
これはESPのRAMを書き換えると技適に反する懸念があったためで、今は問題ない事を先人が確認してくれている。
スイッチサイエンス社の当該記事

ESP8266のIOで十分なら、わざわざ外部ボードを繋がなくてもよい。
もしくは、ESP8266を親とし、I2Cで周辺機器を繋げばよい。


③ATコマンド
ESP8266は、通常起動させるとシリアルでATコマンドを受け付けるモードになる。
Arduino IDEで書き込んで単体で動かすなら不要だが、初期不良のチェックも兼ねて一度はATコマンドで無線LANに繋いでおくほうがよい。

不用意にコマンドを打つと、シリアルで繋げなくなるので要注意。
どんな効力を持つコマンドかよく調べてから実行しないと危険。
そのときは④のファーム焼き直しへ。

シリアル設定は以下の通り。
・115200bps (最初のMessageは74800で送ってくるが、無視してよい)
・8bit
・パリティなし
・Stop bit = 1bit
・フロー制御なし

ESPr DeveloperならUSBでそのまま繋げる。
Arduino IDEのシリアルモニタを使うと楽。
うまくいかないときは、電源を指し直すかRESETスイッチを押すとよい。

ATのみもしくはAT+<COMMAND>という形式で制御する。

(1) AT
動作確認用。うまく認識できていれば、OKを返す。

(2) AT+GMR
バージョン確認。
当方の環境では以下の通りだった。
 AT version:1.3.0.0(Jul 14 2016 18:54:01)
 SDK version:2.0.0(656edbf)
 compile time:Jul 19 2016 18:44:22
 OK

(3) AT+CWMODE=1
無線LANのモードをクライアントにする。
これをやらないとAP設定受け付けない。
2にすると、APになる様子。


(4) AT+CWJAP=<SSID>,<PASSWORD>
無線LANのAP設定を書き込む。


(5) AT+CIFSR
今のIP等の設定を確認する。上のCWJAPがうまくできており、接続したAPでDHCPが動いていればIPが表示される。


検証のみなら(1)~(5)で事足りると思う。
他の機能が使いたければ、「ATコマンド」で調べるとよい。


④ファーム焼き直し
ここまでは順調だったが、以下のATコマンドを打ったらシリアルがうまくつながらなくなった。
・AT+UART_DEF=9600,8,1,0,0

以下のサイトを参考にし、ファームを元に戻せば復活した。
http://nemuisan.blog.bai.ne.jp/?eid=215341

ファームの書き込みは、ボードをSPI書き込みモードにする事で実行できる。
ESPr DeveloperならFLASHを押しながらリセットするとSPI書き込みモードになる
書き込みが始まるまではSWを押し続けないといけない。


続きは別投稿とします。


<以下、メモ>
Arduinoを対応させる
http://qiita.com/dz_/items/eb7c80d3caf4a5c84274

Arduino
最新の1.8.1をccから導入
zipがよい
http://arduino.esp8266.com/stable/package_esp8266com_index.json

2017年1月29日日曜日

Raspberry Pi(2)で小型NASを製作

前提
・小型、省電力のNASが欲しい
・FAT32/NTFSでフォーマットした2.5インチHDDかUSBメモリを使いたい
・市販品は高くて柔軟性に欠け、今一つ
⇒Raspberry Piで自作することに

<2015/3時点のメモで、当時Pi3は未発売です>


①Raspberry Pi2購入
・Pi1⇒Pi2でかなりの性能アップ、余程お金に困ってなければ2を推奨
・ケースはAmazonで適当なクリアケースを購入
・OSはdebian系でaptitudeが使えるRaspbianに

②OS設定
・microSD HC 8GB(class 10推奨)に公式のimgを焼き込み
・ユーザpiとrootのpasswd変更
・sudoersのユーザpiのnopasswdを削除、suを許可
・/etc/network/interfacesでIPを固定に

③samba
・sambaをインストール
⇒# aptitude install samba
・/etc/samba/smb.confに以下を追記
## 日本語Windows対応
dos charset = CP932
unix charset = UTF8
display charset = UTF8
default case = lower
case sensitive = no
preserve case = yes
short preserve case = yes

## Windowsからアクセスするディレクトリ
## 書き込みできるよう権限も追加
[Share]
commnet = Pi-NAS
read only = no
locking = yes
path = /mnt/smbrt
guest ok = yes
create mask = 0777
directory mask = 0777
## smb.confは以上
・confを書き終えたらsambaを再起動
# /etc/init.d/samba restart
⇒Windowsからうまく繋いで読み書きできれば成功

④USB接続Diskの設定
少しハマった。
最初に、raspi-configでLocaleを日本語UTF8にしておく。

ディスクは単純にmountすると、raspbianのdefault設定のせいか、
samba経由で読めても書けない設定になってしまう。
mountのオプションを設定して回避する。
起動時に勝手にやってくれるようfstabにも設定しておく。

まずはmountのオプション
# mount /dev/sda1 /mnt/smbrt/disk/ -t vfat -o fmask=0000,dmask=0000,shortname=mixed,codepage=932,iocharset=utf8

最初の-t vfatまでは一般的な設定。
次の-o以降がマウント時のオプション。
まずfmask, dmaskだが、defaultだとmaskが0022になっていて、
所有者(=root)以外は書き込めなく設定されている。
これは困るので0000にしておく。
DOSのファイル名8.3文字ルールと混在が有り得るので、shortnameはmixedにする。
Windowsから日本語で読み書きするので、Shift-JIS(932)とUTF8をそれぞれをcodepageとiocharsetに設定する。
このfmask, dmaskの設定を知らずに随分時間を取られた。

あとは以下の記述を/etc/fstabに書き込めばOK。
(fstabはFile System TAbleの略なんですね。)
これはmountとは書式がちょっと違うけど、やってることは全く同じ。
/dev/sda1       /mnt/smbrt/disk vfat    rw,nofail,rw,noatime,codepage=932,iocharset=utf8,shortname=mixed,fmask=0000,dmask=0000,errors=remount-ro 1 2

以上、これでWindowsやAndroidスマホから読み書きできた

Anaconda Python 3でOpenCV3(WebCAM, 録画)

Windows 10 32/64bitのAnaconda Python 3環境で、OpenCV3(WebCAM, 録画)を使ってみた。

<2017/1/29時点>

前提:Win 10でAnaconda, Python3.5環境

①condaでOpenCV3を導入
 > conda install -c https://conda.binstar.org/menpo opencv3
 -cオプションで、非公式サイトからライブラリ追加できるとの事。

②Python + OpenCVチュートリアルを参考に、動かしてみる
 http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html

 簡潔にまとめられており、前提の環境ならコピペで一発で動く。
 Web Cameraの表示や録画が簡単に動かせる。

 一つ注意なのは、動画の向き。
 以下をそのままにすると、画像が回転したまま保存される。
 frame = cv2.flip(frame,0)

 左右反転させるときは、以下のやり方もOK。
 frame = frame[:,::-1]