複数のarduinoシリアルポートを一緒に接続する方法
アイデアは、schamaticに示されているように、複数のarduinoスレーブをマスターに接続することです。

この回路をシミュレートする– CircuitLabを使用して作成された回路図問題は、TXスレーブがマスターRXに結合できないことです。スレーブTXを一度に1つずつ作成するには、トライステートバッファのようなトリックを実行する必要があります。とにかく、avrポートはトライステートバッファとして設定できます。(Q1)これを行うためのソフトウェアソリューションはありますか?2番目半二重通信用にTXをRXに接続する場合(1本のデータラインを使用)。データの送信中にRxが自分自身のリッスンを停止するようにするにはどうすればよいですか?
回答
あなたは2つのダイオードと抵抗でそれを行うことができます:

この回路をシミュレートする–CircuitLabを使用して作成された回路図
衝突を防ぐためにいくつかのシステムを実装する必要がありますが、電気的にはそれは健全です。
このスキームが機能するためには、常に最大1つのスレーブがTXを駆動することを確認する必要があります。マスターが1つのスレーブをアドレス指定し、そのスレーブのみが応答するプロトコルを考案する必要があります。問題は:
- 両方のスレーブは、マスターによってアドレス指定されたときに通知するために、シリアルポートをオンにする必要があります
- アクティブなシリアルポートはTXピンを低インピーダンス状態に保ち、データを送信していないときはアクティブにHIGHに駆動します。
このジレンマから抜け出す最善の方法は、Majenkoの回答に従って、ハードウェアを変更することです。何らかの理由でその変更を行うことができない場合は、ソフトウェアのみの解決策がある可能性がありますが、基盤となるハードウェアで、シリアルレシーバーをアクティブにしたまま、スレーブのシリアルトランスミッターをオフにできる場合に限ります。
Arduino APIでは、受信機が無効になっている間、シリアル送信機をアクティブに保つことはできません。送信機と受信機全体の機能Serial.begin()
とSerial.end()
制御です。下位レベルのハードウェアにアクセスすることで、それを実行できる場合があります。使用しているArduinoの種類については述べていません。Unoに似たものがあるとすると、次の方法で送信機を無効にできます。
UCSR0B &= ~_BV(TXEN0);
次のコマンドで再度有効にします。
UCSR0B |= _BV(TXEN0);
シリアル通信にArduinoAPIを使用する場合は、次の直後に送信機を無効にする必要がありますSerial.begin()
。
const uint8_t TX_PIN = 1;
void setup() {
pinMode(TX_PIN, INPUT_PULLUP); // valid when transmitter is off
Serial.begin(9600); // enable serial port
UCSR0B &= ~_BV(TXEN0); // disable transmitter
}
ただし、無効にする直前に、ソート時間(数マイクロ秒以内)で有効になることに注意してください。これにより、一方のスレーブがデータを送信しているときにもう一方のスレーブが起動すると、ショートが発生する可能性があります。
この種のソフトウェアのみのソリューションの問題の1つは、バグが発生することです。回路では、プロトコル処理のバグによってハードウェアが焼損する可能性があります。Gabriel Staplesの回答のように、少なくともいくつかの保護抵抗を追加することができれば、それはあなたを安全に保つはずです。
単極双投スイッチを使用できます。複数のスレーブ間で回線を切り替えることができるシンプルなスイッチ。
制限:マスターが対応する行を選択しない限り、軟膏はリクエストを作成できません。マスターは積極的にデータを要求するか、スレーブにコマンドを送信する必要があります。スレーブは通信を開始できない場合があります(選択されていない場合)
