質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

2903閲覧

Arduino2台からRaspberry PiにUSBでセンサの値を送りたい

birem

総合スコア13

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/09/01 03:56

やりたいこと
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となっているからなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

i2cのスレーブのアドレスが同じなので、難しいかなと思ったのと、同時にセンサで値を取得したかったのでArduinoを2台使用しました。

投稿2018/09/01 04:42

birem

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ArdName['Left_Hand_11']などがNoneとなっているからなのでしょうか?

そりゃそうなってればそうなりますね

Arduino使わずとも、ラズパイでGPIOが使えるんですから、そこでソフトウエアのIIC実装すれば、センサ2個を繋げれるんじゃ

投稿2018/09/01 04:36

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/09/01 04:45

IICは2本のIOがあれば実装できるので、2つのIIC(4本のIO)を実装すればいいというはなしですね
birem

2018/09/01 04:46

Arduinoを2台使用してる理由としては、センサのアドレスが同じなのでi2cで通信が難しいというのと、同時に値を取得したかったというのがあります。
y_waiwai

2018/09/01 04:51

まあ、こういう方法もあるよ、というはなしです Arduino1台だけだと通信はできるんでしょうか
birem

2018/09/01 06:49

返信ありがとうございます。 Arduinoで得られるセンサ値をループによってRaspberryPiへ送り続けました。(Arduinoは一つ) RaspberryPi側でもwhileループによってセンサのシリアルポートから値を取得し続けました。 その際、 Print(ArdName['Right_Hand_1'].readline()) ではなく print(UsbSerial[i].readline()) をしたところ、 b'2424\r\n' のような値が連続で得られました(数字はセンサ値です)。 このプログラムは、http://airoboticsandsoon.hatenablog.jp/entry/2017/11/28/185355 を参考に作ったものなのですが、UsbSerial[i]にはどういう値が格納されるのかというところがわかりません。 サイトを見ると、ArdName[~]で任意のArduinoを呼び出せるように見えるのですが・・・。 最終的には2台のArduinoから得た値を比較して、その差を算出したいと考えてます。
birem

2018/09/01 07:01

print(ArdName['Right_Hand_1'].readline())では ‘NoneType' object has no・・・ と出てしまい、エラーとなりました。
y_waiwai

2018/09/01 07:38

んじゃ、 UsbSerial[0].readline() と、 UsbSerial[1].readline() でいいんじゃ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問