ArduinoのAPI
前回のLチカでは簡単なプログラムを動かしました。今回もプログラムのサンプルが出てきますが、そのようなサンプルで使われている言語仕様はArduinoの公式ページで公開されています。関数の使い方などは都度このページで確認してください。
ボタン操作
下のプログラムを micro:bit に書き込んでください。書き込む方法は Lチカ と同じです。LEDの点滅が、Aボタンを押している間は早く、Bボタンを押している間は遅く変化したら成功です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
void setup() { pinMode(27, OUTPUT); //ROW2 pinMode(10, OUTPUT); //COL3 pinMode(PIN_BUTTON_A, INPUT_PULLUP); pinMode(PIN_BUTTON_B, INPUT_PULLUP); Serial.begin(115200); while (!Serial); } int delay_time = 200; void loop() { if (digitalRead(PIN_BUTTON_A) == LOW) { Serial.println("A Button!"); delay_time = 100; } else if (digitalRead(PIN_BUTTON_B) == LOW) { Serial.println("B Button!"); delay_time = 400; } else { delay_time = 200; } // LED ON digitalWrite(27, HIGH); digitalWrite(10, LOW); delay(delay_time); // LED OFF digitalWrite(27, LOW); digitalWrite(10, HIGH); delay(delay_time); } |
プログラムの説明です。
1 |
pinMode(PIN_BUTTON_A, INPUT_PULLUP); |
Aボタンは micro:bit 内部で、PIN_BUTTON_A で定義されるGPIOに接続されています。ボタンの状態を検知するのはプログラムにとっては「入力」です。また、ボタンを操作していないときは電気的にプルアップされた状態(つまりHIGH)になるように、INPUT_PULLUP と指定しています。このようにすると micro:bit (Arduino) が内蔵しているプルアップ抵抗が有効になります。(下右の図)
1 |
int delay_time = 200; |
delay_time という変数で点滅の速さを調節しています。ボタンの状態によってこの変数の値を変えています。
Serial.〜 という部分は後で説明します。
課題1
AボタンとBボタンが同時に押されている間は「SOS」のモールス信号を点滅させるように上のサンプルプログラムを改造してください。
シリアル通信の使い方
最初のサンプルプログラムに戻って、プログラムの説明を続けます。
1 2 |
Serial.begin(115200); while (!Serial); |
1行目は micro:bit がUSBを経由してパソコンとシリアル通信を行うこと、その通信速度が 115.2kbps であることを宣言しています。2行目は micro:bit とパソコンの間で通信が確立するまで待っています。
1 |
Serial.println("A Button!"); |
Aボタンが押されたことを確認するためにメッセージを出力しています。このようにしてプログラムの動作を追跡することができます。
シリアルモニタ
Arduino IDE ではパソコンとデバイスをUSBシリアル通信で接続してプログラムを書き込んでいます。このUSBシリアル通信は、デバイスの動作中はプログラムとパソコンの間の通信手段として使うことができます。
まず、[ツール]>[シリアルポート] が “BBC micro:bit” と表示されたポートになっていることを確認してください。次に [ツール]>[シリアルモニタ] を選びます。右下で通信速度を設定できますので “115200 bps” を選択してください。micro:bit が接続されていると、Aボタンを押している間は ”A Button!”、Bボタンを押している間は ”B Button!” と繰り返し表示されます。
課題2
USBシリアル通信はプログラムのデバッグする手段として使えます。変数 delay_time がどのように変化しているかシリアルモニタに表示して確認してください。
- Serial.println(“A Button!”); のように文字列データを表示するだけでなく、変数名を引数に渡せばその値を表示することもできます。
- Serial.println() は表示した後に改行します。Serial.print() は改行しません。
- 課題1で作った「AボタンとBボタンが同時に押されている間はSOSを点滅させる」にデバッグ文を追加して動作を確認してください。
シリアルプロッタ
サンプルプログラムの最後の部分に、次のように1行追加してください。
1 2 3 4 |
void loop() { /* 省略 */ Serial.println(delay_time); // 1行追加 } |
変更したプログラムを実行、[ツール]>[シリアルプロッタ] を開いてどのように表示されるか確認してください。シリアルプロッタが開けないときは、シリアルモニタを閉じてください。通信速度は “115200 bps” に設定しなければなりません。Aボタン、Bボタンを押すとグラフが変化するはずです。シリアルプロッタはこのように、受信した数値データを自動的にグラフ化することができる便利なツールです。
課題3
シリアルプロッタに正弦波を表示させてください。
ターミナルソフト
この演習では Arduino IDE に内蔵のシリアルモニタを使いましたが、マイコンプログラムの際には、Windows では TeraTerm(ダウンロード&インストールが必要)、Mac ではターミナルのscreenコマンドなどがよく使われます。使い方を調べて TeraTerm やターミナルでもシリアルポートが動作することを確認してください。その際、シリアルポートを開放するために Arduino IDE のシリアルモニタ・シリアルプロッタは終了しておく必要があります。
TeraTermの場合(Windows)
TeraTermは「窓の杜」などからダウンロード可能です。
起動時の設定は “シリアル” を選択し、ポートは Arduino IDE で使ったのと同じポートを指定します。
メニューの [設定] > [シリアルポート] を開いて通信速度をプログラムで設定した値に合わせてください。
設定が正しければプログラムで記述した内容が表示されるはずです。
Macのターミナルの場合
screenコマンドは標準でインストールされているかもしれませんが、インストールされてなかったり、バージョンが古い場合はHomebrew(brewコマンド)を使ってインストールします。Homebrewがインストールされていない場合はそのインストールから始めてください。それらの方法はネット上にたくさん解説記事がありますので調べてください。ただし、ターミナルの使い方やLinuxコマンドに慣れていないと少し難しいかもしれません。
Arduino IDE で設定したシリアルポートの名前が必要です。次のコマンドでも確認できます。
1 2 |
$ ls /dev/cu.usbmodem* /dev/cu.usbmodem1102 |
この名前を使って screen コマンドを実行します。2つめのパラメータで通信速度を指定します。
1 |
$ screen /dev/cu.usbmodem1102 115200 |
コマンドが正しければ次のように表示されるはずです。
screenコマンドを終了するには、control + a を押して、次に k を押します。すると画面左下に Really kill this windows [y/n] と表示されるので、y を押すと screen が終了します。
screenコマンドを実行したときに Cannot open line ‘/dev/cu.usbmodem1102’ for R/W: Resource busy と一瞬表示されてエラーになることがあります。
過去に実行したscreenコマンドが正しい手順で終了できていない場合、この様な状態になります。このときは screen -list でプロセスIDを調べて、そのプロセスをkillします。
1 2 3 4 5 6 7 |
$ screen -list There are screens on: 1268.ttys001.takemoto (Attached) Remove dead screens with 'screen -wipe'. 1 Sockets in /var/folders/07/r4bw9dzs76qgrxmdq4k4wysh0000gn/T/.screen. $ kill -9 1268 |
コメント