SyntaxHighlighter

ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示
ラベル Raspberry Pi の投稿を表示しています。 すべての投稿を表示

2015年9月8日火曜日

赤外線センサをArduino経由のシリアル通信で受信する

Arduinoに赤外線センサSE-10を接続し、Raspberry Piで読み取ってみた。

今回使ったもの

  • Arduino UNO
  • 人感センサSE-10
  • 抵抗器:330Ω,10kΩ
  • 赤色LED
  • ピンヘッダ (3pin):SE-10をブレッドボードに繋ぐため
  • Raspberry Pi

配線図

fritzingで配線図を描いてみる。
SE-10側に10kΩ、LEDに330Ωの抵抗を繋ぐ。

ソースコード

Arduino

センサが反応すると1を出力。
反応後5秒間LEDが点灯し、その間は不感時間とする(チャタリング防止のため)。
const int ledPin = 13;
const int pirPin = 2;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (digitalRead(pirPin) == LOW) {
    digitalWrite(ledPin, HIGH);
    Serial.println("1");
    delay(5000); //不感帯を5秒に設定
  } else {
    digitalWrite(ledPin, LOW);
  }
  delay(100);
}

Python

pySerial
ArduinoのUSBデバイス名は/dev/ttyACM0。これはdmesg等で確認できる。
センサが感知すると、時刻と共に出力される。
# coding: UTF-8
from serial import *
from sys import exit
from datetime import datetime

# ArduinoのUSBデバイス名
port = '/dev/ttyACM0'

# シリアルポートを開く
try:
    ser = Serial(port, 9600)
    print('open port: %s' % port)
except:
    print('cannot open port: %s' % port)
    exit(1)

# 読み出しと出力
while True:
    # 1ライン単位で読み出し、末尾の改行コードを削除
    line = ser.readline().rstrip() 
    try:
        print(datetime.now(),line)
    except Exception as e:
        print(e.message)

参考

秋月電子の焦電型赤外線センサユニット(SE-10)を使う

2015年8月9日日曜日

Raspberry Pi上でTWE-Lite-2525AからのデータをToCoStickを使って受信する

Raspberry PiにToCoStickを繋いで、加速度センサTWE-Lite-2525Aから送られてきた情報をシリアル通信でモニタリングするために行った作業のメモ。
ToCoStickのアプリはデフォルト(超簡単!TWEアプリ)のまま利用。

Raspberry PiのUSBポートにToCoStickを挿し、dmesgを確認。ttyUSB0として認識されたようだ。
user@raspberrypi ~ $ dmesg
(中略)
[  554.996366] usb 1-1.2: Product: TWE-Lite-USB
[  554.996382] usb 1-1.2: Manufacturer: TOCOS
[  554.996398] usb 1-1.2: SerialNumber: XXXXXXXX
[  555.003578] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[  555.003774] usb 1-1.2: Detected FT232RL
[  555.004697] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
シリアル通信を行うため、cuコマンドを使えるようにする。
しかし、Raspberry Piの初期ユーザであるpi以外で接続を試みると、権限がないと言われてしまう。
user@raspberrypi ~ $ sudo apt-get install cu
user@raspberrypi ~ $ cu -l /dev/ttyUSB0 -s 115200
cu:  open  (/dev/ttyUSB0):  Permission denied
cu:  /dev/ttyUSB0:  Line in use
どうやら、シリアルポートはdialoutというグループに属していないと一般ユーザはもちろん、rootであっても利用できないようだ(初期ユーザであるpiは登録されているので使える)。なので使用しているユーザを追加してやる。
user@raspberrypi ~ $ sudo vigr
- dialout:x:20:pi
+ dialout:x:20:root,user
すると「整合性を保つために /etc/gshadow を変更する必要があるかもしれません。」とメッセージが出る。なので/etc/gshadowも同じように修正する。
user@raspberrypi ~ $ sudo vim /etc/gshadow
- dialout:x:20:pi
+ dialout:x:20:root,user
一度ログアウトし、再度cuコマンドで接続。無事接続され、TWE-Lite-2525Aを叩いたり動かすとログが出力される。ちなみにシリアル通信を終了させるには~.と入力する。Ctrl+Cでは終了できない。
user@raspberrypi ~ $ cu -s 115200 -l /dev/ttyUSB0
Connected.
:788115017B81020950002F2C000BCD00080F403C3A5E5EDE
:788115018A81020950002F34000BCD00010F3E3E3A5E66C6
:788115018A81020950002F3C000BCD00000F3E3E3A5E56CF
:788115017881020950002F44000BCD00000F3E3E3A5E56D9
~.

Disconnected.
続いて、公式で用意されているPythonによる読み出しスクリプトを動かしてみる。

このスクリプト(twelite_read.py)は引数に指定したポートへ接続し、TWE-Lite標準アプリの出力を整理して表示してくれる。
user@raspberrypi ~/python $ python twelite_read.py /dev/ttyUSB0
open serial port: /dev/ttyUSB0

:788115019081020950002F64000BC500010F3E3E3A5E56A8
  command   = 0x81 (data arrival)
  src       = 0x78
  src long  = 0x81020950
  dst       = 0x00
  pktid     = 0x15
  prtcl ver = 0x01
  LQI       = 144 / -48.10 [dbm]
  time stmp = 189.562 [s]
  relay flg = 0
  volt      = 3013 [mV]
  DI1=1/1  DI2=0/1  DI3=0/1  DI4=0/1
  AD1=1000 AD2=0996 AD3=0932 AD4=1508 [mV]
DI0~4はそれぞれ下記の動作に対応している。上記の例ではDI1が1/1になっているので、TWE-Lite-2525Aを1回叩いたことを意味している。
  • DI1: 軽く1回叩く
  • DI2: 軽く2回叩く
  • DI3: 落とす(50cm~?)
  • DI4: 動かす