2015年12月11日金曜日

KiCad 4.0.1 (bzr6195)

KiCadが立て続けに更新されてます。

KiCad 4.0.1をbuildしたイメージをここにおいておきます。

標準のbuildとは下記の点が異なっています。
- TrackPad/MagicMouseの動作をMacの標準的な動作に変更しています
- Library/Application Support/kicad/internat/ja/のリソースを読むように修正しています
- fontが日本語対応になっています
変更分のpatchはこれです。

イメージをダウンロードして開くとkicadアプリケーションとkicadディレクトリがあります。
kicad.appは/Applications
kicadは/Library/Application\ Support
にそれぞれコピーします。(finderで開いた時の矢印のとおりにDrag&Dropして下さい)

最初の1回めは開発元が未確認のため開けませんと言われてしまうので、/Applicationフォルダを開いてKiCadを右クリックし「開く」を選択して、ダイアログボックスの「開く」を選択すると起動します。

詳細とbuildの手順はRC2.0の時に書いたのでこちらを参照して下さい。

2015年12月8日火曜日

KiCad4.0.0 (bzr6194)

KiCad4.0 stable releaseが出ました。
buildしたのでイメージをここに置いておきます。


標準のbuildとは下記の点が異なっています。
- TrackPad/MagicMouseの動作をMacの標準的な動作に変更しています
- Library/Application Support/kicad/internat/ja/のリソースを読むように修正しています
- fontが日本語対応になっています

イメージをダウンロードして開くとkicadアプリケーションとkicadディレクトリがあります。
kicad.appは/Applications
kicadは/Library/Application\ Support
にそれぞれコピーします。(finderで開いた時の矢印のとおりにDrag&Dropして下さい)

最初の1回めは開発元が未確認のため開けませんと言われてしまうので、/Applicationフォルダを開いてKiCadを右クリックし「開く」を選択して、ダイアログボックスの「開く」を選択すると起動します。

詳細とbuildの手順はRC2.0の時に書いたのでこちらを参照して下さい。

一つだけ、buildするのに引っかかった点を書いておきます。
brewでboostをいれているとpcbnewを起動した時にExceptionで落ちてしまうようです。
自分でbuildする場合はbuildする前にbrew uninstall boostでuninstallしておいて下さい。

2015年11月27日金曜日

スマートロック

ちょっと頼まれて普通の鍵の玄関を電気錠化して遠隔制御を出来るようにしてみました。
自宅は建てた時から電気錠だったのでHA端子接続で簡単につなげられていたため、これまで普通の鍵を置き換える検討をしてませんでした。

今回鍵の電気錠化の部分は㈱ユーシン・ショウワのリ・ボーンIIを使います。




最初はAkerunとかQrioSmartLockとかも検討したのですが、どちらもBluetooth接続で暗号化されているのと鍵という性質上セキュリティが厳しくHack出来ないと考え別のものを探してみました。
リ・ボーンIIは玄関のサムターン部分を外して代わりにつけるタイプで、AkerunやQrioSmartLockと比べて面倒ですが、リモコンキーで制御なのでリモコンキーのボタンを制御できればどうとでもなるはずと考えて、とりあえず入手して検討します。

蓋をあけるとDIP-SWがあります。
今回はAutoLockはこちらで制御するので単純にopen/closeのリモコンでの制御通りに動くモードに設定します。




まず、リモコンキーをバラして確認していきます。



CR2032電池なので公証3Vですが回路は電池の初期電圧とかも当然対応しているので3.3Vでも大丈夫でしょう。



open/closeのpush-swがあって、片方の端子がGNDにつながっています。もう片方がpull-upされているようで、sw-offで3V,sw-onでGNDになります。
なので、ここをコントロールすれば鍵を制御できます。

改造に邪魔なので電池ホルダーをはずして、制御モジュールのコネクタと配線を繋いでいきます。
電源の3.3V,GNDの線とFET-SWの線をopen,closeのpush-swのpull-up側に接続します。
これで鍵自体は制御できました。


これにドアが開いているかを検知するセンサーと内側からドアを開けたい場合に押すスイッチを追加して完成です。




2015年11月20日金曜日

車のバッテリーチェック

以前、車の室内灯を点けっぱなしで一週間おいてしまいバッテリーが上がってしまったことがありました。
室内灯のスイッチがPush-Pushのスイッチなので頭があたったか何かで点いてしまったのかもしれません。
そのときは近所の人にブースターケーブルで繋いでもらい暫く走ってなんとか復活したのですが、なんとかしないとまたやりそうなので対策を作ってみました。
回路は簡単でバッテリーの12VをDC-DCコンバータで3.3Vに落としてXBeeの電源とし、同じ12Vを33Kと2Kで分圧してXBeeのADCに入れています。
DC-DCを使ったのは12Vから3.3Vにレギュレータで落とすとちょと損失が大きくなるためです。
実測するとXBeeの送信時に10mA程度、sleep時には0.1mA程度で30秒に1回500ms程度通信するので問題なさそうです。
サーバーのほうはXBeeが送ってくる電圧が12Vを切ったらメールするように設定したのでバッテリーが上る前に気がつけると思います。

FRISKケースに入れて

 車の中のバッテリー電源に接続します。

金属部品だらけなので電波が飛ぶか心配でしたが家のすぐ前なので大丈夫でした。


2015年11月14日土曜日

KiCad4.0RC2

KiCad4.0RC2が出ました。
buildしたのでイメージをKiCad4.0RC2.dmgに置いておきます。

標準のbuildとは下記の点が異なっています。
- TrackPad/MagicMouseの動作をMacの標準的な動作に変更しています
- /Library/Application Support/kicad/internatが読まれてないので検索パスを追加しています
- fontを日本語対応のものに差し替えています

イメージをダウンロードして開くとkicadアプリケーションとkicadディレクトリがあります。
kicad.appは/Applications
kicadは/Library/Application\ Support
にそれぞれコピーします。
(finderで開いた時の矢印のとおりにDrag&Dropして下さい)

最初の1回めは開発元が未確認のため開けませんと言われてしまうので、/Applicationフォルダを開いてKiCadを右クリックし「開く」を選択して、ダイアログボックスの「開く」を選択すると起動します。

変更の詳細とbuildの手順を以下のとおりです。
今回はKiCadのbuildよりもOS X El Capitanに入れ替えた影響で色々とはまってしまいました。

変更内容はRC1の時にも書きましたが、もう一度書いておきます。

build済みはNightlyBuildがhttp://downloads.kicad-pcb.org/osx/にありますが、TrackPad/MagicMouseの使い勝手がMacの標準的な使い方とあっていません。
具体的にはTrackPadならピンチで拡大・縮小、2本指の操作で指を動かす方向にスクロール、MagicMaouseなら1本指で指を動かした方向にスクロールというのが標準的な使い方かと思います。(人によっては異論があるかもしれませんが、私はこれに慣れてしまっています)
NightlyBuildの方はTrackPadのピンチは効かず、2本指の操作で拡大/縮小、MagicMouseの1本指の操作も拡大/縮小になっています。
これはWindowsマウスのホイール動作に拡大/縮小が割り当てられているためと思われますが、クリック感があり上下にしか動かないホイールの動作とTrackPad/MagicMouseの360°操作では使い勝手が大きく違って、何をするにも画面が大きく拡大/縮小されてしまって使い物になりません。
仕方がないので自分でbuildします。

幸いなことに、この件に関するpatchがKiCadの中に既に含まれていて必要なpatchを当ててbuildしてくれるscriptが用意されています。
以前~gcorral/kicad/osx-trackpad-gesturesというbranchで進んでいたOSXのtrackpad対応が入っているようです。
これでbuildしてみて実行してみましたが、どうも以前のようにうまく行きません。
TrackPadのピンチで拡大/縮小が出来るようになっているのですが、2本指での操作でも拡大/縮小になってしまいます。MagicMouseの方も同様です。
osx-trackpad-gesturesと4.0のツリーを比較してみると関係ありそうな所が数箇所あったので修正してみました。
後々の為にpatchにしておきます。(あとでbuildの詳細でやり方を説明します)
これでbuildすると、当初の目論見どおり2本指の操作でスクロール、MagicMouseでもスクロールに出来ました。
さらに基板に日本語でシルクを入れられるように日本語フォント対応も追加します。
Windows環境が必要ですが、ここの手順どおりで日本語フォントを含んだnewstroke_font.cppを作成出来ます。
 http://wiki.kicad.jp/日本語フォントのマージ手順

ここまででひと通り準備が整ったので、以下buildの詳細手順です。

最初に面倒くさいところからやっていきます。
1.brewの対応のための/usr/local/の作成(これは既にbrewをinstallされてれば存在しているので不要です)
2.boostのbuildの対応のために/usr/libにsymbolic-linkを貼ります
こちらは/usr/libに幾つかdylibが存在しないためエラーになるための対応です。

El Capitanの場合、通常は/usr以下はroot権限でも書込みできません。
そのため以下の手順で一旦書き込みできる状態にして、変更後に書き込みできない状態に戻します。

⌘-Rを押しながら再起動してリカバリーモードに入ります。
ユーティリティのTerminalを起動し
# csrutil disable
を設定し再起動
# sudo ln -s /Applications/Xcode.app/Contents/Developer/usr/lib/*.dylib /usr/lib
でsymbolic linkを作成
もし/usr/local/を作ってない場合は作成します。
# sudo mkdir /usr/local
# sudo chown $(whoami):admin /usr/local
一応セキュリティリスクを減らすためにrootlessをenableに戻します。
再度⌘-Rを押しながら再起動し
Terminalで
# csrutil enable
にもどして再起動

以下はXcodeとCommandLineTools、brewが入っている前提で書きますので無い場合は入れて下さい。

まずはbrewを最新の状態にして必要な物をinstallします。
# brew update
# brew upgrade
# brew install cmake bzr glew cairo swig openssl

bzrに自分の名前とメールアドレスを設定します。
# bzr whoami '自分の名前 <name@example.net>'

適当なところにKiCad build用のdirectoryを掘ります。
# mkdir KiCad4.0
# cd KiCad4.0

KiCad 4.0のソースコード入手
# bzr branch lp:kicad/4.0

wxPythonソースコード入手
http://www.wxpython.org/download.php#source
から下の方にあるwxPython-srcのlinkをたどってtar-ballを取得し先ほどのdirectoryに移動し展開します。ブラウザで辿ってもいいですが下記で取得できます。
# curl -O http://jaist.dl.sourceforge.net/project/wxpython/wxPython/3.0.2.0/wxPython-src-3.0.2.0.tar.bz2
# tar xjvf wxPython-src-3.0.2.0.tar.bz2

展開されたdirectory名を変更しておきます。
# mv wxPython-src-3.0.2.0 wx-src

kicad4.0rc2_macosx_patch.tgzをダウンロードして先ほどのdirectoryに移動し展開します。


kicad_macosx_scroll.patch
kicad_macosx_internat.patch
newstroke_font.cpp_j
の3のつのファイルができます。

TrackPad、MagicMouseのスクロール対応とEl Capitan対応
# cd 4.0
# patch -p0 < ../kicad_maxosx_scroll.patch

このpatchで
common/draw_panel.cpp
common/view/wx_view_controls.cpp
scripts/osx_build_wx.sh
の3つのファイルを修正しています。

/Library/Application Support/kicad/internatのパスを検索していないようなので修正
# patch -p0 < ../kicad_macosx_internat.patch

このpatchで
common/pgm_base.cpp
のファイルを修正しています。

日本語フォント対応
# cp ../newstroke_font.cpp_j common/newstroke_font.cpp

更になぜか私の環境ではbzr-svnで/Library/Python/2.6/site-packages/subvertpy/client.soを呼び出しているところでrpathが設定されておらず下のようなエラーが発生します。

bzr: ERROR: Unable to import library "subvertpy": bzr-svn: Unable to load subvertpy extensions: dlopen(/Library/Python/2.6/site-packages/subvertpy/client.so, 2): Library not loaded: @rpath/lib/libsvn_diff-1.0.dylib
  Referenced from: /usr/lib/libsvn_client-1.0.dylib
  Reason: image not found

これは私の環境だけかもしれないのでエラーが出たら以下の対処をして下さい。
/Library/Python/2.6/site-packages/subvertpy/client.soに細工をします。
# cd /Library/Python/2.6/site-packages/subvertpy
戻せるようにbackupをとって
# sudo cp client.so client.so_org
client.soにrpathを/usrとして追加
# sudo install_name_tool -add_rpath /usr client.so
これでbzr-svnのエラーが出なくなります。

次にwxPythonのbuildです。結構時間がかかります。
# sh scripts/osx_build_wx.sh ../wx-src ../wx-bin ./ 10.11 -j4
# cd ..

kicad本体のbuild。こちらもかなり時間がかかります。
# mkdir build
# cd buld
# cmake ../4.0 \
      -DCMAKE_C_COMPILER=clang \
      -DCMAKE_CXX_COMPILER=clang++ \
      -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 \
      -DPYTHON_EXECUTABLE=`which python` \
      -DKICAD_SCRIPTING=ON \
      -DKICAD_SCRIPTING_MODULES=ON \
      -DKICAD_SCRIPTING_WXPYTHON=ON \
      -DwxWidgets_CONFIG_EXECUTABLE=../wx-bin/bin/wx-config \
      -DPYTHON_SITE_PACKAGE_PATH=`pwd`/../wx-bin/lib/python2.7/site-packages \
      -DCMAKE_INSTALL_PREFIX=../bin \
      -DUSE_IMAGES_IN_MENUS=ON \
      -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl \
      -DCMAKE_BUILD_TYPE=Release
# make
# make install
# cd ..

次にその他のリソースをNightlyBuildから持ってきて無理やりパッケージし直します。
http://downloads.kicad-pcb.org/osx/のRC2相当はkicad-r6303なのでこれをダウンロードしてマウントします。

# curl -O http://downloads.kicad-pcb.org/osx/kicad-r6303.20151109-045453.dmg

そのままではReadOnlyなのでRW出来るように変換します。

# hdiutil convert kicad-r6303.20151109-045453.dmg -format UDSP -o kicad-r6303.sparseimage
# hdiutil attach kicad-r6303.sparseimage

アプリケーション本体を置き換えるため大文字のKiCadディレクトリを削除します。
# rm -rf /Volumes/KiCad/Kicad
finder上の位置合わせをconsoleからできないのでfinderでbin/KiCad.appを開いているKiCad Volume上のKiCadディレクトリがあったところにコピーします。

フォルダを開いたままの状態でdiskimageをdetachします。
# hdiutil detach /Volumes/KiCad

イメージの未使用領域を開放します。
# hdiutil compact kicad-r6303.sparseimage

最終的なReadOnly圧縮イメージに変換します。
# hdiutil convert kicad-r6303.sparseimage -format UDZO -o KiCad4.0RC2.dmg

このイメージが一番上のほうに置いてあるイメージになります。

2015年11月7日土曜日

KiCad 4.0RC1でESP-WROOM-02用基板作成 その6

次はESP-WROOM-02版です。

RP-3基板





HA-4基板


こちらの基板はXBeeの裏面に書かれているアドレスを読み取れるようにXBeeの下のところに穴を開けてあるのですが、ESP-WROOM-02を載せると丁度放熱用のPadのところが穴に位置してしまってあまりよろしくないかもしれません。

まだ、ESP-WROOM-02をどう使うか悩み中です。ATコマンドのままでうまく使っていくのか、何らかの独自のバイナリのI/Fを定義してAVRと通信させるのか、とか考えてるところです。


2015年10月31日土曜日

KiCad 4.0RC1でESP-WROOM-02用基板作成 その5

基板が上がってきたので部品をマウントしてみます。
まずは従来通りのXBee版です。

RP-3基板
いい感じです。

HA-4基板
こちらもいい感じです。


RP-3基板をRaspberryPi2と組み合わせます。


あれ?

RP-3基板のHA-4基板書き込み用のコネクタがRaspberryPi2のHDMI、Audioコネクタと干渉しています。
CAD上で基板の板端をギリギリで避けたつもりだったのですが、コネクタの出っ張りを考慮するのを忘れてました。
実物確認しなかったためのミスです。
回路動作チェックをしてソフト書いたらもう一度出し直しです.......


2015年10月23日金曜日

KiCad 4.0RC1でESP-WROOM-02用基板作成 その4

日曜日に届きました。



速かったです。注文してから8日です。
10/10(土)の朝に出して10/14(水)の夕方には基板が上がってきてDHLに渡されています。
business day 4-7日となっていたのに土日も動いてくれてるんですね。
そのあと39時間後の10/16(金)の朝には国内についてますが、そこから配達されるまで49時間もかかってます。
実際の配達は佐川急便でした。
深センから成田のほうが成田から東京より近いようですね。

Wednesday, October 14, 2015
1 Shipment picked up SHENZHEN - CHINA             18:50
2 Processed at SHENZHEN - CHINA                      22:59
3 Departed Facility in SHENZHEN                      23:04
4 Clearance event SHENZHEN - CHINA, PEOPLES REPUBLIC 23:18

Thursday, October 15, 2015
5 Customs status updated HONG KONG            00:16
6 Clearance processing complete at SHENZHEN - CHINA  01:19
7 Arrived at Sort Facility HONG KONG                 03:17
8 Processed at HONG KONG                             06:37
9 Clearance processing complete at HONG KONG         06:37
10 Processed at HONG KONG                            19:15
11 Departed Facility in HONG KONG                    22:34

Friday, October 16, 2015
12 Customs status updated TOKYO - JAPAN        03:07
13 Transferred through TOKYO - JAPAN                 08:42
14 Arrived at Sort Facility TOKYO - JAPAN      10:00
15 Clearance event TOKYO - JAPAN                     10:37
16 Processed for clearance at TOKYO - JAPAN          10:37
17 Customs status updated TOKYO - JAPAN        22:42
18 Clearance processing complete at TOKYO - JAPAN    22:56

Saturday, October 17, 2015
19 Processed at TOKYO - JAPAN                        01:21
20 Departed Facility in TOKYO - JAPAN                01:45
21 Arrived at Delivery Facility in TOKYO - JAPAN     08:13
22 Forwarded for delivery TOKYO - JAPAN        09:33

Sunday, October 18, 2015
23 Delivery attempted; recipient not home            10:58
24 Delivered - Signed for by : DLVD BY AGNT          19:31


2015年10月16日金曜日

KiCad 4.0RC1でESP-WROOM-02用基板作成 その3

とくにパターン的におかしくなかったのでElecrowに出してみました。
Elecrowの注文のページは以前はクレジットカードもPayPalのシステム経由だったのでちゃんとしていたけど、今回は直接クレジットカードの番号を入れるように変わってました。
ただ、このページhttpで暗号化されていません。クレジットカードの入力が暗号化されてないのはちょっと不安なのでpaypalにしました。
送料は820gでShenzhen DHLが$20.44、Registerd Air Parcelが$17.02と$3位の差なのでDHLを選択。
片方はpanelize有りなので+1日かな。国慶節の連休明けなので注文が溜まってるから動きが遅そう。
10/10(土)に出したので月曜日から作業し始めてbusiness dayで10日くらいとすると10/26の週に到着ぐらいかな.....と思っていたら10/10の内に
10/10/2015 In production Dear Customer,
We have put your design into production, it will needs about 4-7 business days. Thank you!
Best Regards
Elecrow
と返ってきました。それでも混んでるから7business daysだろうと考えていたのですが10/15(木)の朝に写真付きで出荷の連絡がきました。


この辺がElecrowのいいところですね。深センは時差の関係で10/14(水)です。

DHLのTrackingを確認すると

Wednesday, October 14, 2015
1 Shipment picked up SHENZHEN - CHINA             18:50
2 Processed at SHENZHEN - CHINA                      22:59
3 Departed Facility in SHENZHEN                      23:04
4 Clearance event SHENZHEN - CHINA, PEOPLES REPUBLIC 23:18
Thursday, October 15, 2015
5 Customs status updated HONG KONG            00:16
6 Clearance processing complete at SHENZHEN - CHINA  01:19
7 Arrived at Sort Facility HONG KONG                 03:17
8 Processed at HONG KONG                             06:37
9 Clearance processing complete at HONG KONG         06:37
10 Processed at HONG KONG                            19:15
11 Departed Facility in HONG KONG                    22:34

Friday, October 16, 2015
12 Customs status updated TOKYO - JAPAN              03:07
13 Transferred through TOKYO - JAPAN                 08:42
14 Arrived at Sort Facility TOKYO - JAPAN            10:00
15 Clearance event TOKYO - JAPAN                     10:37
16 Processed for clearance at TOKYO - JAPAN          10:37

この調子だと週末か週明けには到着しそうです。

2015年10月9日金曜日

KiCad 4.0RC1でESP-WROOM-02用基板作成 その2

2つ目の基板を作成してみました。
HA端子、SW制御、赤外線リモコン送信、受信、GPIO、ADC機能の子基板で以前XBee用に設計したものをESP-WROOM-02対応とダイオード、FETが小さすぎてハンダ付けがしにくいのでひとまわり大きいものに変更したり、機能を変更したりしました。

回路図は以下のとおり


出来上がったパターンは以下のとおりです。



KiCADのバグでしょうか?

DRCの未配線は無いので大丈夫だと思うのですが、KiCADのpcbnewをOpenGLモードで見ていると下側のStatusのところの未配線が2になっています。

これが表示設定を標準にすると0になります。


KiCADのBZR5814とかで作った前回のパターンからいじったのでどこかにゴミデータでも残っているのかもしれませんが、よくわかりません。BZR5814で開くとOpenGLモードでも未配線が0になります。
最初から4.0RC1で作成したRP-3基板はOpenGLモードでも未配線0なので、この基板データ固有の問題かもしれません。

急いでも仕方が無いので週末にガーバーの確認をしてから出図しようかと思います。
Elecrowも国慶節明けで混んでそうなので、週明けくらいに出してもあまり変わらないかと。

今回の基板は10cm x 10cmに3枚面つけでV-Cutの予定です。
RP-3基板と今回の基板それぞれ10枚で、まとめると送料が安くなりそうです。




2015年10月2日金曜日

KiCad 4.0RC1でRaspberryPi2用のESP-WROOM-02用基板作成

KiCad 4.0RC1をせっかくbuildしたのでESP-WROOM-02用の基板を作成してみました。
RaspberryPi2用の基板ですがHAT規格ではありません。合わせられる所はHAT規格に合わせてますが、ACアダプタ用のコネクタを後ろ側から出すため基板外形を変更しています。
ケースは以前作成したRP-2基板用のものを流用する予定です。

回路は色々と余計なものがついていますが、基本的にはRaspberryPi2の電源をUSB-miniからではなくACアダプタ用のコネクタを背面側に出すための回路と、XBeeモジュール・ESP-WROOM-02のいずれか経由で子機と接続するための回路、RaspberryPi2に赤外線リモコンの送受信機能を追加するための回路、子機として使う時のためのAVRマイコン回路で必要に応じてマウント部品を変更して使うようにしています。

回路図は以下のとおり






で出来上がったパターンが以下のとおりです。


SWITCH-SCHIENCEがSeedStudioのPCB作成サービスの取り扱いを始めたのでこちらでお願いするか、以前出したElecrowに出すか、どちらが安いのか比較してみます。
今回は10cm x 10cm x 1.0mm panelizeなし、黒レジスト、10枚です。

SWITCH-SCHIENCEの場合
 Greenレジスト 10cmX10cm基板で3074円
 それ以外のレジスト 10cmX10cm基板で5882円
 +パブリックベータ期間なら送料324円、通常は1080円
で緑レジストの最安なら3398円
黒レジストにすると6206円

Elecrowの場合
 Greenレジスト 10cmX10cm基板$14
 それ以外のレジスト 10cmX10cm基板$15.9
 + 送料(Registerd Airmaailで$10.37,DHLで$16.37)
で緑レジストの最安で$24.37 = 2924円 ($1=120円換算)
黒レジストにすると$26.27 = 3152円
DHLにすると+720円

価格は緑レジストにすればいい勝負ですが他の色の場合はElecrowの方が半額近いですね。
納期はSWITCH-SCHIENCEは14-21日、ElecrowはこれまでDHLでの経験では1回目14日、2回目v-cutありでも14日だったので、こちらもそれほどの違いはなさそう。
ということで今回は黒色にしたいのでElecrowでRegisterd Airmailを試してみます。
.........
ところが、注文しようとしたらElecrowは国慶節で10/7までお休みでした。
別に急いでないので、もう1つの基板も描いてまとめて注文しようかと思います。

2015年9月25日金曜日

angular.jsとonsenUI

node.js、express、mongoDBときているので次はangular.jsです。
UIはどうしようかと思ったのですが、angular.jsと相性が良さそうで日本語で情報が豊富なonsenUIにしてみました。
ちょっとまだソースコードがグチャグチャなのでもう少し整理してから後ほどGitにでもあげようと思います。
まだ、どの処理をサーバーのnode.js側で処理してどの処理をクライアントのangular.js側で処理するのがいいのかを悩み中です。
最初はほとんどの処理をangular.js側に持っていったのですが、mongoDBから読みだしたデータを大量に送った場合にかなり動作が重たくなることがわかったので、ある程度サーバーサイドで処理して扱いやすい形に変換してからクライアントサイドでUIに表示する形にしたほうがいいようです。
サーバーを動かしているさくらVPSのx86仮想サーバーとiPhone5sのARM系64bitCPUではやはりパフォーマンスが違いますね。


2015年9月18日金曜日

KiCad4.0 RC1(bzr6188) for OS-X

KiCad4.0 RC1が出ましたね。
早速試してみます。
build済みはNightlyBuildが
http://downloads.kicad-pcb.org/osx/
にありますが、TrackPad/MagicMouseの使い勝手がMacの標準的な使い方とあっていません。
具体的にはTrackPadならピンチで拡大・縮小、2本指の操作で指を動かす方向にスクロール、MagicMaouseなら1本指で指を動かした方向にスクロールというのが標準的な使い方ではないかと思います。(人によっては異論があるかもしれませんが、私はこれに慣れてしまっています)
NightlyBuildの方はTrackPadのピンチは効かず、2本指の操作で拡大/縮小、MagicMouseの1本指の操作も拡大/縮小になっています。
これはWindowsマウスのホイール動作に拡大/縮小が割り当てられているためと思われますが、クリック感があり上下にしか動かないホイールの動作とTrackPad/MagicMouseの360°操作では使い勝手が大きく違って、何をするにも画面が大きく拡大/縮小されてしまって使い物になりません。

仕方がないので自分でbuildします。
幸いなことに、この件に関するpatchがKiCadの中に既に含まれていて必要なpatchを当ててbuildしてくれるscriptが用意されています。
以前~gcorral/kicad/osx-trackpad-gesturesというbranchで進んでいたOSXのtrackpad対応が入っているようです。

これでbuildしてみて実行してみましたが、どうも以前のようにうまく行きません。
TrackPadのピンチで拡大/縮小が出来るようになっているのですが、2本指での操作でも拡大/縮小になってしまいます。MagicMouseの方も同様です。

osx-trackpad-gesturesと4.0のツリーを比較してみると関係ありそうな所が数箇所あったので修正してみました。
後々の為にpatchにしておきます。(あとでbuildの詳細でやり方を説明します)
これでbuildすると、当初の目論見どおり2本指の操作でスクロール、MagicMouseでもスクロールに出来ました。
さらに基板に日本語でシルクを入れられるように日本語フォント対応も追加します。
Windows環境が必要ですが、ここの手順どおりで日本語フォントを含んだnewstroke_font.cppを作成出来ます。
 http://wiki.kicad.jp/日本語フォントのマージ手順

ここまででひと通り準備が整ったので、以下buildの詳細手順です。
build方法は以下のページを参考にさせていただきました。
http://ochaochaocha3.hateblo.jp/entry/2015/01/05/installing-kicad-on-mac-os-x
ほぼ同じ手順ですが、patchに対応が入っていたりするので順番に記述します。

XcodeとCommandLineTools、brewが入っている前提で書きますので、ない場合は入れておいて下さい。

まずはbrewを最新の状態にして必要な物をinstallします。
# brew update
# brew install cmake bzr glew cairo swig

bzrに自分の名前とメールアドレスを設定します。
# bzr whoami '自分の名前 <name@example.net>'

適当なところにKiCad build用のdirectoryを掘ります。
# mkdir KiCad4.0
# cd KiCad4.0

KiCad 4.0のソースコード入手
# bzr branch lp:kicad/4.0

wxPythonソースコード入手
http://www.wxpython.org/download.php#source
から下の方にあるwxPython-srcのlinkをたどってtar-ballを取得し先ほどのdirectoryに移動し展開します。
# tar xjvf wxPython-src-3.0.2.0.tar.bz2

展開されたdirectory名を変更しておきます。
# mv wxPython-src-3.0.2.0 wx-src

以下のファイルをダウンロードして先ほどのdirectoryに移動し展開します。
kicad4.0_osx_patch.tgz

kicad_macosx_scroll.patch
newstroke_font.cpp
の2つのファイルができます。

TrackPad、MagicMouseのスクロール対応とyosemite対応
# cd 4.0
# patch -p0 < ../kicad_maxosx_scroll.patch

このpatchで
4.0/common/draw_panel.cpp
4.0/common/view/wx_view_controls.cpp
4.0/scripts/osx_build_wx.sh
の3つのファイルを修正しています。

日本語フォント対応
# cp ../newstroke_font.cpp common/newstroke_font.cpp

boost対応
/usr/libに幾つかdylibが存在しないためエラーになる
# sudo ln -s /Applications/Xcode.app/Contents/Developer/usr/lib/*.dylib /usr/lib
でsymbolic linkを作成

El Capitanではrootでも/usr/libに書き込み出来ないのでrootless対応が必要になるようです。

wxPythonのbuild 結構時間がかかります。
# sh scripts/osx_build_wx.sh ../wx-src ../wx-bin ./ 10.10 -j4
# cd ..

kicad本体のbuild こちらもかなり時間がかかります。
# mkdir build
# cd buld
# cmake ../4.0 \
      -DCMAKE_C_COMPILER=clang \
      -DCMAKE_CXX_COMPILER=clang++ \
      -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \
      -DPYTHON_EXECUTABLE=`which python` \
      -DKICAD_SCRIPTING=ON \
      -DKICAD_SCRIPTING_MODULES=ON \
      -DKICAD_SCRIPTING_WXPYTHON=ON \
      -DwxWidgets_CONFIG_EXECUTABLE=../wx-bin/bin/wx-config \
      -DPYTHON_SITE_PACKAGE_PATH=`pwd`/../wx-bin/lib/python2.7/site-packages \
      -DCMAKE_INSTALL_PREFIX=../bin \
      -DUSE_IMAGES_IN_MENUS=ON \
      -DCMAKE_BUILD_TYPE=Release
# make
# make install
# cd ..

ここまででKiCad4.0/bin/にkicadの本体が出来上がります。

次にライブラリなど/Library/Application\ Support/kicad/に配置するものを集めます。
まず集める為のdirectoryを準備します。

# mkdir -p release/kicad

NightlyBuildをみるとkicad以下には下記のdirectoryがあります。
kicad/demos
kicad/help
kicad/internat
kicad/library
kicad/packages3d
kicad/template
ただしkicad/internatはkicad/share/intarnatに置かないと効果がないようです。

kicadをbuildするとbinに出来ているkicad.appとdemosをコピーします。
# cp -pr bin/kicad.app release
# cp -pr bin/demos release/kicad

次にlibrary, packages3d, templateを取得します。
# git clone https://github.com/KiCad/kicad-library.git
# cp -pr kicad-library/library release/kicad
# cp -pr kicad-library/modules/packages3d release/kicad
# cp -pr kicad-library/template release/kicad

次はhelp,internatを取得します。
公式repoはbzr branch lp:~kicad-developers/kicad/docなのですがgitの方が速いので非公式repoですがこちらから取得。
# git clone https://github.com/blairbonnett-mirrors/kicad-doc.git
# cp -pr kicad-doc/doc/help release/kicad
# mkdir release/kicad/share
# cp -pr kicad-doc/internat release/kicad/share

helpが古いのでkicad.jpの方々の最新版の翻訳(感謝!)に差し替えます。
# curl http://kicad.jp/translate/CvPcb.pdf -o release/kicad/help/ja/CvPcb.pdf
# curl http://kicad.jp/translate/Eeschema.pdf -o release/kicad/help/ja/Eeschema.pdf
# curl http://kicad.jp/translate/GerbView.pdf -o release/kicad/help/ja/GerbView.pdf
# curl http://kicad.jp/translate/Getting_Started_in_KiCad.pdf -o release/kicad/help/ja/Getting_Started_in_KiCad.pdf
# curl http://kicad.jp/translate/IDF_Exporter.pdf -o release/kicad/help/ja/IDF_Exporter.pdf
# curl http://kicad.jp/translate/KiCad.pdf -o release/kicad/help/ja/KiCad.pdf
# curl http://kicad.jp/translate/Pcbnew.pdf -o release/kicad/help/ja/Pcbnew.pdf
# curl http://kicad.jp/translate/Pl_Editor.pdf -o release/kicad/help/ja/Pl_Editor.pdf

これでrelease以下にkicad.appとkicadの2つのdirectoryが出来上がりました。
ここまでのreleaseをKiCad4.0RC1にrenameしたものを下記に置いておきます。

KiCad4.0RC1.zip

上のファイルを展開して
kicad.appは/Applications
kicadは/Library/Application\ Support
にそれぞれ移動します。

上記からダウンロードした場合、最初の1回めは開発元が未確認のため開けませんと言われてしまうので /Applicationフォルダを開いてKiCadを右クリックし「開く」を選択してダイアログボックスの「開く」を選択すると起動します。
起動するとタイトルバーにKiCad (2015-09-12 BR6188) .....と出ていれば正しく開けていると思います。
/Library/Application\ Support/kicad/demoに幾つかサンプルが入っているのでkicadから開いてみてください。

まだRC1なのでお試し用であることを踏まえて使ってください。

2015年9月11日金曜日

UIの設定ファイル


node.jsのサーバーとmongoDBでサーバーサイドまで繋がったので、その先のクライアントサイドの実現方法を考えていきます。
UIをHTMLでベタに書いていくのはありえないのでUI定義ファイルを設計します。
まず最初にどんなUIにするのか仮決めします。一度パスが通るところまで作ってしまってから気に入らなければ修正する方針で行きます。
初めてなので色々と想定できていない事があると思うので、とりあえず一度作ってみるのが手っ取り早いですよね。

ざっと要件を考えます。
・全体のステータスを表示するメインページ
 ・部屋ごとにまとめて表示
 ・制御できるものに関しては選択すると制御用のボタンが出てくる
  ・TVはon/off/volume+/volume-/選局のボタン
  ・エアコンはモード切り替え/温度選択/offのボタン
・温湿度のグラフページ
 ・3日分くらい表示
・ログの確認ページ
 ・状態の変化、コマンドの記録
・デバイスの動作状況の確認ページ
 ・各コントロールモジュールの電源電圧と動作状況
といったところを表示します。

 最終的に作ったUIのメインページはこのような感じです。

  


UI定義ファイルは最終的にjavascriptで扱うのでJSONで記述します。

最初は部屋を定義します。
この後のItemの定義で使用するroomと表示用のlabelを定義しています。
Itemとは上のUIの1行ごとの部分を指しています。
この定義は上のUIのグレーになっている部分のタイトルなどに使用されます。
  "RoomList": [
    { "room": "all", "label": "全体"},
    { "room": "living", "label": "リビング"},
    { "room": "kitchen", "label": "キッチン"},
    { "room": "bathroom", "label": "浴室"},
    { "room": "bedroom", "label": "寝室"},
    { "room": "studyroom", "label": "書斎"}

  ],

次に各制御対象毎にUI定義をします。全部出しても同じような定義だらけなので代表的なものだけに絞っています。

 "ItemList": [
   { 
     "room": "all",
     "label": "玄関",
     "status": [
       {"label": "玄関錠", "sensor": "entrance_key_stat"}
     ],
     "buttons": [
       {"label": "open", "command": "entrance_key_open"},
       {"label": "close", "command": "entrance_key_close"}
     ]
   },

このItemは上のUIの一番上の方の玄関のラインを定義しています。
最初にroom:でallを指定しているのでUI上は全体の項目の中に配置されています。
次のlabelはこのItemの項目名として表示されているものです。
status arrayの中はCloseと表示されている状態表示の定義です。
この中のlabelはsensorのための表示用ラベルですがここのUIでは使用していません。
後にGraph等の中で必要になるかもしれないので定義しています。未定義の場合はroom.label+item.labelとみなされます。
button arrayの中はこのItemを選択した時に出てくるボタンを定義しています。下が玄関Itemを押すと出てくる制御用のボタンです。

  
labelでボタンに表示する名称、commandに送信するコマンドを定義しています。

次のItemは制御部分が無くstatusが2つあるものの定義です。
  
この例のように同じような種類の情報表示のみの場合に使っています。

  { 
    "room": "all",
    "label": "室内1F/2F",
    "status": [
      {"label": "室内1F温度", "type": "temp", "sensor": "internal_1f_temp"},
      {"label": "室内2F温度", "type": "temp", "sensor": "internal_2f_temp"}
    ]
  },

statusにtypeを設定すると単位をつけたりいくつかのところで特別な処理をしたりします。
今のところtemp,humidity,pir,rainと設定なしの5種類があります。

次はエアコン用のitemです。
  {
    "room": "study room",
    "type": "aircon",
    "label": "エアコン",
    "status": [
     {"type": "temp", "sensor": "studyroom_aircon_temp"},
     {"sensor": "studyroom_aircon_stat"}
    ],
    "commandPrefix": "studyroom_aircon_", 
    "buttons": [
     {"label": "off", "command": "off"}
    ]
  },
typeでairconであることを指定しています。これはモード切り替え、温度切り替えのために特殊処理があるためairconであることを指定します。 statusは温度とエアコンの状態を表示しています。commandPrefixは送信コマンドの前に追加する文字列を指定していて、この後出てくるAirconListで指定しているコマンドと合わせることで送信するコマンドを決定します。これはエアコン自体のコマンドは同じものだけどコントロールモジュールが違うのでエアコン毎にprefixを付けたい場合に付加します。
buttonsでモード切り替え、温度切り替え、送信ボタン以外のボタンを定義します。ここではOffボタンだけです。
エアコンを選択すると下の状態になります。

  

ここでcoolerの所を上下にスライドするとモードが切り替わります。


  
さらに温度の所を上下にスライドすることで温度設定を変更できます。
このカルーセルの動作の度にリモコンコードが出てしまうと煩わしいので決めた後にsendボタンで送信するようにしています。

カルーセル自体のUI設定はItemListの中ではなく別途AirconListの中で定義しています。

  "AirconList": [
    { "label": "auto", "color": "#404040",
      "command": [
        { "label": "auto", "commandSuffix": "auto" }
      ]},
    { "label": "cooler", "color": "#2586d9",
      "command": [
        { "label": "18", "commandSuffix": "cooler_18" },
       : 途中省略
        { "label": "29", "commandSuffix": "cooler_29" },
        { "label": "30", "commandSuffix": "cooler_30" }
      ]},
    { "label": "heater", "color": "#d93625",
      "command": [
        { "label": "18", "commandSuffix": "heater_18" },
       : 途中省略
        { "label": "28", "commandSuffix": "heater_28" },
        { "label": "29", "commandSuffix": "heater_29" }
      ]}
  ],

 最後にTVのitemです。

  {
    "room": "living",
    "type": "tv",
    "label": "TV",
    "commandPrefix": "",
    "buttons": [
      {"label": "on", "command": "tv_on"},
      {"label": "off", "command": "tv_off"},
      {"label": "vol+", "command": "tv_vup"},
      {"label": "vol-", "command": "tv_vdn"}
    ]
  },

typeをtvにしてitemがTV用であることを指定します。
commandPrefixはエアコンの時と同じです。
buttonsにon, off, vol+, vol-を指定しています。
TVの場合はこれらのボタンと選局のカルーセルが現れます。

  

TV局名の所を上下にスライドすることで選局できます。

  
選局後に局名ボタンを押すことでコマンドが送信されます。
TVの選局リストは下記のように定義しています。

 "TVChCommandList": [
    { "label": "NHK", "commandSuffix": "tv_1" },
    { "label": "NHK", "commandSuffix": "tv_2" },
    { "label": "日テレ", "commandSuffix": "tv_4" },
    { "label": "テレビ朝日", "commandSuffix": "tv_5" },
    { "label": "TBS", "commandSuffix": "tv_6" },
    { "label": "テレビ東京", "commandSuffix": "tv_7" },
    { "label": "フジテレビ", "commandSuffix": "tv_8" },
    { "label": "TOKYO MX", "commandSuffix": "tv_9" },
    { "label": "放送大学", "commandSuffix": "tv_12" }
  ]

今回はここまで。




2015年9月4日金曜日

mongoDB/mongoose

自宅のNATの内側から、さくらVPSのnode.js上のサーバーまでsecure websocket serverが開通したので気温や湿度、コマンドのやりとりや各種センサーの情報を記録するデータベースを設定していきます。
MEANスタックというのが流行りのようなので、mongoDBを使ってみることにしました。
node.js上のアクセスはmongooseを使用しています。
素人が書くよりも色々ネット上に書いてくれている情報があるのでインストール方法とかは省略します。
mongooseはSchemaを設定してアクセスするようなので、最初にどういうデータで格納していくかを考えていきます。
まず、定期的に測定する気温や湿度などのセンサー情報と何かスイッチ等をon/offした時などのタイミングで上がってくるイベントの最新情報のみを記録するためのStatusSchemaを考えます。これはLogとは別に最新データを素早くアクセスするために記録します。
情報としては接続先のclientID、センサー名称、センサーの値、更新時のTimeStampです。

var StatusSchema = new mongoose.Schema({
  client: {type:String, required: true},
  sensor: {type:String, required: true},
  value: {type:String, required: true},
  update: {type:Date, default:Date.now}
});
var Status = db.model('status', StatusSchema);

次にデバイスの最新情報を取得して保持しておくためのDeviceInfoSchemaです。
記録する情報は接続先のclientID、デバイス名称、デバイスタイプ、ZigBeeアドレス下位32bit、デバイスの機能情報、バージョン、電源電圧、デバイス状態、更新時のTimeStampです。
var DeviceInfoSchema = new mongoose.Schema({
  client: {type:String, required: true},
  device: {type:String, required: true},
  type: {type:String, required: true},
  addrL: {type:String, required: true},
  func: {type:String, required: true},
  version: {type:String, required: true},
  voltage: {type:String, required: true},
  state: {type:String, required: true},
  update: {type:Date, default:Date.now}
});
var DeviceInfo = db.model('deviceInfo', DeviceInfoSchema);

次は全ての変化の記録を記録していくLogSchemaです。
ここには接続先のclientID、情報のタイプ、データベースを検索する時に情報粒度を落とすためにつける分解能フラグ、更新時のTimeStamp、データ本体です。
データ本体はコマンド、レスポンス、ステータスなどのメッセージobjectです。
var LogSchema = new mongoose.Schema({
  client: {type:String, required: true},
  type: {type:String, required: true},
  fine: {type:Boolean, required: false},
  timeStamp: {type:Date, default:Date.now},
  data: mongoose.Schema.Types.Mixed
});
var Log = db.model('log', LogSchema);

最後にclientごとのUIを定義するためのClientUISchemaです。
これは制御する機器のコマンドとUIの表記を記述したテーブルを記録しています。
var ClientUiSchema = new mongoose.Schema({
  client: {type:String, required: true},
  clientUi: mongoose.Schema.Types.Mixed
});
var ClientUi = db.model('client_ui', ClientUiSchema);

長くなってきたのでUIのテーブルについては次回にします。

2015年8月28日金曜日

node.jsとwebsocket

node.js自体のinstall方法は色々な方が書かれているのでここでは飛ばします。
今回はさくらVPS上でubuntu14.04LTSでサーバーを運用しています。

javascript初心者なので何かとつまらないところで躓いてますが、なんとか通信が動くようになりました。

最初にhttpsで接続し、upgradeでwebsocketに切り替える動作になるので、サーバー認証、クライアント認証はhttps接続時に行います。
最初に躓いたのは、自己認証局の証明書(いわゆるオレオレ証明書です)でMacのSafari(8.0.8)からwebsocketに接続しようとすると接続がハネられてしまうことに気が付かなかったため数日間悩みました。Chromeで接続するとちゃんと接続できたので、Safariの仕様のようです。wiresharkでみてみるとサーバー側からはリクエストが出ていますがSafariからクライアント証明書を送っていないようです。
最終的にはSafariではなくRaspberryPi上の自作プログラムから接続するので、このまま進めます。

最初に必要なモジュールを読み込みます。
var WebSocketServer = require('ws').Server;
var https = require('https');
var fs = require('fs');

後で変更しそうな設定値を記述したconfigファイルを用意して読み込みます。
var config = require('./config');

httpsのセキュリティ条件をoptsで設定します。
  var opts = {
    key: fs.readFileSync(config.keyFile),
    cert: fs.readFileSync(config.certFile),
    ca: fs.readFileSync(config.caFile),
    ciphers: "ALL:!EXP:!ADH:!LOW:!SSLv2:!SSLv3:!DES:!3DES:!RC4",
    honorCipherOrder: true,
    secureProtocol: "TLSv1_2_method",
    requestCert: true,
    rejectUnauthorized: true
  };

クライアント認証をするには最後のrejectUnauthorized:trueが必要です。
これがないとやりとりはするけど認証されてない相手でも通信を許してしまいます。
あとdebug時にwiresharkで暗号通信の中身を確認したい場合はciphers:の先頭のALL:をkRSA:にする必要があります。これをしないと暗号が解けないので中身が見えません。

  // connect from house controller
  var houseControllerServer = https.createServer(opts);
  var wss = new WebSocketServer({server:houseControllerServer});
  var houseControllerConnections = [];

  houseControllerServer.listen(config.houseControllerPort, function() {
    console.log("house controller listing on port %d", config.houseControllerPort);
  });
指定されたportでアクセスが来るのを待ちます。

  wss.on('connection', function (ws) {
    // connectionイベントの処理
    console.log('connect from house controller');
    houseControllerConnections.push(ws); // 接続先を記録しておきます。
  // ここにwebsocket接続時の処理を追加します。

    ws.on('close', function () {
      // closeイベントの処理
      console.log('disconnect from hosue controller');
      // closeする接続先を記録から除いています。
      houseControllerConnections = houseControllerConnections.filter(function (conn, i) {
        return (conn === ws) ? false : true;
      });
     // ここにdisconnect時の処理を追加します。
    });

    ws.on('message', function (message) {
      // mesageイベントの受信処理
      var OU = ws._socket.getPeerCertificate().subject.OU;
      var msg = JSON.parse(message);
      // ここに通信相手からのメッセージの処理を追加します。
      console.log(msg);
    });
  });

  //送信はイベント処理ではないのでfunctionです。
  function sendWebsocket(message) {
    houseControllerConnections.forEach(function (con, i) {
      // 登録されている通信相手にメッセージを送信します。
      con.send(JSON.stringify(message));
    });
  }

以上で接続、終了、受信、送信の処理となります。


2015年8月21日金曜日

websocket

これまでは自宅のNAT内のRaspberryPiのホームコントロールシステムを外からアクセス出来るようにするためにNAT内から外のサーバーに対してTLSでsocketを1本通しておいて、外部サーバーの443portにアクセスしてきたものをclient認証をした後にTLSを逆流させてRaspberryPiのapache2に繋ぐという仕組みを作って運用していました。
これはこれで簡単でいいのですが、apache2をRaspberryPiで運用していたのでどうしても重たくなっていました。
少し世間一般的な解決方法を取り入れようと考えて、色々と最近の流行を調べたりしているのですが、webの世界はフレームワークの標準とかの変化が激しすぎてなかなかついていけません。とりあえず始めないと始まらないので、まずは手始めにサーバーサイドをnode.jsにしてRaspberryPi上のホームコントロールサーバーにwebsocketのプロトコルを話せるような機能を追加してみました。
websocketはwikipediaの説明を読めば大体理解できたので対向のwebsocketサーバーにnode.jsのサンプルプログラムを利用してそのままTLS化して繋いで動作確認をしていきます。
まだ他の部分が安定して動作してないので安定してきたら公開しようかと思います。
最終的にはセンサー、HAコントロール、etcの機能をESP8266を使ったWiFiモジュールで実現し、RaspberryPi2上のホームコントロールサーバーで情報集約してsecure websocketでNAT越しにさくらVPSで借りているサーバー上のnode.jsに接続、そこからiPhone上のWebAppに繋ぐということを実現しようかと考えています。
まだjavascriptを勉強し始めたところなので道のりが長そうですが........

2015年8月14日金曜日

OS-XでESP8266開発環境その2

前回作ったSDKの環境でbuildしていきます。
# cd ~/ESP8266/esp_iot_sdk_v1.2.0
# cp -r examples/at/ .
# cd at
scriptの属性を実行可能に修正
# chmod +x gen_misc.sh
# ./gen_misc.sh
gen_misc.sh version 20150511

Please follow below steps(1-5) to generate specific bin(s):
STEP 1: choose boot version(0=boot_v1.1, 1=boot_v1.2+, 2=none)
enter(0/1/2, default 2):
1 <---最初にfirmware updateで使用したイメージと同じものを選択
boot mode: new

STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin)
enter (0/1/2, default 0):
1 <---ここも最初にfirmware updateで使用したイメージと同じものを選択
generate bin: user1.bin

STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz)
enter (0/1/2/3, default 2):
2 <---defaultを選択
spi speed: 40 MHz

STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)
enter (0/1/2/3, default 0):
0 <---defaultを選択
spi mode: QIO

STEP 5: choose spi size and map
    0= 512KB( 256KB+ 256KB)
    2=1024KB( 512KB+ 512KB)
    3=2048KB( 512KB+ 512KB)
    4=4096KB( 512KB+ 512KB)
    5=2048KB(1024KB+1024KB)
    6=4096KB(1024KB+1024KB)
enter (0/2/3/4/5/6, default 0):
2 <---ここも最初にfirmware updateで使用したイメージと同じものを選択
spi size: 1024KB
spi ota map:  512KB + 512KB


start...

DEPEND: xtensa-lx106-elf-gcc -M -Os -g -O2 -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -DICACHE_FLASH -DAT_UPGRADE_SUPPORT -I include -I ./ -I ../../include/ets -I ../include -I ../../include -I ../../include/eagle user_main.c
xtensa-lx106-elf-gcc -Os -g -O2 -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections  -DICACHE_FLASH -DAT_UPGRADE_SUPPORT   -I include -I ./ -I ../../include/ets -I ../include -I ../../include -I ../../include/eagle  -o .output/eagle/debug/obj/user_main.o -c user_main.c
xtensa-lx106-elf-ar ru .output/eagle/debug/lib/libuser.a .output/eagle/debug/obj/user_main.o 
xtensa-lx106-elf-gcc  -L../lib -nostdlib -T../ld/eagle.app.v6.new.1024.app1.ld -Wl,--no-check-sections -u call_user_start -Wl,-static -Wl,--start-group -lc -lgcc -lhal -lphy -lpp -lnet80211 -llwip -lwpa -lmain -ljson -lupgrade -lsmartconfig user/.output/eagle/debug/lib/libuser.a -lat -Wl,--end-group -o .output/eagle/debug/image/eagle.app.v6.out 

!!!
Support boot_v1.2 and +
Generate user1.1024.new.2.bin successully in folder bin/upgrade.
boot.bin------------>0x00000
user1.1024.new.2.bin--->0x01000
!!!

これで../bin/upgradeに
user1.4096.new.4.S 逆アセンブルコード
user1.4096.new.4.bin 書き込みイメージ
user1.4096.new.4.dump シンボル情報
が出来上がります。

# cd ../bin

基板のIO0のスイッチをUART書き込み側に倒してリセットします。

# esptool.py -p /dev/cu.usbserial-A101JG84 write_flash -fs 32m 0x00000 boot_v1.4\(b1\).bin 0x1000 upgrade/user1.1024.new.2.bin                                   
Connecting...
Erasing flash...
Writing at 0x00000800... (100 %)
Erasing flash...
Writing at 0x00040800... (100 %)

Leaving...

基板のIO0のスイッチを通常モードに戻してリセットします。
# jerm -b 115200 -r rntn /dev/cu.usbserial-A101JG84
を起動してATコマンドでバージョンを確認
AT+GMR
AT version:0.30.0.0(Jul  3 2015 19:35:49)
SDK version:1.2.0
compile time:Jul 25 2015 10:44:06
OK
ちゃんと更新されて動いているようです。

2015年8月7日金曜日

OS-XでESP8266開発環境その1

ともの技術メモさんを参考にArduinoIDE ESP8266の環境をinstallします。
linux版ですが非常にわかりやすく書いてくれています。
OS-Xでもほぼ同じ手順で行けます。

以下はOS-X yosemiteでの環境構築です。

Arduino IDE for ESP8266
のInstalling with Boards Managerに書かれているとおりの手順です。

Aruduino website
からARDUINO 1.6.5のMac OS X 10.7 Lion or newerをdownloadします。
ダウンロードしたzipファイルをダブルクリックして開くとArudiono.appが展開されます。
Arudiono.appをApplicationフォルダにコピーし、ファイルを右クリックで開きます。
メニューバーのArudino->Preferences...を開きます。
Additional Boards Manager URLs:に
    http://arduino.esp8266.com/package_esp8266com_index.json
を設定しOKボタンを押してPreferences...を閉じます。
メニューバーのツール->ボード->Board Manager..を開きます。
一番下にesp8266 by ESP8266 Communiyというものがあるので選択し、Installボタンを押します。
ダウンロードが完了したら閉じて、Aruduinoを終了します。

~/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9/
にxtensa-lx106のツール一式が出来上がっています。
このままでもいいのですが、diretoryが深すぎて使いにくいので
# cp -pr ~/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9 /usr/local/ESP8266
とします。(このへんは好みの問題です)
shellのPATH設定に/usr/local/ESP8266/binを追加します。

次にBRILLIANTSERVICE TECHNICAL BLOGさんを参考にESP8266のSDKとツール等を展開するためのdirectoryを掘ります。
まずは最新firmwareをbuild出来る環境を作って確認していきます。

# mkdir ~/ESP8266
# cd ~/ESP8266
# curl -o esp_iot_sdk_v1.2.0_15_07_03.zip https://raw.githubusercontent.com/esp8266/esp8266-wiki/master/sdk/esp_iot_sdk_v1.2.0_15_07_03.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.7M  100 11.7M    0     0  2088k      0  0:00:05  0:00:05 --:--:-- 2992k
# unzip esp_iot_sdk_v1.2.0_15_07_03.zip
Archive:  esp_iot_sdk_v1.2.0_15_07_03.zip
..............
  inflating: release_note.txt  

buildに必要なincludeファイルを入れます。
# curl -o includes.tgz https://raw.githubusercontent.com/esp8266/esp8266-wiki/master/include.tgz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  956k  100  956k    0     0   316k      0  0:00:03  0:00:03 --:--:--  316k
# cd esp_iot_sdk_v1.2.0
# tar zxvf ../includes.tgz
x include/
..........
x include/wctype.h

libc.a,libhal.aを入れます。
# curl -o lib/libc.a https://raw.githubusercontent.com/esp8266/esp8266-wiki/master/libs/libc.a
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2689k  100 2689k    0     0   854k      0  0:00:03  0:00:03 --:--:--  854k
# curl -o lib/libhal.a https://raw.githubusercontent.com/esp8266/esp8266-wiki/master/libs/libhal.a
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  339k  100  339k    0     0   593k      0 --:--:-- --:--:-- --:--:--  594k

書き込みのためのツールを入れます。
# cd ..
#  git clone https://github.com/themadinventor/esptool esptool-py 
Cloning into 'esptool-py'...
remote: Counting objects: 192, done.
remote: Total 192 (delta 0), reused 0 (delta 0), pack-reused 192
Receiving objects: 100% (192/192), 66.80 KiB | 0 bytes/s, done.
Resolving deltas: 100% (93/93), done.
Checking connectivity... done.
# cd esptool-py 
# python setup.py install
running install
.......
Installing esptool.py script to /usr/local/bin
......
Finished processing dependencies for esptool==0.1.0
# cd ..

ここまででbuild出来る環境が出来上がりました。
次回は実際にbuildして書き込んで確認します。