ทดลองใช้งาน RobotDyn UNO+WiFi
สืบเนื่องจากเห็นมีการผลิตบอร์ดลูกผสมระหว่าง Arduino UNO กับ ESP8266 ออกมาขายก็เลยลองสั่งมาเล่น 1 บอร์ด โดยสั่งของยี่ห้อ RobotDyn เนื่องจากชอบยี่ห้อนี้ ราคาก็ไม่แพงมาก คุณภาพการผลิตก็ดูเรียบร้อยดี และบอร์ดมีสีดำ (เกี่ยวอะไร 55) ตามรูปเลยครับ
บอร์ดนี้จะใช้ USB to Serial เบอร์ CH340 ดังนั้นหากนำไปใช้งาน อาจจะต้องลง Driver เพิ่ม บอร์ดนี้มีโหมดการทำงานทั้งหมด 4 โหมดด้วยกัน การกำหนดโหมดทำโดยการเซ็ตที่ Dip Switch ที่อยู่บริเวณกลางบอร์ด โดยมีรูปแบบดังนี้
ในบอร์ดจะมี MCU อยู่ 2 ตัว คือ ATmega328P กับ ESP8266 โดยเขาบอกว่าบอร์ดนี้สามารถใช้ได้ 3 รูปแบบด้วยกัน คือ 1) ใช้เป็น Arduino UNO ธรรมดา 2) ใช้เป็น ESP8266 และ 3) ให้ ATmega328P กับ ESP8266 ทำงานร่วมกัน
ใช้เป็น Arduino UNO
บอร์ดนี้มาตอนแรกจะไม่ได้อยู่ในโหมดนี้ ดังนั้นก็ต้องเซ็ท Dip Switch ก่อน โดยเอาตัวที่ 3 กับ 4 ให้ On ที่เหลือก็ Off หมด
ทดลองใช้งาน ก็ไม่มีปัญหาอะไร สามารถใช้งานได้ทุกขา
สรุปว่า เหมือน Arduino UNO R3 ทุกประการ (แน่ละ)
ใช้เป็น ESP8266
เริ่มต้นก็เซ็ท Dip Switch โดยให้ตัวที่ 5 กับ 6 และ 7 เป็น On ที่เหลือเป็น Off หมด
จากนั้นก็เริ่มจากการติดตั้ง ESP8266 โดยไปที่หน้า File -> Preference จะเห็นหน้าตาแบบนี้
จากนั้นให้ป้อน http://arduino.esp8266.com/stable/package_esp8266com_index.json ลงไปในช่อง (ตามรูป)
จากนั้นไปที่ Tools -> Board -> Boards Manager… แล้วป้อน esp8266 ลงในช่อง
แล้วกด Install ระบบก็จะเริ่มติดตั้งจนเสร็จ
จากนั้นก็เริ่มทดสอบ โดยตั้งบอร์ดเป็น Generic ESP8266 module ตั้ง Upload Speed เป็น 115200 แล้วลอง Upload อะไรก็ได้ลงไป
ผลก็คือจะ Upload ไม่ได้ (อ้าว!)
สิ่งที่ต้องทำเพิ่ม คือ ในระหว่าง Upload ในขณะที่มันขึ้นข้อความว่า Contecting ให้กดปุ่ม Reset
เอาละครับ! คราวนี้ Upload ได้แล้ว คราวนี้จะใช้ขา Input/Output ที่ไหน คำตอบคือ อยู่ตรงที่เขียนว่า ESP Pin นั่นแปลว่าจะใช้ Pin ของ Arduino ไม่ได้เลย
โดย ESP Pin จะมีทั้งหมด 12 ขา โดยมี Pinout ดังนี้
เมื่อทราบ Pinout ก็ทดลองทดสอบกันหน่อย แต่ก็คงทดสอบไม่ได้มาก เพราะจะเห็นว่ามี GPIO ให้ไม่กี่ขา แถมพวกที่เป็น I2C ก็ไม่มีมาให้ด้วย แปลว่าอย่าหวังจะเอาตัวนี้ไปต่อกับอะไรได้มากๆ ซึ่งก็พอเข้าใจได้ว่าเขาคงตั้งใจจะให้ใช้ต่อ WiFi เป็นหลักมากกว่า
แต่ก่อนอื่นต้องตรวจสอบก่อนว่า Upload ไปแล้วมันทำงานหรือเปล่า โดยผมจะใช้โปรแกรม Example ที่ให้มา โดยโหลดโปรแกรมจาก File -> Examples -> ESP8266 -> ConfileFile โดยเมื่อโหลดเสร็จเรียบร้อย ให้แก้ Dip Switch โดยเปลี่ยนให้ตัวที่ 7 เป็น OFF แล้วกด Reset อีกครั้ง
เมื่อเปิด Serial Monitor ก็จะขึ้นข้อความประมาณนี้ ก็แสดงว่าโหลดไปแล้วทำงานได้
เอาละ! คราวนี้ก็มาลองไฟกระพริบกันเสียที เพื่อทดสอบว่าขาของ ESP8266 ก็ใช้งานได้นะค้าบ โดยต่อวงจรดังนี้
- ขา GPIO 4 ต่อกับ ขาบวกของ LED
- GND ต่อกับขาลบของ LED
จากนั้นก็ Upload โปรแกรม Blink เข้าไป ซึ่งผลการทดสอบ ก็สามารถทำงานได้ สรุปว่าสามารถต่อขา GPIO ต่างๆ ของ EPS8266 ไปใช้งานโดยตรงก็ได้เช่นกัน
ทำงานร่วมกันระหว่าง Arduino กับ ESP8266
เอาละครับ! คราวนี้ก็มาถึงจุดที่จะนำบอร์ดนี้ไปใช้งาน คือ การให้ Arduino กับ ESP8266 คุยกัน โดย Arduino กับ ESP8266 จะคุยกันผ่าน Serial โดยมีการเชื่อมต่อดังนี้
- Arduino Tx <-> ESP8266 Rx
- Arduino Rx <-> ESP8266 Tx
เราจะเริ่มจากดูว่าสามารถสั่งงานจาก ESP8266 มายังบอร์ด Arduino ได้หรือไม่
ก่อนอื่นเราจะ Upload โปรแกรมต่อไปนี้ไปที่บอร์ด Arduino ก่อน โดยเซ็ท Dip Switch 3 และ 4 เป็น On ที่เหลือให้ Off หมด และให้กด Reset
void setup() {
pinMode(13, OUTPUT);
Serial.begin(115200);
}void loop() {
while (Serial.available()) {
char inChar = (char)Serial.read(); // get the new byte:
if (inChar == ‘1’) { // check received ‘enter’ (0x0D)
digitalWrite(13, HIGH);
}
else if (inChar == ‘0’) {
digitalWrite(13, LOW);
}
}
}
โปรแกรมข้างต้นก็เป็นโปรแกรมง่ายๆ คือจะคอยดูข้อมูลที่ส่งมาจาก Serial และถ้าข้อมูลเป็น 1 ก็จะสั่งให้ LED ที่อยู่บนบอร์ด “ติด” ถ้าข้อมูลเป็น 0 ก็จะสั่งให้ LED ที่อยู่บนบอร์ด “ดับ” โปรแกรมนี้ก็จะรอรับการสั่งงานจาก ESP8266 ไปเรื่อยๆ
จากนั้นเราก็จะ Upload โปรแกรมลงบน ESP8266 โดยเซ็ท Dip Switch 5,6 และ 7 เป็น On ที่เหลือให้ Off หมด และให้กด Reset
void setup() {
Serial.begin(115200);
}void loop() {
Serial.print(“1”); // turn the LED on
delay(1000); // wait for a second
Serial.print(“0”); // turn the LED off
delay(1000); // wait for a second
}
โปรแกรมนี้จะสั่งให้ Arduino ทำไฟกระพริบโดยการสั่งงานจาก ESP8266
ให้เซ็ท Dip Switch 1,2 On เพื่อเชื่อมระหว่าง Arduino กับ ESP8266 ที่เหลือให้ Off หมด และให้กด Reset ก็จะพบว่า LED บนบอร์ดกระพริบแล้ว ก็เป็นอันว่า ESP8266 กับ Arduino สามารถสื่อสารและทำงานร่วมกันได้
สุดท้ายผมจะ Upload อีกโปรแกรมหนึ่ง บน ESP8266 โดยโปรแกรมนี้จะทำหน้าที่เป็น Web Server รับการสั่งงานผ่าน Web เพื่อเปิด/ปิด LED
#include <ESP8266WiFi.h>
#define LED 4
const char* ssid = “ssid”;
const char* password = “password”;
unsigned char status_led=0;
WiFiServer server(80);void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
server.begin();
// Serial.println("Server started");
// Serial.println(WiFi.localIP());}void loop() {
WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available())
{
delay(1);
}
String req = client.readStringUntil(‘\r’);
client.flush();
if (req.indexOf(“/ledoff”) != -1)
{
status_led=0;
Serial.print(“0”);
}
else if(req.indexOf(“/ledon”) != -1)
{
status_led=1;
Serial.print(“1”);
}
String web = “HTTP/1.1 200 OK\r\nContent-Type: text/html\r \n\r\n”;
web += “<html>\r\n”;
web += “<body>\r\n”;
web += “<h1>LED Status</h1>\r\n”;
web += “<p>\r\n”;
if(status_led==1)
web += “LED On\r\n”;
else
web += “LED Off\r\n”;
web += “</p>\r\n”;
web += “<p>\r\n”;
web += “<a href=\”/ledon\”>\r\n”;
web += “<button>LED On</button>\r\n”;
web += “</a>\r\n”;
web += “</p>\r\n”;
web += “<a href=\”/ledoff\”>\r\n”;
web += “<button>LED Off</button>\r\n”;
web += “</a>\r\n”; web += “</body>\r\n”;
web += “</html>\r\n”;
client.print(web);
}
โปรแกรมนี้เมื่อรันแล้วใช้ Browser เรียกไปที่ IP Address ของ ESP8266 ก็จะพบหน้าตาแบบนี้
ซึ่งสามารถกดปุ่มเพื่อเปิด/ปิด LED ได้ ปัญหาที่พบคือ แล้วจะรู้ได้ยังไงว่า IP ของ ESP8266 เป็น IP ใด เนื่องจาก Serial ต่ออยู่กับ Arduino ดังนั้นจึงไม่สามารถส่งข้อมูลมาทาง Serial Monitor ได้ ปัญหาในเรื่องนี้ผมมีวิธีให้ 2 วิธี วิธีแรก คือ ในการ Connect ครั้งแรก ก็อย่าเพิ่งเชื่อมกับ Arduino แล้วเอา Comment ในโปรแกรมออก โปรแกรมจะแสดง IP Address มาทาง Serial Monitor ให้ทราบ เมื่อ Connect ครั้งต่อไป จึงค่อยเชื่อมกับ Arduino แต่เราก็ได้ IP Address มาแล้ว วิธีที่ 2 คือ ใช้โปรแกรม IP Scanner เพื่อหา IP Address
เอาละครับ! มาถึงตรงนี้ก็เป็นอันว่าได้ทดลองใช้งานบอร์ดนี้ ครบถ้วนแล้ว ก็ขอจบเพียงเท่านี้ครับ