シリアルポートで通信してみよう
レガシーだけど今でも現役

はじめに

PCのRS-232Cインターフェースは、シリアルポートやCOMポートと呼ばれています。シリアルポートは絶滅寸前のレガシーなインターフェースですが、マイコン関係の開発では、まだまだ現役で、なくてはならないものです。今回はシリアルポートの練習ネタとして16×2キャラクタLCDモジュールSC1602BS*Bを使ってみようで用いたPICキャリーボードキットを使ってPCからPICを通してキャラクタLCDに文字を表示させてみました。

次にPICとMIDI音源を使って超簡単MIDIキーボードを作ってみました。MIDIは電子楽器系のインターフェース規格で規格RS-232と酷似しているため、MIDIインターフェースと変換ケーブルを作成すれば、MIDI機器を操作することができます。しかし今回は、PCとの接続用にRS-232Cを搭載しているMIDI音源モジュールを所持していたので、変換ケーブルの作成は行なわないで、PICからRS-232CインターフェースでMIDIデータを送ります。


シリアルポートについて

RS-232C関連の予備知識

シリアルポートは殆どのデスクトップPCにはついていますが、最近のノートPCにはついていません。しかし、USBとCOMポート変換ケーブルが販売されていますので、ケーブル購入すれば少なくともWindows上からは普通に使用できます。USBとCOMポートのインターフェース変換CHIPが、USBチップメーカーから出ているので、自作も可能です。デバイスドライバのインストールとか面倒ですけど。

RS-232C規格(Recommended Standard 232 version C)
RS-232Cはシリアル通信のコネクタと信号の規格です。PCのCOMポートのコネクタは9ピンのEIA574です。(PC9801は25ピンのEIA232だったはず)
RS-232Cを電子工作で用いる場合は、通信規格の全てを把握する必要は無く、基本的に送信、受信、GNDの3本をどのように繋ぐか考えるだけで十分です。コネクタも、PCには9ピンのコネクタが必要ですが、ターゲット側は3本の端子でもかまいません。例えばステレオ端子で代用することができます。
クロスケーブルが必要な場合は送信Pin⇔受信Pin、受信Pin⇔送信Pinになるように繋ぎます。
RS-232Cと似た規格にRS-422規格があります。こちらはMacintoshのシリアルポートに採用されています。

RS-232C信号ドライバ
RS-232Cの信号は±12Vなので信号ドライバICが必要になります。このドライバICの殆どはMAX232互換のICが使われています。組み込み関連のボードのシリアルポートの近くを探してみると必ずと言って良いほどMAX232互換ICが搭載されています。

PCのCOMポート
PCのCOMポートのコネクタは9ピンのEIA574です、2番が送信(TX)、3番が受信(RX)、7番がGNDです。

MIDIインターフェース規格
MIDIは電子楽器同士を接続するインターフェース規格です。実はMIDIインターフェースはPCのシリアル通信と同じ通信を行います。しかし、電圧のHi,Lowするものではなく、電流の有り無しでHi、Lowが決まるカレントループ信号になっていて、速度もPCと異なり31.25kbpsのシリアル調歩同期になっています。


PCからLCDをコントロールする。

キャリーボードの改造

PCからLCDモジュールを簡単にコントロールするために、LCDモジュールの手続き的な処理をPICで吸収します。単純に、PCからキャラクタをシリアル調歩同期通信で送ると、LCDに表示するようにしました。

シリアル通信をする為にキャリーボードを改造します…といってもいじるのはPIC16F84Aマイコンモジュールキットです。受信のRA4と割り込み入力RB0をショートします。ポートを繋ぐだけの簡単な改造です。

↓ボード改造 ウレタン線でつないでいます


↓改造した結果の回路図 PDF版はこちら

2930L05は5Vの低ドロップレギュレータ、SP202ECPはMAX232の互換ICです。


受信処理とLCD表示

PIC18キャリーボードにあるD-SUB9ピンからシリアル調歩同期 9600bpsで受信します。製作当初は38400bpsで作成していたのですが、受信タイミングが厳しくなってソースが汚くなってきたのでレートを落とすことにしました。16×2キャラクタのLCDに表示する程度の処理なのでこれで十分でしょう。

キャラクタコードを受信してLCDに表示するサンプル
PICアセンブラ:
pc_com100.asm
アセンブルしたhexファイル:
pc_com100.hex

PICとLCDモジュールを初期化した後にブランクとして1s待ってから受信を待ちます。待ち受け中はGOTOで無限ループしています。データを受信はRB0の立下りをトリガに割り込みを発生させます。受信したデータはコマンドまたはキャラクタを判断した後、LCDに書き込みしてGOTOループに戻ります。LCDのコマンドはキャラクタコードで0x01〜0x04を割り当てています。


PCからLCDモジュールを操作しよう Windows編

↓PCから入力した文字

TeraTermProやハイパーターミナル等のターミナルエミュレータから操作可能です。TeraTermProでは以下の様に設定します。

ターミナルエミュレーターの設定
Baud rate: 9600
Data: 8bit
Parity: none
Stop: 1bit
Flow control: none

QWERTYとタイプしました。ターミナルエミュレータの画面に入力しても何も表示されませんが、キー入力をシリアルでPCから出力され、PICが処理して液晶に表示します。


動作を覗いてみる

受信タイミングの確認用にプログラムでは、データを取り込む直前にRA3を2サイクルだけHiになるようにしています。これで取り込みタイミングにパルスを発生します。コレを使って、何時データを取り込んでいるか、ロジックアナライザを用いてみてみました。

↓受信信号の波形と受信のタイミング

ラベルの3のRX Dataが受信データ、ラベルの4のTEST Trgが受信のタイミングです。データが確定している位置で取り込んでいることがわかります。ラベルの13,14の信号は受信信号を取りこぼしているときの波形です。処理が間に合わずに、へんなところでデータを取り始めています。

PCからのシリアル転送を受信できるようになりました。次は受信だけでは片手落ちなので送信のネタを考えて見ます。


超簡単MIDIキーボードを作る

MIDIの使用をひっぺがえす

AKI-PIC18キャリーボードを、YAMAHAやRolandやKORGに劣るとも優らないMIDIキーボードにします。複数MIDI音源モジュールを持っている人でTornキーが無ければ、音を素早く確認するのに使えるかもしれません。

MIDI音源モジュールにはMIDIポートの他に、AT互換機・PC9801のRS-232C規格と、MacのRS-422規格のシリアルインターフェースを持つものがあります。PICと通信するにあたって、音源のRS-232CからMIDIポートへ変換する回路を作っても良かったのですが、信号をそのままシリアルポートに繋いだ方が楽だったので、そちらを使うことにしました。

送信速度はPCのシリアル通信速度と同じ、38.4kbps(1bit=26μs)にしました。


音を鳴らす

まず、音だけ鳴るプログラムを作ってみました。D-SUB9ピンコネクタとRS-232C用ドライバICはボード上で結線していますので、上記のLCDの回路そのままで、改造は不要です。

シリアルからMIDIコードを出力するサンプル
アセンブラソース:
midi_tx100.asm

ソース上は正しくても、出力データが正しく出ているかどうかは実際に波形を見なければ解りません。ロジックアナライザで波形を見てみましょう。
今回はMIDI信号の資料が不足していたため、数年前に作成したDOS用MIDIプレイヤの出力信号を参考にプログラムを組んでみました。

↓プローブを当てる

観測状況。プローブを端子に当てて、波形を調べています。


↓出力波形

13: PIC16F84の出力波形 "90 39 70"(チャネル0 ノートオン、ノート番号57(A)、ベロシティ 112)
15: シリアルバスの波形 (RS-232C用ドライバICはインバータのため伝送される信号は反転している)

波形のラベルを忘れていました…。

どうやら、OKみたいです。データはLSBから送信されるので注意してください。

おっと忘れるとこだった。

MIDI音源モジュールの受信ポートに送信するため、クロスケーブルを使う必要があります。
シリアルポートにはたくさんのポートが有りますが、実際にMIDI信号の送信に使用しているポートは、受信と送信とGNDの3本だけなので、送信と受信をクロスにした簡易クロスケーブルを作りました。

↓クロスケーブルの回路図

Rx、Tx、GNDだけです。

↓製作したクロスケーブル

即席の簡易クロスケーブル。本当に簡易ですね。制作費100円です。


↓鳴らしているところ

とりあえずMIDI音源モジュール鳴らしてみます。サンプルのアセンブラソースではAの音がGM音色の2〜128番まで鳴ります。1番の音色が実験のやりすぎで飽きたので省略しちゃいました。


ボードの改造

キーボードというからにはキーがなくてははじまりません。

キーボードのキーになるタクトスイッチをPICに接続します。タクトスイッチがOFFの時はVccがプルアップされていて、ONでGNDに落ちます。Vccのプルアップ抵抗にはキャリーボード付属の2.2kΩを使っています。

↓改造後の回路図 PDFはこちら

ボタンを追加しています。


一応キーボード

ボタンを押すと音が鳴るようにサンプルを改造しました。

簡易キーボードサンプル
アセンブラソース:
midi_tx110.asm
アセンブルしたhexファイル:
midi_tx110.hex

キー配置
青(SW1): A(ラ)
黄(SW2): B(シ)
赤(SW3):ノート・オフとプログラムチェンジ

ベロシティは112に固定しています。ボタンの同時押しには対応していません。

シリアル転送で音を鳴らすことができれば、このようなMIDIキーボードも簡単に作れます。今回は2キー+コントロールキーのみですが、キー数は容易に増やすことができます。

市販のキーボードのベロシティ検出対応のものはキーを押すスピードや力をセンサで検出しています。気が向いたら挑戦してみます。

コレができるとMIDIプレイヤーを作ることができるようになります。小型プレイヤーとか、タイマーを使って目覚まし時計とか、いろいろと応用ができそうです。


使用機器

↓ロジアナ98とAKI-PICプログラマキット

私の場合、アナログ回路よりソフト系の方が明るいので、ソフトの方からアプローチをするために、オシロスコープよりもロジアナを先に購入しました(高価だった)。200MHzサンプリングまで対応してます。うーんオーバースペックか?

AKI-PICプログラマキットは殆どのミッドエンドのPICの書き込みに対応してたスグレモノです。まぁ、入門で作成したプログラマでも今回は十分使えますけど。今回のAKI-PIC18キャリーボードキットといい、AKI-PICプログラマキットといい、秋月電子通商のキットは資料が付いてくるので学習用途にも向いています。是非、学習に活用しましょう。


今回学んだこと。

使わないピンが使うピンと繋がっているときはハイインピーダンス(入力)にしておく。
出力だとピンに影響を与えます。
使う変数は必ず初期化するべし。シミュレータではOKでも実機では駄目な場合あり。
レジスタファイルにはパワーオンリセットで初期化されないの?
ハード製作用のテストの専用機材は個人ではまず利用できないので、PCを使って何とかすることになる。
そのためにはAT互換機のレジスタなどのハードを理解できるようになることことが必要条件となります。
1つでも規格を熟知していると何か作るとき便利。
MIDIは昔プログラムやってたおかげで知ってた。
半田ごてで手に焼きを入れるべからず。
恥ずかしい男の勲章。
ケーブルをクロスにするのを忘れるなぁ!
気づいたらフテ寝したくなります。
ロジアナで現実をみようよ。
コレ、重要。予想より現実を見る方が手っ取り早い。
データシートは舐めるように読むべし、読むべし。
フテ寝したくなければ何度でも何度でも。