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
