2学期開始!体験授業 受付中 →
ROBO SCIENCE

入力と出力 ―
CdSで暗くなったら、LEDが光る。

2026.10.08
R3 PE(Pre-expert)

これまでは、ロボットに命令を出すだけでした。LEDを光らせ、モーターを回す。どれも、こちらから一方的に出す話です。これを出力といいます。

出すだけでは、サッカーロボットになりません。ボールがどこにあるか分からないまま、ただモーターが回っているだけになります。

ロボットは、この3つをくり返している

自律型のロボットがやっていることは、つきつめると3つです。順に入力・判断・出力といいます。

読む(入力) センサー 決める(判断) プログラム 動かす(出力) モーター くり返す
センサーで読み(入力)、プログラムで決め(判断)、モーターへ出す(出力)。これを電源が切れるまでくり返します。

前回までに作ったのは、右端の出力だけでした。今回、入力と判断が加わります。

明るさで、電気の通りやすさが変わる部品

使ったのは CdS という小さな部品です。光が当たると電気を通しやすくなり、暗くなると通しにくくなります。

ブレッドボードに挿したCdS。丸い頭の表面にうねうねした電極の模様がある
CdS。丸い頭に見えるうねうねした模様が電極です。光が当たる面積を広くとるために、わざと長く曲げてあります。

変化はわずかではありません。明るいときと暗いときで、電気の通しやすさが1000倍以上ちがうこともあります。だから、少しの明るさの差でもはっきり数字に出ます。

マイコンは「通しやすさ」を読めない

ロボットの頭脳であるマイコンが読めるのは電圧だけです。電気の通しやすさは、そのままでは読めません。

そこで、通しやすさの変化を電圧の変化に置き換える仕掛けを使います。

3V3(OUT) GND CdS 明るさで抵抗が変わる 10kΩ 決まった値 GP26(A0) ここの電圧を読む 明るい → 抵抗 小 → 値 大 暗い  → 抵抗 大 → 値 小
CdS と決まった値の抵抗をたてにつなぎ、その真ん中の電圧を読みます。分圧(ぶんあつ)といいます。

綱引きに似ています。片方の力が弱くなれば、真ん中の印はそちら側に寄ります。

ピンは、入力か出力のどちらか

マイコンには、たくさんのピンがあります。ただし、1本のピンができるのは入力か出力のどちらか一方だけです。両方を同時にはできません。

LEDをつないだピンは出力。電気を出す側です。CdSをつないだピンは入力。電圧を読む側です。

そのため、出力として使うピンは、プログラムの最初にそう書いておきます。

pinMode(LED, OUTPUT);     // LEDのピンは出力として使う

では入力のほうはどう書くのか。こちらは書きません。CdSをつないだピンは、analogRead() で読んだ時点で入力として扱われます。

つないだ形は、この2枚で決まる

ここまでの話をまとめると、配線はこうなります。

配線図
ブレッドボードの配線図。CdSと10kΩの抵抗、Raspberry Pi Pico、220Ωの抵抗とLEDがつながっている
ブレッドボードに、どう挿すか。実際に手を動かすときに見る図です。
回路図
回路図。3V3からCdSと10kΩを通ってGNDへ、その中間がGP26(A0)につながる。GP15から220Ωを通ってLEDへ
電気として、どうつながっているか。同じ回路を、記号で描いたものです。

同じ回路を2通りに描いています。配線図は作るための図、回路図は考えるための図です。ブレッドボードの穴がどこにつながっているかを気にせず、電気の流れだけを見られるのが回路図のほうです。

明るさをパソコンで見る

はじめに書くのは、とても短いプログラムです。CdSの値を読んで、パソコンに送る。それだけです。LEDはまだ動かしません。

const int CDS = A0;

void setup() {
  Serial.begin(9600);          // パソコンと話す準備
}

void loop() {
  int v = analogRead(CDS);     // 明るさを数字で読む
  Serial.println(v);           // パソコンに送る
  delay(200);
}

書き込み、画面上のシリアルモニタを開くと数字が流れはじめます。これは CdS が感じている明るさの値です。

Arduino IDE のシリアルモニタ。930から945あたりの数字が次々に流れている
教室の明るさで読んだ値。手でおおうと数字が下がり、光を当てると上がります。

明るさを測り、しきい値を決める

生徒はこの表を、自分の手で埋めます。ある日の教室では、こうなりました。

やってみることどういう状態か値
手でおおう暗い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が点きます。離すと消えます。

しきい値のあたりで、ランプがちらつく

やってみると、ちょうどしきい値あたりの明るさのとき、LEDがチカチカします。

壊れているわけではありません。数字がしきい値をまたいで行ったり来たりしているだけで、プログラムは正しく動いています。

この形のまま、ボールを追うロボットになる

今回のプログラムは、見た目は「暗くなったらランプが点く」だけのものです。

ただ、CdS をボールセンサーに、LED をモーターに置き替えれば、それはもうボールを追うロボットです。

サッカーのボールは赤外線を出していて、CdS では見えません。そのため、この先で専用のセンサーに取りかえます。ですが、数字として読む方法はまったく同じです。今回おぼえたことが、そのまま使えます。

ロボサイエンスについて

ロボカップジュニア2027 に向けて、レスキュー(災害救助)とサッカーの2種目に取り組みます。プログラミングと電子工作の経験は問いません。

前回までの回:初回はLEDの点滅から →
ロボサイエンスの記録一覧 →
体験授業・お問い合わせ →

← ロボサイエンスの記録一覧へ戻る