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

回路の解説
このプロジェクトは非常にシンプルで、Arduino Unoボードのみを使用します。Unoに内蔵されたUSB-シリアル変換器を介してシリアル通信が行われるため、外部部品は不要です。Velxioでは、シリアルモニタがエディタツールバーに統合されているため、コードとすぐにやり取りできます。
部品
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Uno (wokwi-arduino-uno) | 1 | 動作の頭脳 |
これだけです!Arduino UnoのTX(ピン1)とRX(ピン0)はUSBインターフェースに内部接続されており、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);
}
}

動作の仕組み
-
セットアップ:
Serial.begin(9600)でシリアル通信を9600ボーで初期化します。次に、バナーとシステム情報(CPUクロック速度(F_CPU / 1000000 でMHz表示)とボーレート)を表示します。 -
グローバル変数:
unsigned long charCount = 0;で受信した文字数を追跡します。 -
ループ:
if (Serial.available() > 0)で受信バッファにデータがあるか確認します。char c = Serial.read();で1文字読み取ります。charCountをインクリメントし、フォーマットされたメッセージ[count] Received: 'c' (ASCII 99)を表示します。- 5秒ごとに、稼働時間と受信文字数のハートビートを表示します。
学生向けの重要な概念
- ボーレート: シリアル通信の速度。両方の機器が同じボーレート(ここでは9600)に設定されている必要があります。
- Serial.available(): 読み取り待ちのバイト数を返します。読み取り前に必ず確認し、-1を避けます。
- Serial.read(): バッファから1バイト(文字)を読み取ります。
- ASCII: 各文字には数値コードがあります。例えば ‘A’ は65です。コードでは
cをintにキャストして表示しています。 - millis(): プログラム開始からの経過ミリ秒を返します。ノンブロッキングなタイミング処理に便利です。
- static変数:
static unsigned long lastBeatはループ間で値を保持します。ローカル変数とは異なります。
よくある落とし穴とデバッグのヒント
- シリアルモニタに出力が表示されない? Velxioでシリアルモニタを開いているか確認してください(ツールバーの「Serial Monitor」ボタンをクリック)。また、モニタのボーレートが9600に設定されているか確認してください。
- 文字化け? ボーレートの不一致が最も一般的な原因です。
Serial.begin(9600)とモニタの設定を再確認してください。 - 入力しても何も起こらない? 入力後に「Send」またはEnterキーを押しているか確認してください。コードは1文字ずつ読み取ります。
- ハートビートが表示されない?
if (millis() - lastBeat >= 5000)の条件は>=を使用して間隔を逃さないようにしています。ハートビートが表示されない場合は、lastBeatが正しく更新されているか確認してください。
推奨される拡張機能
基本的なエコーをマスターしたら、以下の拡張に挑戦してみてください:
- 行全体のエコー: 各文字をエコーする代わりに、改行まで文字を蓄積し、行全体をエコーします。
- コマンドパーサー: 「LED ON」のような特別なコマンドを解釈してLEDを点灯します(回路にLEDを追加)。
- バイナリ出力: 受信した文字をバイナリ形式で表示します。
- 複数のボーレート: コマンドでボーレートを変更できるようにします。
- 仮想EEPROMへのログ: 受信データをシミュレートされたEEPROMに保存します。
まとめ
最初のシリアル通信プロジェクトが完成しました!シリアルエコーは、マイクロコントローラが外部とどのように通信するかを示す、シンプルながら強力なデモンストレーションです。Velxioを使えば、ハードウェアなしで実験できます。シミュレータを開いてコードを書き、すぐにテストしてみましょう。
実際に試してみませんか?Velxioでライブサンプルを開いて、入力してみてください:Velxioのシリアルエコー。楽しいコーディングを!