戻る

Arduinoでシリアルエコー:USART通信を学ぼう

はじめに

シリアル通信は、組み込みエレクトロニクスにおける最も基本的なスキルの一つです。センサーのデバッグ、GPSモジュールとの通信、PCへのデータ送信など、USART(ユニバーサル同期/非同期送受信機)は頼りになるツールです。このチュートリアルでは、Velxioシミュレータ上でArduino Unoを使い、シンプルなシリアルエコープロジェクトを構築します。シリアルモニタで入力したすべての文字が、そのASCII値と通し番号とともにエコーバックされます。これはシリアル通信における「Hello, World!」です。

Velxioシミュレータキャンバス上のシリアルエコーの回路図

回路の解説

このプロジェクトは非常にシンプルで、Arduino Unoボードのみを使用します。Unoに内蔵されたUSB-シリアル変換器を介してシリアル通信が行われるため、外部部品は不要です。Velxioでは、シリアルモニタがエディタツールバーに統合されているため、コードとすぐにやり取りできます。

部品

部品数量備考
Arduino Uno (wokwi-arduino-uno)1動作の頭脳

これだけです!Arduino UnoのTX(ピン1)とRX(ピン0)はUSBインターフェースに内部接続されており、Velxioがそれを完璧にエミュレートします。配線は不要です。

コンパイルと実行のコントロールがあるVelxioエディタツールバー

コードの解説

コードを見ていきましょう。Velxioエディタを開くと、以下のスケッチが表示されます:

// Serial Echo — USART Protocol Test
// Open the Serial Monitor to send and receive data.
// Everything you type is echoed back with extra info.

void setup() {
  Serial.begin(9600);
  Serial.println("=============================");
  Serial.println("  Serial Echo Test (USART)");
  Serial.println("=============================");
  Serial.println("Type something and press Send.");
  Serial.println();

  // Print system info
  Serial.print("CPU Clock: ");
  Serial.print(F_CPU / 1000000);
  Serial.println(" MHz");
  Serial.print("Baud rate: 9600");
  Serial.println();
  Serial.println();
}

unsigned long charCount = 0;

void loop() {
  if (Serial.available() > 0) {
    char c = Serial.read();
    charCount++;

    Serial.print("[");
    Serial.print(charCount);
    Serial.print("] Received: '");
    Serial.print(c);
    Serial.print("' (ASCII ");
    Serial.print((int)c);
    Serial.println(")");
  }

  // Periodic heartbeat
  static unsigned long lastBeat = 0;
  if (millis() - lastBeat >= 5000) {
    lastBeat = millis();
    Serial.print("Uptime: ");
    Serial.print(millis() / 1000);
    Serial.print("s | Chars received: ");
    Serial.println(charCount);
  }
}

Velxio Monacoエディタでのシリアルエコーのソースコード

動作の仕組み

  1. セットアップ: Serial.begin(9600) でシリアル通信を9600ボーで初期化します。次に、バナーとシステム情報(CPUクロック速度(F_CPU / 1000000 でMHz表示)とボーレート)を表示します。

  2. グローバル変数: unsigned long charCount = 0; で受信した文字数を追跡します。

  3. ループ:

    • if (Serial.available() > 0) で受信バッファにデータがあるか確認します。
    • char c = Serial.read(); で1文字読み取ります。
    • charCount をインクリメントし、フォーマットされたメッセージ [count] Received: 'c' (ASCII 99) を表示します。
    • 5秒ごとに、稼働時間と受信文字数のハートビートを表示します。

学生向けの重要な概念

よくある落とし穴とデバッグのヒント

推奨される拡張機能

基本的なエコーをマスターしたら、以下の拡張に挑戦してみてください:

  1. 行全体のエコー: 各文字をエコーする代わりに、改行まで文字を蓄積し、行全体をエコーします。
  2. コマンドパーサー: 「LED ON」のような特別なコマンドを解釈してLEDを点灯します(回路にLEDを追加)。
  3. バイナリ出力: 受信した文字をバイナリ形式で表示します。
  4. 複数のボーレート: コマンドでボーレートを変更できるようにします。
  5. 仮想EEPROMへのログ: 受信データをシミュレートされたEEPROMに保存します。

まとめ

最初のシリアル通信プロジェクトが完成しました!シリアルエコーは、マイクロコントローラが外部とどのように通信するかを示す、シンプルながら強力なデモンストレーションです。Velxioを使えば、ハードウェアなしで実験できます。シミュレータを開いてコードを書き、すぐにテストしてみましょう。

実際に試してみませんか?Velxioでライブサンプルを開いて、入力してみてください:Velxioのシリアルエコー。楽しいコーディングを!


共有:
David Montero

執筆者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

関連記事


前の記事
ArduinoによるシリアルLED制御:コマンド送信でLEDを点滅させる
次の記事
ArduinoでLCD 20x4ディスプレイ:VelxioでHello World