防犯用などに監視カメラがありますが、電源の確保や高価格の問題があります。既にカメラはあるのですが、さらに死角をなくすために、なるべく安価に設置したいと思い、ネットで探してみると、@乾電池式で配線不要、A屋外・屋内のどこでも付けられる、B赤外線LEDで夜間でも撮影可能、C安価、のセンサーカメラ(SD1000、REVEX製、\3,930)を見つけ、アマゾンで入手した。
カタログによると、SD1000は新品単3アルカリ電池3本で、15秒の動画を1000回程度撮影することが出来とある(センサーライトOFF時)。センサーの感知距離は10m先の人物も感知する。しかし、センサーの直ぐ前を横切る人は、録画開始が間に合わず、人物の録画が出来ていなかった。
どんなときにも対応というわけには行かないが、安価で簡単に使えるのは便利で、畑の果物や野菜泥棒の監視への利用例がTVでも紹介されている(ゴミの不法投棄監視にも使えるかな・・)。。
SD1000電池式センサカメラ | カメラの裏側(スイッチとカードスロット) |
撮影例(昼間) | 撮影例(夜間) |
ラズペリーパイにはアルディーノと異なり、アナログ信号の電圧値を測定する端子が無い。そこで、よく使われるのがA/D変換ICが使われる。AD変換器としてSPI接続のMCP3208を用い、光が当たると抵抗値が変化するPDS光センサのアナログ電圧出力値をラズパイに取り込みを行った。
実験回路図 | 配線状況 |
<GPIOZeroによるLED点灯テスト(gpzeroled.py)> |
from gpiozero import LED from gpiozero import Button from signal import pause led = LED(17) button = Button(23) button.when_pressed = led.on button.when_released = led.off pause() |
<GPIOZeroによるLED点滅(gpzeroblink.py)> |
from gpiozero import LED from signal import pause led = LED(17) led.blink() pause() |
<GPIOZeroによるAD変換(gpzeroadc.py)> | <spidevライブラリによるAD変換(spitest.py)> | |
from gpiozero import MCP3208 Vref = 3.29476 pot = MCP3208(channel = 0) print(str(pot.value * Vref)+" V") |
importt spidev vref = 3.29476 spi = spidev.SpiDev() spi.open(0,0) # spi_bus=0, cs=0 adc = spi.xfer2([0x06,0x00,0x00]) # Singleend, ,ch=0 data = ((adc[1] & 0xff)<< 8) | adc[2] print ( str(Vref * data / 4095) + "V") spi.close() |
|
CDS電圧測定例(gpiozero) | CDS電圧測定例(spidev) |
<GPIOZeroによるカラーLED制御(gpzerocled.py)> |
from gpiozero import RGBLED led = RGBLED(17, 27, 22 , pwm=True) led.color = (1.0, 0.0, 1.0) |
<GPIOZeroによるDCモータ制御(gpzerodcm.py)> |
from gpiozero import Motor from time import sleep motor = Motor(forward=23, backward=24) print("start") motor.forward() sleep(2) motor.backward() sleep(2) motor.stop() print("end") |
<GPIOZeroによるサーボモータ制御(gpzeroservo.py)> |
from gpiozero import Servo from time import sleep servo = Servo(17) while True: servo.min() sleep(1) servo.max() sleep(1) servo.mId() sleep(1) |
<GPIOZeroによるサーボモータ角度制御(gpzeroangservo.py)> |
from gpiozero import AngularServo s = AngularServo(17, min_angle=-42, max_angle=44) s.angle = 0.0 |
<GPIOZeroによるロボット制御(gpzerorobo.py)> |
from gpiozero import Robot from time import sleep robot = Robot(left=(4, 14), right=(17, 18)) for i in range(4): robot.forward() sleep(10) robot.right() sleep(1) robot.left() sleep(1) robot.backward() sleep(1) robot.stop() |
<GPIOZeroによるロボット制御(gpzerorobo4b.py)> |
from gpiozero import Button, Robot from time import sleep from signal import pause robot = Robot((17, 18), (22, 23)) left = Button(2) right = Button(3) forward = Button(4) backward = Button(5) go = Button(6) instructions = [] def add_instruction(btn): instructions.append({ left: (-1, 1), right: (1, -1), forward: (1, 1), backward: (-1, -1), }[btn]) def do_instructions(): instructions.append((0, 0)) robot.source_delay = 0.5 robot.source = instructions sleep(robot.source_delay * len(instructions)) del instructions[:] go.when_pressed = do_instructions for button in (left, right, forward, backward): button.when_pressed = add_instruction pause() |
<GPIOZeroによるロボット制御(gpzerorobo2s.py)> |
from gpiozero import Robot, MCP3208 from signal import pause robot = Robot(left=(4, 14), right=(17, 18)) left = MCP3208(0) right = MCP3208(1) robot.source = zip( scaled(left.values,,-1,1) , scaled(right.values),-1,1) ) pause() |