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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Arduino

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

Q&A

解決済

1回答

246閲覧

ArduinoのLEDが点灯しない

One_of_Arthur

総合スコア80

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Arduino

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

0グッド

0クリップ

投稿2024/04/07 07:27

実現したいこと

Arudino nanoのLED点灯や出力をPCから制御したいです。

発生している問題・分からないこと

Arduino nanoのLED D13が点灯しないです。
Arudino IDEのシリアルモニタからメッセージを送ると、ちゃんと点灯するので、Arduino側には問題がないと思われます。
PC側のソースも、エラーを吐かないのでどこが悪いのか見当がつきません。

該当のソースコード

Arduino

1const int LED = 13; 2int incomingByte = 0; // for incoming serial data 3 4void setup() { 5 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps 6 pinMode(LED,OUTPUT); 7 digitalWrite(LED,LOW); 8} 9 10void loop() { 11 12 // send data only when you receive data: 13 if (Serial.available() > 0) { 14 incomingByte = Serial.read(); 15 if(incomingByte != 0){ 16 digitalWrite(LED,HIGH); 17 } 18 } 19 20 delay(10); 21}

C++

1#include <windows.h> 2#include <stdio.h> 3#include <stdlib.h> 4 5HANDLE arduino; 6bool Ret; 7 8void main(void) { 9 BYTE data = 1; 10 //1.ポートをオープン 11 arduino = CreateFile(L"COM6", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 12 //2014/01/22追記 これでつながらない場合には"\\\\.\\COM7"とするとつながるかもしれません。 13 14 if (arduino == INVALID_HANDLE_VALUE) { 15 printf("PORT COULD NOT OPEN\n"); 16 system("PAUSE"); 17 exit(0); 18 } 19 //2.送受信バッファ初期化 20 Ret = SetupComm(arduino, 1024, 1024); 21 if (!Ret) { 22 printf("SET UP FAILED\n"); 23 CloseHandle(arduino); 24 system("PAUSE"); 25 exit(0); 26 } 27 Ret = PurgeComm(arduino, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); 28 if (!Ret) { 29 printf("CLEAR FAILED\n"); 30 CloseHandle(arduino); 31 exit(0); 32 } 33 //3.基本通信条件の設定 34 DCB dcb; 35 GetCommState(arduino, &dcb); 36 dcb.DCBlength = sizeof(DCB); 37 dcb.BaudRate = 9600; 38 dcb.fBinary = TRUE; 39 dcb.ByteSize = 8; 40 dcb.fParity = NOPARITY; 41 dcb.StopBits = ONESTOPBIT; 42 43 Ret = SetCommState(arduino, &dcb); 44 if (!Ret) { 45 printf("SetCommState FAILED\n"); 46 CloseHandle(arduino); 47 system("PAUSE"); 48 exit(0); 49 } 50 //4.送信 51 DWORD dwSendSize; 52 DWORD dwErrorMask; 53 54 Ret = WriteFile(arduino, &data, sizeof(data), &dwSendSize, NULL); 55 if (!Ret) { 56 printf("SEND FAILED\n"); 57 CloseHandle(arduino); 58 system("PAUSE"); 59 exit(0); 60 } 61 printf("FINISH\n"); 62 CloseHandle(arduino); 63 system("PAUSE"); 64}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

色々と試行錯誤をしてみたところ、
OLEDモジュールをつけて、受信した文字を表示するようにしてみました。
これもシリアルモニタからだと正常に表示されました。
Arduino側のif (Serial.available() > 0) {}の中に入ったら無条件で表示するようにしてみたのですが、
PCからの送信を全くバッファしていないらしく、送ったdataを表示しませんでした。
同じ個所に、OLEDモジュールとは別に、無条件でLED D13を点灯するようにしてみたところ、
やはり、シリアルモニタからなら点灯しますが、
PC側からだと点灯しません(正確には一瞬ついて消える)。
Aruduino側のloop() {}にLEDを消すような文はないので、一瞬点灯しても関係がないと思われます。

実際には、D2、D3、D4を選択的にオンにするプログラムを書いたのですが、シリアルモニタからは正常動作するものの、PCからは全くオンになりません。

補足

Arduino IDE 2.3.2
Visual Studio Community 2022 (64 ビット) - Current Version 17.9.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

最近見た他サイトの質問と同様の話かと思います。

PC側のCOMポートをオープンすると、Arduinoの機種によっては(NANOは該当)ボードにリセットがかかり、ブートローダが終わってからユーザープログラムが走ります。PCからデータを送るなら、ユーザープログラムが始まるのを待ってからにしましょう。単純に時間をつぶすなり、Arduinoから何か送ってそれを待ってからPCがデータを送るようにするとか。

投稿2024/04/07 08:24

編集2024/04/07 10:22
thkana

総合スコア7645

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

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

One_of_Arthur

2024/04/09 02:00

回答ありがとうございます。 試したところ問題が解決しました! 両方試してみましたが、Arduinoからのシリアル通信をPC側で受信したら先に進むようにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問