Day 8|知覚:明るさに反応する
1. 今日やること
Section titled “1. 今日やること”- 光センサー(CdSセル) を配線する
- Picoで部屋の明るさ を測る
- 「暗くなったら動く」 仕組みを作る
スポンサーリンク(開発中はプレースホルダー)
2. 使う部品
Section titled “2. 使う部品”- Day 7のサーボ配線(そのまま)
- CdSセル(光導電セル) ×1
- ※うねうねした線が描いてある丸い部品
- 抵抗器(10kΩ) ×1
- ※帯の色:茶黒橙金など(330Ωとは違います!)
3. 完成形(今日のゴール)
Section titled “3. 完成形(今日のゴール)”センサーを手で覆って暗くすると、サーボモーターが「ガシャッ」と動きます。 外の世界の状況(明るさ)を見て、自分の行動を変える。これぞ「ロボット」です。
Step 1: 抵抗分圧回路を作る
Section titled “Step 1: 抵抗分圧回路を作る”CdSセルは「明るいと電気が通りやすく、暗いと通りにくい」部品です。 これをPicoで読むためには 「抵抗分圧(ていこうぶんあつ)」 という少し賢い配線が必要です。
- 3V3 → CdSセル
- CdSセル → GP26 (ADC0)
- 同じ場所(GP26) → 10kΩ抵抗 → GND
ポイント: センサーと抵抗が「縦一列」で手を繋ぎ、その真ん中からPicoへ線を引く形になります。
Step 2: 統合する
Section titled “Step 2: 統合する”入力(CdS)と出力(サーボ)のコードを合体させます。
5. コード
Section titled “5. コード”import machineimport time
# サーボ(出力)servo = machine.PWM(machine.Pin(15))servo.freq(50)
# 光センサー(入力)sensor = machine.ADC(0)
# 角度セット用関数def set_angle(angle): duty = int((angle / 180 * 6000) + 2000) servo.duty_u16(duty)
while True: # 1. 明るさを測る(暗いと値が小さく、明るいと大きい) # ※配線によっては逆になることもあります brightness = sensor.read_u16() print(brightness) # 調整用に数値を見る
# 2. 判断する(しきい値) # ※「20000」は環境によって変えてください if brightness < 20000: # 暗いとき:動く! set_angle(90) else: # 明るいとき:じっとする set_angle(0)
time.sleep(0.5)6. つまずきログ
Section titled “6. つまずきログ”⚠️ 反応しない / 逆に動く
- 原因: しきい値(20000)が合っていない
- → 部屋の明るさは環境によって全然違います。Thonnyの下の画面(Shell)に出ている数字を見て、「手で覆ったときの値」と「普段の値」の中間くらいの数字に書き換えてください。
7. 文系への翻訳
Section titled “7. 文系への翻訳”- センサー: ロボットの「視神経」。
- 抵抗分圧: 「綱引き」。3.3V組とGND組が綱引きをして、その勝敗(電圧の偏り)をPicoが見ています。CdSが弱る(抵抗が増える)とGND組が勝つので、電圧が下がります。
- しきい値: 「ここから先は暗闇とする!」という境界線。
8. 今日の達成
Section titled “8. 今日の達成”「『空気を読む(環境に合わせる)』能力を授けた!」
中身は完成しました。しかし、今のままではブレッドボードという「手術台」に繋がれたままです。 ダンボールや空き箱を使って、この子に「家(ボディ)」を与えましょう。