โปรเจค นี้จะเป็นการนำ ESP8266 NodeMCU V2 ESP-12E มาทำเป็น หุ่นยนต์ Robot car และ ควบคุมด้วยแอพ Blynk ผ่าน WiFi
NodeMCU V2 เป็นบอร์ดที่ใช้ ESP8266 เป็น CPU สำหรับประมวลผลโปรแกรมต่างๆ มีข้อดีกว่า Arduino ตรงที่ตัวมันมีขนาดเล็กกว่า มีพื้นที่เขียนโปรแกรมลงไปมากกว่า และสามารถเชื่อมต่อกับ WiFi ได้
อุปกรณ์ที่ใช้
1. 2WD Smart Car Robot Chassis Kits
2. NodeMCU V2 CP2102 Lua WIFI ESP8266 ESP-12E
3. Micro USB Cable Wire 1m for NodeMCU
4. Motor Drive Module L298N
5. Jumper (M2M) cable wire 40pcs 2.54mm 20cm Male to Male
6. Jumper (F2F) cable wire 40pcs 2.54mm 20cm Female to Female
7. Jumper (F2M) cable wire 40pcs 10 cm 2.54mm Female to Male
8. สกรูหัวกลม+น็อตตัวเมีย ขนาด 3มม ยาว 12 มม.
9. รางถ่าน 18650 - 2 ก้อน
10. ถ่านชาร์จ 18650 Panasonic NCR18650B จำนวน 2 ก้อน
การจะใช้ NodeMCU ได้นั้น จำเป็นต้องติดตั้ง แพลตฟอร์ม ESP8266 เพื่อ ทำการติดต่อ ระหว่าง Arduino IDE กับ NodeMCU
ลิงค์ : ขั้นตอนการติดตั้ง แพลตฟอร์ม ESP8266
https://robotsiam.blogspot.com/2017/06/esp8266-platform-nodemcu.html
ลิงค์ : การใช้งาน NodeMCU V2 ESP8266 ESP-12E
https://robotsiam.blogspot.com/2017/06/nodemcu-lua-wifi-esp8266-esp-12e-module.html
เริ่มต้นด้วยการ ประกอบ 2WD Smart Car Robot Chassis Kits
ภาพรวม การประกอบ รางถ่านแบบ 18650 และ เชื่อมต่อ Motor Drive Module L298N เข้ากับ NodeMCU V2 ตามรูป
เริ่มด้วย ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด รางถ่านแบบ 18650 และ เชื่อมต่อ สายสีแดง ขั้วบวก เข้าที่ เพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF )
ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด Motor Drive Module L298N
ใช้ จั้มเปอร์ ผู้-ผู้ สีแดง ต่อจาก สวิทช์ อีกด้าน เข้า ไฟ+ Motor Drive และ ใช้ จั้มเปอร์ ผู้-ผู้ สีดำ ต่อจากสายสีดำ ของรางถ่าน เข้า GND ของ Motor Drive
การใช้งาน Digital/Input ซึ่งการใช้งาน Digital I/O ของ ESP8266 นั้น สามารถใช้งานคำสั่ง digitalWrite, digitalRead ได้เช่นเดียวกับการใช้งาน Digital I/O ของ Arduino โดยกำหนดหมายเลขของ Pin เช่นตัวอย่าง Pin ที่ 5 หรือจะกำหนดชื่อ Pin โดยอ้างตามชื่อ Pin บนบอร์ด NodeMCU V2 เป็น D1 ก็ได้เช่นกัน
การต่อวงจร ระหว่าง NodeMCU กับ Motor Driver
ใช้ จั้มเปอร์ เมีย-เมีย ในการเชื่อมต่อ
D1 <-> IN1
D3 <-> IN2
D2 <-> IN3
D4 <-> IN4
Upload โปรแกรม ทดสอบการทำงาน
1. ตรวจสอบการติดตั้งไดร์เวอร์ ของ NodeMCU V2
2.ทดสอบ การเคลื่อนที่ของหุ่นยนต์
เปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด NodeMCU V2
// Motor A pins
int enableA = 12; // D6 - ENB
int pinA2 = 4; // D2 - IN3
int pinA1 = 2; // D4 - IN4
//Motor B pins
int enableB = 14; // D5 - ENA
int pinB2 = 5; // D1 - IN1
int pinB1 = 0; // D3 - IN2
//This lets you run the loop a single time for testing
boolean run = true;
void setup() {
pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);
pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);
}
void loop() {
if (run) {
for (int i = 0; i <= 500; i++) {
delay(10);
}
enableMotors();
//Go forward
forward(400);
coast(200);
//Go backward
backward(400);
coast(200);
//Turn left
turnLeft(400);
coast(200);
//Turn right
turnRight(400);
coast(200);
//This stops the loop
run = false;
}
}
//Define high-level H-bridge commands
void enableMotors()
{
motorAOn();
motorBOn();
}
void disableMotors()
{
motorAOff();
motorBOff();
}
void forward(int time)
{
motorAForward();
motorBForward();
delay(time);
}
void backward(int time)
{
motorABackward();
motorBBackward();
delay(time);
}
void turnLeft(int time)
{
motorABackward();
motorBForward();
delay(time);
}
void turnRight(int time)
{
motorAForward();
motorBBackward();
delay(time);
}
void coast(int time)
{
motorACoast();
motorBCoast();
delay(time);
}
void brake(int time)
{
motorABrake();
motorBBrake();
delay(time);
}
//Define low-level H-bridge commands
//enable motors
void motorAOn()
{
digitalWrite(enableA, HIGH);
}
void motorBOn()
{
digitalWrite(enableB, HIGH);
}
//disable motors
void motorAOff()
{
digitalWrite(enableB, LOW);
}
void motorBOff()
{
digitalWrite(enableA, LOW);
}
//motor A controls
void motorAForward()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
}
void motorABackward()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}
//motor B controls
void motorBForward()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}
void motorBBackward()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
}
//coasting and braking
void motorACoast()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, LOW);
}
void motorABrake()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, HIGH);
}
void motorBCoast()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, LOW);
}
void motorBBrake()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, HIGH);
}
เลือก Port ในตัวอย่างเป็น "COM12"
เลือก Board : NodeMCU 1.0 (ESP-12E Module)
Upload
ถ้ามีปัญหา Upload ไม่เข้า ขึ้น Error แสดงข้อความว่า ตามรูปภาพ
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
ให้กดปุ่ม RST 1 ครั้ง และ กดปุ่ม FLASH บนบอร์ด ของ NodeMCU ค้างไว้ ในขณะที่ทำการอัพโหลดโปรแกรม
รอจนกระทั่ง Done uploading. 100%
ถ้าทุกอย่างถูกต้อง ทดลอง ยกลงวางที่พื้นแล้ว ทดสอบ ปิดเปิด สวิทช์ไฟ Power ถ้าทุกอย่างถูกต้อง ปรกติ หุ่นยนต์จะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว เลี้ยวขวา
เปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด NodeMCU V2
// Motor A pins
int enableA = 12; // D6 - ENB
int pinA2 = 4; // D2 - IN3
int pinA1 = 2; // D4 - IN4
//Motor B pins
int enableB = 14; // D5 - ENA
int pinB2 = 5; // D1 - IN1
int pinB1 = 0; // D3 - IN2
//This lets you run the loop a single time for testing
boolean run = true;
void setup() {
pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);
pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);
}
void loop() {
if (run) {
for (int i = 0; i <= 500; i++) {
delay(10);
}
enableMotors();
//Go forward
forward(400);
coast(200);
//Go backward
backward(400);
coast(200);
//Turn left
turnLeft(400);
coast(200);
//Turn right
turnRight(400);
coast(200);
//This stops the loop
run = false;
}
}
//Define high-level H-bridge commands
void enableMotors()
{
motorAOn();
motorBOn();
}
void disableMotors()
{
motorAOff();
motorBOff();
}
void forward(int time)
{
motorAForward();
motorBForward();
delay(time);
}
void backward(int time)
{
motorABackward();
motorBBackward();
delay(time);
}
void turnLeft(int time)
{
motorABackward();
motorBForward();
delay(time);
}
void turnRight(int time)
{
motorAForward();
motorBBackward();
delay(time);
}
void coast(int time)
{
motorACoast();
motorBCoast();
delay(time);
}
void brake(int time)
{
motorABrake();
motorBBrake();
delay(time);
}
//Define low-level H-bridge commands
//enable motors
void motorAOn()
{
digitalWrite(enableA, HIGH);
}
void motorBOn()
{
digitalWrite(enableB, HIGH);
}
//disable motors
void motorAOff()
{
digitalWrite(enableB, LOW);
}
void motorBOff()
{
digitalWrite(enableA, LOW);
}
//motor A controls
void motorAForward()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
}
void motorABackward()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}
//motor B controls
void motorBForward()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}
void motorBBackward()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
}
//coasting and braking
void motorACoast()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, LOW);
}
void motorABrake()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, HIGH);
}
void motorBCoast()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, LOW);
}
void motorBBrake()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, HIGH);
}
เลือก Port ในตัวอย่างเป็น "COM12"
เลือก Board : NodeMCU 1.0 (ESP-12E Module)
Upload
ถ้ามีปัญหา Upload ไม่เข้า ขึ้น Error แสดงข้อความว่า ตามรูปภาพ
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
ให้กดปุ่ม RST 1 ครั้ง และ กดปุ่ม FLASH บนบอร์ด ของ NodeMCU ค้างไว้ ในขณะที่ทำการอัพโหลดโปรแกรม
รอจนกระทั่ง Done uploading. 100%
ถ้าทุกอย่างถูกต้อง ทดลอง ยกลงวางที่พื้นแล้ว ทดสอบ ปิดเปิด สวิทช์ไฟ Power ถ้าทุกอย่างถูกต้อง ปรกติ หุ่นยนต์จะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว เลี้ยวขวา
ถ้าหุ่นยนต์ เคลื่อนที่ปรกติ แสดงว่า หุ่นยนต์ของเราพร้อมทำงานแล้ว
(ถ้าต้องการทดสอบใหม่ ให้ ปิดเปิด สวิทช์ไฟใหม่)
3.การสร้างแอพ Blynk สำหรับหุ่นยนต์ NodeMCU V2
(ถ้าต้องการทดสอบใหม่ ให้ ปิดเปิด สวิทช์ไฟใหม่)
Blynk Application เป็นโปรแกรมบนมือถือที่ทำให้เราสร้างหน้าต่างควบคุมหรือแสดงผลเชื่อมต่อกับพวกไมโครคอนโทรเลอร์(Ardunio, ESP8266, Raspberry Pi) ได้ง่ายๆ โดยไปที่ Play Store ค้นหา Blynk
https://play.google.com/store/apps/details?id=cc.blynk&hl=th
หรือ
https://blynk.th.aptoide.com/
ติดตั้ง เหมือน App ทั่วๆไป
เปิด Blynk Application ขึ้นมา
-> Create New Account
กรอก อีเมล และ พาสเวิด -> Sign Up
-> New Project
ตั้งชื่อ Project ในตัวอย่างชื่อ robot_car -> Create
โปรกรม จะส่ง Auth Toke ไปที่ อีเมล ที่เรากรอกไว้ -> OK
โดยทุกๆครั้งที่เริ่มสร้างโปรเจคใหม่ AUTH TOKEN จะถูกเปลี่ยนใหม่เสมอ ซึ่ง KEY นี้เองที่เป็นเสมือนกุญแจสำหรับเชื่อมต่อ
คลิก เครื่องหมาย +
1. char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
เป็นค่าที่เราได้รับจาก ที่ Blynk ส่ง อีเมล ให้เรา
ในตัวอย่างนี้แก้เป็น
char auth[] = "264b50a5284642c09eff8a0815cff21e";
2. char ssid[] = "MyWifi";
แก้เป็น ชื่อ WiFi ที่ต้องการเชื่อมต่อ
3. char pass[] = "MyWifiPassword";
แก้เป็น รหัสผ่าน ของWiFiที่ต้องการเชื่อมต่อ
แล้วจีง Upload โค้ดที่แก้ไขแล้ว ไปยัง บอร์ด NodeMCU V2
/**************************************************************
เลือก Port ในตัวอย่างเป็น "COM12"
เลือก Board : NodeMCU 1.0 (ESP-12E Module)
Upload
ถ้ามีปัญหา Upload ไม่เข้า ขึ้น Error แสดงข้อความว่า ตามรูปภาพ
ให้กดปุ่ม RST 1 ครั้ง และ กดปุ่ม FLASH บนบอร์ด ของ NodeMCU ค้างไว้ ในขณะที่ทำการอัพโหลดโปรแกรม
รอจนกระทั่ง Done uploading. 100%
กลับไปที่ Blynk Application คลิกที่ เครื่องหมาย สามเหลี่ยม เพื่อทดสอบการทำงาน
วีดีโอผลลัพธ์การทำงานของ โปรเจค หุ่นยนต์ ESP8266 NodeMCU V2 ควบคุมด้วย แอพ Blynk
คลิก เครื่องหมาย +
เพิ่ม Button อีก 3 ปุ่ม ตั้งค่า จัดวางตำแหน่ง ตามรูป
ปุ่ม BACK เลือก Virtual -> V1 -> CONTINUE
ปุ่ม RIGHT เลือก Virtual -> V2 -> CONTINUE
ปุ่ม LEFT เลือก Virtual -> V3 -> CONTINUE
ปุ่ม BACK เลือก Virtual -> V1 -> CONTINUE
ปุ่ม RIGHT เลือก Virtual -> V2 -> CONTINUE
ปุ่ม LEFT เลือก Virtual -> V3 -> CONTINUE
การติดตั้ง ไลบรารี่ Blynk
ดาวน์โหลด ไลบรารี่ Blynk
คลิกที่ Clone or download
คลิกที่ Download ZIP
เปิด โปรแกรม Arduino IDE
ไปที่ Skecth -> Include Library -> Add .ZIP Library...
ไปที่ ไลบรารี blynk-library-master.zip ที่เรา ดาวน์โหลด มา -> Open
ตรวจสอบที่ Skecth -> Include Library จะพบ ไลบรารี Blynk เพิ่มเข้ามาใน Arduino IDE ของเรา
ก่อน Upload โปรแกรม มีค่าเฉพาะที่ต้องแก้ไข อยู่ 3 ค่าด้วยกันคือ
1. char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
เป็นค่าที่เราได้รับจาก ที่ Blynk ส่ง อีเมล ให้เรา
ในตัวอย่างนี้แก้เป็น
char auth[] = "264b50a5284642c09eff8a0815cff21e";
2. char ssid[] = "MyWifi";
แก้เป็น ชื่อ WiFi ที่ต้องการเชื่อมต่อ
3. char pass[] = "MyWifiPassword";
แก้เป็น รหัสผ่าน ของWiFiที่ต้องการเชื่อมต่อ
แล้วจีง Upload โค้ดที่แก้ไขแล้ว ไปยัง บอร์ด NodeMCU V2
/**************************************************************
* This example runs directly on NodeMCU chip
* using the Blynk platform and mobile application.
* Change WiFi ssid, password, and Blynk auth token to run :)
**************************************************************/
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#define RightMotorSpeed 5 // D1 <-> IN1
#define RightMotorDir 0 // D3 <-> IN2
#define LeftMotorSpeed 4 // D2 <-> IN3
#define LeftMotorDir 2 // D4 <-> IN4
#define RightMotorDir 0 // D3 <-> IN2
#define LeftMotorSpeed 4 // D2 <-> IN3
#define LeftMotorDir 2 // D4 <-> IN4
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char ssid[] = "MyWifi";
char pass[] = "MyWifiPassword";
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(RightMotorSpeed, OUTPUT);
pinMode(RightMotorDir, OUTPUT);
pinMode(LeftMotorSpeed, OUTPUT);
pinMode(LeftMotorDir, OUTPUT);
}
void loop()
{
Blynk.run();
}
void halt()
{
digitalWrite(RightMotorSpeed, LOW);
digitalWrite(LeftMotorSpeed, LOW);
}
void forward()
{
digitalWrite(RightMotorDir, HIGH);
digitalWrite(LeftMotorDir, HIGH);
digitalWrite(RightMotorSpeed, LOW);
digitalWrite(LeftMotorSpeed, LOW);
}
void reverse()
{
digitalWrite(RightMotorDir, LOW);
digitalWrite(LeftMotorDir, LOW);
digitalWrite(RightMotorSpeed, HIGH);
digitalWrite(LeftMotorSpeed, HIGH);
}
void right()
{
digitalWrite(RightMotorDir, LOW);
digitalWrite(LeftMotorDir, HIGH);
digitalWrite(RightMotorSpeed, HIGH);
digitalWrite(LeftMotorSpeed, HIGH);
}
void left()
{
digitalWrite(RightMotorDir, HIGH);
digitalWrite(LeftMotorDir, LOW);
digitalWrite(RightMotorSpeed, HIGH);
digitalWrite(LeftMotorSpeed, HIGH);
}
BLYNK_WRITE(V0)
{
if (param[0])
forward();
else
halt();
}
BLYNK_WRITE(V1)
{
if (param[0])
reverse();
else
halt();
}
BLYNK_WRITE(V2)
{
if (param[0])
right();
else
halt();
}
BLYNK_WRITE(V3)
{
if (param[0])
left();
else
halt();
}
เลือก Port ในตัวอย่างเป็น "COM12"
เลือก Board : NodeMCU 1.0 (ESP-12E Module)
Upload
ถ้ามีปัญหา Upload ไม่เข้า ขึ้น Error แสดงข้อความว่า ตามรูปภาพ
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
ให้กดปุ่ม RST 1 ครั้ง และ กดปุ่ม FLASH บนบอร์ด ของ NodeMCU ค้างไว้ ในขณะที่ทำการอัพโหลดโปรแกรม
รอจนกระทั่ง Done uploading. 100%
ภาพรวมการต่อหุ่นยนต์
กลับไปที่ Blynk Application คลิกที่ เครื่องหมาย สามเหลี่ยม เพื่อทดสอบการทำงาน
หน้าต่างควบคุม แอพ robot_car
วีดีโอผลลัพธ์การทำงานของ โปรเจค หุ่นยนต์ ESP8266 NodeMCU V2 ควบคุมด้วย แอพ Blynk