วันอังคารที่ 22 สิงหาคม พ.ศ. 2560

โครงงานหุ่นยนต์ ESP8266 NodeMCU V2 ควบคุมด้วย แอพ Blynk



โปรเจค นี้จะเป็นการนำ  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 




ใช้ 
จั้มเปอร์ ผู้-ผู้ สีเขียว และ สีเหลือง ต่อจาก Motor Driver ไปยัง มอเตอร์ของหุ่นยนต์ ด้านขวา และ ใช้ จั้มเปอร์ ผู้-ผู้ สีน้ำเงิน และ สีม่วง ต่อจาก Motor Driver ไปยัง มอเตอร์ของหุ่นยนต์ ด้านซ้าย





การต่อมอเตอร์ ด้านล่างของหุ่นยนต์





ใช้ จั้มเปอร์ ผู้-เมีย ยาว 10 ซม. สีแดง ต่อจาก สวิทช์ เข้า ขา Vin ของ NodeMCU และ ใช้ จั้มเปอร์ ผู้-เมีย ยาว 10 ซม. สีดำ ต่อจาก สายสีดำของรางถ่าน เข้า ขา GND ของ NodeMCU




การใช้งาน 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 โปรแกรม ทดสอบการทำงาน


เชื่อมต่อ สาย USB ระหว่าง คอมพิวเตอร์ กับ  NodeMCU 




1. ตรวจสอบการติดตั้งไดร์เวอร์ ของ NodeMCU V2 



โดย 
คลิกขวา Computet -> Properties






คลิกที่ Device Manager



ที่ Ports (COM & LPT) จะพบ 
ไดร์เวอร์ ของ NodeMCU V2 ในตัวอย่างเป็น "COM12"





(ถ้าไม่พบให้ทำการติดตั้งไดร์เวอร์ก่อน) 
การติดตั้งโปรแกรม Arduino (IDE) และ การติดตั้งไดร์เวอร์


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%




ใส่ แบตเตอรี่ลิเธียม 18650 จำนวน 2 ก้อน ไปที่ รางถ่าน และ ตรวจสอบขั้วของแบตเตอรี่ ใส่ถุกต้องหรือไม่



ถ้าทุกอย่างถูกต้อง ทดลอง ยกลงวางที่พื้นแล้ว ทดสอบ  ปิดเปิด สวิทช์ไฟ Power  ถ้าทุกอย่างถูกต้อง ปรกติ หุ่นยนต์จะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว เลี้ยวขวา


ถ้าหุ่นยนต์ เคลื่อนที่ปรกติ แสดงว่า หุ่นยนต์ของเราพร้อมทำงานแล้ว



(ถ้าต้องการทดสอบใหม่ ให้  ปิดเปิด สวิทช์ไฟใหม่)



3.การสร้างแอพ Blynk สำหรับหุ่นยนต์ NodeMCU V2


Blynk Application เป็นโปรแกรมบนมือถือที่ทำให้เราสร้างหน้าต่างควบคุมหรือแสดงผลเชื่อมต่อกับพวกไมโครคอนโทรเลอร์(Ardunio, ESP8266, Raspberry Pi) ได้ง่ายๆ
 โดยไปที่ Play Store ค้นหา Blynk

ติดตั้ง เหมือน App ทั่วๆไป



เปิด Blynk Application ขึ้นมา

-> Create New Account







กรอก อีเมล และ พาสเวิด -> Sign Up




-> New Project





ตั้งชื่อ Project ในตัวอย่างชื่อ robot_car -> Create



โปรกรม จะส่ง Auth Toke ไปที่ อีเมล ที่เรากรอกไว้ -> OK


โดยทุกๆครั้งที่เริ่มสร้างโปรเจคใหม่ AUTH TOKEN จะถูกเปลี่ยนใหม่เสมอ ซึ่ง KEY นี้เองที่เป็นเสมือนกุญแจสำหรับเชื่อมต่อ


คลิก เครื่องหมาย +



คลิก เพิ่ม Button




จะมี ปุ่ม BUTTON เพิ่มเข้ามาที่หน้าจอ แล้วจึง คลิกที่ BUTTON เพื่อตั้งค่า



คลิก ที่ PIN


เลือก Virtual -> V0 -> CONTINUE


เปลี่ยนชื่อ Button เป็น FORWARD



ลาก Button ไว้กลางหน้าจอ


เพิ่ม Button อีก 3 ปุ่ม ตั้งค่า จัดวางตำแหน่ง ตามรูป

ปุ่ม BACK เลือก Virtual -> V1 -> CONTINUE
ปุ่ม RIGHT เลือก Virtual -> V2 -> CONTINUE
ปุ่ม LEFT เลือก Virtual -> V3 -> CONTINUE




การติดตั้ง ไลบรารี่ Blynk



ไปที่

http://www.blynk.cc/getting-started/

ดาวน์โหลด ไลบรารี่ Blynk




เปิด โปรแกรม 
Arduino IDE จากนั้นให้ทำการเพิ่ม ไลบรารี่ Blynk  ให้กับ Arduino (IDE) ของเรา
การเพิ่ม ไลบรารี่ Blynk ให้กับ Arduino (IDE) ของเรา ตามรูป





เลือกไฟล์ ไลบรารี่ blynk-library-0.4.8.ZIP ที่เรา ดาวน์โหลดมาอยู่ในคอมพิวเตอร์ของเรา จากนั้นคลิก Open โปรแกรม จะเพิ่ม ไลบรารี่ Blynk เข้าสู่ Arduino (IDE) ของเรา



เมื่อเพิ่มเสร็จแล้วตรวจสอบ จะพบ File -> Eamples -> Blynk 





แสดงว่า ไลบรารี่ 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

// 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




ไม่มีความคิดเห็น:

แสดงความคิดเห็น

โปรเจค IoT ESP8266 วัดอุณหภูมิความชื้น บันทึกลงดาต้าเบส MySQL

เป้าหมายของโปรเจคนี้คือเราต้องดูข้อมูลด้วยการเข้าถึงโดเมน ของเราเอง ไม่ว่าจะอยู่ส่วนไหนของโลก โดย ESP8266 จะสร้างไคลเอ็นต์  ที่ทำให้คำขอ...