これまでは、ロボットに命令を出すだけでした。LEDを光らせ、モーターを回す。どれも、こちらから一方的に出す話です。これを出力といいます。
出すだけでは、サッカーロボットになりません。ボールがどこにあるか分からないまま、ただモーターが回っているだけになります。
ロボットは、この3つをくり返している
自律型のロボットがやっていることは、つきつめると3つです。順に入力・判断・出力といいます。
前回までに作ったのは、右端の出力だけでした。今回、入力と判断が加わります。
明るさで、電気の通りやすさが変わる部品
使ったのは CdS という小さな部品です。光が当たると電気を通しやすくなり、暗くなると通しにくくなります。
変化はわずかではありません。明るいときと暗いときで、電気の通しやすさが1000倍以上ちがうこともあります。だから、少しの明るさの差でもはっきり数字に出ます。
マイコンは「通しやすさ」を読めない
ロボットの頭脳であるマイコンが読めるのは電圧だけです。電気の通しやすさは、そのままでは読めません。
そこで、通しやすさの変化を電圧の変化に置き換える仕掛けを使います。
綱引きに似ています。片方の力が弱くなれば、真ん中の印はそちら側に寄ります。
ピンは、入力か出力のどちらか
マイコンには、たくさんのピンがあります。ただし、1本のピンができるのは入力か出力のどちらか一方だけです。両方を同時にはできません。
LEDをつないだピンは出力。電気を出す側です。CdSをつないだピンは入力。電圧を読む側です。
そのため、出力として使うピンは、プログラムの最初にそう書いておきます。
pinMode(LED, OUTPUT); // LEDのピンは出力として使う
では入力のほうはどう書くのか。こちらは書きません。CdSをつないだピンは、analogRead() で読んだ時点で入力として扱われます。
つないだ形は、この2枚で決まる
ここまでの話をまとめると、配線はこうなります。
同じ回路を2通りに描いています。配線図は作るための図、回路図は考えるための図です。ブレッドボードの穴がどこにつながっているかを気にせず、電気の流れだけを見られるのが回路図のほうです。
明るさをパソコンで見る
はじめに書くのは、とても短いプログラムです。CdSの値を読んで、パソコンに送る。それだけです。LEDはまだ動かしません。
const int CDS = A0;
void setup() {
Serial.begin(9600); // パソコンと話す準備
}
void loop() {
int v = analogRead(CDS); // 明るさを数字で読む
Serial.println(v); // パソコンに送る
delay(200);
}
書き込み、画面上のシリアルモニタを開くと数字が流れはじめます。これは CdS が感じている明るさの値です。
明るさを測り、しきい値を決める
生徒はこの表を、自分の手で埋めます。ある日の教室では、こうなりました。
| やってみること | どういう状態か | 値 |
|---|---|---|
| 手でおおう | 暗い | 500 以下 |
| そのまま置く | ふつうの教室 | 900 くらい |
| ライトを当てる | 明るい | 1023(上限) |
ただし、この数字をそのまま使うことはできません。教室の明るさ、部品の個体差、使った抵抗の値で変わるからです。隣の席の子の数字を写しても、自分のロボットは動きません。
決めたしきい値を、プログラムに書く
測った数字から、「ここより暗ければ暗いとみなす」というしきい値を決めます。手でおおったときの値より、少し上に取ります。今回は 500 にしました。
そして、入力・判断・出力の3つがそろいます。
const int CDS = A0;
const int LED = 15;
const int SHIKII = 500; // ← 自分で測った値から決める
void setup() {
pinMode(LED, OUTPUT); // 出力のピンだけ設定する
} // 入力(CdS)の設定はいらない
void loop() {
int v = analogRead(CDS); // 入力:明るさを読む
if (v < SHIKII) { // 判断:しきい値より暗い?
digitalWrite(LED, HIGH); // 出力:点ける
} else {
digitalWrite(LED, LOW); // 出力:消す
}
}
if は「もし〜なら」。これが入ったことで、プログラムが自分で分かれ道を選べるようになりました。
これまでは、書いたとおりに上から順に動くだけでした。今回からは、そのときの状況で動きが変わります。
しきい値のあたりで、ランプがちらつく
やってみると、ちょうどしきい値あたりの明るさのとき、LEDがチカチカします。
壊れているわけではありません。数字がしきい値をまたいで行ったり来たりしているだけで、プログラムは正しく動いています。
この形のまま、ボールを追うロボットになる
今回のプログラムは、見た目は「暗くなったらランプが点く」だけのものです。
ただ、CdS をボールセンサーに、LED をモーターに置き替えれば、それはもうボールを追うロボットです。
サッカーのボールは赤外線を出していて、CdS では見えません。そのため、この先で専用のセンサーに取りかえます。ですが、数字として読む方法はまったく同じです。今回おぼえたことが、そのまま使えます。
ロボカップジュニア2027 に向けて、レスキュー(災害救助)とサッカーの2種目に取り組みます。プログラミングと電子工作の経験は問いません。