ロボカップジュニア2027 に向けた講座を始めました。初回にやったのは、LEDを1個、点滅させることです。
LEDをチカチカさせる、略して「Lチカ」は、多くの初心者が最初に行うプログラムです。
Lチカは、ピンのこと、GNDへの接続、電気信号を送るということ、PWMなど、多くのことを教えてくれるとてもよい内容です。
使ったもの
マイコンは Raspberry Pi Pico。名刺の半分ほどの大きさの基板で、ロボットの頭脳にあたる部分です。プログラムは Arduino IDE を使い、C++ で書きます。
ほかに使ったのは、LED・抵抗(330Ω)・ブレッドボード・ジャンパー線です。
プログラム
Picoの基板には、もともとLEDが1個載っています。まずは配線をせず、これを点滅させました。
void setup() { // 初期設定
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() { // ここが永遠に繰り返される
digitalWrite(LED_BUILTIN, HIGH); // 点ける
delay(500); // 0.5秒まつ
digitalWrite(LED_BUILTIN, LOW); // 消す
delay(500); // 0.5秒まつ
}
10行ほどですが、この中にプログラムの基本がひととおり入っています。
setup() は電源が入ったときに一度だけ通る部分で、ここで準備をします。loop() はそのあと永遠に繰り返される部分です。pinMode で「このピンを出力として使う」と宣言し、digitalWrite で電気を出したり止めたりします。delay は時間を待つ命令です。
ロボットのプログラムも構造は同じです。センサーで周りを読み、どうするか決め、モーターを回し、また繰り返す。初回に書いたのは、このうち「出力」「時間」「繰り返し」の部分です。
LEDのつなぎ方
次に、外付けのLEDを GP15 につなぎました。
電気は、ピンから出てLEDを通り、GND(グランド)という戻り口に帰ってきて、はじめて流れます。行きだけでは光りません。配線は、かならず一周して輪になります。
LEDには向きがあります。長い足がプラス側(アノード)、短い足がマイナス側(カソード)です。樹脂の側面が少し平らに削られている方も、マイナス側の目印になります。逆につないでも壊れませんが、光りません。
抵抗は必ず入れます。LEDは自分で電流を加減できないため、そのままつなぐと流れるだけ流れて焼き切れます。抵抗が電流に上限をかける役目をします。
const int LED = 15; // GP15 につないだ
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
delay(800);
}
明るさを変える
点灯と消灯の2択ではなく、明るさを途中にすることもできます。digitalWrite のかわりに analogWrite を使います。
const int LED = 15;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
for (int b = 0; b <= 255; b++) { // だんだん明るく
analogWrite(LED, b);
delay(5);
}
for (int b = 255; b >= 0; b--) { // だんだん暗く
analogWrite(LED, b);
delay(5);
}
}
数字は 0〜255 で指定します。0 が消灯、255 がいちばん明るい状態です。
ところが、LEDに「半分だけ光る」という機能はありません。点いているか、消えているか。その2つしかありません。
では、どうやって中くらいの明るさを作っているのか。答えは単純で、目で追えないほど速く、点けたり消したりしています。
目では追えないほど速く点滅させると、人の目は追いつけません。残像が残るため、ONとOFFが混ざって「ひとつの明るさ」に見えます。パラパラ漫画やアニメが、止まった絵の連続なのに動いて見えるのと同じ理屈です。
この「ONしている時間の割合」をデューティ比といい、この方法を PWM(Pulse Width Modulation / パルス幅変調)と呼びます。analogWrite(LED, 128) と書いたとき、Picoは電圧を半分の1.65Vにしているのではありません。3.3Vのまま、ONでいる時間を半分にしているのです。
身のまわりにもたくさんあります。明るさを変えられる照明、スマートフォンの画面、扇風機の風量。「強さを変えている」ように見えて、実際は「ONの時間の割合を変えている」ものが数多くあります。
この analogWrite は、次回以降モーターの速さを決めるときに使う命令と同じものです。相手がLEDなら明るさになり、モーターなら速さになります。モーターも電圧を弱めているわけではなく、速いON/OFFの繰り返しで、回る力の平均を変えています。
つまずいた点
この日、うまく動かなかった原因は次のとおりでした。
LEDの向きが逆。ジャンパー線がブレッドボードから抜けている。プログラムのピン番号と実際の配線が違う。抵抗を入れ忘れている。書き込み先のボード設定が Raspberry Pi Pico になっていない。
原因はこちらからは伝えず、どこまでは合っているかを一緒に確認しながら、本人に探させました。
次回
次回からモーターに入ります。モータードライバ(DRV8835)を使い、Picoからモーターを回します。LEDの明るさで使った analogWrite が、そのまま速さの調整に使えます。
ロボカップジュニア2027 に向けて、レスキュー(災害救助)とサッカーの2種目に取り組みます。プログラミングと電子工作の経験は問いません。