プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Arduinoでアイソレータを使ってシリアル通信をする

アイソレータとはなんぞ?

シリアル通信はわかるけど、アイソレータって何?って人は多いと思います。
簡単に言うと、絶縁した状態でデータのやり取りができる部品です。

シリアル通信とは、USBであったりリード線で送信(TX)と受信(RX)の2本の線でデータを送受信するもので、接続が単純なのでマイコンやセンサーのデータのやり取りによく用いられます。
Arduino IDEでのシリアルモニタもこのシリアル通信が使われています。
Arduino同士でシリアル通信をするサンプルコードはいろいろ公開されています。
ameblo.jp

一般的には上記参考サイトのような方法で実施することができますが、このとき2つのArduinoを一台のPCに接続するとグラウンドループという問題がおきます(とされているが、実際に問題になったことは実は私自身は経験がない)。

www.analog.com
上記サイトで何が言われているかというと、USB同士を接続してはダメ、ということです。

このような問題(グラウンドループという言葉)を知ったのはDeskHopプロジェクトでのことですが、この問題を解消するため、DeskHopでは2つのRsapberryPi Picoの間にアイソレータという部品を使ってお互いに通信しています。

今回は、このアイソレータを使って実際に通信ができることを試してみました。

#include <SoftwareSerial.h>
#define RX 0
#define TX (1 - RX)

SoftwareSerial mySerial(2, 3); // RX, TX
int i = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(5, INPUT_PULLUP);
}

void loop() {
#if RX
  if (mySerial.available())
  {
    String sRead =  mySerial.readString();
    Serial.println(sRead);
    mySerial.print("Receive!");
  }
#endif

#if TX
  if (digitalRead(5) == LOW)
  {
    delay(500);
    while (digitalRead(5) == LOW) {}
    mySerial.print(i);
    Serial.print(i);
    i++;
  }
  if (mySerial.available())
  {
    String sRead =  mySerial.readString();
    Serial.println(sRead);
  }
#endif
}

コードは上記で、受信側(RX)と送信側(TX)でプリプロセッサオプションで切り替えます。
受信と言いながら、受信側も受信できたことを確認するために応答を返すようにしています。

今回使った部品は、アイソレータです。
https://www.aliexpress.com/item/1005006730170950.html?spm=a2g0o.order_list.order_list_main.41.4aab1802UT6U2n
https://ja.aliexpress.com/item/1005005523196682.html?spm=a2g0o.order_list.order_list_main.34.4aab1802UT6U2n&gatewayAdapt=glo2jpn
こちらは秋月電子で買える、以下とピン互換です。
akizukidenshi.com

接続は下図のようになりますが、アイソレータを使っていない時と比べて、シリアル通信線の間にアイソレータが入っているだけです。


これで何がおいしいかというと、アイソレータの等価回路を見ていただくと、通信線がコイルで接続しています。
これによって、Arduino同士が電気的に絶縁となっています。
そのため、送信側・受信側それぞれで電源とGNDを取るようになっています。

これで実際に動かしてみた結果が以下です。
お互いに送受信ができていることが確認できました。

まとめ

Aliexpressで購入したアイソレータでArduino同士を絶縁して通信することができました。
今回はシリアル通信を試しましたが、もっと速度が遅くてもいいときはフォトカプラでも同じく絶縁したまま通信をすることができます。