17
17

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.

Raspiで使ったセンサ/アクチュエータと制御プログラムのまとめ

Posted at

約1年前に買って放置していたRaspberryPiで遊んだので、使ったセンサ/アクチュエータと制御プログラムをまとめます。

使用したコードはgithubに登録しています。
https://github.com/aratakokubun/RaspiBot.git
実装はpythonと一部shellで書いています。

Raspiでのプログラム概要

Twitterから操作を送信し、外部からセンサ情報を取得・アクチュエータを駆動するプログラを実装しています。
機能は以下の通り

  • カメラキャプチャ
  • カメラの首振り
  • エアコンのON/OFF
  • パソコンに設置した超音波測距センサの現在・ログのグラフ取得(基本的には自分とパソコン画面との距離)
  • 湿温度センサの現在・ログのグラフ取得

サーボモータ

アクチュエータ概要

  • GWS S03T
  • 指定した角度に回転する、ごく普通のサーボモータ
  • 値段 ¥1200 (秋月購入)
  • 5V, GND, 制御端子の3端子

用途

Twitterから角度を指定して指令を送り、搭載したwebカメラの角度を変える

実装

RaspberryPiのピン入出力制御ライブラリのRPi.GPIOを使用しています。
参考文献1のページを参考に実装しました。
以下処理の抜粋

  • 初期化
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
# サーボのGPIOピン番号を23に設定
SERVO_GPIO = 23
GPIO.setup(SERVO_GPIO, GPIO.OUT)
# 動作周波数は50Hz
HZ = 50
servo = GPIO.PWM(SERVO_GPIO, HZ)
servo.start(0.0)
  • 角度を指定して制御

ChangeDutyCycleメソッドで制御するが、動作範囲は2.0 - 12.00° - 180°に対応する。

dc = 2.0 + 10.0 * float(angle/180)
servo.ChangeDutyCycle(dc)
# Wait while finishing servo
time.sleep(0.5)
  • プログラム終了

GPIOをcleanupしてから終了します。

GPIO.cleanup(SERVO_GPIO)

赤外線LED(送信・受信)

センサ・アクチュエータ概要

受信モジュール

  • 赤外線リモコン受信モジュール GP1UXC41QS
  • 値段 ? (元から持ってた)
  • 5V, GND, 制御端子の3端子で回路は単純

送信モジュール

  • 赤外線LED OSI5FU5111
  • 値段 ? (元から持ってた)
  • GND, 制御端子の2端子

用途

リモコンの信号を取得し、同じ信号を赤外線LEDで送信

実装

Linux用の赤外線モジュール制御のライブラリであるlircを使用しました。
参考文献2のページを参考に実装しました。

  • lircでのリモコンの信号取得と発信する信号の設定
    lircの設定方法は参考文献2を参照してください。ここでは割愛します。
    簡単には以下の設定を行います。(全てroot権限が必要)

    1. /etc/lirc/hardware.confの設定を変更する。
    2. /boot/config.txtの設定を変更し、起動時にLIRCを有効にする。
    3. mode2 -d /dev/lirc0(hardware.confに設定した名称)コマンドでlircを起動し、リモコンの信号を赤外線受信モジュールに送信した際にデータが取れることを確認する。
    4. 3のコマンドで取得したデータをデータ送信用のコマンド定義と共に/etc/lirc/lircd.confに追記する。
    5. /etc/init.d/lirc startでlircを起動
    6. irsend SEND_ONCE <コマンド>でデータが送信できることを確認
  • 初期化
    初期化用のshellを用意しておき、pythonから初期化時に呼び出します。

initLirc.sh
sudo /etc/init.d/lirc stop
sudo /etc/init.d/lirc start
from subprocess import call
INIT_CMD = "sudo bash ./src/initLirc.sh"
call(INIT_CMD.strip().split(" "))
  • エアコン制御
from subprocess import call
ON_CMD = "sudo irsend SEND_ONCE aircon cooler_on"
OFF_CMD = "sudo irsend SEND_ONCE aircon cooler_on"

call(ON_CMD.strip().split(" "))
call(OFF_CMD.strip().split(" "))
  • プログラム終了
stopLirc.sh
sudo /etc/init.d/lirc stop
from subprocess import call
STOP_CMD = "sudo bash ./src/stopLirc.sh"
call(STOP_CMD.strip().split(" "))

測距センサ

センサ概要

  • HC-SR04
  • 超音の反射時間を利用して非接触で測距するセンサモジュール
  • 2-180cmまで測距可能
  • 値段 ¥400 (秋月購入)
  • 5V, GND, ECHO, TRIGGERの4端子

用途

パソコンに設置し、自分がパソコンに向き合ってる時の距離を測定

実装

こちらもRaspberryPiのピン入出力制御ライブラリのRPi.GPIOを使用しています。

  • 初期化
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
# TRIGGERのGPIOを17, ECHOのGPIOを27に設定
TRIG_GPIO = 17
ECHO_GPIO = 27
# TRIGGERは出力ピン、ECHOは入力ピンに設定
GPIO.setup(TRIG_GPIO, GPIO.OUT)
GPIO.setup(ECHO_GPIO, GPIO.IN)
# TRIGGERを0Vに設定
GPIO.output(TRIG_GPIO, GPIO.LOW)
  • 測定
GPIO.output(TRIG_GPIO, True)
time.sleep(0.00001)
GPIO.output(TRIG_GPIO, False)

while GPIO.input(ECHO_GPIO) == 0:
  signaloff = time.time()
while GPIO.input(ECHO_GPIO) == 1:
  signalon = time.time()
return (signalon - signal off) * 17000
  • プログラム終了

GPIOをcleanupしてから終了します。

GPIO.cleanup(TRIG_GPIO)
GPIO.cleanup(ECHO_GPIO)

湿温度センサ

センサ概要

  • DHT11
  • 温度を1度単位・湿度を1%単位で計測可能
  • 温度精度±2度・湿度精度±5%と精度は微妙
  • 取得に失敗することもあり、動作も不安定
  • 値段 ¥490 (amazon購入)
  • 5V, GND, 入出力の4端子

用途

部屋の湿温度の現在値とログを取得

実装

RaspberryPiからDHT11の温度/湿度を取得する為のプログラムがgithubに公開されていたので、これを利用
https://github.com/adafruit/Adafruit_Python_DHT

  • 初期化
import Adafruit_DHT
# DHTのGPIOを18番に設定
DHT_GPIO = 18
# センサを指定
sensor = Adafruit_DHT.DHT11
  • 測定
    1回だと失敗する可能性があるので、3回リトライしています。
MAX_TRIAL = 3
for _ in range(self.MAX_TRIAL):
  humidity, temperature =  Adafruit_DHT.read_retry(sensor, DHT_GPIO)
  if humidity is None and temperature is None:
    continue
  return [humidity, temperature]
  • プログラム終了

特に終了時に処理をする必要はなさそうです。

その他

  • Twitterでのコマンド送受信
    TwitterStreamingAPIを使用し、特定のメッセージを監視しています。

  • 各センサの終了時の処理
    atexitパッケージで終了処理のハンドラを登録していますが、クラスの__del__メソッドでもいい気がします・・・

参考文献

  1. RaspberryPiでのサーボ制御
    http://windvoice.hatenablog.jp/entry/2015/05/04/180110
  2. Raspberry Pi 2 でエアコン操作(赤外線リモコン編)

    http://kaiware007.hatenablog.jp/entry/2015/08/28/020356
  3. Raspberry Piに超音波距離計”HC-SR04”つけてみた

    http://arkouji.cocolog-nifty.com/blog/2014/05/raspberry-pihc-.html
  4. 温湿度センサDHT11をRaspberryPiに接続しグラフ表示

    http://blog.bnikka.com/raspberrypi/dht11-raspberrypi.html
17
17
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
17
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?