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
