Ccmmutty logo
Commutty IT
7 min read

TensorFlow Lite for Microcontrollersのmagic wandの学習用データをあつめるraspberry pi picoプログラムを書いた

https://cdn.magicode.io/media/notebox/efacb4c0-37e1-4fbc-8130-3816efe8b6e3.jpeg

はじめに

前回 、tensorflow lite for microcontrollersのmagic wandの学習の仕方を学んだ。
今回は独自のデータをpicoで収集するためのプログラムを組む。

環境

  • PC
    • windows 10
  • pico
  • USBケーブル
    • 家に転がってたものを
  • 加速度センサー(MMA8452Q)
  • 330Ωの抵抗 x 2
    • 動作確認では手元になかったので使ってないが、ドキュメントを見た感じ合った方がよさそう。
  • ブレッドボードやジャンパー
    • VDD/GND用 2 or 4本
    • SCL/SDA用 2本
  • 開発環境
    • Visual Studio Code
  • 動作確認環境
    • TeraTerm

開発の方針と流れ

トップ画像にあるようにブレッドボードが小さめで、スイッチを置く余裕がないのでBOOTSELボタンを使いまわしたい。
また、いままではexampleを書き換えていたがゼロから立ち上げをしたい。
  1. Pico Project Generatorでプロジェクトの立ち上げ
  2. プロジェクトの動作確認
  3. 加速度センサ読み取り部分の実装
  4. BOOTSELボタンの検知
  5. シリアル出力
  6. teratermでログ保存

1. Pico Project Generatorでプロジェクトの立ち上げ

自分で設定を頑張るのもできるが、Pico Project Generatorというツールがある。
こちらの記事でやったように、インストーラーを使って環境を構築した場合、picoのインストールディレクトリにある。
同じくインストールディレクトリにあるReadme.txt曰く
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
    • Console over USBにチェック
  • Code Options
    • なし
  • Build Options
    • なし
  • IDE Options
    • Create VSCode project
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"
               },
     },
}
ボタンじゃなくてショートカットキーで実行したい場合は、F7を押すとビルドできる。
https://github.com/microsoft/vscode-cmake-tools/blob/HEAD/docs/how-to.md#build-a-project
自動生成されたプロジェクトのコードのまま、素のpicoに書き込んでもちゃんと動かない。
I2C関連のコードをコメントアウトすると動き、動作確認ができる。

3. 加速度センサ読み取り部分の実装

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を参照。

4. BOOTSELボタンの検知

ここに書いてあるように、pico examplesにBOOTSELボタンを使うサンプルがあるので、それを流用する。
普通のGPIOと違う処理になっている。理由は上のリンク先が詳しいので、そちらを参照する。
流用は、bootesel_button.hとbootsel_button.cを用意し、
.h ファイルで、 bool __no_inline_not_in_flash_func(get_bootsel_button)(); を宣言し、
.cファイルでサンプルの実装を書き込んだ。
詳細はgithubを参照。

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でログ保存

Readmeを読み直すと、
  1. scriptコマンドで作業ログを記録
  2. screenコマンドでシリアル通信
の二つの機能の組み合わせでログとしてテクストファイル化していた。
今回はwindowsでteratermでシリアル通信をしているので、teratermに機能があるかを調べたらやっぱりあった。。
https://www.server-memo.net/memo/teraterm/teratarm-log.html

終わりに

今回は、magic wandの学習用データを自分で集めるためのプログラムを作った。
次は、データを集めて、学習して、推論してみようと思う。

Discussion

コメントにはログインが必要です。