Arduino Uno(Slave)とArduino Nano(Master)間をSPIで通信します。
Arduino UnoとArduino Nano間の接続
Arduino UnoとArduino Nano間の接続ピンを次に示します。
UNO(スレーブ) | nano(マスター) | |
---|---|---|
SS | PIN 10 | PIN 10 |
MOSI | PIN 11 | PIN 11 |
MISO | PIN 12 | PIN 12 |
SCK | PIN 13 | PIN 13 |
GND | GND |
Arduino UnoとArduino Nano間の接続画像を次に示します。
<Arduino Nanoの書き込みについて>
2018/01 に新しいブートローダーが公開されました。書き込み時に 「avrdude: stk500_recv(): programmer is not responding 」のエラーが出る場合には、[ツール | ボード] で Arduino Nanoを選択して [ツール | プロセッサ] で ATmega328P (Old Bootloader) を選択するか、[ツール | ボード] で Arduino/Genuino Uno を選択して書き込んでみてください。
Arduino Uno(Slave)のプログラム作成
Arduino Uno上でスレーブとして動作するプログラムを次に示します。
- 13行目でスレーブモードを設定します。
- 15行目で割り込みを可能とします。
- マスタへのデータは、受信と同じレジスタ「SPDR」を使用します。
21行目の割り込み処理「ISR」内でシリアル関数を使用すると受信データが不定になります。
spi_unoslave.ino
/********************************************** Arduino uno SPI(sleave) **********************************************/ #include <SPI.h> byte rxdata; void setup() { Serial.begin(9600); Serial.println("/-----START Arduino uno-----/"); Serial.println("/----------SPI Slave---------/"); SPCR |= bit(SPE); pinMode(MISO, OUTPUT); SPI.attachInterrupt(); } void loop() { } ISR(SPI_STC_vect) { rxdata = SPDR; SPDR = rxdata; }
Arduino Nano(Master)のプログラム作成
Arduino Nano上でマスタとして動作するプログラムを次に示します。
- 20行目と22行目でSS信号を制御します。
エコーバックのデータは出力した次のSPI.transfer関数で取得できます。
spi_nanomaster.ino
/********************************************** Arduino nano SPI(Master) **********************************************/ #include <SPI.h> void setup() { Serial.begin(9600); Serial.println("/-----START Arduino nano-----/"); Serial.println("/---------SPI Master--------/"); SPI.begin(); digitalWrite(SS, HIGH); } int knob = 54; void loop() { byte rxdata; knob = 54; digitalWrite(SS, LOW); SPI.transfer(knob); digitalWrite(SS, HIGH); digitalWrite(SS, LOW); rxdata = SPI.transfer(0); digitalWrite(SS, HIGH); Serial.print("tx:"); Serial.print(knob); Serial.print(" rx:"); Serial.println(rxdata); knob = 32; digitalWrite(SS, LOW); SPI.transfer(knob); digitalWrite(SS, HIGH); digitalWrite(SS, LOW); rxdata = SPI.transfer(0); digitalWrite(SS, HIGH); Serial.print("tx:"); Serial.print(knob); Serial.print(" rx:"); Serial.println(rxdata); delay(2000); }
Arduino UnoとArduino Nano間通信
作成したプログラムを実行すると、Arduino Nanoのシリアル端末に次の内容が表示され、データがエコーバックされていることが確認できます。
/-----START Arduino nano-----/ /---------SPI Master--------/ tx:54 rx:54 tx:32 rx:32 tx:54 rx:54 tx:32 rx:32 tx:54 rx:54 tx:32 rx:32 tx:54 rx:54 tx:32 rx:32 tx:54 rx:54 tx:32 rx:32 tx:54 rx:54 tx:32 rx:32 tx:54 rx:54