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

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

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

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

Q&A

解決済

2回答

874閲覧

arduinoのシリアルモニタが準備中から準備完了にならないことについて

kotaro425

総合スコア11

Arduino

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

0グッド

0クリップ

投稿2022/08/26 03:49

編集2022/08/26 03:55

前提

arduino IDEでTeensy4.1につながっているセンサーの値をfor文で1000回とり、シリアルモニタにそのデータをすべて表示させようとしています

Teensy4.1にはvinから5V電源を入れており、そのうえでusbを指しています

プログラム面は一切変えていないのですが、突然シリアルモニタがスタートしなくなりました

実現したいこと

  • [ ]シリアルモニタにデータを表示させる

発生している問題・エラーメッセージ

プログラムをTeensyに書き込むことは出来るのですが、シリアルモニタがうまく動きません

該当のソースコード

Arduino言語(C++)

1#include<Wire.h> //I2Cライブラリ 2 3int a = 0; //ステートマシン用 4int i = 0; //センサの値の回数を数える(ディスプレイ用) 5int ii = 0; //センサの値の回数を数える(マジで100回数える) 6int c[100]; //脳筋作業をするかしないか選択 7float d = 0; //センサの値(小数ありをいれるとこ) 8int x; //displayの座標 9int y; //displayの座標 10int k = 0; //回数管理 11 12float pd_value[100]; //センサの値 13int pd_ratio[100]; //センサの値の割合 14 15/*ピンの名前を設定********************************************/ 16const int to_switch = 14; //スタート用トグルスイッチ 17const int ta_switch = 15; //タクトスイッチ 18 19//motor1 20const int M1_ENABLE = 0; //PWM(パワー設定) 21const int M1_PAHSE = 1; //digitl(正転、逆転設定) 22//motor2 23const int M2_ENABLE = 2; //PWM(パワー設定) 24const int M2_PAHSE = 3; //digitl(正転、逆転設定) 25//motor3 26const int M3_ENABLE = 4; //PWM(パワー設定) 27const int M3_PAHSE = 5; //digitl(正転、逆転設定) 28//motor4 29const int M4_ENABLE = 28; //PWM(パワー設定) 30const int M4_PAHSE = 29; //digitl(正転、逆転設定) 31 32void setup(void) { 33 Serial.begin(115200); // シリアル通信の準備をする 34 while (!Serial); // 準備が終わるのを待つ 35 Serial.println("プログラム開始"); // シリアル通信でメッセージをPCに送信 36 37 pinMode(13, OUTPUT); //Lチカ 38 pinMode(27, OUTPUT); //ラインLED 39 pinMode(to_switch, INPUT); // トグルスイッチ(スタート用) 40 pinMode(ta_switch, INPUT); //タクトスイッチ(計測用) 41 42 pinMode(26,OUTPUT); //A(ラインマルチプレクサでピン選択) 43 pinMode(25,OUTPUT); //B(ラインマルチプレクサでピン選択) 44 pinMode(24,OUTPUT); //C(ラインマルチプレクサでピン選択) 45 pinMode(23,INPUT); //ic1のセンサー値 46 47} 48 49void loop(void) { 50 if(a == 0) //一番最初にくるところ(リセットステート) 51 { 52 digitalWrite(M1_PAHSE,LOW); //正転 53 analogWrite(M1_ENABLE,0); //PWM Speed Control 54 digitalWrite(M2_PAHSE,LOW); //正転 55 analogWrite(M2_ENABLE,0); //PWM Speed Control 56 digitalWrite(M3_PAHSE,LOW); //正転 57 analogWrite(M3_ENABLE,0); //PWM Speed Control 58 digitalWrite(M4_PAHSE,LOW); //正転 59 analogWrite(M4_ENABLE,0); //PWM Speed Control 60 61 i = 0; //センサの値の回数を数える(ディスプレイ用) 62 ii = 0; //センサの値の回数を数える(マジで100回数える) 63 k = 0; //回数管理 64 65 66 digitalWrite(13,HIGH); //Lチカ 67 digitalWrite(27,HIGH); //ラインLEDオン 68 69 //一番右のラインセンサを選択 70 digitalWrite(26,LOW); //A(ラインマルチプレクサでピン選択) 71 digitalWrite(25,HIGH); //B(ラインマルチプレクサでピン選択) 72 digitalWrite(24,HIGH); //C(ラインマルチプレクサでピン選択) 73 74 if(digitalRead(to_switch) == 1) //ボタンがオンになったら計測を開始する 75 { 76// digitalWrite(M1_PAHSE,HIGH); //正転 77// analogWrite(M1_ENABLE,255); //PWM Speed Control 78// digitalWrite(M2_PAHSE,HIGH); //正転 79// analogWrite(M2_ENABLE,255); //PWM Speed Control 80// digitalWrite(M3_PAHSE,HIGH); //正転 81// analogWrite(M3_ENABLE,255); //PWM Speed Control 82// digitalWrite(M4_PAHSE,HIGH); //正転 83// analogWrite(M4_ENABLE,255); //PWM Speed Control 84// delay(1000); //一秒待つ(モーターが全速力で回るまでまつため) 85 a = 10; //計測スタート 86 } 87 } 88 else if(a == 10) //スタートボタンが押されたら 89 { 90 for(int i=0; i<=1000; i++) 91 { 92 pd_value[i] = analogRead(23); 93 }; 94 a = 20; //データを表示 95 } 96 else if(a == 20) //集めたデータを表示 97 { 98 for(int i=0; i<=1000; i++) 99 { 100 Serial.println(pd_value[i]); 101 }; 102 a = 30; 103 } 104 else if(a == 30) 105 { 106 if(digitalRead(ta_switch) == LOW) 107 { 108 a = 20; //計測データをみる 109 }; 110 } 111 112 if(digitalRead(to_switch) == 0) 113 { 114 a = 0; //すべてをリセット 115 } 116}

試したこと

-簡単なシリアルモニタを動かすプログラムを入力→シリアルモニタは作動

int counter = 0; // counterという名前の変数を用意して、0をセットする void setup() { // 起動後、この中の内容が上から順に1回実行される Serial.begin(115200); // シリアル通信の準備をする while (!Serial); // 準備が終わるのを待つ Serial.println("プログラム開始"); // シリアル通信でメッセージをPCに送信 // 最後まで実行された後はloop関数に移行する } void loop() { // setup関数が終了すると、この中の内容が上から順に何度も実行されつづける Serial.print("カウンターの値 "); // シリアル通信でメッセージをPCに送信 Serial.println(counter); // シリアル通信でカウンターの値をPCに送信 counter = counter + 1; // カウンターの値を1増やす delay(1000); // 1000ミリ秒(1秒)待機 // 最後まで実行された後はloop関数の先頭に戻る }

-シリアルモニタが表示されないコードの"while (!Serial);"をコメントアウト→それ以降のプログラムは動くようになるが、シリアルモニタは表示されない
-パソコンを再起動

補足情報(FW/ツールのバージョンなど)

ですので、私はシリアルモニタの準備が永遠にできていないと思うのですが実際は何が原因なのでしょうか?
解決方法を教えていただけるとありがたいです
ようしくお願いします!!

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

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

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

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

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

guest

回答2

0

ベストアンサー

バグが入り込んだのかもしれませんね。

例えば

float pd_value[100];

としたのなら

for(int i=0; i<=1000; i++) { pd_value[i] = analogRead(23); };

のように1000まで行ったらダメです。99までにしないと。
このようなのが他にもあるかも。

また、

Serial.println(pd_value[i]);

としていますけど、ここでのiは外部変数の方のiですから0ですよ。
このiは0のままのようですけど。

投稿2022/08/26 04:14

nac_tnk

総合スコア463

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

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

kotaro425

2022/08/26 05:18

そうですね! 言われたとおりに変更してみるとうまく動いてくれるようになりました! 本当に教えていただき、ありがとうございます。
guest

0

そうなる原因は不明ですが、

while (!Serial);

この行は意味ないので削除しましょう

投稿2022/08/26 04:04

y_waiwai

総合スコア87749

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

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

kotaro425

2022/08/26 05:11

コメントしていただき、ありがとうございます! なぜ while (!Serial); は意味がないのでしょうか? 教えていただけると嬉しいです
y_waiwai

2022/08/26 05:22

どっちかいうと、なぜそういう記述をしてるのかってのを聞きたいところですが、 SerialというオブジェクトがNULLになることはありませんし、NULLになってるのが別のものに変化するってのはありません。
thkana

2022/08/28 03:06

> SerialというオブジェクトがNULLになることはありません というのは間違いで、USBをマイコン自身が制御するタイプの場合、起動後USB Serialの準備ができるまで多少の時間がかかり、その間Serial()がNULL(だったか0だったか)を返すようになっています。
kotaro425

2022/09/10 10:42

なるほど、ではいるということですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問