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