這幾天思考如何將最近請購的Ultimate機器人與先前的NodeMcu課程整合,而且科技教室也保留了一批Mega板,不用真的可惜,於是想使用NodeMcu運用Wifi接收遠端的控制訊息,再以I2C(串行通信協議)的方式來控制Arduino Mega及MegaPi板 。這樣就可再應用於機器人的控制,也可省下一些材料費吧!
電路圖
紅色LED是由主控端NodeMcu控制的LED ,綠色LED是由受控端Mega板控制的LED。網頁按鈕button壓下時,兩顆LED都會亮起。另外將 NodeMcu(3.3V) 與Arduino Mega(5V)兩個邏輯系列連接在一起的規則非常簡單:可以將 3.3 V輸出連接到 5V輸入。不能將 5 V輸出連接到 3.3 V輸入。
兩者組合的邏輯電位說明請參考以下資料 https://dronebotworkshop.com/i2c-arduino-raspberry-pi/
一、先使用ardublock ESP 設定網頁操控介面
使用ardublock ESP 設定網頁操控介面減少學生編寫複雜程式的困擾。
下載Arduinoaug-0.70.19-esp版, 即可進行ardublock ESP程式積木設定。
主端網頁控制畫面與從端序列埠
二、轉為程式碼加入I2C的函式
參考網頁料 https://microcontrollerslab.com/arduino-i2c-tutorial-communication-between-arduino-boards/
nodeMcu master端程式碼
————————————————————————————
#include <Duinoedu_Esp8266.h>
#include <Wire.h>
Duinoedu_Esp8266 MonEsp;
int button;
ESP8266WebServer server ( 80 );
int x ;
void I2CLEDOFF();
void I2CLEDON();
void setup()
{
Wire.begin(D1,D2);
Serial.begin(9600);
MonEsp.connect_AP("nodeI2C","12345678");//The command will only work if the password length is 8 characters or more.
server.on ( "/", handleRoot );
server.begin();
Serial.println ( "HTTP server started" );
pinMode(D6,OUTPUT);
}
void handleRoot(){
MonEsp.updateStringint(&server,"button", button);
server.send ( 200, "text/html", getPage() );
delay(10);
}
String getPage(){
#define PAGE_EXIST
String page = "<!DOCTYPE html><html><head><meta charset='ISO-8859-15'>";
page += "<title>DUINOEDU - www.duinoedu.com</title></head>";
page += MonEsp.addPhoneStyle();
page += "<BODY onload='process()'>";
page += MonEsp.javaslider();
page += MonEsp.slider(0,0,"button""");
page += "</body>";
page += "</html>";
return page;
}
void loop()
{
#ifdef PAGE_EXIST
server.handleClient();
delay(10);
#endif
if (button)
{
digitalWrite(D6,HIGH);
I2CLEDON();
}
else
{
digitalWrite(D6,LOW);
I2CLEDOFF();
}
delay(300);
}
void I2CLEDOFF()
{
x=0;
Wire.beginTransmission(9);
Wire.write(x);
Wire.endTransmission();
delay(10);
}
void I2CLEDON()
{
x=1;
Wire.beginTransmission(9);
Wire.write(x);
Wire.endTransmission();
delay(10);
}
—————————————————————————————
Mega slave 端程式碼
——————————————————————————
#include <Wire.h>
int LED = 8;
int x = 0;
void setup()
{
pinMode (LED,OUTPUT);
digitalWrite(LED,HIGH);
Wire.begin(9);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void receiveEvent(int bytes)
{
x = Wire.read();
}
void loop()
{
Serial.println(x);
if (x ==1)
{
digitalWrite(LED, LOW);
delay(200);
}
else
{
digitalWrite(LED, HIGH);
delay(200);
}
}
與MegaPi 結合的控制應用
MegaPi 是makeblock系列的控制板,基於ATmega2560的微控主板,完全兼容Arduino编程。 影片中所示為利用NodeMcu 建置網頁按鈕來控制MegaPi中的直流馬達。
MegaPi slave 端程式碼
———————————————————
#include <Wire.h>
int LED =22;
int x = 0;
void setup()
{
pinMode (LED,OUTPUT);
digitalWrite(LED,HIGH);
Wire.begin(9);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void receiveEvent(int bytes)
{
x = Wire.read();
}
void loop()
{
Serial.println(x);
if (x ==1)
{
digitalWrite(LED, HIGH);
delay(200);
}
else
{
digitalWrite(LED, LOW);
delay(200);
}
}