照度センサー

明るさに反応させてみる

CdS照度センサーを使って、部屋の明るさに応じてベゼリーを反応させてみましょう。

CdS照度センサーを使うには、ベゼボードにADコンバータを取り付けておく必要があります。

CdS(硫化カドミウム)照度センサーをご用意ください。

秋月電子通商

ベゼボードの表記に従い、10kΩの抵抗を半田付けします。

CdSセンサーをベゼボードの「CdS」と「3V」に刺してください。向きは関係ありません。

サンプルプログラムを実行してみましょう。CdSセンサーに手をかざすなどして暗くするとベゼリーがしゃべります。

python3 sample_CdS1.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Sample Code : 照度センサーのサンプル
# CdSセンサーをアナログinput0と3Vに接続してください。

# ライブラリの読み込み
from time import sleep
import RPi.GPIO as GPIO
import subprocess                     # 外部プロセスを実行するモジュール
import bezelie

# 準備
bez = bezelie.Control()               # べゼリー操作インスタンスの生成
bez.moveCenter()                      # サーボをセンタリング
sleep(0.5)

# MCP3204からSPI通信で12ビットのデジタル値を取得。4チャンネル使用可
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
    if adcnum > 7 or adcnum < 0:
        return -1
    GPIO.output(cspin, GPIO.HIGH)
    GPIO.output(clockpin, GPIO.LOW)
    GPIO.output(cspin, GPIO.LOW)

    commandout = adcnum
    commandout |= 0x18  # スタートビット+シングルエンドビット
    commandout <<= 3    # LSBから8ビット目を送信するようにする
    for i in range(5):
        # LSBから数えて8ビット目から4ビット目までを送信
        if commandout &amp; 0x80:
            GPIO.output(mosipin, GPIO.HIGH)
        else:
            GPIO.output(mosipin, GPIO.LOW)
        commandout <<= 1
        GPIO.output(clockpin, GPIO.HIGH)
        GPIO.output(clockpin, GPIO.LOW)
    adcout = 0
    # 13ビット読む(ヌルビット+12ビットデータ)
    for i in range(13):
        GPIO.output(clockpin, GPIO.HIGH)
        GPIO.output(clockpin, GPIO.LOW)
        adcout <<= 1
        if i>0 and GPIO.input(misopin)==GPIO.HIGH:
            adcout |= 0x1
    GPIO.output(cspin, GPIO.HIGH)
    return adcout

# 初期設定
GPIO.setmode(GPIO.BCM)

# 変数
value = 1000               # 入力値がこの値を下回ると反応する

# 定数
ttsJpn = "exec_talkJpn.sh" # 発話シェルスクリプトのファイル名
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8
# SPI通信用の入出力を定義
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICS, GPIO.OUT)

# 関数
def main():
  try:
    print ("開始します")
    while True:
      inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)
      print("input = "+str(inputVal0))
      if inputVal0 < value:              # しきい値は条件によって変えてください。
        bez.movePitch(1, 20)            # 上を向く
        subprocess.call("sh "+ttsJpn+" "+"にゃああ", shell=True)
        sleep(0.5)
        bez.movePitch(1, 0)
        sleep(0.5)
      sleep(1)

  except KeyboardInterrupt:
    print ("終了しました")
    GPIO.cleanup()                     # ポートをクリア

# 直接実行された場合の処理
if __name__ == "__main__":
    main()

CdSセル(5mm)はベゼリーの頭部に取り付けることができます。

ジャンパーケブルなどで延長しましょう。

その場所の明るさに反応するだけでなく、タッチセンサーの代わりとして、頭をナデナデされたときに反応させることもできます。