開発の方針と流れ
トップ画像にあるようにブレッドボードが小さめで、スイッチを置く余裕がないのでBOOTSELボタンを使いまわしたい。
また、いままではexampleを書き換えていたがゼロから立ち上げをしたい。
- Pico Project Generatorでプロジェクトの立ち上げ
- プロジェクトの動作確認
- 加速度センサ読み取り部分の実装
- BOOTSELボタンの検知
- シリアル出力
- teratermでログ保存
1. Pico Project Generatorでプロジェクトの立ち上げ
Pico Project Generator
This is a Python application to help you create new Pico projects.
だそう。
ダブルクリックと画像のようなGUIが表示される。
今回は下記の設定にした
- Project Name
- Location
- Library Options
- I2C interfaceにチェック(加速度センサのため)
- PIO interfaceにチェック(ボタン押下のため)
- Console Options
- Code Options
- Build Options
- IDE Options
OKボタンを押すとプロジェクトが生成され、locationで指定した場所に下記が作られる。
- .vscode
- build
- {proect_name}.c
- CmakeLists.txt
- pico_sdk_import.cmake
2. プロジェクトの動作確認
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"
},
},
}
自動生成されたプロジェクトのコードのまま、素のpicoに書き込んでもちゃんと動かない。
I2C関連のコードをコメントアウトすると動き、動作確認ができる。
3. 加速度センサ読み取り部分の実装
//..
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を参照。
4. BOOTSELボタンの検知
普通のGPIOと違う処理になっている。理由は上のリンク先が詳しいので、そちらを参照する。
流用は、bootesel_button.hとbootsel_button.cを用意し、
.h ファイルで、 bool __no_inline_not_in_flash_func(get_bootsel_button)();
を宣言し、
.cファイルでサンプルの実装を書き込んだ。
5. シリアル出力
シリアル出力の要求は以下の通り
- gesture開始時に"-,-,-\r\n"が出力される
- gestureの開始はBOOTSELボタンが押されたとき
- BOOTSELボタンが押されている場合、"%04.2f,%04.2f,%04.2f\r\n"というフォーマットで加速度センサーの値が出力される
- BOOTSELボタンが離されると出力が停止する
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;
}
6. teratermでログ保存
- scriptコマンドで作業ログを記録
- screenコマンドでシリアル通信
の二つの機能の組み合わせでログとしてテクストファイル化していた。
終わりに
今回は、magic wandの学習用データを自分で集めるためのプログラムを作った。
次は、データを集めて、学習して、推論してみようと思う。