1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

日本Androidの会秋葉原支部ロボット部Advent Calendar 2018

Day 14

Raspberry Pi + Camera + 超音波ソナー + リレー

Last updated at Posted at 2018-12-13

https://qiita.com/nanbuwks/items/a14bca7ce6b5003e1935
のバリエーションです

RaspberryPiでHeadlessで超音波ソナーで何か検出したらリレーで照明を付けて、カメラ撮影するよ!

準備

以下まで終わらせておこう。

  • Raspberry Pi を用意
  • Raspberry Pi へ Raspbian をインストール
  • Raspberry Pi がインターネットに接続
  • ipアドレスを取得しておく
  • 母艦(PC)からログイン

cf., 「Raspberry Pi 最初の設定をCUIで行う(ディスプレイ、キーボードがある場合)」
https://qiita.com/nanbuwks/items/9a1d46c22e898178015c

インストール

sudo apt-get install apache2

設定


sudo raspi-config

で、カメラを有効にします。

リレーをON/OFFする

まずは、リレーをGPIO 0番(WiringPi番号)に取付て、動作するかどうかテストです。


gpio mode 0 OUT

として、OUTPUTモードにした後に、


gpio write 0 1

として、リレーがONになったでしょうか?


gpio write 0 0

とすると、リレーがOFFとなります。

カメラを撮影する


sudo rm /var/www/html/index.html

sudo chmod 777 /var/www/html

とします。(一度だけすれば、OKです)

raspistill -o /var/www/html/201812081719.jpg

とすると、

http://(IPアドレス)

で写真が見えます。

写真を撮るスクリプトをつくる


nano shot.sh

として、画面を開きます。



raspistill -o /var/www/html/shottest.jpg

として保存します。

これを実行すると、キーボードで入力したように実行できます。

実行のためには、実行許可を与えます。


chmod 777 shot.sh

として、


./shot.sh

とすると、shottest.jpg が撮影出来たでしょうか?

時刻を自動で写真のファイル名にする

OKだったら、次に、自動で日付をつけるようにします。
shot.shの中身を、


raspistill -o /var/www/html/`date +%Y%m%d%H%M%S`.jpg

とします。


./shot.sh

で実行すると

と出てきました。

ライトをつけて写真を撮る


gpio write 0 1
sleep 1
raspistill -o /var/www/html/`date +%Y%m%d%H%M%S`.jpg
gpio write 0 0

sleep 1 というのは、1秒待つという意味です。

センサープログラムを作る

WiringPi でいうGPIO 1番に磁石センサーを繋いでみました


gpio mode 1 in
while [ 1 ]
do
  SENSOR=$(gpio read 1)
  if test "1" = $SENSOR ; then
    echo "Detect"
  else
    echo "Normal"
  fi
  sleep 0.1  
done

これで、通常の場合は Normal 、反応があったらDetect と出ます。

センサー連動で写真を撮る

以下のシェルスクリプトを使って実行してみます。


gpio mode 0 out
gpio mode 1 in
while [ 1 ]
do
  SENSOR=$(gpio read 1)
  if test "0" = $SENSOR ; then
    echo "Detect"
    gpio write 3 1
    sleep 1
    raspistill -o /var/www/html/`date +%Y%m%d%H%M%S`.jpg
    gpio write 3 0
    sleep 20 
  else
    echo "Normal"
  fi
  sleep 0.1  
done

今回は、磁石センサーの他にWiringPI のGPIO3番にブザーを取り付けてみました。
これで、センサーに反応があったら写真を撮影して、20秒待って次の反応を待ちます。
また、

    gpio write 3 1

のところで、ブザーから音が鳴ります。

ライトを光らせる

さて、WiringPi GPIO 0 番にはリレーが付いていました。リレーにLEDライトを取り付けておくと、ライトを点灯してカメラ撮影ができるようになります。プログラムは、

    gpio write 3 1
↓
    gpio write 0 1

のように、書き直す必要があります。(書き直す箇所は、更にもう一箇所ありますね!)

超音波ソナーを設定する

超音波ソナーを使って距離を即テイしてみます。
今まではシェルスクリプトだったのですが、だんだん複雑になってきましたのでpythonを使うことにします。

Using a Raspberry Pi distance sensor (ultrasonic sensor HC-SR04)
https://tutorials-raspberrypi.com/raspberry-pi-ultrasonic-sensor-hc-sr04/

を元にして以下のプログラムを作ります。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import os,signal
import subprocess

def reading(sensor):
    import time
    import RPi.GPIO as GPIO
    GPIO.setwarnings(False)

    GPIO.setmode(GPIO.BOARD)
    TRIG = 18
    ECHO = 13

    if sensor == 0:
        GPIO.setup(TRIG,GPIO.OUT)
        GPIO.setup(ECHO,GPIO.IN)
        GPIO.output(TRIG, GPIO.LOW)
        time.sleep(0.3)

        GPIO.output(TRIG, True)
        time.sleep(0.00001)
        GPIO.output(TRIG, False)
        while GPIO.input(ECHO) == 0:
          signaloff = time.time()

        while GPIO.input(ECHO) == 1:
          signalon = time.time()

        timepassed = signalon - signaloff
        distance = timepassed * 17000
        return distance
        GPIO.cleanup()
    else:
        print "Incorrect usonic() function varible."
level=0
while 1:
  distance = reading(0)
  print distance
  time.sleep(0.01)

と直したものを、sonner.pyとして保存します。

以下のようにして実行します。


python  sonner.py

すると距離が表示されます。

超音波ソナーで距離を測定してライトとカメラを動作させる


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import os,signal
import subprocess
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)
TRIG = 27
ECHO = 18
RELAY = 17
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.setup(RELAY,GPIO.OUT)

def reading(sensor):

    if sensor == 0:
        GPIO.output(TRIG, GPIO.LOW)
        time.sleep(0.3)

        GPIO.output(TRIG, True)
        time.sleep(0.00001)
        GPIO.output(TRIG, False)
        signaloff = time.time()
        while GPIO.input(ECHO) == 0:
          signaloff = time.time()

        while GPIO.input(ECHO) == 1:
          signalon = time.time()

        timepassed = signalon - signaloff
        distance = timepassed * 17000
        return distance
        GPIO.cleanup()
    else:
        print "Incorrect usonic() function varible."

def shot():
  GPIO.output(RELAY, True)
  time.sleep(1)
  cmd = "raspistill -o /var/www/html/`date +%Y%m%d%H%M%S`.jpg"
  subprocess.call(cmd, shell=True)
  GPIO.output(RELAY, False)
while 1:
  distance = reading(0)
  print distance
  if ( distance < 120 ):
    print("bingo")
    shot()
  time.sleep(0.1)

これを実行すると、ソナーで検出したらライトを点灯し、写真撮影します。写真撮影したものは同じネットワークにつながったWebブラウザから閲覧できます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?