2018年4月28日土曜日

[ESP32]Window上でmicropythonをビルドする(デュアルコア対応化)

ESP32ってデュアルコアなのにビルド済みのMicropython for ESP32はシングルコアしか使っていないのが分かった。。(2018年4月時点)
なので自前ビルドを実践する事にした。


Step1.環境一式ダウンロード
https://esp-idf.readthedocs.io/en/latest/get-started/windows-setup.html
600MB弱のファイルをダウンロードして任意のフォルダに展開する。
例:D:\msys32


Step2.環境構築
d:\msys32\mingw32.exeを起動
$ cd
$ mkdir -p esp
$ cd esp
$ mv esp-idf esp-idf.old
$ git clone --recursive https://github.com/espressif/esp-idf.git


Step3.micropythonのコードをクローン
$ pacman -S python2
$ curl https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py
$ pip install pyserial

$ mv /mingw32/bin/envsubst.exe /mingw32/bin/envsubst.exe.del
$ pacman -S gettext
2$ vim ~/.profile
最後の行に
 export IDF_PATH=~/esp/esp-idf
 export ESPIDF=$IDF_PATH
を追加。
$ source ~/.profile

$ git clone --recursive https://github.com/micropython/micropython.git
$ git clone --recursive https://github.com/micropython/micropython-lib.git
https://github.com/micropython/micropython/blob/master/ports/esp32/mpthreadport.c
の136行目
TaskHandle_t id = xTaskCreateStaticPinnedToCore(freertos_entry, name, *stack_size / sizeof(StackType_t), arg, priority, stack, tcb, 0);
これを
TaskHandle_t id = xTaskCreateStaticPinnedToCore(freertos_entry, name, *stack_size / sizeof(StackType_t), arg, priority, stack, tcb, 1);
にする。

※Windowsだとシンボリック問題が発生するので、置換マクロ組んで全部置き換えました。。


Step4.ビルド開始
$ cd ~/esp/micropython/ports/esp32
$ make

★ここでHASHが異なるからビルドできないってエラーメッセージが表示されたら
ハッシュコードの部分は出力メッセージのに書き換えて
$ cd ~/esp/esp-idf
$ git checkout 3ede9f011b50999b0560683f9419538c066dd09e -b micropython
$ git submodule update

$ cd ~/esp/micropython
$ make -C mpy-cross
$ cd ~/esp/micropython/ports/esp32
$ make
$ make erase
$ make deploy

消去や書込めない場合、
$vim Makefile
ポート名は/dev/ttyS0 
など、各自環境に合わせて要調整。




諦めてビルド済みのを使う場合は、


ここからバイナリイメージをダウンロードしてきて書込み実行。

$ easy_install -U pip
$ pip install esptool
$ esptool.py --port /dev/ttyS0 --baud 460800 write_flash --flash_mode dio --flash_size=detect 0x1000 esp32-20171006-v1.9.2-276-ga9517c04.bin


追記:
Ubuntu on Windows 上で環境構築した場合、
Makefileの設定で

ポート名は、/dev/ttyS1 = COM1になります。
通信速度はデバイスマネージャに記載した通信レートを指定します。


以上!

2018年4月24日火曜日

[FreeRTOS]現在アクティブのタスクハンドラ・タスク名を取得する。

色々と検索すると古い情報だったり、カーネルをカスタマイズしないといけないとか
情報が散乱していて良く分からない状態だったのでまとめます。

結局は英語も良く分からないから、分からないなりに読めるソースコードを頼りに調べました。

タスクハンドラはTaskTCBのポインタになっているようですが、
Task.cに構造体が定義されていて直接参照したりすることができないようになっています。
構造体の部分を抜き出すやり方も検討しましたが、
最終的にはAPI関数のみでやる方法で落ち着きました。

現在のタスクハンドラを取得する方法
TaskHandle_t handle = xTaskGetCurrentTaskHandle();


タスクハンドラからタスク名を取得する
char* taskname = pcTaskGetName(handle);


これ知っておけばタスク間をまたぐような処理で
自タスクなのか他タスクなのかが判別できるようになりますね。

2018年4月21日土曜日

レディプレイヤーワン良かった

 スピルバーグ作品といえばやっぱり「激突!」
激突はトラックが永遠と追いかけてきて、振り切ったかと思っても
「またあのトラックあるやん!」って
見てる側もハラハラドキドキさせてくれる作品だったことを思い出します。
あれから色々な作品を世にだして巨匠となりますが
2000年以降は低迷続きでもう大作は難しいのかなって思ってた矢先に出してきたSF作品。
彼の思い描いている強烈な映画感を色濃く出してきた上に
80年代からの有名作品全部入り!
いくら映画好きでも昔の作品はまったく知らないし、
そういうのをいろんなシーンに挿入されてても元ネタが分からないんだよねー
それって「ラ・ラ・ランド」もそうだったじゃん!という人でも
アクション好きであればOKですw
全部入りシリーズは大体は不作に終わるジンクスがあると個人的に思っていましたが
久々にぶっ飛ばしてきましたね。

2018年4月17日火曜日

WindowsにAmazon Alexaをインストールする

本記事はalexa-avs-sample-appを動かすメモです。

2018年4月現在は、MSYS2上にインストールする方法がありますので
そちらを参照するといいかもしれません。

【元記事】

【修正するファイル】・samples/companionService/config.js
・samples/javaclient/config.json
・samples/javaclient/pom.xml
・samples/javaclient/ssl.cnf


ではスタートです。

Step1.Amazon developerにログインしてAVSデバイスを追加
ProductID、ClientID、ClientSecretキーを取得する。


Step2.サンプルプログラムをダウンロードする。
例:c:\project\alexsaフォルダに展開する場合、
DOSプロンプト上でクローンするフォルダに移動してから
> c:
> cd \project
> mkdir alexsa
> cd alexsa
> git clone https://github.com/alexa/alexa-avs-sample-app.git


Step3.依存アプリのインストール
・VLCをインストール http://www.videolan.org/
 環境変数に登録する
 例:
  環境変数名:VLC_PATH
  パス:C:\Program Files(x86)\VideoLAN\VLC

・Node.jsをインストール
 https://nodejs.org/en/download/


・Movenをインストール
 https://maven.apache.org/download.cgi
 ※環境パスを登録する事
 例:JAVA_HOME=C:\Program Files\Java\jdk1.8.0_162


Step4.SSL証明書を生成する
・OpenSSLをインストール
 http://slproweb.com/products/Win32OpenSSL.html
環境変数「Path」に「Bin」フォルダを登録する。
例「C:\tool\OpenSSL-Win64\bin」
・[C:\project\alexa\alexa-avs-sample-app\samples\javaclient]を編集する
YOUR_****の部分を全て変更する
countryName = JP
stateOrProvinceName = Tokyo
localityName = Nakano-Ku
organizationName = NA
organizationalUnitName = NA

・DOSプロンプト上でGenerate.batを起動する。
ここで適当な
プロダクトID、シリアルナンバー、パスワードを入力する。
例:
ProductID:Dispatcher
SerialNumber:123456
Password:1234
ちゃんとうまく証明書が生成できれば
「1 個のファイルをコピーしました」
というのが表示される。

・設定ファイルに生成した証明書の参照パスを設定する。

「c:\project\alexa\alexa-avs-sample-app\samples\companionService\config.js」を開き、
 sslKey: 'C:\\project\\alexa\\alexa-avs-sample-app\\samples\\javaclient\\certs\\server\\node.key',
 sslCert: 'C:\\project\\alexa\\alexa-avs-sample-app\\samples\\javaclient\\certs\\server\\node.crt',
 sslCaCert: 'C:\\project\\alexa\\alexa-avs-sample-app\\samples\\javaclient\\certs\\ca\\ca.crt',
 "products":"Dispatcher" : ["Dispatcher"],
を入力する。


「C:\project\alexa\alexa-avs-sample-app\samples\javaclient\config.json」を開き、
    "productId":"Dispatcher",
    "dsn":"123456",
    "provisioningMethod":"companionService",
 "clientId":"*********",
 "clientSecret":"*********",
 "locale":"ja-JP"
 "sslKeyStore":"C:\\project\\alexa\\alexa-avs-sample-app\\samples\\javaclient\\certs\\server\\jetty.pkcs12",
 "sslClientKeyStore":"C:\\project\\alexa\\alexa-avs-sample-app\\samples\\javaclient\\certs\\client\\client.pkcs12",
 "sslClientKeyStorePassphrase":"1234",
 "sslCaCert":"C:\\project\\alexa\\alexa-avs-sample-app\\samples\\javaclient\\certs\ca\\ca.crt"


「clientID」「clientSecret」は最初のAVS登録時の情報で
「sslClientKeyStorePassphrase」は証明書作成時に入力したパスワードになります。
「products」はKey:Value型になっていて
 KeyはAVS登録時のProductIDで、
 ValueはSSL証明書作成時に入力したProductIDになります。


「C:\project\alexa\alexa-avs-sample-app\samples\javaclient\」を開き
17行目付近にある部分を下記のように編集
8.1.12.v20180117


・AndroidスマホにAmazonAlexaアプリをインストールする
 https://play.google.com/store/apps/details?id=com.amazon.dee.app&hl=ja&rdid=com.amazon.dee.app


Step5.ビルドと実行、そしてNode.jsサーバによる認証
Dosプロンプト上で
> c:
> cd project\alexa\alexa-avs-sample-app\samples\companionService
> npm install
> npm start
別のDosプロンプト上で
> c:
> cd project\alexa\alexa-avs-sample-app\samples\examples\javaclient
> mvn validate
> mvn install
> mvn exec:exec
を実行する。
これでJAVAアプリが起動する。
クラウドとやり取りするのは1つめのコンパニオン
GUIは2つ目のjavaアプリ
という2構成になっています。



ブラウザで「https://developer.amazon.com/lwa/sp/overview.html」を開き
最初に作成したAVSデバイスを選択して
Consent Privacy Notice URLは暫定のURLでも張り付けておく。

cd project\alexa\alexa-avs-sample-app\samples\companionService


【インストール時に引っかかった事】
設定ファイルで未記入の所でエラー。(エラーが出なくなるまで項目を埋めていった)
Jsonファイルの構文にひっかかった。(\\が2つになっていない箇所があった)
JAVAコンパイラが見つからなかった(パスの問題)
VLCのバージョンが32bitでDLL読込み失敗した(64bitのものにインストールし直した)
Localhostを127.0.0.1に直さないと動かない。


【まとめ】
以上の手順をこなせば、Alexaが動作する所まで確認できます。

構成は、
GUIがフロントエンド(JAVA)で
バックエンド(Javascript)にコンパニオンがいます。

動作の流れは、
GUIからログインを行うと、コンパニオンを仲介してAWSにアクセスして認証を通します。
Amazonアカウントのログイン完了後、
OKであればシークレットキーが届いて、これでアレクサと接続状態になります。
ダメな場合は400とかエラーコードが返ってきます。

接続状態の時にアレクサに話しかけてAlexsaスキルを発動すると、
対応する接続中のデバイスに対してNotificationが届きます。

これでESP32でLチカとかもできちゃいますね!

Androider