コンテンツにスキップ

【ハンズオン1】ファームウェアの作成

前提条件

  • 仮想環境の起動が完了していること

手順

1. Arduino IDEを起動する

仮想環境のデスクトップにある「Arduino IDE」アイコンをダブルクリックして起動する。

alt text

画面が真っ白のままである場合、IDEを一度閉じ、再度開く(閉じられない場合は新たにIDEを起動しなおす)。

Mac(ARM64)環境利用者向け注意

Arduinoを起動するとメモリリークを起こす。

メニューのFile > New Sketchを選択して新規スケッチを作成し、元々開いてたウィンドウを閉じることでメモリ使用量が正常値になる。

起動直後はメニューが表示されないので、10秒程度待つことが推奨される。

2. 空のプログラム(=スケッチ)が書かれていることを確認する

メニューのFile > New Sketchを選択して新規スケッチを作成する。 下記のような、空のプログラムが表示される。

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

3. 書き込むボードの種類を選択する

ボードが選択されていない場合、画面右下に小さくNo board selectedと表示されているので、メニューのTools > Board > Raspberry Pi Pico/RP2040/RP2350 > Raspberry Pi Pico Wを選択する。

alt text

4. スケッチをディスクに保存する

メニューのFile > Save Asを選択して、適当な名前で保存する。この手順書では名前をledとする。

5. 空のプログラムをコンパイルする

メニューのSketch > Verify/CompileCtrl+R) を選択して、スケッチをコンパイルする。

6. ファームウェアが生成されたことを確認する

ファームウェアは所定のディレクトリに生成されるが、ディレクトリ名はランダムである。 そこで、Arduino IDEの下部にあるOutputタブの出力を確認する。 Outputタブにおいて、以下のようなメッセージを探す。

/home/kali/.arduino15/packages/rp2040/tools/pqt-gcc/4.0.1-8ec9d6f/bin/arm-none-eabi-size -A /home/kali/.cache/arduino/sketches/[ランダムなファイル名]/[スケッチ名].ino.elf
見つけたらパス/home/kali/.cache/arduino/sketches/[ランダムなファイル名]/をコピーする。

続いて、Kali Linuxにおいてファイルエクスプローラを開き、コピーしたパスに移動する。

ファイルエクスプローラーの開き方と、指定パスの移動方法は、共通の手順 4節を参照。

前述のディレクトリにおいて、[スケッチ名].ino.binファイルが生成されていることを確認する。

alt text

Note
  • [ランダムなファイル名]は時々変わることがあるので、変更が反映されないと感じた場合は、再度パスを確認する

7. ファームウェアを書き込む

書き込みの準備のため、PicoボードをBOOTSELモードで起動・仮想環境に接続する

を参照。

上記の準備が終わったら、ターミナルを起動し、以下のコマンドを実行する。

$ cd /home/kali/.cache/arduino/sketches/[ランダムなファイル名]/ # ファームウェアが保存されているディレクトリに移動
$ sudo picotool load [スケッチ名].ino.bin # ファームウェア書込
$ sudo picotool reboot # ボードを再起動

以上のコマンドにより、Pico Wボードにファームウェアが書き込まれ、再起動後、ファームウェアが実行される。

ERROR: The RP2040 device returned an error: <unknown> と表示された場合

Mac OSの設定→プライバシーとセキュリティ→ファイルとフォルダにある、VMware Fusionの「リムーバブルボリューム」トグルをオンにする。

それでもエラーが発生する場合、Mac端末上でpicotoolコマンドを使用する。.binファイルを仮想環境内でコピーし、Mac端末上で貼り付けることで、.binファイルを仮想環境の外に持ち出すことが可能。

操作が分からない場合は講師・チューターに質問する。
note: ファームウェアを書き込む別の方法
  • Arduino IDE上で書き込みボタンを押下する
  • ファイルエクスプローラー上で、[スケッチ名].ino.uf2をPicoボードにドラッグ&ドロップする

8. オリジナルのファームウェアを作成する

プログラムを書き換え、LEDをチカチカ(Lチカ)させるプログラムを作成し、ファームウェアを書き込み、動作を確認してください。 コードの作成にあたって、以下の例を参考にしてください。

余力があれば、単純にLEDをチカチカさせるだけでなく、LEDの点灯間隔を変更を変更するなど、実装を工夫してみましょう。

注意
  • この後の、ファームウェア解析の都合上、delay([1以上の数字を直接入力])関数を一つ以上含むプログラムを作成してください。
note:プログラムの基本的な書き方
  • C言語では、下記の関数Aが存在するとき、関数A()と記述することで、関数Aの中の処理を実行することができる。
    void 関数A() {
        // 関数Aの処理
    }
    
  • プログラムは逐次実行(上から順番に実行)される。以下のように書くと、Process1(), Process2(), Process3()の順に実行される。
    void 関数A() {
        Process1();
        Process2();
        Process3();
    }
    
  • Raspberry Pi Pico ボードでは、setup()関数とloop()関数が用意されている。これらの関数の{}で囲まれた部分に、プログラムを記述する。
  • //以降の部分はコメントであり、プログラムの実行には影響しない。コメントは、コードの説明やメモとして使用する。
  • setup()関数とloop()関数は、CPUが自動的に呼び出してくれる。呼び出しタイミングは次のノートを参照。
note: setup()関数とloop()関数
  • setup()関数: プログラムの初期化処理を記述する。電源投入時、一度だけ実行される。
  • loop()関数: メインの処理を記述する。loop()関数内の処理は、無限ループする。LEDの制御に関連する処理は、ここに記述する。

例1: LEDを点灯・消灯させるプログラム

点灯:

digitalWrite(LED_BUILTIN, HIGH);

消灯:

digitalWrite(LED_BUILTIN, LOW);

例2: 一定時間待機するプログラム

1秒間(1000ミリ秒) 待機:

delay(1000);

例3: LEDを1秒間点灯し、1秒間消灯するloop関数実装例

void loop() {
    digitalWrite(LED_BUILTIN, HIGH); // LEDを点灯
    delay(1000); // 1秒待機
    digitalWrite(LED_BUILTIN, LOW); // LEDを消灯
    delay(1000); // 1秒待機
}

例4: PWM制御によりLEDの輝度を変更するプログラム

  int brightness = 50; // 0~100の範囲で輝度を指定
  int onTime = brightness;
  int offTime = 100 - brightness;
  digitalWrite(LED_BUILTIN, HIGH);
  delayMicroseconds(onTime * 100);
  digitalWrite(LED_BUILTIN, LOW);
  delayMicroseconds(offTime * 100);
注意
  • ファームウェアの書き込み時に、Ardunio IDE上でコンパイルエラーが発生していないか確認する

トラブルシューティング

Outputタブに赤色のエラーメッセージが表示される

  • コンパイルエラーが発生している。エラーメッセージを確認し、修正する。
  • 修正方法がわからない場合は、遠慮なくチューター・講師に相談する。

ソースコードを変更したのにファームウェアが新しくならない

  • 出力先が変更されている可能性がある。Outputタブのメッセージを確認し、改めて出力先のパスを確認する。

"Failed uploading: uploading error: exit status 1"と表示される

  • PicoボードがBOOTSELモードで起動していない可能性がある
  • Picoボードが仮想環境に接続されていない可能性がある
  • Arduino IDEではなく、picotoolを使用してファームウェアを書き込む

仮想環境内のKali Linuxが非常に重い・動かなくなった

  • 特にArduino IDEのメモリ使用量が急激に増加することがあるので、一旦閉じる
  • 操作不可の場合は再起動する
  • PC本体のRAM(メモリ)に余裕がある場合は、仮想環境のRAMを増やすことで改善することがある

コードが汚くなってきたのできれいにしたい

メニューのEdit > Auto FormatCtrl+T) を選択して、スケッチをフォーマットする。