「RaspberryPi」に無線モジュール「TWE-Lite DIP」を接続してUART通信をする。
TWE-Lite DIP端末のアナログ入力をRaspberryPiに取り込み、入力電圧が1Vを越えると
端末のLEDを点灯させる試みです。
動作画像をYouTubeにアッしてあります。
無線モジュールTWE-Lite DIP は東京コスモス(株)の製品で完成品でも\1,890と安価ですし、初心者にも解りやすい説明書と
ピン配置表が付いてきます。電子工作大好き人間の好奇心をくすぐる楽しいガジェットです。
今回の試みのためUART-RS232Cレベルコンバータの作成から始めましたが、不明なことや疑問はリンク貼付先の諸兄ページ
の他にも多くの関連ページから情報をいただき感謝しております。
結線図
上側の「TWE-Lite DIP」は端末として使います。
アナログ入力のボリュームと出力表示のLEDを接続
してあります。また、応答を速くするため M1をGND
に接続して親機としています。
下側の「TWE-Lite DIP」は「RaspberryPi」とUARTと
デジタル入出力(トランジスタ−で反転)端子を接続
してあります。
UARL接続は、RX-RX TX-TX GND-GND になります。
端子番号は仕様書等で調べてください。
TWE-Lite DIPのシリアルデーターをRaspberry-Piで見る
RaspberryPiの初期設定ではGPIOのシリアルピンはポートとして使えないため、設定を変更する必要があります。
参考ページ RaspberryPiのUART端子番号の解説もあります。
動作確認のために、ターミナルエミュレータ(minicom)をインストールして
pi@raspberrypi ~ $ minicom -b 115200 -o -D /dev/ttyAMA0
welcome to minicom 2.6.1
OPTIONS: I18n
Compiled on Apr 28 2012, 19:24:31.
Port /dev/ttyAMA0
Press CTRL-A Z for help on special keys
:0081150160810001C300778F000AAC1B000000FFFFFFFDF3
ちなみに minicomを終了するコマンドはctrl+A Q です。
上記:008…DF3 データの内容は
TWE-Lite DIP使用方法にあります。
詳細は、TWE-Lite DIPを試す AD変換結果が参考になりました。
Pythonで見る。
Pythonのシリアルポート操作ライブラリをインストールして
#! /usr/bin/env python
import serial
ser=serial.Serial('/dev/ttyAMA0',115200)
while True:
rx= ser.readline()
print rx #シリアルデータ
rx01 = rx[37:39] #ADI-1の入力値
#補正値を取り出す。もっとスマートな方法があるだろうな!
rx02 = rx[46] # ef1(0x) 補正値
rx03 = int(str(rx02),16) # 16進 -> 2進
rx04 = bin(rx03)[4:6] # 8bit binary -> LSB 2bit
rx05 = int(str(rx04),2) # 2bit binary -> Decimal
#計算 補正値は 0〜3 実際は0〜12(mV)
a01 = (int(rx01,16))*4
a02 = (a01 + rx05) * 4
print a02, "[mV]"
RaspberryPiのGPIO出力
手始めにコマンド入力で動作確認をしてみました。GPIO-7(26p)のみを対象に出力として設定して
1(= on)、0(= off)を書き込みます。その都度のsudoタイプが煩わしいので、rootになって
pi@raspberrypi ~ $ sudo -i
root@raspberrypi:~# echo 7 > /sys/class/gpio/export
root@raspberrypi:~# echo out > /sys/class/gpio/gpio7/direction
root@raspberrypi:~# echo 1 > /sys/class/gpio/gpio7/value
root@raspberrypi:~# echo 0 > /sys/class/gpio/gpio7/value
root@raspberrypi:~# echo 7 > /sys/class/gpio/unexport
root@raspberrypi:~# exit
logout
pi@raspberrypi ~ $
上記手順で、TWE-Lite DIP親機のLEDが off→on→off します。
Pythonで動かす。
「Let's start… RaspberryPi's …(GPIO) facilities.」を参考にしました。
sudo apt-get update
sudo apt-get install python-rpi.gpio
GPIO操作ライブラリをインストールしてから
#! /usr/bin/env python
import serial
import RPi.GPIO as GPIO
IO_NO = 7
print("press ^C to exit program ...\n")
GPIO.setmode(GPIO.BCM) # ***
GPIO.setup(IO_NO, GPIO.OUT)
ser=serial.Serial('/dev/ttyAMA0',115200)
try:
while True:
rx= ser.readline()
print rx
rx01 = rx[37:39]
rx02 = rx[46]
rx03 = int(str(rx02),16)
rx04 = bin(rx03)[4:6]
rx05 = int(str(rx04),2)
a01 = (int(rx01,16))*4
a = (a01 + rx05) * 4
print " ---> ", a, "[mV]"
if a > 1000 :
GPIO.output(IO_NO, True)
else:
GPIO.output(IO_NO, False)
except KeyboardInterrupt:
print("detect key interrupt\n")
GPIO.cleanup()
print("Program exit\n")
*** GPIO.setmode(GPIO.BOARD) だと、データ表示はしますが「Lチカ」ができません。
終了時は GPIO.cleanup()でポートを解放しないと、次に同じプログラムを走らせた時にエラーが出ます。
これはコマンド入力の echo * > /sys/class/gpio/unexport でも同様でした。 2014/01/12
ホームページに戻る