HOME > 1対多シリアル通信

 1対多シリアル通信 

Arduinoを使った1対多のシリアル通信をやってみました.
Arduino Duemilanove(UNO)はI2C通信が使えるのです が,この場合アナログ4,5ピンが使用されるので,アナログを6ポートとも使い たい場合には使えません.
それでシリアル通信を使って1対多の通信をやってみました.
その様子↓
CIMG3811.JPG

手書きメモ
CIMG3812.JPG

ホストはハードウェアシリアルを使う.
ターゲットはハードウェアシリアルの受信と,ソフトウェアシリアルの送信を使う. ホスト側のTXをターゲットのRXに並列接続. ターゲットのTX(ソフトウェアシリアルでデジタル3ピン)は100Ωの抵抗を 介してホストのRXに並列接続.

ホストからの送信は,ターゲットが並列に受信.
ターゲットは自分が呼ばれたら応答をソフトウェアシリアルで返す.
ターゲットのソフトウェアシリアルのTXは, 通常はピンモードを強制的にINPUTにしてハイインピーダンス状態.
送信時だけピンモードをOUTPUTにして送信. 送信後にピンモードをINPUTに戻して,ターゲットデバイスの並列なTXとの 干渉を防ぐ.
※このモード切替がハードウェアシリアルではできなかったのでターゲットからの 送信にはソフトウェアシリアルを使った.

ホスト側のスケッチ


#include < MsTimer2.h>

int ch=0;

void recvStr(char *buf)
{
  int i = 0;
  char c;
  while (1) {
    if (Serial.available()) {
      c = Serial.read();
      buf[i] = c;
      if (c == '\n') break; 
      i++;
    }
  }
  buf[i] = '\0';  // \0: end of string
}

// ---------タイマー処理 ---------- 
void fTimer() {
  if (ch==0) ch=1; else ch=0;  // チャンネルの切替
  sendRequest(ch);
}

void sendRequest(int num){
  Serial.print("Q"); Serial.println(num);
}

void setup(){
  // 状態表示のためにタイマーセット
  MsTimer2::set(2000, fTimer); // 2s 周期でタイマー割込み
  MsTimer2::start(); 
  Serial.begin(9600);
}

void loop()
{
  char str[90]; // string buffer
 
  if (Serial.available()) {
    recvStr(str);
    Serial.println(str);
  }
}

ターゲット側のスケッチ


#include < SoftwareSerial.h> char ch[]="Q0"; // ここでデバイス側のチャンネルを指定 char rs[]="R0"; // 受信文字列をそのまま返すとループに陥るので応答を変える SoftwareSerial mySerial=SoftwareSerial(2,3); // 3のTXしか使わない void recvStr(char *buf) { int i=0; char c; while (1) { if (Serial.available()) { c = Serial.read(); buf[i] = c; if (c == '\n') break; i++; } } buf[i] = '\0'; // \0: end of string } void setup(){ Serial.begin(9600); mySerial.begin(9600); pinMode(3,INPUT); // 一旦TXを絶縁状態にする } void loop() { char str[90]; // 文字列バッファ if (Serial.available()) { recvStr(str); if(strncmp(str,ch,2)==0) { pinMode(3,OUTPUT); mySerial.print(rs); mySerial.println(" response"); pinMode(3,INPUT); } } }

< 前の記事へ次の記事へ >


ページトップに戻る



ESP32 Wifi Bluetooth開発ボード

Arduino Nano Every
​​
Raspberry Pi pico

FPGA XILINX Artix-7