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