前回 、tensorflow lite for microcontrollersのmagic wandの学習の仕方を学んだ。
今回は独自のデータをpicoで収集するためのプログラムを組む。
トップ画像にあるようにブレッドボードが小さめで、スイッチを置く余裕がないのでBOOTSELボタンを使いまわしたい。
また、いままではexampleを書き換えていたがゼロから立ち上げをしたい。
自分で設定を頑張るのもできるが、Pico Project Generatorというツールがある。
こちらの記事でやったように、インストーラーを使って環境を構築した場合、picoのインストールディレクトリにある。
同じくインストールディレクトリにあるReadme.txt曰く
Pico Project Generator This is a Python application to help you create new Pico projects.
だそう。
ダブルクリックと画像のようなGUIが表示される。
今回は下記の設定にした
OKボタンを押すとプロジェクトが生成され、locationで指定した場所に下記が作られる。
picoのインストールディレクトリにある Visual Studio Code for Pico からVSCodeを開き、open folderで作ったプロジェクトのフォルダを開く。
kitをGCC 10.3.1 arm-none-eabiに設定。
問題発生。buildボタンがない。
結論を言うと、 .vscode/settings.json
の設定を下記のように書き換えると表示された。
ちなみに、設定の値はvscodeが保管してくれるので、ドキュメントとか見なくてもいい。すごい。
{
"cmake.configureOnOpen": false,
"cmake.statusbar.advanced": {
"debug" : {
"visibility": "hidden"
}, "launch" : {
"visibility": "hidden"
},
"build" : {
"visibility": "default"
},
"buildTarget" : {
"visibility": "compact"
},
},
}
ボタンじゃなくてショートカットキーで実行したい場合は、F7を押すとビルドできる。
https://github.com/microsoft/vscode-cmake-tools/blob/HEAD/docs/how-to.md#build-a-project
自動生成されたプロジェクトのコードのまま、素のpicoに書き込んでもちゃんと動かない。
I2C関連のコードをコメントアウトすると動き、動作確認ができる。
pico-examples/mma8451_i2cを流用した。
mma8451_i2c.h, mma8451_i2c.cを用意して、mainからincludeして呼び出している。
//..
MMA8451Gravity gravity;
int main()
{
//...
MMA8451Status status = mma8451_init();
if (status == kMMA8451Error)
{
return -1;
}
while (true)
{
mma451_read_gravity(&gravity);
// do something
sleep_ms(40);
}
return 0;
}
mma8451_i2c.h, mma8451_i2c.cの詳細はgithubを参照。
ここに書いてあるように、pico examplesにBOOTSELボタンを使うサンプルがあるので、それを流用する。
普通のGPIOと違う処理になっている。理由は上のリンク先が詳しいので、そちらを参照する。
流用は、bootesel_button.hとbootsel_button.cを用意し、
.h ファイルで、 bool __no_inline_not_in_flash_func(get_bootsel_button)();
を宣言し、
.cファイルでサンプルの実装を書き込んだ。
詳細はgithubを参照。
シリアル出力の要求は以下の通り
gestureの開始は、bool型のフラグで管理し、下記のように実装した。
MMA8451Gravity gravity;
int main()
{
stdio_init_all();
MMA8451Status status = mma8451_init();
if (status == kMMA8451Error)
{
return -1;
}
bool is_low = true;
while (true)
{
if (get_bootsel_button())
{
if(is_low)
{
printf("-,-,-\r\n");
is_low = false;
}
mma451_read_gravity(&gravity);
printf("%04.2f,%04.2f,%04.2f\r\n", gravity.x*1000, gravity.y*1000, gravity.z*1000);
}else{
is_low = true;
}
sleep_ms(40);
}
return 0;
}
Readmeを読み直すと、
の二つの機能の組み合わせでログとしてテクストファイル化していた。
今回はwindowsでteratermでシリアル通信をしているので、teratermに機能があるかを調べたらやっぱりあった。。
https://www.server-memo.net/memo/teraterm/teratarm-log.html
今回は、magic wandの学習用データを自分で集めるためのプログラムを作った。
次は、データを集めて、学習して、推論してみようと思う。