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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

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

Python

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

Arduino

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

Q&A

解決済

2回答

4738閲覧

シリアル通信でPCから送る文字列をArduino側で認識できない問題について

trafalbad

総合スコア303

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

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

Python

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

Arduino

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

0グッド

0クリップ

投稿2020/05/31 07:45

編集2020/05/31 07:47

PCからシリアル通信で送った文字列を認識させて、Arduino側認識させて、サーボモータを動かすコードを書きました。

回路自体も問題ないのですが、Arduinoがシリアル通信で送ったバイト文字列をうまく認識できてないようです。


動作の順序
1.スイッチを押すとシリアル通信で'1'が送信される

2.スイッチを押すとser.write(b'o')が実行される

3.Arduino側でa = Serial.read()'o'のときサーボモータを動作させる


3のところでうまく認識されていません。ボタンを押すところに同様の動作コードを書くとサーボモータが動きますが、シリアル通信を認識する部分でうまく動作できないです。
エラーは出ないため、バイト文字列がうまく認識されていないと思うのですがうまく認識させるやうまくいかない原因を教えていただけないでしょうか?

Arudino側コード

c#include

1Servo myservo;//Servoオブジェクトの宣言 2 3void setup() { 4 Serial.begin(9600); 5 myservo.attach(9);//9番ピンでサーボモータを動かす 6 pinMode(2, INPUT_PULLUP); // Inputモードでプルアップ抵抗を有効に 7 pinMode(LED_BUILTIN, OUTPUT); 8 myservo.write(10); 9 digitalWrite(LED_BUILTIN, HIGH); 10} 11 12void loop(){ 13 static int flag=0; 14 if(digitalRead(2)==LOW){ //スイッチをおす 15 flag=1; 16 // myservo.write(10); サーボモータ動作 17 // digitalWrite(LED_BUILTIN, HIGH); サーボモータ動作 18 } 19 else{ 20 if(flag==1){ 21 flag=0; 22 Serial.write('1'); 23 delay(500); 24 } 25 } 26 if(Serial.available()>0){ 27 char a = Serial.read(); 28 if(a=='o'){ 29 myservo.write(10); // ここの動作が認識されない 30 digitalWrite(LED_BUILTIN, HIGH); 31 } 32 else if(a=='c'){ 33 myservo.write(100); // ここの動作が認識されない 34 digitalWrite(LED_BUILTIN, LOW); 35 } 36 } 37}

PC側Pythonコード(base.py)

python

1import serial 2 3with serial.Serial('/dev/cu.usbmodem14301', timeout=0.1) as ser: 4 while True: 5 a = ser.read() 6 print(a) 7 if a == b'1': 8 ser.write(b'o') 9 print('write') 10 else: 11 ser.write(b'c')

実行

sh

1python3 base.py 2>>> 3b'' 4b'' 5b'' 6b'1' 7write 8b'' 9

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

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

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

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

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

guest

回答2

0

python側は、シリアルのタイムアウトを0.1秒に設定しているから、Arduinoがなにも送って無くてもSerial.read()がタイムアウトして空のbytesを返し、結果0.1秒毎に'c'を送信する。

Arduino側は、'1'を送ったあと0.5秒delayしてる。
すると、その間にPython側は'o''c''c''c''c'を送信する。これは、Arduinoの受信バッファに貯まる。
delayが明けたArduinoは、この'o''c''c''c''c'を「一気に」処理する。つまり、'o'でサーボ信号を変えてLEDを点灯した多分1ms秒以内に次の'c'の処理でサーボ信号を書き換えてLEDを消灯してしまう。

そりゃ、なにもしてないように見える、というか「目にも止まらない」でしょう。

そもそもArduino側が'1'を送ったあとのdelay(500);は妥当なのか、
Python側は、受信ありのチェックをせず、あるいは受信データがなかったときにも'c'を送ってるけどこれは妥当なのか、むやみな待ちを入れるよりはそのへんをちゃんと考えるべきでは。

投稿2020/05/31 13:13

thkana

総合スコア7703

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

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

0

ベストアンサー

通信の何かがうまくいってないようですね。
一文字だけ受け付けるのではなく、複数受け付けるようにしてみましょう。

C

1char buf[10]; 2char index = 0; 3void loop(){ 4 if(Serial.available()>0){ 5 buf[index] = Serial.read(); 6 index++; 7}

Serial.read()で受け取った文字列が何となっているかみると、
問題が分かってくるように思います。

投稿2020/05/31 08:32

KohheyDokkoisyo

総合スコア63

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

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

trafalbad

2020/05/31 09:46

time.sleep(5.0)で数秒待つコードを加えたら、認識されました。 with serial.Serial('/dev/cu.usbmodem14301', timeout=0.1) as ser: while True: a = ser.read() print(a) if a == b'1': time.sleep(5.0) ser.write(b'o') print('write') else: ser.write(b'c')
y_waiwai

2020/05/31 10:37

sleepいれてどうにかするってのは悪手ですねえ。 まあ、動けばそんでいいっちゃーいいんですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問