ESP8266(Master)とArduino Nano(Slave)間をSPIで通信します。

Arduino nanoとESP8266間の接続

Arduino nanoとESP8266間の接続ピンを次に示します。

nano(スレーブ)  ESP8266(マスター)
SS PIN 10 SS
MOSI PIN 11 MO
MISO PIN 12 MI
SCK PIN 13 SCK
GND GND

Arduino nanoとESP8266間の接続画像を次に示します。

Arduino Nano(Slave)のプログラム作成

Arduino Nano上でスレーブとして動作するプログラムを次に示します。マスターへのエコーバックが削除されていますが、「SPIを使ったArduino間通信」と基本的に同じロジックです。

spi_testslave.ino

/**********************************************
  Arduino nano SPI(sleave)
**********************************************/
#include <SPI.h>

 byte rxdata;

void setup() {
  Serial.begin(9600);
  Serial.println("/-----START Arduino nano-----/");
  Serial.println("/----------SPI Slave---------/");

  SPCR |= bit(SPE);
  pinMode(MISO, OUTPUT);
  SPI.attachInterrupt();
}

void loop() {
}

ISR(SPI_STC_vect) {
  rxdata = SPDR;
  Serial.print("ISR! ");
  Serial.println(rxdata);
}

ESP8266(Master)のプログラム作成

ESP8266上でマスタとして動作するプログラムを次に示します。9-11行目が追加していますが、「SPIを使ったArduino間通信」と基本的に同じロジックです。

10行目で「SPI.setDataMode(SPI_MODE3)」に変更すると動作しません。受信の割り込みは発生しますが、データがスレーブ側に渡りません。

spi_testmaster.ino

#include <SPI.h>

void setup() {
  Serial.begin(9600);
  Serial.println("/-----START ESP8266-----/");
  Serial.println("/----------SPI Master---------/");

  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  SPI.setDataMode(SPI_MODE1);
  SPI.setBitOrder(MSBFIRST);
  
  // SSをHightに
  pinMode(SS, OUTPUT);
  digitalWrite(SS, HIGH);
}

int knob = 54;
void loop() {
  byte rxdata;
  
  knob = 54;
  digitalWrite(SS, LOW);
  SPI.transfer(knob);
  digitalWrite(SS, HIGH);
  delay(1000);

  knob = 32;
  digitalWrite(SS, LOW);
  SPI.transfer(knob);
  digitalWrite(SS, HIGH);

  Serial.println("tx");
  
  delay(1000);
}

Arduino nanoとESP8266間通信

作成したプログラムを実行すると、Arduino Nanoのシリアル端末に次の内容が表示され、Arduino nanoでデータが受信されていることが確認できます。

/-----START Arduino nano-----/
/----------SPI Slave---------/
ISR! 32
ISR! 54
ISR! 32
ISR! 54
ISR! 32
ISR! 54
ISR! 32
ISR! 54
ISR! 32
ISR! 54
ISR! 54
ISR! 32
ISR! 54
ISR! 32
ISR! 54
ISR! 32
ISR! 54
ISR! 32
ISR! 54
ISR! 32
ISR! 54