事象発生日:2017-03-30
記事公開日:-
アクセス数:20007
UbuntuとArduinoでシリアル通信を行なった.Perlスクリプトで実現したかったのだが,使いやすいライブラリが見つからなかったので,Pythonで実装した.
今回は,LM35温度センサの値を取得する.
Ubuntu Server 16.04.2 LTS
Arduino Uno R2
Python 2.7.12
LM35温度センサと104コンデンサを使用.
まず,pyserialのインストール.
$ sudo pip install pyserial
lsusb
でArduinoのデバイス表示.
$ lsusb Bus 001 Device 004: ID 2341:0001 Arduino SA Uno (CDC ACM) $ ls -al /dev/ttyACM0 crw-rw---- 1 root dialout 166, 0 3月 29 10:25 /dev/ttyACM0
/dev/ttyACM0
にアクセス権がないので,グループに追加.
$ sudo gpasswd -a ${username} dialout # 以下でグループへの追加を確認 $ id ${username}
Ubuntuの再起動.
# coding: UTF-8 # arduinoからシリアル通信受信して温度をモニター import sys import os import serial # importはカレントディレクトリもまわるので,このスクリプト名をserial.pyにすると動かない! def main(args): # while True: if True: # timeoutを秒で設定.ボーレートはデフォルトで9600. ser = serial.Serial('/dev/ttyACM0', timeout=5.0) # 1文字読み込み # c = ser.read() # 指定文字数読み込み ただしtimeoutが設定されている場合は読み取れた分だけ # str = ser.read(10) # 行終端'¥n'までリードする # line = ser.readline() # 最初に届く行は不完全な可能性があるので捨てる. line1 = ser.readline() line2 = ser.readline() ser.close() # 改行コードの削除. # line2.strip() # これだと,LFのみでCRLFは消せない. # ArduinoはWindowsから書き込みしているのでCRLF. line2 = line2.replace('\n','') line2 = line2.replace('\r','') ps(line2) def ps(output): sys.stdout.write(str(output)) sys.stdout.flush() if __name__ == '__main__': main(sys.argv)
const int N = 100; int analogPin = 0; double analogIn; double temperature[N]; double temperature_avg; void setup() { // http://www.arduino.cc/en/Reference/AnalogReference // INTERNAL: an built-in reference, equal to 1.1 volts analogReference(INTERNAL); // シリアル通信速度 Serial.begin(9600); } void loop() { // N回平均 temperature_avg = 0; for (int i=0 ; i< N ; i++) { // アナログピンから計測値を取得(0-1023) analogIn = analogRead( analogPin ); // 摂氏に換算 100度で1.0V temperature[i] = (1.1 * analogIn * 100.0) / 1024.0; temperature_avg = temperature_avg + temperature[i] / N; } Serial.println( temperature_avg, 4 ); // 停止 delay(1000); } // 参考 // http://playground.arduino.cc/Main/LM35HigherResolution
蛇足だが,Perlから呼び出す際は以下のようにすればいい.
#!/usr/bin/perl use strict; use warnings; my $command = 'python "/${path}/mySerial.py"'; my @CommandResult = `$command`;
$ python mySerial.py 23.2805
hirooka.pro. [Ubuntu] Arduino Uno. Retrieved March 29, 2017, from https://hirooka.pro/?p=675 |
名前
Email (※公開されることはありません)
コメント