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

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

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

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

Q&A

解決済

3回答

1749閲覧

ArduinoでSONAR::initを使用するとSerial.printlnで文字化けが発生するので解消したい。

huckepain

総合スコア14

Arduino

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

0グッド

0クリップ

投稿2020/05/26 04:17

編集2020/05/26 06:36

Arduino初心者です。

ロボットのセンサーのサンプルプログラム(下記を参照してください。)で、
センサーが正常に動作しているのか確認したいのですが、
そもそも、Serial.printlnの内容がシリアルモニタ上文字化けを起こして表示されているため、
原因がわからず困っています。

ちなみに、
SONAR::initをコメント化すると、
loop関数内のSerial.printlnの内容は文字化けせずに表示されます。

センサーは、RS485から接続になります。

解消方法を教えてください。

Arduino

1#include <EEPROM.h> 2 3#include <MotorWheel.h> 4#include <Omni4WD.h> 5#include <PID_Beta6.h> 6#include <PinChangeInt.h> 7#include <PinChangeIntConfig.h> 8#include <SONAR.h> 9 10/* 11************************************************************************************ 12 Sonar:0x12 13 ------------------------------ 14 | | 15 M3| |M2 16 | | 17 | | 18 | | 19 Sonar:0x13| |Sonar:0x11 20 | | 21 | |Power Switch 22 | | 23 | | 24 ------------------------------- 25 | | 26 M4| |M1 27 | | 28 ------------------------------- 29 Sonar:0x14 30************************************************************************************ 31*/ 32 33 34irqISR(irq1,isr1); 35MotorWheel wheel1(3, 2, 4, 5, &irq1); 36 37irqISR(irq2,isr2); 38MotorWheel wheel2(11, 12, 14, 15, &irq2); 39 40irqISR(irq3,isr3); 41MotorWheel wheel3(9, 8, 16, 17, &irq3); 42 43irqISR(irq4,isr4); 44MotorWheel wheel4(10, 7, 18, 19, &irq4); 45 46Omni4WD Omni(&wheel1, &wheel2, &wheel3, &wheel4); 47 48SONAR sonar11(0x11),sonar12(0x12),sonar13(0x13),sonar14(0x14); 49 50unsigned short distBuf[4]; 51 52unsigned char sonarsUpdate() { 53 static unsigned char sonarCurr = 1; 54 if(sonarCurr==4) sonarCurr=1; 55 else ++sonarCurr; 56 if(sonarCurr==1) { 57 distBuf[1]=sonar12.getDist(); 58 sonar12.showDat(); 59 sonar12.trigger(); 60 } else if(sonarCurr==2) { 61 distBuf[2]=sonar13.getDist(); 62 sonar13.showDat(); 63 sonar13.trigger(); 64 } else if(sonarCurr==3){ 65 distBuf[3]=sonar14.getDist(); 66 sonar14.showDat(); 67 sonar14.trigger(); 68 } else { 69 distBuf[0]=sonar11.getDist(); 70 sonar11.showDat(); 71 sonar11.trigger(); 72 } 73 74 return sonarCurr; 75} 76 77void goAhead(unsigned int speedMMPS){ 78 if(Omni.getCarStat()!=Omni4WD::STAT_ADVANCE) Omni.setCarSlow2Stop(300); 79 Omni.setCarAdvance(0); 80 Omni.setCarSpeedMMPS(speedMMPS, 300); 81} 82 83void turnLeft(unsigned int speedMMPS){ 84 if(Omni.getCarStat()!=Omni4WD::STAT_LEFT) Omni.setCarSlow2Stop(300); 85 Omni.setCarLeft(0); 86 Omni.setCarSpeedMMPS(speedMMPS, 300); 87} 88 89void turnRight(unsigned int speedMMPS){ 90 if(Omni.getCarStat()!=Omni4WD::STAT_RIGHT) Omni.setCarSlow2Stop(300); 91 Omni.setCarRight(0); 92 Omni.setCarSpeedMMPS(speedMMPS, 300); 93} 94 95void rotateRight(unsigned int speedMMPS){ 96 if(Omni.getCarStat()!=Omni4WD::STAT_ROTATERIGHT) Omni.setCarSlow2Stop(300); 97 Omni.setCarRotateRight(0); 98 Omni.setCarSpeedMMPS(speedMMPS, 300); 99} 100 101void rotateLeft(unsigned int speedMMPS){ 102 if(Omni.getCarStat()!=Omni4WD::STAT_ROTATELEFT) Omni.setCarSlow2Stop(300); 103 Omni.setCarRotateLeft(0); 104 Omni.setCarSpeedMMPS(speedMMPS, 300); 105} 106 107void allStop(unsigned int speedMMPS){ 108 if(Omni.getCarStat()!=Omni4WD::STAT_STOP) Omni.setCarSlow2Stop(300); 109 Omni.setCarStop(); 110} 111 112void backOff(unsigned int speedMMPS){ 113 114} 115 116//void(*motion[8])(unsigned int speedMMPS) = {goAhead, turnLeft, rotateRight, rotateLeft, 117 //turnRight, goAhead, rotateRight, backOff}; 118 119void(*motion[16])(unsigned int speedMMPS) = {goAhead, turnRight, goAhead, turnRight, 120 turnLeft, goAhead, turnLeft, goAhead, 121 rotateRight, rotateRight, turnRight, turnRight, 122 rotateLeft, backOff, turnLeft, allStop}; 123 124unsigned long currMillis=0; 125void demoWithSensors(unsigned int speedMMPS,unsigned int distance) { 126 unsigned char sonarcurrent = 0; 127 if(millis()-currMillis>SONAR::duration + 20) { 128 currMillis=millis(); 129 sonarcurrent = sonarsUpdate(); 130 } 131 //Serial.println(sonarcurrent); 132 133 if(sonarcurrent == 4){ 134 unsigned char bitmap = (distBuf[0] < distance); //right 135 bitmap |= (distBuf[1] < distance) << 1; // back 136 bitmap |= (distBuf[2] < distance) << 2; // left 137 bitmap |= (distBuf[3] < distance) << 3; // front 138 139 (*motion[bitmap])(speedMMPS); 140 } 141 142 Omni.PIDRegulate(); 143} 144 145void setup() { 146 Serial.begin(9600); //シリアル通信のレートを設定 147 delay(2000); 148 TCCR1B=TCCR1B&0xf8|0x01; // Pin9,Pin10 PWM 31250Hz 149 TCCR2B=TCCR2B&0xf8|0x01; // Pin3,Pin11 PWM 31250Hz 150 151 SONAR::init(13); 152 Omni.switchMotors(); 153 Omni.PIDEnable(0.35,0.02,0,10); 154} 155 156void loop() { 157 Serial.println(1); 158 //Omni.demoActions(160,5000,500,false); 159 //demoWithSensors(160,30); 160}

SONAR::initをコメント化したときのシリアルモニタ

Arduino

113:07:04.531 -> 1 213:07:04.531 -> 1 313:07:04.531 -> 1 413:07:04.531 -> 1 513:07:04.531 -> 1 613:07:04.531 -> 1 713:07:04.531 -> 1 813:07:04.531 -> 1 913:07:04.531 -> 1 1013:07:04.565 -> 1 1113:07:04.565 -> 1 1213:07:04.565 -> 1 1313:07:04.565 -> 1 1413:07:04.565 -> 1 1513:07:04.565 -> 1 1613:07:04.565 -> 1

SONAR::initをコメント化解除したときのシリアルモニタ

Arduino

113:07:33.031 -> D⸮bD⸮bD⸮bD⸮ D⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDCbD⸮D⸮bD⸮jD⸮b:213:07:33.094 -> D⸮bD⸮bD⸮b4⸮bD⸮D⸮"D⸮bD⸮bDbD⸮bD⸮bD⸮bD⸮bD⸮b<⸮bD⸮bD⸮bD[bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮ 313:07:33.163 -> D⸮bD⸮bD⸮bD⸮bD⸮D⸮b⸮bD⸮bD⸮bD⸮bD⸮bD⸮D⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDCbD⸮b$⸮bD⸮bD[bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮ 413:07:33.266 -> D⸮bD⸮b<⸮bD⸮bD⸮b:⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮D⸮bD⸮bD⸮bD[bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮b<⸮bD⸮bD⸮ D⸮bD⸮bD⸮bD⸮b$⸮bD⸮D⸮b8⸮b8⸮bD⸮bD⸮bD⸮1"XbD⸮b⸮1"X"D⸮b$⸮bD⸮bD[bDYbDCbD⸮1"@1"XbD⸮bD⸮bD⸮b:⸮bD⸮ D⸮*D⸮bD⸮bD⸮ 513:07:33.440 -> D⸮bD⸮bD⸮bD⸮bD⸮bD⸮bt⸮bD⸮bD⸮bD⸮b<⸮D⸮bDSbD⸮bD⸮bD⸮b"XbD⸮bD⸮1"XbD⸮bD⸮bD⸮bD⸮D⸮bD⸮bD[bD⸮bD⸮ D⸮1"XbD⸮b4⸮bD⸮bD⸮b4⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDbD⸮bD⸮D⸮bD⸮b⸮bD⸮bD[bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD[bDXbD⸮bD⸮b:⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮ 613:07:33.647 -> D⸮bD⸮bD⸮b:⸮bD⸮1"XbD⸮bDXbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮ D⸮D⸮bD⸮bD⸮bD⸮b4⸮bD⸮bD⸮bD⸮ 713:07:33.750 -> D⸮bD⸮bD⸮D⸮bD⸮bD⸮bD⸮bDSbD[bD[bD⸮bD⸮bD⸮bD⸮ D⸮b8⸮bD⸮b:⸮"D⸮bD⸮b<⸮b<⸮b<⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDXbD⸮bDbD⸮b⸮bD⸮bD⸮b4⸮bD⸮b$⸮bD⸮bDbDYb4⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮ D⸮bDCD⸮bD⸮b⸮bD⸮ 813:07:33.923 -> D⸮D⸮ D⸮bD⸮bD⸮D⸮b\⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDSbD⸮bD⸮b$⸮b<⸮b<⸮bD⸮bD⸮bD⸮bD⸮b8⸮bD⸮ D⸮bD⸮b⸮bD⸮bD⸮bD⸮bDXbDXbD⸮bD⸮bD[bD⸮bD⸮bd[bD⸮bD⸮bD⸮bD⸮bD⸮b:⸮bD⸮bD⸮bD⸮D⸮bD⸮bDYbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮b4⸮bD⸮bD⸮bD⸮bD⸮"D⸮bDSbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDCbDCbDCbD⸮bD⸮ D⸮bDYbDSbD⸮bD[bD⸮bD⸮1"X1"X1"X"D⸮bD⸮b8⸮1"X 913:07:34.198 -> D⸮bD⸮bD⸮D⸮bD⸮bD⸮b$⸮ 1013:07:34.233 -> D⸮bD⸮bD⸮bD⸮bD⸮bD⸮b4⸮bD⸮bD⸮D⸮ 1113:07:34.268 -> D⸮bD⸮bD⸮ 1213:07:34.268 -> DCbD⸮b4⸮bD⸮bD⸮bD⸮bD⸮bD[bD⸮bD⸮bD⸮bD[bD⸮bFCbD⸮D⸮bD⸮bD⸮bD⸮bD⸮bD⸮D⸮bD⸮"D⸮bD⸮bD⸮bD⸮bD⸮bD⸮ 1313:07:34.371 -> D⸮D⸮D⸮bD⸮bDCbD[bD[bD⸮bD⸮bD⸮bDYbD⸮bD⸮bD⸮bDCbD⸮D⸮bD⸮bD⸮bDSbDCbDbD⸮bD⸮bD⸮bD⸮bD⸮bDYbD⸮bDXbDXbD⸮bD[bD⸮bD⸮b"XbD⸮bD⸮bD⸮bD[bD⸮bD⸮bD⸮bD⸮"D⸮b<⸮bD⸮bD⸮b"XbD⸮bD⸮bD⸮b:⸮bD⸮bD⸮b<⸮b:⸮bD[bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮D⸮bD⸮bDXbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮"D⸮b"Xb4⸮bD⸮bD⸮bDYbD⸮bD⸮bD⸮bD⸮bD⸮bD[bD⸮b:⸮bD⸮bD⸮bD⸮bD⸮b:⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDXbD⸮bD⸮ 1413:07:34.682 -> D⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDXbD⸮bD⸮bD⸮bD⸮b$⸮bD[bD⸮bD⸮bD[bD⸮ D⸮bD⸮bD⸮bD⸮b:⸮b:⸮bD⸮bD[bD⸮bD⸮bD⸮bDYbD⸮ 1513:07:34.786 -> D⸮bD⸮bD⸮bD⸮bD⸮"D⸮bD⸮bD⸮bD⸮D⸮ D⸮b⸮bD⸮ D⸮bD⸮ 1613:07:34.821 -> D⸮bDYbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDSbD⸮bD⸮b"XbD⸮bD⸮b:⸮bD⸮b<⸮bD⸮bD⸮b:⸮bD⸮bD[bD⸮ 1713:07:34.890 -> DbDCbD⸮D⸮b⸮⸮1"XbD⸮bDCbD⸮bDCbDYbD[bD⸮bD⸮bD⸮ D⸮bD⸮bDCbD[bD⸮bD⸮bD⸮b$⸮bD⸮bD⸮bDXbD⸮cD⸮bD⸮bD⸮bD[bDSbD⸮bD⸮bD⸮bD⸮D⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮1"XbD⸮bD⸮D⸮ 1813:07:35.060 -> D⸮D⸮D⸮bD⸮bDXbD⸮bD⸮bD⸮bD⸮bD[bD⸮bD⸮bD⸮bD⸮bD⸮ 1913:07:35.095 -> D⸮bD⸮bD⸮bD⸮bD[bDYbD⸮bDXbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮D⸮bD⸮bD⸮bD[bD⸮ 2013:07:35.197 -> DCbD⸮bDYbD⸮bD⸮bD⸮bD⸮D⸮bD[bDbD⸮bD⸮bD⸮bDXbDCbD⸮bD⸮bD⸮b<⸮b<⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮b"X⸮⸮1"X1⸮⸮ '⸮⸮1"XbD⸮bD⸮bD⸮bDCbD⸮bD⸮bD[bD⸮b⸮b<⸮bD⸮b$⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDSbD⸮bD⸮ 2113:07:35.370 -> D⸮bD⸮bD⸮bD⸮bD⸮bD⸮bD⸮ D⸮1"X1"X 2213:07:35.370 -> D⸮bD⸮b:⸮bD⸮bD⸮bDSbD⸮bD⸮bD[bD⸮bDYbD⸮bD⸮bD⸮bDXbD⸮bD⸮b:⸮bD⸮bDYbDYbD[bD⸮bD⸮bD⸮ 2313:07:35.474 -> D⸮ 2413:07:35.474 -> D⸮D⸮b:⸮"DbD⸮bD⸮bD⸮bD⸮ 2513:07:35.508 -> D⸮1"XbD⸮bD⸮bD⸮bDXbD⸮bD⸮D⸮ 2613:07:35.542 -> D⸮bD⸮b$⸮b:⸮bD⸮bD⸮bD⸮bD⸮b$⸮bD⸮b<⸮b4⸮bD⸮bD⸮b$⸮bD⸮bD⸮bDCbD⸮bD⸮bD⸮b4⸮bD⸮bD⸮bD⸮bD⸮bD⸮b4⸮bD⸮1"XbD⸮bD⸮bDSbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDYbDSbDXbD⸮b:2713:07:35.647 -> D⸮bD⸮bD⸮b<⸮bD⸮bD⸮bD⸮D⸮1"XbD⸮ DCbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮bDCbD⸮bD⸮bD⸮bD⸮bD⸮bD⸮D⸮ D⸮bD⸮b:⸮bD⸮c$⸮bD⸮bD⸮bD⸮bD[bD⸮cD⸮bD⸮b4⸮bD⸮bD⸮ 2813:07:35.785 -> D⸮"D⸮

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

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

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

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

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

guest

回答3

0

自己解決

Serial.begin(9600);
から
Serial.begin(19200);
に修正したところ、文字化けせずに、出力できました。
RS485はUSBとは別のレートを使用しているためのようです。

投稿2020/05/26 08:24

huckepain

総合スコア14

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

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

thkana

2020/05/26 08:40

それでちゃんと動くのか、というのは結構注意深く確認しないといけませんが、大丈夫なんですか? 少なくとも、https://github.com/ncnynl/IMTRobot/blob/master/repos/libraries/SONAR/SONAR.cpp で見る限り、ライブラリも何らかの送信を行っています。あなたがSerialポートを使うことがセンサの計測になにかの影響をあたえないという保証はあるのでしょうか?
guest

0

初心者という言葉を付け加えても現実は変わりません。

そのSONERというもの(なんだか知りませんが)はSerialを自分用に使います。なので、あなたがSerialを好きに使うことは出来ません。(Arduinoと言っているのがArduino UNOであれば)ハード的な制約になるので、ソフトウェアのみでの解決は不可能でしょう。

もし、別のUSB-シリアル変換器を持っている(あるいはもう一台Arduinoがあってそれをシリアル変換に流用してもよい)なら、(Serialではなく)ソフトウェアシリアルを使用して状態モニターに使う、というのが一番変更は少なそうに思います。

投稿2020/05/26 07:07

thkana

総合スコア7659

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

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

0

シリアルポートの受信データのピンがかぶってたりした場合の症状ですが、そこらへんは大丈夫でしょうか

投稿2020/05/26 04:38

y_waiwai

総合スコア87793

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問