やりたいこと
Arduino Unoを2台用いて、それぞれにセンサ(BH1790GLC)をi2cで接続します。
(※BH1790GLCのデータシート→ https://www.rohm.co.jp/datasheet/BH1790GLC)
それぞれArduinoでBH1790GLCを同時に5秒間稼働させ、5秒間の間に得られた最高値をRaspberry Piへ送信したいのですが、うまくいきません。
Arduinoのコード
Arduino
1 2#include <Wire.h> 3#include <BH1790GLC.h> 4#include <FlexiTimer2.h> 5#include <stdio.h> 6 7BH1790GLC bh1790glc; 8volatile bool timer_flg; 9char str[100]; 10 11void timer_isr(void); 12int first_check = 1; //自分の名前の送信処理が終了すると0になる 13String get_data; //シリアルで受け取るデータの保管場所 14String Get_tell = "Tell_Me_Your_Name"; //pythonから送信される文字列 15String check_OK = "ok"; 16String MyName = "Left_hand_11"; //自分の名前の定義 17 18 19void setup() { 20 byte rc; 21 22 timer_flg = false; 23 Serial.begin(115200); 24 while (!Serial); 25 26 Wire.begin(); 27 Wire.setClock(400000L); 28 29 rc = bh1790glc.init(); 30 if (rc != 0) { 31 Serial.println("BH1790 initialize failed"); 32 } else { 33 //Serial.println("LEDON Data, LEDOFF Data"); 34 FlexiTimer2::stop(); 35 FlexiTimer2::set(250, 1.0/8000, timer_isr); // 32Hz timer 36 FlexiTimer2::start(); 37 } 38 39 40} 41int a =0; 42int w=0; 43unsigned long start = millis(); 44void loop() { 45 //Get_tellと同じ文字列が入力されたら名前を送信しfirst_check=0にする 46 //first_checkが1である限り以下の処理を続ける。 47 while(first_check == 1){ 48 //シリアルから入力があるかチェックする 49 if(Serial.available()){ 50 //シリアルからの入力をget_dataに保管(#で始めと終わりを定義) 51 //python側では'#Tell_Me_Your_Name#'と送信 52 get_data = Serial.readStringUntil('#'); 53 54 //入力された文字列がGet_tellと同じなら以下の処理実行 55 if(get_data == Get_tell){ 56 Serial.print(MyName); //自分の名前を送信 57 58 } 59 60 if(get_data == check_OK){ 61 //入力された文字列がcheck_OKと同じなら 62 //whileから抜けるためfirst_checkを0にする 63 first_check = 0; 64 } 65 66 } 67 } 68 if (first_check==0){ 69 70 while (millis() < start + 5000) { 71 byte rc; 72 unsigned short val[2]; 73 if (timer_flg) { 74 rc = bh1790glc.get_val(val); 75 if (rc == 0) { 76 a=max(a,val[1]); 77 } 78 79 timer_flg = false; 80 } 81 } 82} 83 84first_check = 1; 85//Raspberry Piへ値を送信 86sprintf(str,"%d\n",a); 87Serial.write(str); 88} 89 90 91void timer_isr(void) { 92 timer_flg = true; 93 } 94
なお、もう一台のArduinoのコードは上記プログラムの「自分の名前の定義」を変更し、Right_Hand_1としています。
以下は受信側のRaspberry Piのコードです。
Python
1import serial 2from time import sleep 3import subprocess 4 5 6cond = True 7def main(): 8 ArdName={'Right_Hand_1':None,'Left_Hand_11':None} 9 UsbSerial = [0 for i in range(5)] 10 USBinfo = subprocess.getoutput('ls /dev | grep ttyACM*') 11 USBinfo = USBinfo.split('\n') 12 print(USBinfo) 13 for i in range(len(USBinfo)): 14 print(USBinfo[i]) 15 UsbSerial[i] = serial.Serial("/dev/%s"%USBinfo[i],115200) 16 sleep(2) 17 18 for i in range(len(USBinfo)): 19 UsbSerial[i].write('#Tell_Me_Your_Name#'.encode()) 20 sleep(2) 21 22 str =UsbSerial[i].read(12) 23 print(str.decode()) 24 for i in range(len(USBinfo)): 25 ArdName[subprocess.getoutput('cat /dev/%s'%USBinfo[i])]=UsbSerial[i] 26 UsbSerial[i].write('#ok#'.encode()) 27 sleep(5) 28 print(ArdName['Right_Hand_1']) 29 print(ArdName['Left_Hand_11']) 30 a = ArdName['Left_Hand_11'].readline() 31 b = ArdName['Right_Hand_1'].readline() 32 print(a) 33 print(b) 34 UsbSerial[i].close() 35 36 37 38if __name__ == '__main__': 39 main() 40
実行したところ、以下のようなエラーが出ました。
['ttyACM0', 'ttyACM2']
ttyACM0
ttyACM2
Left_hand_11
None
None
Traceback (most recent call last):
File "/home/pi/USB.py", line 39, in <module>
main()
File "/home/pi/USB.py", line 30, in main
a = ArdName['Left_Hand_11'].readline()
AttributeError: 'NoneType' object has no attribute 'readline'
readline()が使用できないということだと思うのですが、
ArdName['Left_Hand_11']などがNoneとなっているからなのでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。