金魚に餌をあげる装置を作る(ボツ案)
金魚に餌をあげる装置を作る(ボツ案)
機能
- エサやり - スマホからネットワーク越しに操作する
- 映像 - ネットワーク越しに閲覧する(動画? 静止画?)
- 温度測定 - DS18B20
デバイス
- 本体 Raspberry pi 2 model B
Pi3は消費電力が面倒なので、こちらにする。
CPUパワーも十分足りると思われる。
- カメラ
どうしようか・・・。
- USB接続のWEBカメラにする方法 給電するUSBハブに接続すれば、本体の電力を食わない。
その代わり、USBハブを設置する必要が出る。
- 純正カメラモジュールを使用する方法 ケースを自作する必要があるが、コンパクトに収まりそう。
ただし、電力不足の懸念も有る。
- モーター
なんにせよ、円形なり、資格なりの餌BOX?を、回転させるなり、傾けるなりすることになりそう。
サーボモーター * 1台
- 餌ケース
ネットワーク環境
ラズパイを設置する場所では、グローバルIPを得られない、かつ、ルーターも設定できないので、ポートフォワーディングで対処するのは難しそう。
そこで、USB接続のデータ通信端末を検討する(失敗に終わる)。
金魚マシン(ラズパイ) > Server
クライアント(スマホ) > Server
の形にして、ラズパイからサーバーへデータを投げまくり、クライアントは、そのデータをサーバーから取得する形にしよう。
Raspberry Pi のセットアップ
16GのマイクロSDを、SDFormatter
でフォーマットする。
Noobsを解凍し、すべて入れる。
ラズパイに挿して起動。
昔のように、4G超えて使用できるような設定は、不要。最初から16Gなど使用できる。
日本語フォントを入れる
apt-get install fonts-takao ibus-mozc
IPを固定する
SSHでログインしやすいように、とりあえず、IPを固定しておく。
/etc/dhcpcd.conf
を編集する。
interface eth0 static ip_address=192.168.100.94/24 static routers=192.168.100.1 static domain_name_servers=192.168.100.1
WEBカメラを設定する
手元に有った HD WEBCAM C270
を接続する。
# lsusb Bus 001 Device 007: ID 046d:0825 Logitech, Inc. Webcam C270 Bus 001 Device 006: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB Bus 001 Device 004: ID 046d:c52b Logitech, Inc. Unifying Receiver Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub # ls /dev/video* /dev/video0
静止画での撮影テスト
fswebcam インストール
# apt-get install fswebcam
撮影する
~# fswebcam -d v4l2:/dev/video0 -i 0 -p YUYV test.jpg --- Opening v4l2:/dev/video0... /dev/video0 opened. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Writing JPEG image to 'test.jpg'.
無事撮影出来た。
MJPG-streamer
先に必要なソフトウェアを用意し、
ソースコードを取得、インストール先ディレクトリに設置、コンパイル&インストール。
# apt-get install subversion libjpeg-dev imagemagick # svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer # mv mjpg-streamer /usr/local/etc/ # cd /usr/local/etc/mjpg-streamer # make
起動する
貧弱な回線でストリーミングすることを考え、フレームレートを落として、画面を大きくした。
# ./mjpg_streamer -i "./input_uvc.so -f 6 -r 640x480 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"
起動した。
スナップショットも試しておく
wget -O test.jpg http://192.168.100.94:8080/?action=snapshot
温度測定
DS18B20
DQ と Vdd を、4,7k の抵抗でつなぐ。
なお、まちがえて 4.7の抵抗を繋いだ所、認識しませんでした。
1wireデバイスなので、有効にする。
/etc/modules に追加
w1-gpio w1-therm
/boot/config.txt
dtoverlay=w1-gpio-pullup,gpiopin=4
で、リブートしておく。
# ls /sys/bus/w1/devices/ 28-00000724377c w1_bus_master1 # cat /sys/bus/w1/devices/w1_bus_master1/28-00000724377c/w1_slave aa 01 4b 46 7f ff 06 10 84 : crc=84 YES aa 01 4b 46 7f ff 06 10 84 t=26625
GL08Dをつなぐ
指す前。
# ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1
刺す
# lsusb Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port Bus 001 Device 007: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub # ls -l /dev/ttyU* crw-rw---- 1 root dialout 188, 0 6月 23 13:01 /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 1 6月 23 12:30 /dev/ttyUSB1
# eject /dev/cdrom # echo "12d1 1506" >> /sys/bus/usb-serial/drivers/option1/new_id
wvdial
# apt-get install wvdial
苦戦中
WEBIOPI
Raspberry Pi 2 Mobdel B で使用できるように、パッチを当てる。
GitHub - doublebind/raspi: WebIOPi-0.7.1 Patch for Raspberry B+ and Pi 2
WebIOPi-0.7.1 Patch for Raspberry B+, Pi2, and Pi3 You have full access to all header pins (40 pins) on the Web interface.
Usage
$ wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz $ tar xvzf WebIOPi-0.7.1.tar.gz $ cd WebIOPi-0.7.1 $ wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch $ patch -p1 -i webiopi-pi2bplus.patch $ sudo ./setup.sh
How to Start WebIOPi
Follow the steps below if Raspbian is installed by NOOBS later than 1.4.2. $ cd /etc/systemd/system/ $ sudo wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi.service $ sudo systemctl start webiopi $ sudo systemctl enable webiopi
sudo systemctl disable webiopi
備忘録
設定ファイル
/etc/webiopi/config
temp2 = DS18B20
htmlファイル
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content = "height = device-height, width = 420, user-scalable = no" /> <title>WebIOPi | Demo</title> <script type="text/javascript" src="/webiopi.js"></script> <script type="text/javascript"> webiopi().ready(function() { var content, button; content = $("#content"); // Temp callMacroTemp(); // Servo button = webiopi().createButton("macro", "FEED", callMacro); content.append(button); webiopi().refreshGPIO(true); }); function callMacro() { webiopi().callMacro("feedServo", [], macroCallback); } function macroCallback(macro, args, data) { } function callMacroTemp() { webiopi().callMacro("getTemp", [], updateTemp); } function updateTemp(macro, args, data) { $("#temp").html(data); } </script> <style type="text/css"> button { display: block; margin: 5px 5px 5px 5px; width: 160px; height: 45px; font-size: 24pt; font-weight: bold; color: black; } </style> </head> <body> <div align="center"> <div><img src="http://192.168.100.94:8080/?action=stream" /></div> 室温 <span id="temp" style="color:#F00;"> 取得中...</span> ℃ <div id="content"></div> </div> </body> </html>
スクリプトファイル
# Imports import webiopi import time webiopi.setDebug() # Enable debug output GPIO = webiopi.GPIO # Retrieve GPIO lib SERVO = 21 # GPIO 21番を使用 # Called by WebIOPi at script loading def setup(): webiopi.debug("Script with macros - Setup") # Setup GPIOs GPIO.setFunction(SERVO, GPIO.PWM) GPIO.pwmWriteAngle(SERVO, 90) GPIO.setFunction(SERVO, GPIO.IN) # Looped by WebIOPi def loop(): webiopi.sleep(5) # Called by WebIOPi at server shutdown def destroy(): webiopi.debug("Script with macros - Destroy") # Reset GPIO functions GPIO.setFunction(SERVO, GPIO.IN) # A macro without args which return nothing @webiopi.macro def feedServo(): webiopi.debug("feedServo: " + time.asctime()) # 初期化 GPIO.setFunction(SERVO, GPIO.PWM) GPIO.pwmWriteAngle(SERVO, -120) time.sleep(1.0) # 餌を落とす GPIO.pwmWriteAngle(SERVO, 90) time.sleep(1.0) GPIO.setFunction(SERVO, GPIO.IN) @webiopi.macro def getTemp(): tmp = webiopi.deviceInstance("temp2") celsius = tmp.getCelsius() return celsius
※注意
- サーボの角度指定で、-90 だと、回りきらなかったので、雑ですが -120 してあります。
- 普通は
GPIO.setFunction(SERVO, GPIO.PWM)
しっぱなしで、Destroy ではじめてGPIO.setFunction(SERVO, GPIO.IN)
に戻すと思うのですが、プルプルうるさいので、こうしました。
ボツ!
グローバルIPを渡すことを前提に、WEBIOPIなどを使うことにしていたのだが、自宅ではルーターを触れないことが判明!
その2につづく!