000000 ランダム
 HOME | DIARY | PROFILE 【お気に入りブログ登録】 【ログイン】

CPUを作ろう ~計算機教材とマイコンと電子工作~

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);
}
}
}


Copyright (c) 1997-2018 Rakuten, Inc. All Rights Reserved.