アフィリエイト広告
アフィリエイト広告

UART 送信回路をロジックICでつくる

UART 通信の送信回路をロジックICでつくり、Arduino やパソコンへデータを送信してみます。

前回までに、Arduino Nano Every から送られてくる UART通信データを受信する回路ができています。今回はこれに追加して、送信もできるようにしましょう。
前回の記事は次のふたつです。最初に、Arduino Nano Every から送られてくる UART通信の信号を確認して、それを受信する回路をつくりました。次の記事では、その回路をちょっと変更、うーん改善かな、しました。

タイミングダイヤグラム

UART送信回路のタイミングダイヤグラム (図1) です。

タイミングダイヤグラム
図1. タイミングダイヤグラム

外部からのスタート信号で、送信を開始することにします。
スタート信号 START が LOW になるとストレージクロック STCP を出力し、入力された 8ビットパラレルデータをストレージレジスタに読み込みます。このときスタートビット ST、ストップビット SP を付加した 10ビットをセットします。
次に、パラレルロード PL を出力し、ストレージレジスタのデータをシフトレジスタに転送します。同時に TLOAD を HIGH にしてカウント動作を開始します。カウンタはシフトクロック SHCP を 10個出力し、10ビットのデータをすべてシフトしたら、出力 TxD が HIGH の状態で停止します。
ちなみに、次の START 信号はカウンタ停止後に受け付け可能であり、送信動作中に START が立ち下がると誤動作する可能性があります。これへの対応は考慮していません。

図2 は、スタートビット ST、ストップビット SP 付近を拡大したタイミングダイヤグラムです。

タイミングダイヤグラム (拡大)
図2. タイミングダイヤグラム (拡大)

スタート信号 START の立ち下がりエッジを検出し、クロック CLK に同期したストレージクロック STCP を出力します。続けて次のクロックでパラレルロード PL を出力します。入力された 8ビットパラレルデータにスタートビット ST、ストップビット SP を付加した 10ビットのデータは、STCP の立ち上がりエッジでストレージレジスタに読み込まれ、PL が LOW になるとシフトレジスタへ転送されます。
PL によりカウンタのロード信号 TLOAD を HIGH にしてカウント動作を開始します。カウンタは初期値 0x61 から 0xff までカウントして、クロックを 16分周した 9600Hz のパルストレイン 10個を出力します。0xff で停止信号 TSUPR を出力してカウンタを停止、TLOAD を LOW に戻します。カウンタには初期値 0x61 がロードされ、待機します。

ブロックダイヤグラム

ブロックダイヤグラム (図3) です。前回までに作成した UART受信回路ブロックダイヤグラムに、送信回路を追加しました。

ブロックダイヤグラム
図3. ブロックダイヤグラム

初期化回路、クロック発振回路は共通部分です。初期化回路は、電源オン時に Dフリップフロップ、カウンタを初期化します。水晶発振子により 19.6608MHz を発振し、リプルカウンタにより 128分周してクロック 153.6KHz を出力します。これをさらに 16分周してシリアルクロック 9600Hz とします。
テスト用の周辺回路として、送信スタート信号を発生させる押しボタン回路、8ビットパラレルデータを生成する Dipスイッチ回路をつくります。送出したシリアル通信データは、Arduino Nano Every、またはパソコンで受信します。
なお、送信データのレジスタはありませんので、この回路で送信できるのは 1キャラクタのみです。

回路図

各部の回路図です。

初期化回路

初期化回路
図4. 初期化回路

クロック発振回路

クロック発振回路
図5. クロック発振回路

初期化回路、クロック発振回路は受信回路と共通です。前回記事を参照ください。

スタート信号発生回路 (テスト用)

スタート信号発生回路 (テスト用)
図6. スタート信号発生回路 (テスト用)

送信スタート信号 START を発生させる押しボタンスイッチとチャタリング防止回路です。テスト用の回路です。

R38、C7 とシュミットトリガインバータ 74HC14 により、押しボタンスイッチのチャタリングを防止します。
R37 はプルアップ抵抗で、押しボタンスイッチに 5mA を流します。R39 はインバータの保護抵抗です。

スタート信号検出回路

スタート信号 START の立ち下がりエッジを検出する回路です。

スタート信号検出回路
図7. スタート信号検出回路


Dフリップフロップ 74HC74 (U18B、U18A) と ANDゲート 74HC08 (U16A) による立ち下がりエッジ検出回路で、U16A より出力されたパルスをシフトレジスタのストレージクロック STCP とします。
Dフリップフロップ 74HC74 (U19A) は、STCP を検出してパラレルロード PL を出力します。U19A により PL は 1クロック遅延したパルスになるので、STCP で入力されたパラレルデータをストレージレジスタに読み込み、次に PL でストレージレジスタからシフトレジスタへデータを転送するシーケンスが実行されます。

シリアルクロック発生回路 (送信)

送信側のシリアルクロック発生回路です。受信側と同様の、4ビットカウンタ 74HC161 をカスケード接続した 8ビットカウンタを利用したパルストレイン回路です。

シリアルクロック発生回路 (送信)
図8. シリアルクロック発生回路(送信)


Dフリップフロップ 74HC74 (U21B) は SRラッチとして動作していて、パラレルロード PL によりセットされ、TLOAD を HIGH にしてカウント動作をスタートさせます。カウンタ 74HC161 (下位 U22、上位 U20) は初期値を 0x61 とし、0xff までカウントして、U22 の出力 QD から 16分周された 9600Hz のパルストレイン 10個を出力します。
データ送出はパルストレインの立ち下がりエッジで行うため、74HC00 を使用した NOT (U23C) で反転してシフトクロック SHCP としています。
カウント値 0xff で上位カウンタ U20 から出力されるキャリー COU20 は、カウンタ停止信号 TSUPR として SRラッチ U21B をリセット、TLOAD を LOW にしてカウント動作を停止するとともに、初期値 0x61 をロードします。

74HC00 NANDゲート (U23D) は、カスケード接続されたカウンタから出るハザードを除去するために入れてあります。
カスケード接続されたカウンタでは出力が 0xef から 0xf0 に遷移するときに上位カウンタ U20 のキャリー COU20 にハザードが発生し、SRラッチ U21B をリセットしてしまいます。そこで、下位カウンタ U22 の出力が 0xf であることを条件に加えハザードの影響をなくしています。

パラレル送信データ生成回路 (テスト用)

パラレル送信データ生成回路 (テスト用)
図9. パラレル送信データ生成回路(テスト用)

送信テスト用に 8ビットのパラレルデータを生成する Dipスイッチ回路です。

Dipスイッチは Dip1 が LSB です。送信したいデータ値をセットしスタート押しボタンスイッチを押下すると、データが送信されます。
R40~R47 はプルダウン抵抗で、Dipスイッチに 0.5mA を流します。

データ送信回路 (パラレル・シリアル変換)

送信データにスタートビット ST とストップビット SP を付加し、パラレル・シリアル変換して送出する回路です。

データ送信回路 (パラレル・シリアル変換)
図10. データ送信回路 (パラレル・シリアル変換)

入力された 8ビットパラレルデータ D0..D7 にスタートビット ST とストップビット SP を付加し、シフトレジスタ 74HC597 によりシリアルデータに変換して送出します。送信データは 10ビットなので、74HC597 をカスケード接続しています。ST、SP は、データ入力端子をそれぞれ LOW、HIGH に固定することで付加しています。
スタートボタンが押下されると STCP が入力されて、パラレルデータがストレージレジスタへ読み込まれます。次にパラレルロード PL が入力され、データはストレージレジスタからシフトレジスタへ転送されます。
9600Hz のパルストレイン 10個をシフトクロック SHCP として入力し、パラレルデータをシリアルデータ (LSB ファースト) に変換、送信データ TxD として送出します。データ送出後、シフトレジスタの出力は待機状態の HIGH に保持されます。

電源オン直後のシフトレジスタ出力は LOW レベルのため、最初の送信時に正常に ST を送信することができません。そのために、74HC00 を利用した OR (U23B) で TLOAD (待機中 LOW) を与え、待機時出力を HIGH にしています。

テスト信号受信回路

UART送信回路からのシリアル通信データを受信するための、テスト信号受信回路を用意します。受信は、Arduino Nano Every とパソコンとで試してみました。

Arduino で受信

Arduino Nano Every 接続図
図11. Arduino Nano Every 接続図

Arduino Nano Every で受信します。受信端子は RX1 です。

前回の UART受信回路への送信も同時に行ないますので、送信端子 TX1 を受信回路の RxD に接続しておきます。

ダイオード D1 は、電源の逆流防止用です。30V 1A 程度の適当なものを使用してください。
電源は 12V になっていますが、9V ほどがおすすめ。まぁ、利用できるものをうまく使いましょう。

スケッチです。
送信は前回同様に、アップカウントビットデータをそのまま送出します。受信は、受け取ったデータビットをシリアルモニタへ表示させます。

  1. void setup() {
  2.   Serial.begin(9600); // Connect to serial monitor
  3.   Serial1.begin(9600, SERIAL_8N1); // Connect to UART pin
  4.   delay(500); // Waiting to start
  5. }
  6. void loop() {
  7.   static byte sendingBit;
  8.   static byte receivedBit;
  9.   for (sendingBit = 0x00; sendingBit <= 0xff; sendingBit++) {
  10.     if (Serial1.available() > 0) {
  11.       receivedBit = Serial1.read();
  12.       Serial.println(receivedBit, BIN);
  13.     }
  14.     Serial1.write(sendingBit);
  15.     Serial1.print('\r'); // sending CR
  16.     Serial1.print('\n'); // sending LF
  17.     delay(500);
  18.   }
  19. }

2~3行目。Arduino Nano Every は、シリアル通信と USB通信が同時に利用できます。シリアルモニタは Serial、シリアル通信端子は Serial1 です。
5行目は、UART送受信回路の起動の待ち時間です。

データ送信は前回と変更ありません。12行目で、0x00~0xff のアップカウントビットデータを生成し、18行目、Serial1.write() でそのまま送出します。19行目は改行コード CR、20行目は行送りコード LF をそれぞれ送信します。
データ受信は、14行目で受け取ったデータを、15行目でシリアルモニタへ表示させています。その際、Serial.println() として CR+LF を付加しています。表示はビット列 (MSBファースト) です。

送信回路の Dipスイッチでデータをセットしスタート押しボタンを押下すると、シリアルモニタにセットしたビット列が表示されることを確認しました。

パソコンで受信

USBシリアル変換モジュール接続図
図12. USBシリアル変換モジュール接続図

秋月電子通商の USBシリアル変換モジュール AE-FT234X を使って、パソコンで UART通信を受信してみます。

このモジュールの RxD 入力レベルは、TxD 同様 3.3V ですが、入力トレラント機能のため 5Vの信号をそのまま入力することができます。なので、送信回路出力 TxD を直接つないでいます。
変換モジュールの TxD はバッファ 74HCT244 で 5V にレベル変換しています。

Arduino IDE による受信
図13. Arduino IDE による受信

データ受信は、Arduino IDE のシリアルモニタでできます。図13 は、送信回路から一文字ずつ送信して表示したものです。

シリアルモニタは受信したデータをアスキーコードとして表示します。
0x00~0x1f はコントロールコードですので、たとえば 0x0a ならば行送り、0x08 ならばバックスペースといった動作をします。0x20~0x7e は、それぞれに対応した文字や記号を表示します。0x7f は DEL コードです。0x80 以上は割り当てされていないので、裏返しの?が表示されます。

ubuntu では、端末から cu コマンドで送受信ができます。受信回路のテストでもやっていますので、前回記事を参照ください。

ブレッドボード

UART 送受信回路ブレッドボード
図14. UART送受信回路ブレッドボード

製作した UART送受信回路のブレッドボードです。

右側が受信回路、左側が送信回路です。
右側の一番上の Arduino Nano Every で、テストデータの送受信を行なっています。左側の一番上は USBシリアル変換モジュールで、写真ではつないでいませんが、パソコンと通信するときに使いました。

バッファレジスタ回路やデータ表示 LED回路がわりと面積とっていますが、実質的な部分はさほど大きな回路でもありません。

まぁ取り立てて説明するところもないので、こんな感じで実験しました、ということで。

後記

今回は、UART通信の送信回路をつくり、Arduino Nano Every へデータを送信できることを確認しました。

実際の UART通信では端末レディだとかフロー制御だとかいろいろありますけど、そういったことはまったく考えていないです。必要になったらまた勉強しましょう。たぶん、これまでより簡単に理解できるようになってるんじゃないかな、と。
それから、非同期な信号や異なるクロックドメインから信号を受けることについても、少し考えることができたので、同期回路がより理解できるようになった、かもです。

さて、これまで Arduino のシリアル通信として SPI と UART を勉強しましたが、あとは I2C ですかねぇ。うーん、まぁ、気が向いたら、ね。

タイトルとURLをコピーしました