レベル変換 (12) UART その7 Arduino UNOと双方向 ISO7221BDG4
ここで利用するテキサス・インスツルメンツの ISO7221BDG4は、2チャネル・アイソレータと呼ばれています。RSコンポーネンツで入手し、DIP化変換基板にはんだ付けしました。一方向の絶縁されたバッファが2組入っています。それぞれの方向は逆です。同じ方向の2組入っているのが ISO7220です。
型番の数字の後ろはスピードなどを表しています。Aは1.5Mbps、Bは10Mbps、Cは25Mbps、Mは150Mbpsです。Dはパッケージを表しているようですが、現時点のデータシートにはSOIC形状一つしかありません。
●ISO7221BDG4のおもな特徴
- 電源電圧 A側、B側ともに3~5.5V
- 入力レベル スレッショルド1.5V
- 動作速度 10MHz
OPアンプ用の変換ボードは入出力は入り乱れているので、アイソレータとしては絶縁電圧はまったくカタログ通りにはなりません。DC的に分離できていると考えて利用しました。
●接続
「5Vで動作するArduino UNO」と「3.3Vで動作するラズパイ」を双方向でつなぎます。ラズパイ側の電源Vcc2は絶縁DC-DCレギュレータの出力3.3Vをつなぎます。
3.3V電源はラズパイからもらえばよいのですが、そうすると配線が1本増えて、4本になります。TTLレベルの配線ですが、マイコン・ボード間は約3mのケーブルで接続しました。
Arduino UNOはSoftwareSerialを利用し、Rxが10番、Txは11番です。
ラズパイのTxは8番ピン、Rxは10番ピンです。
●Arduinoのスケッチ
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
Serial.begin(9600); // ハードウェアシリアルを準備
Serial.println("Ready");
mySerial.begin(9600); // ソフトウェアシリアルの初期化
mySerial.println("Hello, world?");
}
void loop() { // run over and over
delay(1000);
mySerial.write("123"); Serial.print("send 123 ");
if (mySerial.available()) {
Serial.print(" Received");Serial.println(mySerial.read());
}
}
●ラズパイのプログラム
カーネルは4.14.71(2018/10/13現在)です。
メイン・メニューの設定からRaspberry Piの設定-インターフェイスのタブを選び、Serial Portを有効にSerial Consoleを無効にします。
リブート後に/boot/config.txtをsudo nanoで開くと、最下行にenable_uart=1が追加されています。この下の行に、dtoverlay=pi3-miniuart-btを追加して、CTRL+oで書き込み、CTRL+xで抜け、rebootします。
ラズパイ3、Raspberry Pi Zero WなどではBluetoothが搭載されていて、デフォルトで有効になっている代わりに、GPIO14/15のTxD/RxDが使えなくなっています。/boot/overlay/READMEに書かれているように、デバイス・ドライバpi3-miniuart-btの記述を追加します。Bluetoothは使えなくなり、/dev/ttyAMA0および/dev/serial0のUARTが有効になります。
import serial
import time
con=serial.Serial('/dev/serial0', 9600, timeout=10)
while 1:
con.write("1234\n")
print(con.read())
time.sleep(0.1)
Arduino UNOのシリアルモニタです。ラズパイからの1234\nを受信しています。
ラズパイのターミナルです。Arduino UNOからの123を受信しています。
波形です。
Analog Discovery2を使って、これらの実験中の波形を示します。画面の上側ブロックがアナログ信号です。オレンジ色がArduino UNOのTxの波形で、青色がラズパイのTxの波形です。
下側のブロックはI2Cのデータをデコードして表示する画面です。オシロスコープのチャネル1(オレンジ色)にDIO2ピンを、オシロスコープのチャネル2(青色)にDIO1ピンをつないでいます。
アイソレーションしていますが、波形は、GND共通にして観測しています。
Arduino UNOのTxはLOWが-0.1V、HIGHが4.6Vです。ラズパイ側のLOWは0.2V、HIGH3.7Vです。問題なく通信できています。
ここでは3.3V側の電源を別途用意しましたが、ADUM6211のように絶縁電源を内蔵した製品を使うと、コンパクトに実装できます。