blog画像が表示されないページは、元画像を間違えて削除してしまっているためです。データが残っていないので、想像力で補ってください。2016/12/29[mbedtls]mpiのビットmbedTLSを使おうとしている。Windowsで動作確認だ。サンプルを見ていると、mbedtls_mpiで大きい数字を取り扱うようだ。34ほう、そう来るか。ビット0は、一番下のビットになるんだ。C/C++[py]PythonのソースをAndroidで動かせないものか→今回はあきらめたpythonでいくつかソースを書いて、テストしている。ネットから情報を取得して加工するとか、コマンドラインからの入力を加工してネットに上げるとか、その手のソースだ。今のところ、pythonはWindowsやLinuxでしか動かしていない。Androidくらいなら動かせないだろうか?と思うではないか。Androidで動くなら、もうちょっとやれることが増えるかもしれない、ということで、環境を調べてみた。思ったよりも、色よい返事(検索結果)がない。私もネイティブの言語で動かすのが筋だとは思っているのだが、とりあえず動けばよい、というレベルの場合、多少不具合があったとしても最初に書いたコードがそのまま使えるのがありがたいのだ。androidとQPython。androidを試してみることにした。android開始記事を見ながらやるものの、なかなか難しい。難しいというか、これを書いている時点ではまだうまくいっていない。Windowsを起動。installなどを実行。Linuxの方はやっていないが、これはMac用なのかな?続けて、pipを使ってcython、virtualenvをインストール。python-for-androidはgitの方を使った(pipのだとrecipesでエラーが出たので)。SDKとNDKがいるようなので、インストールする。WindowsはGUIが使えないので、コマンドラインツールだけをダウンロードし、unzipする。その後は、tools/androidコマンドを使ってSDKをインストールする。blog.tyye.netAPIは19にした。21以上だと、ビルド時にチェックされて使えないようなのだ。環境変数も書いてあるように設定して、p4aを実行。オプションの指定は、こちらをまねした。--bootstrap=sdl2よくわからんが、テンプレートでも作ってくれるんじゃないのか?"planewavessdl2"という名前のサンプルがあるのかと思ったけど、リポジトリを検索しても出てこないし。ダウンロードしてビルドしてくれている。main.pyが無い、と。documentationドキュメント内を検索したら出てきたので、そのファイルを置いた。ここって古いp4aのドキュメントだから、あやしいかも。dxコマンドを実行しようとして、Javaのバージョンがあわないとかなんとか。build-toolsは少し古いものを入れたのだが、どうもbuild-toolsフォルダに新しいのが入っているとそちらが使われるようだ。Overflowアンインストールは、単なる削除でよいらしい。ビルドし直すと、またエラーが。unexpected」といってくる。バージョンの違いで文法が変わったのか?と思ってbuild-toolsをさらに古くしたが、変わらない。場所は、~/.local/share/python-for-android/dists/unnamed_dist_1あたりで作業しているようなのだけど、フォルダ構成がeclipseでやっていたときの構成に似ている。debug"とすると、やはりaaptのエラーで終わった。R.java"というコメントがあるので、その関係だとは思うのだが、ちょっと動かしてみたいというだけでここまで苦労するのは作業的に厳しい気がする。githubじゃなくてpipのpython-for-androidを使うべきなのだろうか。Windowsを使っているというのも不安なところだ。site-hhsこちらを読むと、今わたしが見ていたpython-for-androidはkivyというプラットフォーム関係のようだ。たしかにビルド方法の説明でも「Kivyアプリ」「Webアプリ」「SDL2ベースアプリ」の3種類に分かれていた。そこら辺がわからんとダメなんかなぁ。いうわけで、今回はあきらめた。python2016/12/27[hw]FFC/FPCのコネクタ薄い、ぺなぺなしたケーブルを挟む部品がある。RC-S730やRC-S620/Sだ。これは、ケーブルを差し込むだけのコネクタ。SB1602や、RC-S620/Sの反対側として購入したコネクタ。これは、ケーブルを挿して、部品で押さえ込むようになっている。これは、なんという名前なのだろう?ケーブルの方は、フレキと呼んでいた。フレキシブルケーブルの略だと思うのだが、一般的にはFPC/FFCなどと呼ばれるようだ。Panasonicおそらく、RC-S620/Sなどに挿すタイプのケーブルは、FFCだ。SB1602の裏にある橙色のケーブルは、FPCだ。そのコネクタはどういうものがあるのだろうか?先ほどのページに関連する質問があった。Panasonic図で、図で教えてほしいのだけど。他の人に聞いたら、こちらを教えてもらった。イリソ電子工業株式会社タイプが列挙されているのだが、まずはケーブルとではなく、方向で分類されている。ストレートライトアングル次に、基板にどう取り付けるのか。SMTDIPそして、ケーブルの挿し方。ZIFスライダーロックフリップロックNON-ZIF上記で写真に載せたものは基板と平行になっていたので、ライトアングル。基板の上にハンダ付けしているので、SMT。部品で押さえ込む方がスライダーロックで、RC-S620/Sのように挿すだけなのがNON-ZIFか。ここまでわかれば、部品検索も簡単かと思ったが、それが全然ダメだ。ケーブルのピン数(ポジション数)と、ピンの間隔(ピッチ)。RC-S620/Sは6ピンで、間隔は0.5mmくらいだ。6ピンだと端と端の間が5つで2.5mmくらいだからだ。ストレートでSMTの場合、基板に垂直に取り付けることになるからか、ピンの生え方が1列タイプと2列タイプがあるようだった。きーーー!同じものを探してみようとしたが、形状が微妙に違ったり、色が違ったり。詳細を見ると、写真ではなくカタログPDFを参照してください、などとあり、逆引きするのは難しいと思った。hw2016/12/25[esp8266][rtos]lwIPのSNTPを使うネットを使うと、何かと時間が取得したくなる。時間といえば、NTP。NTPから時間を取ってくるシンプルな手順が、SNTP。SDKでも時間が取得したくなったので、RFC2030を見たり、他の人のまねをしながら実装したものの、どうやらlwIPのSNTPがあるようだった。非同期で時間を取ってくるため、取得できるまではsntp_get_current_timestamp()に0が返ってくるようだった。これは、while()などで待たせればよいだろう。lwIPにtime()も持っているのだが、これを使うとlibcの方と競合してしまうので、やめておいた。(int)t);...NTPサーバにsendto()するのはsntp_init()を呼んだ場合のようだから、定期的に実行するならsntp_close()せずにsntp_init()を呼ぶだけでもよさそうだし、毎回sntp_close()してもよいのではなかろうか。このモジュール自体は、再送などはしてくれるようだが、定期実行はしないように見える。SNTPをsocketでやる部分も作ったので、GISTに置いておこう。Windowsでビルドして動いたので、Linux系だったら動くんじゃなかろうか(bind()のために実行時はsudoせんといかんが)。Nanoを動かしたのだが、mbedのオンラインコンパイラでビルドできるようだった。以前できなかった、というわけではなく、単に私がやったことがないだけだ。実装が少なくてサービスを組み込めることは分かったのだが、もうちょっとmain()と切り離したかったので、サンプルを見ながら置き換えてみた。mbedベースは、BLENano_SimpleControlsだ。API仕様などは見ず、サンプルソースの配置を換えただけだ。Studioのプラグインにできるんじゃないかなぁ、などと想像しているのだが、いかんせん最近はBLEをお仕事でやることがなくなってきたので、このまま放置になるかもしれん。client試作ができた。ESP8266_RTOS_SDK何に時間がかかったかって、IPアドレスの文字列が間違っているということに気付かなくて1時間以上悩んでいたのだ。間違っているとconnect()に失敗するのだけど、即座にエラーが返るんじゃなくて、時間がかかって返ってくるのだ。なんか通信がうまくいっていないんだろうかとか、いろいろな要因を探し回ってしまった。動かしてみたいのであれば、include/con_ap.hを自分のAPに変更し、include/tcp_client.hのIPアドレスとポート番号をTCPサーバのものに変更すればよいだろう。今回も、TCPサーバとしてはWindowsのHerculesを使った。接続できたらメッセージを飛ばすので、後はサーバからsendすると、そのままエコーバックするだけだ。hirokuma/esp8266_rtos_tcp_client受信をrecv()で同期待ちさせることができるのがありがたい。これで、受信待ちタスクと送信タスクを別々にして、受信したら送信タスクに要求を投げる、という、よくあるsocketプログラミングができそうだ。Studioを使う(2016/12/23)ノートPCを買い替え、まだNordicの開発環境を作っていないので、作りながら記録を残しておく。Nanoを使うことにしよう。古いのと新しいのでRAMのサイズが違うようだが、まあ気にしないでおこう。この子であれば、J-Linkなどがなくても、USB経由で焼けるんじゃなかろうか。スイッチサイエンス先に言っておくことになるが、mbed環境は使わない。Studioのコード生成がmbedに対応していないというか、mbed用がないのだ(たぶん)。コード生成はプラグインで、プラグインはJavaScriptで書けばよいから、そのうち誰かが作ってくれるのかもしれないが、まだ時代が追いついていないのだ。5.1以上あれば動くんじゃなかろうか。Studioが自動生成するくらいで、あまり説明しません。説明するものが無いというか、他を読んだ方がよいというか。Studioで作っていく。Nanoに載っているLEDを制御する、ということにしておこう。Studioでやるのが、一番簡単だと思う。残念なのは、Windowsでしか動かないというところだろうか。Studioをダウンロードする。名前、会社名、メールアドレスの入力が必須なのはうっとうしいが、仕方ない。https://www.bluetooth.com/download-developer-studio今日2016/12/23は、DeveloperStudio_1_1_3135_0.exeがダウンロードされた。SIGは無料で入会できるようにはなっているのだが、会社として登録することになる。「NEW」をクリック。UUIDは勝手に決めてくれているので、変更したくなければそのままでよい。今回は「NanoLed」という名前にしておこう。ここのNAMESPACE欄は、Androidアプリを作るときにも使われるので注意しておこう。Profile」とだけ書かれた画面が出てくる。Profileのところを「NanoLed」に変更して、SAVE。変更したけど、しなくてよいのかもしれん。SERVICE」をクリック。service」と長いので、newを削除することにした。これは、後でソースを自動生成するときのファイル名になる。左側にある「+」ボタンをクリック。これはServiceにCharacteristicを追加するボタンだ。今回は、1サービス、1キャラクタリスティック(書込みのみ)を作ってみよう。書込みすると、それに応じてLEDが点いたり消えたりする、という目論見だ。黄色で囲んだところを変更させる。適当に名前を付けて、WRITEをMANDATORYにする。RESPONSEの違いは、結果が返ってくるか来ないかだけの違いなので、今回はどうでもよい。TEXTなどにメモを残しておけばよいだろう。他の画面にも、同じような欄があるから、丁寧にやるときは入力しておくと、人に渡すときに親切だったり、数ヶ月後の自分に親切だったりするかもしれない。これで名前は付いたものの、このCharacteristicが何バイトなのかとか、どういう設定ができるのかが決まってない。これはFIELDを入力していくことになる。FIELDS」をクリックだ。NAMEと、FORMATくらいは入力することになるだろう。ONとOFFの設定ができればよいので、8bitあればよいだろう。名前はonoffにした。入力したら「DONE」をクリック。戻るので、「SAVE」をクリック。これで、サービスの入力が終わった。他の項目もきれいに入力しておくと、レポート出力機能でそれっぽいものをHTMLで出すことができる。気が向いたらやってみるのもよいだろう。ここまでできたら、nRF51822とAndroidのソースの自動生成をさせたいのだが、プラグインがまだ入っていない。SIGからダウンロードしたり、Nordicのサイトからダウンロードしたりする。Website下の方にプラグインの一覧がある。v1.0と、bds_plugin_1.2.2_nRF5_SDK_11.0.0.zipを使う。SDKはv12を使う予定だが、まあ使えるんじゃなかろうか。Androidのプラグインは、解凍するとファイルがべたっと入っているので、Android_Client1.0とでも名前を付けたフォルダを作って移動させる。フォルダごとプラグインフォルダに移動させる。Studio\Plugins、の中に移動させる。v1.2.2を移動させる。Filesの中におくので管理者権限がいるのだが、まあよかろう。Studioを立ち上げたままだったのであれば、プロジェクトを保存して立ち上げ直そう。CODE」を選ぶとダイアログが開く。FOR」で、Server側かClient側かを選ぶ。今回は、PeripheralがServerで、CentralがClientになる。NanoがServerで、AndroidがClientだ。データを持っている方がServerになるので、PeripheralがServerになることが多いだろう。TO」に書いているフォルダに出力するので、ServerとClientは出力先を変えた方がよい。Nano側のビルドを行う。オンラインmbedコンパイラで楽々、と行きたかったのだが、無理そうなのでKeiliでビルドする。https://www.keil.com/demo/eval/arm.htmここが一番面倒かも。ほどほどに入力すればよいだろう。今だと、MDK522.exeがダウンロードされた。Keilは面倒、ということであれば、gccでもよいだろう。私は普段gccを使っているのだが、今回はなるべく手動を減らすことを目的にしているので、Keilにしたのだ。gccを使える人であれば、ここから先は雰囲気さえ分かれば対応できると思う。Keilをインストールし終わると、Packageのデータをダウンロードするので、待つ(下にプログレスバーが出る)。終わったら、終了させよう。SDKをダウンロードする。v13はまだalpha版なので、v12.2.0をダウンロードし、適当な場所に解凍した。あ、「適当な場所」というのは、フォルダ名に日本語とかスペースとか入っていないような、あまり深すぎない場所、という意味だ。私は「C:\Prog\nrf5\nRF5_SDK_12.2.0_f012efa」という場所に置いた。developer.nordicsemi.com:/nRF5_SDK/nRF5_SDK_v12.x.x/解凍したフォルダの中に「examples\ble_peripheral」があり、そこに「experimental_bluetoothds_template」がある。これをフォルダごとコピーして、同じ場所に別名でペーストしよう。今回は「experimental_bluetoothds_nanoled」という名前にした。「examples\ble_peripheral\experimental_bluetoothds_nanoled\pca10028\s130\arm5_no_packs」という場所に「bluetoothds_template_pca10028_s130.uvprojx」というファイルがある。緑色のアイコンになっていると思うので、それをダブルクリックするとKeilが立ち上がってくれる。すると、おそらく足りないものをダウンロードするよう要求してくるので、YesYesいっておく。ここまでやって「examples\ble_peripheral\experimental_bluetoothds_nanoled」を見ると、こうなっていると思う。この中に、先ほど生成されたソースをコピーする。上書きも気にせずやってしまう。service_if.c,hは上書きになるが、ble_nanoled_service.c,hは新規なので、プロジェクトに追加が必要だ。'Application'...」をクリックし、追加しよう。ビルド!・・・service_if.cでエラー発生。これは、ログ周りが変更になったためと思われる。ログは今回見ないので、こんな感じで無効にしておこう。app_trace_log(...)これでビルドすると、".\_build\nrf51422_xxac.axf"というファイルができたらしい。axf、というのは、ARMのELF形式みたいなものだろう。ARM社のコンパイラでビルドすると、axfファイルができるのだ。ここまででBLEのCharacteristicが見えるかどうかを確認しておこう。mbedは、USB接続するとファイルシステムとして見えて、そこにファイルを置くと焼いてくれる、というしくみになっている。「components\softdevice\s130\hex」においてある「s130_nrf51_2.0.1_softdevice.hex」をD&D。すると、親基板のLEDが高速点滅して、勝手にアンマウントして再接続された。続けて、「examples\ble_peripheral\experimental_bluetoothds_nanoled\pca10028\s130\arm5_no_packs\_build」にある「nrf51422_xxac.hex」をD&D。焼き終わったら、一度はずして、付け直した方がよいのかな?BLEのperipheralが動いているかどうかは、スマホアプリを使って確認するのが簡単だ。connectというNordicのアプリを使っている。アプリが、iOSだったらLightBlueに軍配が上がるかも。使ってみるとよいだろう。Android版の場合、動いていると「Nordic_BDS」という機器がAdvertisingしているので、CONNECTするとCharacteristicが見える。矢印が上向きは、WRITEの意味。UUIDは作ったときのものなので、ここまで同じ手順で作っていても別の番号になっていることだろう。書いているが、実は焼くのに手間がかかっていた。Nanoはいろいろやっていたためか、ファームウェアがmbedで使うものになっていなかったのだ。Firmware」の手順に従ってファームウェアを書き換えると、SoftDeviceのHEX→ビルドしたHEXの順に焼いて動くようになった。HEXファイルをマージすると安心ではあるのだが、SoftDeviceを書き換えることはめったにないので、一度このようにして動くのが確認できれば、あとはビルドしたHEXだけをD&Dで焼けばよいはずである。Toolsに入っているのかもしれん。動かなかったとしても、フォローできないので先に進もう。NanoのCharacteristicが見えていたなら、残っているのはCentralからの書込に応じてLEDの点灯状態を変更する、というところだけが残っていることになる。Centralから書込まれると、service_if.cのon_nanoled_service_evt()が呼ばれ、case文のBLE_NANOLED_SERVICE_LED_EVT_WRITEに分岐することになる。Nanoに載っているLEDを変更したかったら、このcase文に書けばよいだ。StudioのFIELDで「onoff」という名前を付けたので、それでgrepしよう。ble_nanoled_service_led_tというstructのtypedefに入っている。ble_nanoled_service_led_tはble_nanoled_service_evt_t.paramsの中に入っている。さっきのcase文が入っている関数はble_nanoled_service_evt_tが引数で渡されるので、そこからonoffを探せばよいだろう。NanoのLEDは、GPIOの19番になっていた。アクティブLOになっていて、0で点灯、1で消灯のようだ。connectアプリでCharacteristic書込みを行うとLED制御できた。SoftDeviceは、消さない限りは前のが残っているようだ。焼いた後は立ち上げ直して、スマホアプリからCONNECTし、Characteristicに0x00かそれ以外を書込めば、LEDが消えたり点いたりするはずだ。Androidアプリは・・・力尽きたので省略だ。Studioで新規生成したプロジェクトのフォルダを引数に指定して実行すると、ファイルがコピーされるようになっている。以前のここを参照しておくれ。Client)はsocketを使ってないTCPで通信するRTOS版のサンプルを動かしてみようとインストール先を見たが、なかった。rtos_sdk_programming_guideを見るとsocket()が使えるようで、lwipらしいのだが、RTOS版のAPIドキュメントにはそこら辺は載っていないようだ。socketが使えるのはRTOS版のよい点だと思うので、そこから見ていきたい。名前からすると、githubのここでよいのだろうか?espressif/esp8266-rtos-sample-codeこれの、04Protocal/TCP_Client_Demoを動かそう。Protocolの誤記だとは思うけど、キーボードで打ち込むときは間違えそうだ。tcp_client/tcp_client.htcp_server_ipをサーバのIPに変更ポート番号も、気に入らなければ変更tcp_client/conn_ap.cDEMO_AP_SSIDとDEMO_AP_PASSWORDを自分のAPに変更このくらいで動く。UARTログをデフォルト速度以外で見たいなら、uartのドライバを入れてuser_main()などで変更しよう。デフォルトが中途半端な速度なのをなんとかしてくれんだろうか。clientとして動くので、サーバ側を用意しなければならん。今回はStackoverflowで紹介されていたツールを使ってみよう。Hercules最初、APの設定を「隔離モード」にしていたので、PC側につながらずにRECONNECTを繰り返していた。test」を受け取っている。あとは、こちらが送信した文字列をエコーバックするだけのようだ。本体は、ほとんどtcp_client.cに入っている。serverやらも混ざっている。clientとしては、一番上からTcpLocalClient()までを使っていて、そこから下は不要のようだ。clientの説明と違うじゃないか。gitからcloneしたソースをgrepすると、openssl_demoとかmulticast_demoなどでsocket()を使っているようだったが、単純なサンプルには使っていなさそうだ。わからんが、PDFにはコードも載っているし、書き換えてみるか。Windowsのコンソールを起動したい、というだけのことだった。それがここまではまることになろうとは。結果として動かすことができなかった。これをランチャーに登録しても動かないというか、bash.exeが見えない。cmd.exeの引数にしても、やはり見えない。PowerShellでもダメだ。バッチファイルに書いてExplorerからダブルクリックすれば起動する。Explorerでc:\Windows\System32を見るとbash.exeは見えるのだが、ランチャアプリの登録exeを探すOpenDialogみたいなダイアログからは見ることができなかった。bash.exeは特殊な扱いのようだ。このbash.exeはショートカットというよりも、Bashランチャーというものらしく、COMでうんたらかんたらと説明されていた。なんかわからんが、exec系のAPIからは呼べないようになっているとか、そういうことじゃないかね。テキストエディタから起動させて、今編集しているファイルと同じ場所に移動したbashコンソールを開きたいだけなのだ。コンテキストメニューから起動させるというやり方のページはあったのだが、そこまではしなくてもよいのだ。libusbも動かないし、やはりcygwinしかないのか。c:\Windows\WinSxSの深いところにbash.exeがある。これは単体で起動できるし、ランチャからも見える。困ったことに、今の私の環境ではbash.exeが2つある。フォルダにバージョンらしき数字があるので、大きい方を使っているが、そもそもこれを使ってよいものかどうかもわからん。アップデートされたら別フォルダになるだろうし、おすすめはできんな。windows2016/12/21[py]コンソールログを出力させたい多少pythonにも慣れてきて、ことあるごとに出力させていたprintが邪魔になってきた。全部消してしまうと困るかもしれないし、大幅に変更させるときにはまた復活させたくなるかもしれない。なると、デバッグレベルに応じて出力させたりさせなかったりを制御したい。ログ」で検索すると、こちらが出てきた(私はまだpython2.7を使っているのだ)。ドキュメント「ロギングレベルをコマンドラインオプションから~」とあるので、pythonにそういうオプションがあるのかと思ったが、単に引数を解析してからやるだけのようだった。したら、getoptみたいな関数があるのかもしれんが、調べる気力が無いので、第1引数をそのままロギングレベルと見なすように書いてみた。loglevel)logging.basicConfig(level=numeric_level)logging.debug('debug')logging.info('info')logging.warning('warning')INFO、とするとinfoが出るし、DEBUGとすればdebugも出てきた。log.txt」にしても空っぽで、「2>&1」を追加すると入ったところからすると、標準エラー出力がデフォルトのようである。ファイルに保存する設定もあるから、そこまでリダイレクトしたいことはないのかもしれんがね。これくらいは用は足りそうなのだが、loggingページのまだ最初の方だ。便利な何かがあるのだろうか?変数の表示が%で指定するタイプだ、とか、時刻を入れるフォーマットにできるよ、とか、そういうのがちょっと書いてあって、あとは上級編になるようだ。formatter、の4つから構成されているようだ。こんなに複雑だったのか・・・。自分でいろいろ指示することによって、カスタマイズできるようになっているようで、クックブックのページも用意されていた。ドキュメントまあ、そこまで踏み込まなくていいな。地の文:print普段はいらない、細かいデバッグ出力:logging.debug()問題ないかもしれないけど念のため忠告の出力:logging.info()ちょっとないかもねー、バグってんじゃないの?の出力:logging.warning()これはダメだー、の出力:logging.error()私の場合は、debugとerrorがあればまだ足りるかな。errorも、その後はquit()で終わらせるしかないなら、もうprintでもよい気がする。ログ出力できるほど優雅じゃ無い環境が多いので、自由に出してよいといわれると困るのよねぇ。python2016/12/20[sqlite]最後の行を更新するのに悩むpython経由でSQLite3を使っているのだが、直接pythonとは関係が無い話だ。最後にINSERTしたデータの一部をUPDATEしたかったのだが、何だかうまくいっていない。失敗しているというわけでもないようだが、期待したところが更新されていないので、うまくいっていないのだろう。やっていたのは、どこかのページで見つけたやりかただ。rowid=last_insert_rowid()?のところは、pythonだとexecute()の引数に書けるのだが、まあそこは関係ないので省略しよう。これがうまくいかない。エラーは出ていないので、SQL文は間違えていないのだろう。検索すると、last_insert_rowid()でうまくいかないというところも見つかったのだが、まずは根っこを探そう。Rowidsqlite.orgのページだ。WITHOUT_ROWIDしていないなら使える。INSERTに成功していなかったら0を返す、とある。INSERTは何度かしているし、データを見ても列はあるから、INSERTしていないはずはないのだが。思ったら、読み飛ばしていた。D接続してから、でよいのかな。どこかでクローズしたりしていた気がするのだ。コマンドのsqlite3で見ておこう。tblこれで、tblに入っているデータがrowidと一緒に出力される。rowidは1から始まるから、last_insert_rowid()が0を返すとどれにも引っかからないのだな。rowid=last_insert_rowid()うん、出てこない。rowid=last_insert_rowid()+1うん、1行目が出てきた。いうことは、やはり0が返ってきていたのだろう。今回の私は、UPDATE文で使いたいので、たぶんWHRER節でやってやらないといかんだろう。便利なやり方があるのかもしれんが、知らん。tbl)うむ、これでよさそうだ。tech2016/12/19[esp8266][rtos]SmartConfig+ESP-TOUCHで接続できたタイトル通りだ。ESP-TOUCHはAndroidのAPKを、SmartConfigはRTOS版を使った。ESP8266側は、立ち上げると何かコンソールに出るので、Androidの"Confirm"をタップすると勝手にやってくれた。192.168.xxx.xxxSmartConfigの方は、AirKissの検出もあるようだから、WeChatクライアントでもつなげられるのかもしれない。手軽でよいのだけど、特定のアプリからしか設定できないとか、そういうしくみを入れられるのだろうか?どこまでやれば安全なのかは考えないといかんけど、違うAPに接続してしまう、というようなのは避けたいな。APIというものがあり、設定に使えそうな感じがしている。Config技術を実装したものらしい。http://espressif.com/sites/default/files/documentation/30b-esp-touch_user_guide_en_v1.1_20160412_0.pdfスマホにESP-TOUCHアプリが載っていたら、APからSSIDとパスワードを取得し、それをESP8266に伝えられる、というような図に見える。このESP-TOUCHもあるし、AirKissというプロトコルをWechatが作ってくれてるから、それでもよいんだとか。APIにリンクがあり、そこを見る限りはそれっぽかった。AirKissという名前は別のところで聞いたことがあるから、そういうプロトコルがあるのかもしれん(探しきらんかった)。ESP-TCOUHアプリは、githubにソースごと載っている。https://github.com/EspressifApp?tab=repositories「ForRTOS」というのが別アプリになっているのだけど、RTOS版は開発を止めるようなことが書かれているので、付いていない方を見ておけばよいのだろう。iOS版は、Espressifさんが出しているようだ。Previewって初めて聞いたわ。StoreAndroid版は、IOTなんとかはあるけど、ESP-TOUCHがないのだな。https://play.google.com/store/apps/details?id=com.espressif.iot&hl=ja他の人がSmartConfigアプリをアップしているが、さすがにこの手のアプリを使うのは怖いから、せめてEspressifのダウンロードページから取得したものを使う方がよいか。PreviewはV1.2.0。githubのForIOSはv0.3.5.2、forAndroidはV0.3.4.5と、なんかバラバラだ。iOS版は、OSバージョンの都合で上がったりしているのかもしれんが、せめてiTunesにアップしている方とのつながりがわかるようにしてほしいものだ。関係ないけど、半年前のことらしいが、ESP8266のオライリー本が出ているそうな。マイコンで本が出たりするんだねぇ。esp8266[esp8266]WPSがうまくいくAPといかないAPがありそうESP8266のAPIにWPS関係のものがあるので試してみたのだが、どうもうまくいかない。実装が悪いのかを切り分けるため、ATコマンドの方でやってみた。modeにして、AT+WPS=1で開始。Buffaloのほうはつながったのだが、NECのほうはつながらなかった。WR4100Nという、もうずいぶん前のAPではあるのだが、つながる/つながらないがあると困るのだ。SSIDを指定すればつながっていたので、WPSだけの話だろう。念のためAndroidでやってみたが、接続できたし。BuffaloのAPを買うまでは主力として使っていたのだから、使えるはずなのだ。なると、ESP8266ではWPSよりもSmartConfigとかいうやつを使った方が確実なのかもしれん。esp82662016/12/17[esp8266][rtos]サンプルを斜め読みそろそろ、何か作ってみないと、正月を迎えてしまうと何もしないまま年度末の慌ただしさに巻き込まれてしまうに違いない。作りたいものがあるわけではないので、まずはサンプルを眺めてみよう。眺めるだけで、深入りはしない。NonOS版のexamples。RTOS版のexamples。RTOS版でFreeRTOSの機能を使わなければ、NonOS版と同じ動きになるのだと思う。今日(2016/12/17)の時点では、NonOS版はV2.0.0(patchあり)、RTOS版はV1.5.0が最新となっている。RTOS版は1.5.0のタグが作られていない(コメントで1.5.0になっている)ので、確定じゃ無いのかもしれない。ここに貼ってるgithubのリンクは、今日の最新のcommit(2016/11/09)にしているので、今の最新版では無いかもしれない。そこはご注意くだされ。project_templateこれはシンプルで、実際の動作としてはSDKバージョンをprintf()するだけだ。smart_config昔から気になっていたものの、動かしたことがないsmart_config。名前からすると、設定ができそうなのだが。SmartConfigはNonOS版でも専用APIがあるくらいなので、ドキュメントも充実しているのでは?ドキュメントの一覧を見たが、よくわからん。APIしか出てこないのだろうか。ESP8266はモードとして、STATIONモード、APモード、その両方、の3種類がある。STATIONモードはAPにつなぐモード。APモードは自分がAPになるモード。SmartConfigは、STATIONモードでしか動作しない。私のイメージでは、自分がAPになって「誰か接続して設定しておくれ~」という動作なのかと思っていたのだが、そうじゃないんだなぁ。説明を読む限りでは、つなぐ先の情報をブロードキャストしていたらESP8266が接続してくれる、というように感じた。WPSみたいなものか?しかし、WPSと絡めて検索しても情報が出てこない。Plugなんてものすら出てきてしまったので、これは後日調べよう。spiffs_test名前からすると、SPIでつながっているFlashにFileSystemを作ろう、というところだろうか。大したサイズではないのだけど、自前で管理するとやはりめんどうなのだ(ああ、めんどうだったさ)。使わないと足りない場合は、自分でやらんといかんだろう。APIというものもspiffs_testに関わっているようだ。サンプルもファイル数が多いので、必要があるときまで忘れておこう。websocket_demoまず、websocket、というものがあるらしい。検索するといろいろ出てくる。ここではIPAのリンクを載せておこう。下に"2007"とあるので、たぶん2007年に書かれたものなのだろう。Web関連技術とりあえず、サーバとクライアントの間で双方向通信したいためのプロトコルらしい。だいたい、サーバは待ち、クライアントがアクションを掛ける、というイメージがあるのだが、サーバからも送りつけたい場合なのだろう。サンプルではSTATIONモードになっているから、自分はクライアントということか。なんか、STATIONって駅だから、電車が来るのを待っている姿をイメージして、APの動作になると勘違いしてしまうのだよなぁ。このサンプルは、SSIDやパスフレーズがべた書きになっているから、それなりに書き換える必要があろう。それ以前に、どういうアプリを用意したらよいのだろう?すまん、この辺で私が力尽きた。websocketがサーバからの通知に注力してるのだったら、常に接続状態にしていないといけないだろうから、それだったらBLEでいいやん、と思ってしまったせいかもしれない。WiFi-AP用のBLE規格、みたいなものがあればよいのだけど、多少マニアックな感じがするから、そういうのは出てこないだろうねぇ。この中で何をRTOS版でやってみたいかというと。SmartConfigが気になっているというところか。今はソースにSSIDやパスフレーズを埋め込んでいるのだけど、外部から設定できるようにしたいのよねぇ。esp8266[esp8266][rtos]driver_libのビルドUoWでビルド環境は作ったが、RTOS版のサンプルがビルドできるかを確認していなかった。examples/project_templateをどこかにコピーして、SDK_PATHとBIN_PATHを環境変数として設定し(gen_misc.shを変更するよりも、環境変数設定用のスクリプトを用意してsourceなどで読ませた方が都合がよさそう)、実行するたびにQIOとか40MHzなどの入力をするのが面倒だからgen_misc.shを変更。githubのESP8266_RTOS_SDKはNTFS側にcloneしているが、ビルドはできた。project_templateはSDKバージョンをprintfするだけのようなので動かしたのだが・・・化ける。ESP8266のUARTはデフォルトで変な速度なので、USBシリアル変換チップがその速度に対応していないうちの環境では見るのがめんどくさい(ロジアナなどで見ることはできるが)。UARTの速度変更はuart_init()でできるのだが、使うにはUARTドライバがいる。いうわけで、driver_libをビルドすることにした。以前はuart.cだけをプロジェクトにコピーして使っていたが、今回はdriver_libに入っているmake_lib.shを使うことにした。README.mdを読むと、これでビルドできるそうだ。driverが、最初はビルドに失敗していた。includeパスなどが見えていないようで、コンパイルしている様子を見ても確かにパスがおかしい。環境変数SDK_PATHの設定が必要だった、ということに気付いたわけだ。gen_misc.shに設定して使っていたので、いっそのこと設定用のスクリプトを作るようにした。すると、コンパイルは進むようになったが、i2c_master.cでまたエラーになった。これは、RTOS版とNonOS版のバージョン違いによるものかもしれないが、今回はRTOS版のdriver_libにあるi2c_master.cに以下を追加することで対応した。"esp8266/gpio_register.h"これでlibdriver.aができ、RTOSのlib/にコピーされた。これでuart_init()が使えるかと思ったが、リンクでエラーになった。SPEED1)の形式はNonOS版のドライバで、RTOS版はそういうのがないのだ。やるなら、uart_init_new()をまねして、UART_ParamConfig()を使うほうがよさそうだ。system_get_sdk_version());}}なんでforで回しているかというと、最初の「SDK」が出力されなかったので、どこから速度が変わったのか確認するためだ。version:1.5.0-dev(950076a)10個は出ているので、最初の数文字分が間に合っていないというところか。TXFIFOのemptyを待っているのにダメということは、最初がHWフロー制御になっているということだろうか?この、システムが勝手に出力するというやつがやっかいなのよねぇ。Windowsのコンソールで、ファイル名補完などでTABを押すと、ビープ音が鳴る。OverflowたぶんLinux系全般なのだろうけど、鳴っていなかったので気にしたことがなかった。私は、/etc/inputrcを変更する方で対応できた(もう片方は試していない)。何と略してよいのかわからん。今回は、BoUoWとしたが、これだと「ばうわう」と犬の吠える声っぽくなってしまうぞ。BoUoW上でesp-open-sdk環境をビルドした。今回はノートPC環境で行ったためか、BoUoWだからかわからないが、倍の時間がかかった。2.3GHzで40分くらいだったんじゃなかろうか。前回作った、sdkディレクトリ内に置けばビルドできるプロジェクトで試した。焼いても動いたように思う。BoUoWのディレクトリ内にファイルがあるとエディタが使いづらいので、NTFS側にソースを置いて、xss側はシンボリックリンクしてみたら、それはビルドができなかった。makeがうまく進まないのだ。..しても、1つ上のディレクトリが見えないのが気になる。Foundになってしまう。-sしたらよいのでは?と思ったが、そうでもない。..したのと同じものが見えるようなのだ。最近、Linuxで作業していなかったから、ルールが変わってしまったのだろうか?なんにせよ、これはけっこう面倒な話だ。NTFS側にsdkの元フォルダごとNTFS側にコピーして、そこをシンボリックリンクしてみた。lsすると見えるフォルダにcdで入ろうとしても、入っていかない。なんじゃこりゃ?だが、シンボリックリンクを張らずに、直接/mnt/c/xxxに置いたフォルダにcdで移動してしまえば、それはうまくいった。シンボリックリンクがうまくいっていないというだけかもしれない。Extensionsがv2.49になって使っているが、cloneが以前と違うので多少困っている。D:\Prog\tmp\abc、というフォルダの下にcloneしたかったとしよう。シェルと統合していれば、コンテキストメニューから「Clone」を選ぶことができる。以前は、Destinationに選択しているフォルダ名が入っていたように思うが、1つ上のパスになったようだ。ここでリポジトリを入力すると、こうなる。createがリポジトリ名になるのは以前からなのだが、このままやってしまうとabcというフォルダの下ではなく、その上にcloneされてしまうのだ。何回かcloneしても場所が違っていて、操作を間違えたかと思ったのだが、そういうことらしい。createがカレントディレクトリのままであれば、選択したフォルダにそのままcloneするようになる、という解釈もできたのだが、コンテキストメニューで使うコマンドが変更されたりしたのだろうか?解決してないので、なんかわかったら追記しよう。Updateが走って再起動されたら困る、に対応したい話の続きだ。Service)を止めて様子を見ていた。Updateは動作しなかった。再起動しなかったし、「更新とセキュリティ」を開いても何もならなかったので、あれでよいのだろう。なんというか、喜びも何もない。えん罪で捕まって、何もかも失った後に裁判で勝利したが、何も残らなかった、という話を聞いたことがあるが、そこまではないにしても、作業中に有無を言わさず再起動されて失ったものは、もう元に戻らないのだ。自分(Windows)を安全に保とうとするばかりに過剰な反応をしてしまうという点では、アレルギー反応に近いのかもしれない。その防御機能であるwuauservを止めるのは、本末転倒ではあるけれども、他にどうしようもないようだ。ちなみに、アップデートが済んで、再起動待ちの状態でwuauservを停止しても、それはダメでした。再起動時間を指定していたせいかもしれませんが、時間が来ると再起動された。いうことは、スケジューラの方に何か登録されていたのだろうか?今となっては、知るよしもなかった。Japanなんだろうね、IoTって・・・。いう話をするのはやめて、中身だけ見ていこう。ThingsSDKのOverviewに載っている図がわかりやすい。今のところ、こういうのに向けたプラットフォームが出ているようだ。3というところからもわかるように、けっこうなスペックがいる。Linux上で動く、というところが既に壁が高い。時代が進んで、電池で数ヶ月動くLinuxがマイコン内で動く、というところまでいけばよいのかな。備え付けられるような機器であればすぐにでもよいのかも。一昔前のAndroid端末で動かす、というのもありなのか?端末と言っても、BeagleBoardとかBoneのような、Android2くらいだったらかろうじて動かせたような組み込み機器だろうけど。今出ている上記3つはCortex-Aだから、スペックが足りないかもなぁ。FAQを読むシリーズの最終回。うまいこと伝えられない気がするので、FAQの原文を載せておく。capacity」だ。31バイトが255バイト(octetだけど、バイトでいいや)となっていることからもわかるが、どうもAdvertisingのことを話しているようなのだ。その次にチャネル数のことが出ているが、Advertisingするチャネル数が3つから37に増えた、と。Advertisingとかいう、あれだろう。4.2までの仕様とずいぶん違うので、使い分けるようになっているはずなのだが、どうやるのだろう?Advertisingなんて、まだ相手がいないときだから、使い分けるも何もあったもんじゃ無いように思うのだ。AdvertisingのチャネルはPrimaryと重ならないようになっている。Advertisingは、データで使うチャネルやWiFiの周波数と重ならないように選ばれていたはず。Selectionあたりに書いてあるそうだ。・・・ごめん、長いので読むのはあきらめた。Channelを見ると、どうやらADV_EXT_INDというものが増えているようだ。Advertisingという章があり、追加されたと思わしきPDUが載っていた。255octetという文字もあることから、新しく追加されたものは新しいPDUで行うようになっているということだろう。新しいPDUはBluetooth4.2までのBLEでは処理されずにスルーされるだろうから、別に問題ないのかな。新しい酒は新しい革袋に、か。チャネルがデータチャネルとぶつかるので、邪魔なんじゃなかろうか?こういうAdvertisingを使うときは、データではなくAdvertisingが目的の環境で使うことを前提にしているのか。いかんいかん、こういうことはすぐに結論を出してはいかんな。調べてからにするのがよいだろう。Bluetooth5.0にありそうな大きい変更内容はわかったんじゃないかと思う。仕様変更というよりも追加なので、誰がどのように5.0の機能を使ったデバイスを出すかは興味深いな。ble2016/12/11[esp8266]接続ビルドまでできたので、接続して確認しよう。うちは、スイッチサイエンスさんから買った、小さい方のボードを使っている。スイッチサイエンス基板の裏にチップ抵抗10kΩを2つハンダ付けしているので、あとはFLASHを焼くときのためにGNDに落とすためのスイッチを2つつないでいる。GPIO2はGND、GPIO15は3.3Vにしておき、GPIO2だけでブートか焼くのかを決める。電源がUSBから取ってくる程度では足りないので、ACアダプタを使うようにした。1.2Aのが転がっていたのでつないでみたら、動いた。使わなくなった機器も、ACアダプタだけは捨てずに残しておくと、こういうときに使える。コンデンサがあると消費電力が一瞬上がった場合にも安心できるが、1.2Aもあれば大丈夫なんじゃないのか?そういうときはexceptionで動けなくなるから、わかるだろう。レギュレータとかがあればUSBからの電源でなんとかなるのかもしれんが、あまりそういうのは詳しくない。焼くためのツールは、ここからダウンロードした。SystemsうちはWindowsなので、V3.4.4を使っている。今回は初回だったので全部焼いたが、開発中は2番目のだけ焼けばよいだろう。gitに置いていたものを焼いた(もちろん、SSIDなどは変更してビルド)ら、ちゃんと動いた。コンパイル環境が変わっただけなので、当たり前といえば当たり前だ。RTOS版として動かすには、ちゃんと中身を作り替えねば。これはもう来週かなぁ。以前作っていたNon-OS用のプロジェクトを、esp-open-sdkでビルドできるようにした。https://github.com/hirokuma/esp8266_httpget/tree/opensdkまず、置く場所。esp-open-sdkの中にsdkディレクトリができていると思うが、その中に置くことになる。ビルド中に相対パスで見に行くところがあって、動かせなかった。sdk内のMakefileを書き換えるとたぶんどこでも置けるようになると思うが、試していない。1つは、ファイルの削除。これはesp-open-sdkをビルドした後に1回だけやればよいのだが、esp-open-sdkの直下にあるMakefileを削除するなりリネームするなりしておくこと。これもsdk内のMakefileと関係するのだと思うが、上位ディレクトリにあるMakefileを自動的に実行しようとしてしまうのだ。すると、またesp-open-sdkをビルドしようとして失敗するので、Makefileがない状態にしておけばよい。それ以外は、環境変数になる。前回ビルドしたとき、最後にincludeパスとlibパスが表示されたと思うが、あれをXTENSA_INCLUDEとXTENSA_LIBに設定しておくようにしている。気に入らなければ、gen_misc.shやMakefileを変更してもらえばよかろう。これでビルドはできるが、動作確認はしていない。動くんじゃないの?程度だ。いうのは、だいたい後で「やっておけばよかった。」と思うのだけど、まあいいや。rangeBluetooth5.0のFAQ[pdf]を読んでいくシリーズ2回目。energy」と書いてあったので、BLEだけの話なのだな。rangeだと「範囲」と読んでしまうのだが、どちらかといえば距離っぽい気がする。rangeでいけるぜ、というところか。SIGのホームページに、range関係らしきドキュメントがあった。Whitepaper[pdf]技術資料ではあるが、BL600などの名前が柱に出てきているので、企業が作ったもののようだ。いう団体が出すようなドキュメントは中立的なものかと思っていたけど、「ホワイトペーパー」というものは企業が自社宣伝も兼ねて作るものらしい。これを眺めたら、4倍になる理由が分かるかと思ったけど、それっぽい比較表がなかった。読めばわかるのかもしれんが、計算によって理論的な距離が出せるという読みものではないかと思われる。いうときは、再びsilexさんのブログを読もう。世界に魔法はありません」。基本的には計算であれこれやって、あとはノイズとか反射とかの外乱が出てくるけど、プロトコルによって距離が変わるということはあり得ないはず。あるとしたら、ノイズに4倍強い(計算上)方式になったとか?もうちょっと読むと、4.2での上限が-20~+10dBmだったものが、5.0から-20~+20dBmになったんじゃないの?という推測になっていた(記事の時点では、まだCore_v5.0が出ていないため)。さっきのPDFの表が、こうなってました。setting」とのことで、最大出力設定時の最小出力、だと思うのだけど、技術用語的に微妙な違いがあるのかも。計算のことはわからんので、Core_v5.0の変更で範囲が変わっているか確認しよう。Characteristicに表があった。