arduinoがシリアル通信時にリセットされる原因が分かりました
ここ数日、Arduinoとパソコン間でシリアル通信を行う際に
1)初期通信が不安定
2)Arduinoにリセットがかかる
の件で悩んでいました。
これが解決できないと、arduinoを連続稼働したままでパソコンとのシリアル通信が
出来ないし、通信でエラーが発生します。
パソコン側はLinux (CentOS)で通信ソフトを作成していたのですが、
操作性の良いWindows環境に作り変えることにし、その際Arduinoの仕様を
見直したところ、本家arduino.ccのホームページのArduino UNOの仕様において
に「Automatic (Software) Reset」なる記事を見つけました。
(ヒントはeggshell blueさんHPの「DTR と Arduino の関係」から頂きました:感謝!)
結論及び仕様の要点をいうと
Arduino UNOにおいてUSB経由でシリアル通信する際、DTR端子の状態がLOWの
場合はリセットがかかり、HIGHの場合はリセットがかからないです。
この仕様はArduino IDEからのソフトウェア書き込み&再起動のための仕様でです。
今回、パソコン側の通信ソフトをVisual Basic 2013で作り直しました。
シリアル通信はSerialPortというモジュールを使いました。
このモジュールのプロパティにDtrEnableという項目があり、DTRの利用の指定ができます。
DtrEnableをFlaseに設定することで、USB経由でのシリアル通信開始時に
リセットが発生せず、安定した通信ができました。
これでarduinoとのシリアル通信は自分が意図するイメージで行えるようになりました。
Arduino接続の外部EEPROMの書き込みソフトが完成しました。
Visual Basic 2013で作成したアプリはこんな感じです。
データファイルを指定して任意のアドレスにデータを書き込みます。
データが正しく書き込めたかのチェックは2バイトのチェックサムを比較しています。
書込みはスレッドにてバックグラウンドで行い、進捗表示、中断ができます。
スレットからUI関連のAPIを使うとエラーとなることにちょっとハマりましたが、
こんな感じで
Me.BeginInvoke( _
Sub()
Lbl_status.Text = "状況: 通信中 [" & cnt & "/" & data.Length & "]"
Lbl_status.Update()
End Sub)
Invokeを使うことで解決できました。
VBのソース ダウンロード EEPROMWrite.zip (178.0K)
arduino側はシリアル通信においてはスレーブ動作でパソコンから受信したコマンド
に応じて処理を行います。TeraTerm等で対話的にデータの参照もできます。
arduino UNO用のソース ダウンロード download.zip (3.1K)
arduinoにTeraTermで接続し"i"と入力するとI2Cバス接続デバイスのアドレスを表示
"p10000,100FFF"と入力してEEPROMの指定範囲のデータを表示
Visual Basicでのプログラミングは久しぶりですが、シリアル通信のSerialPort
は使いやすくで良いです。以後ツールはVisual Basicで作成します。
開発環境も無料ですし。作成も1日程度でできました。
« Arduinoで美咲フォントを使った8x8ドットマトリクスLED(3) | トップページ | 日本語フォントROM GT20L16J1Y Breakoutを試してみました »
「arduino」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
「AVR」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました(2018.10.30)
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
コメント
« Arduinoで美咲フォントを使った8x8ドットマトリクスLED(3) | トップページ | 日本語フォントROM GT20L16J1Y Breakoutを試してみました »
同じ内容で1日悩んでました。DTRをHIGHにするということで。ありがとう👍
投稿: riraosan | 2021年10月 5日 (火) 09時37分
> 同じ内容で1日悩んでました。DTRをHIGHにするということで。ありがとう👍
ご連絡ありがとうございます。お役に立てて、光栄です
投稿: たま吉さん(管理者) | 2021年10月 5日 (火) 12時06分