Raspberry Pi 備忘録 / Mbedもあるよ!

Raspberry Pi であれこれやった事の記録

金魚に餌をあげる装置を作る(ボツ案)

金魚に餌をあげる装置を作る(ボツ案)

機能

  1. エサやり - スマホからネットワーク越しに操作する
  2. 映像 - ネットワーク越しに閲覧する(動画? 静止画?)
  3. 温度測定 - DS18B20

バイ

  1. 本体 Raspberry pi 2 model B

Pi3は消費電力が面倒なので、こちらにする。

CPUパワーも十分足りると思われる。

  1. カメラ

どうしようか・・・。

  1. USB接続のWEBカメラにする方法 給電するUSBハブに接続すれば、本体の電力を食わない。

その代わり、USBハブを設置する必要が出る。

  1. 純正カメラモジュールを使用する方法 ケースを自作する必要があるが、コンパクトに収まりそう。

ただし、電力不足の懸念も有る。

  1. モーター

なんにせよ、円形なり、資格なりの餌BOX?を、回転させるなり、傾けるなりすることになりそう。

サーボモーター * 1台

  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を接続する。

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'.

f:id:pongsuke:20160615134646j:plain

無事撮影出来た。

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"

起動した。

f:id:pongsuke:20160615140447j:plain

スナップショットも試しておく

wget -O test.jpg http://192.168.100.94:8080/?action=snapshot

温度測定

DS18B20

f:id:pongsuke:20160616165142j:plain

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  623 13:01 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1  623 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

※注意

  1. サーボの角度指定で、-90 だと、回りきらなかったので、雑ですが -120 してあります。
  2. 普通は GPIO.setFunction(SERVO, GPIO.PWM) しっぱなしで、Destroy ではじめて GPIO.setFunction(SERVO, GPIO.IN) に戻すと思うのですが、プルプルうるさいので、こうしました。

ボツ!

グローバルIPを渡すことを前提に、WEBIOPIなどを使うことにしていたのだが、自宅ではルーターを触れないことが判明!

その2につづく!