防犯用などに監視カメラがありますが、電源の確保や高価格の問題があります。既にカメラはあるのですが、さらに死角をなくすために、なるべく安価に設置したいと思い、ネットで探してみると、@乾電池式で配線不要、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() |
![]() |
![]() |
![]() |