2つのマスターネットワーク間のArduino I2C通信

私は2台のArduinoマイクロコントローラを持っており、それぞれにI2Cデバイスのネットワークが接続されています(1台に2台のADC、もう1台にLCDディスプレイとRTCがあります)。最初のµCで得られた値をADCから2番目のADCに転送するのにI2C接続を使用するにはどうすればよいですか。どちらのuCもI2Cバスのマスターです。 私は2番目のuC上にソフトウェアのI2Cを作成し、それを最初のスレーブにスレーブとして接続することを考えていました(つまり2番目のコントローラには2つのI2Cポートがあります。問題は、スレーブとして動作するソフトウェアのI2Cライブラリが見つからないことです。すべてがマスターです。

あなたのアイデアを待っています。


1つのArduino Mega2560を使って2つのI 2 Cネットワークを作ることができますか? LCDとRTCと通信するためのハードウェアポートのマスタとして1つ、他の2つのピンのペア(SCLとSDA用)のソフトウェアポートのスレーブとして他のマスタarduinoからデータを受信するための...


すべてのデータを分析した後、2つのI2Cバスを一緒にリンクすることはできないという結論に達しました。私が利用可能なデータ収集用の外部I2Cポートで、私は情報を受信し、無線アダプタ(おそらくNRF24N01)を使用してそれを渡すスレーブとして別のarduinoを接続します。そうすれば、ソーラーコントローラーから生産をpvoutput Webサイトに報告するarduinoまでの配線は不要です。

1
nl ru de
どのArduino(実際にはどのマイクロプロセッサ)?
追加された 著者 rnd_nr_gen,
Arduino Pro miniはADCに接続されています。 Arduino Mega2560はetcやLCD付きのものです。
追加された 著者 nadia zona,

4 答え

IICは、ピアツーピア通信には適していません。

マイクロコントローラに接続する最も簡単な方法は、おそらくUARTを使用することです。各方向に別々の非同期チャネルを提供することに注意してください。あなたはまた、標準のボーレートにこだわっていません。両方のクロックから直接導き出すことができる速いものを使用してください。同じボード上のUART間でMBaud以上を簡単に行うことができます。

特にボーレートを上げた場合は、フロー制御を実装することをお勧めします。一部のマイクロコントローラUARTSにはRTS/CTSが組み込まれていますが、そうでなくても、このような機能をファームウェアに追加するのは簡単です。受信者が少なくとも送信者のハードウェアFIFOにあるのと同数の文字をバッファできることを確認してください。こうすれば、フロー制御ラインを送信側で使用して、ハードウェアにそれ以上データを書き込まないようにすることができます。マイクロコントローラは小さなUART出力FIFO(通常は1つか2つ、めったに4つ以上)を持たない傾向があるため、これはそれほど問題にはなりません。

1
追加された
Arduino Pro miniはADCに接続されており、ソーラー充電コントローラーのディスプレイユニットを形成しています(シリアルに接続された特別なLCDがあります)。私が使用できる唯一の接続はI2Cです(または私はPCBから混乱を起こす必要があります)。 Arduino Mega2560はRTCとLCDを搭載したもので、イーサネットシールドも付いています。このデータ転送は高速である必要はありません、私はただ毎秒かそこら2つの値(ボルトとアンペア)を送る必要があります。
追加された 著者 nadia zona,
  • I2Cバス上に配置できるI2Cマスターは1つだけです。 (誰がマスターかを切り替えることができる高度なプロトコルがあるかもしれません。)
  • 多くの組み込みプロセッサは、I2CマスターまたはI2Cマスターとして設定できます。 奴隷。 (私は標準のArduino I2Cライブラリでマスターとスレーブを簡単に切り替えることができるとは思わない。スレーブモードをサポートしていないプロセッサを使うArduinosがあるかもしれない。)
  • これらの種類のプロトコル(SPIまたはI2C)は、同じボードと電源を共有する部品で使用する必要があります。これらは一般的に、部分的な電源障害、ホットプラグ、過度に長いケーブルなどの複雑さを被るほど堅牢ではありません。

2つのArduino Unoボード(1つのマスターと2つのマスターボード) I2Cバスを使用します。

0
追加された
ソフトウェアスレーブのI2Cポートを実装することは可能です。転送中にCS、Clock&Dataのラインを監視する以外にプログラムを実行する必要はありません。または、スレーブが転送を処理できるようになるまでSPIを遅くし、それ以外にスレーブプロセッサで何をする必要があるかを調べます。
追加された 著者 rnd_nr_gen,
回答として、SPIからI2Cに切り替える必要があります。また、I2C用のCS(チップセレクト)はありません。 I2Cはそのプロトコルでスレーブアドレッシングを使用します。
追加された 著者 rnd_nr_gen,
2枚のArduinoボードの間で何を送りたいのか、そしてどれだけ速く送りたいのかを正確に知っている状況を考えてみましょう。両方のプロセッサのソフトウェアに実装されているカスタムハンドシェイクインターフェイスを実装する方が簡単な場合があることを考慮してください。参照してください、私はあなたが(例えば)I2Cプロトコルのアドレス指定のオーバーヘッドを必要とは思わない。結局のところ、あなたは1つのマスターと1つのスレーブしか持っていません。また、データを一方向に送信するだけでよい場合もあります。それで、あなたはラインをトライステートにして抵抗でそれらを引き上げる問題に行く必要はありません。
追加された 著者 rnd_nr_gen,
私はこのシステム全体を2つの別々のI2Cネットワークとして見ていました。最初のものはマスター+ ADCとしてのArduino prominiとスレーブとしてのArduino Mega2560です。 2番目のネットワークはスレーブとしてマスター+ LCDなどとしてArduino Mega2560から構成されています。ご覧のとおり、Mega2560には2つのI2C接続があり、1つはスレーブ(ソフトウェア)として、もう1つはハードウェアポート上のマスターとして使用します。
追加された 著者 nadia zona,
ソフトウェアI2C用のライブラリがいくつかありますが、すべてマスターです...スレーブなし...私はLCDやRTCとの通信にソフトウェアI2Cを使用できますが、これらのモジュール用に作成されたライブラリがソフトウェアで機能することは疑います。港...
追加された 著者 nadia zona,

あなたのコメントから、あなたはあなたの別々のプロジェクトの各々の上でI2Cバスだけに接続して、データを転送することができることを望む。

WirningはArduinoをI2Cマスターまたはスレーブとして実行することを可能にします。 両方ともUSIハードウェアを使用するため、マスターとスレーブ両方のWiringソフトウェアを1つのマイクロで実行することはできませんが、USIが1つしかないため、とにかく1つのバスにしか接続できません。

私は効果的な方法はATTiny85を各バスのI2Cスレーブインターフェースとして使用し、それからそれらをソフトウェアUARTを介して一緒に接続することであろうことを提案したいと思います。 AdafruitのATTiny85用の非常に素晴らしい TinyWire ライブラリがあります。掲示板は Trinket と呼ばれることもあります。

Arduinoプログラミング環境に接続できるATTiny85ボード(Digisparkのような)がたくさんあるので、これはI2Cスレーブを作成するための簡単で安価な方法であるはずです。

これはやり過ぎであると言う人もいるかもしれませんが、それは実装するのが非常に簡単で、あなたのプロジェクトにハードウェア改造を必要としません。

0
追加された

@olinが示唆していることはあなたが考慮すべきものです。

その場合、あなたはI2Cの2つのモード(マスターとスレーブの両方)を必要としています。

arduinoは、いつでもマスターまたはスレーブとして設定できます。だから、私はこれを試してみます。両方の役割を果たす必要があるarduino(Arduino Aと呼びます)は、デフォルトでスレーブとして構成できます。このようにして、ArduinoはArduino B(常にマスターするArduino)からのコマンドを見逃すことはありません。

Arduino Aはいつ自分の役割をマスターに変更するかを自ら決定することができます。 これは、データを読み取る必要がある定期的な間隔によって異なります。データがセンサーから読み取られるか、またはデータがLCDに書き込まれると、arduino Aは再びスレーブの役割を果たすことができます。

1つのキャッチは、Arduino Aがマスターの役割を引き受ける一方で、Arduino BがArduino Aと通信できないことです。これはさまざまな方法で解決できます。

  1. 予備のGPIOを使用して、Arduino AはBにビジーであることを通知します
  2. Arduino Bはしばらくしてから再試行できます
  3. Arduino Aは、通信の準備ができたときにArduino Bに通知することができます(例:通信するデータがGPIO経由で利用可能になったときにBに知らせます)。
  4. Arduino Aが期待するデータを定期的に書き込むようにArduino Bをプログラムします。

役に立つ場合は http://www.gammon.com.au/i2c を検討してください。構成に関する優れた情報があります。 1ページにすべてナビゲーション中に迷子にしないでください。

最後に、ロジックの決定に影響を与える要因はあなた自身のアプリケーションの要求です。 I2Cソフトウェアスレーブを実装することを決定した場合、通信の頻度 - 時々または連続した、応答時間の重要性、最低限必要なリソース量ではない場合があります。

0
追加された