事象発生日:2017-03-30
記事公開日:-
アクセス数:21701
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 (※公開されることはありません)
コメント