Skip to content

Day 8|知覚:明るさに反応する

  • 光センサー(CdSセル) を配線する
  • Picoで部屋の明るさ を測る
  • 「暗くなったら動く」 仕組みを作る

スポンサーリンク(開発中はプレースホルダー)

NO IMAGE
Raspberry Pi Pico Hピンヘッダ付き
NO IMAGE
ブレッドボード標準サイズ
NO IMAGE
マイクロサーボ SG90青い9gサーボ
NO IMAGE
CdSセル(光センサー)光導電セル
NO IMAGE
抵抗器 10kΩ茶黒橙金
NO IMAGE
ジャンパーワイヤオス-オス
  • Day 7のサーボ配線(そのまま)
  • CdSセル(光導電セル) ×1
    • ※うねうねした線が描いてある丸い部品
  • 抵抗器(10kΩ) ×1
    • ※帯の色:茶黒橙金など(330Ωとは違います!)

センサーを手で覆って暗くすると、サーボモーターが「ガシャッ」と動きます。 外の世界の状況(明るさ)を見て、自分の行動を変える。これぞ「ロボット」です。

CdSセルは「明るいと電気が通りやすく、暗いと通りにくい」部品です。 これをPicoで読むためには 「抵抗分圧(ていこうぶんあつ)」 という少し賢い配線が必要です。

  1. 3V3 → CdSセル
  2. CdSセル → GP26 (ADC0)
  3. 同じ場所(GP26) → 10kΩ抵抗 → GND

ポイント: センサーと抵抗が「縦一列」で手を繋ぎ、その真ん中からPicoへ線を引く形になります。

入力(CdS)と出力(サーボ)のコードを合体させます。

import machine
import 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)

⚠️ 反応しない / 逆に動く

  • 原因: しきい値(20000)が合っていない
    • → 部屋の明るさは環境によって全然違います。Thonnyの下の画面(Shell)に出ている数字を見て、「手で覆ったときの値」と「普段の値」の中間くらいの数字に書き換えてください。
  • センサー: ロボットの「視神経」。
  • 抵抗分圧: 「綱引き」。3.3V組とGND組が綱引きをして、その勝敗(電圧の偏り)をPicoが見ています。CdSが弱る(抵抗が増える)とGND組が勝つので、電圧が下がります。
  • しきい値: 「ここから先は暗闇とする!」という境界線。

「『空気を読む(環境に合わせる)』能力を授けた!」

中身は完成しました。しかし、今のままではブレッドボードという「手術台」に繋がれたままです。 ダンボールや空き箱を使って、この子に「家(ボディ)」を与えましょう。