วันพฤหัสบดีที่ 9 พฤศจิกายน พ.ศ. 2560

ESP32 #1: รู้จัก ไมโครคอนโทรลเลอร์ ESP32


ESP32 เป็นชิปไมโครคอนโทรลเลอร์ที่มาพร้อม WiFi มาตรฐาน 802.11 b/g/n และบลูทูธเวอร์ชั่น 4.2 เป็นรุ่นต่อยอดความสำเร็จของ ESP8266 โดยในรุ่นนี้ได้ออกมาแก้ไขข้อเสียของ ESP8266 ทั้งหมด



โดย CPU ใช้สถาปัตยกรรม Tensilica LX6 จำนวน 2 คอร์ สัญญาณนาฬิกา 240MHz สามารถแยกการทำงานระหว่างโปรแกรมจัดการ WiFi และแอพพลิเคชั่นออกจากกันได้ ทำให้มีสเถียรภาพเพิ่มขึ้นมาก มีแรม 520KB มาในตัว  นอกจากนี้ยังมี GPIO เพิ่มขึ้นมาก และมีช่อง ADC เพิ่มขึ้นเป็น 12 ช่อง จากเดิม ESP8266 มีเพียงช่องเดียว ใช้แรงดันไฟฟ้า 3.3V ในโหมด Sleep ใช้กระแสไฟฟ้าเพียง 2.5uA ผลิตโดยบริษัท Espressif จากประเทศจีน โดยตัวไอซี ESP32 มีสเปคโดยละเอียด ดังนี้


  • ซีพียูใช้สถาปัตยกรรม Tensilica LX6 แบบ 2 แกนสมอง สัญญาณนาฬิกา 240MHz
  • มีแรมในตัว 512KB
  • รองรับการเชื่อมต่อรอมภายนอกสูงสุด 16MB
  • มาพร้อมกับ WiFi มาตรฐาน 802.11 b/g/n รองรับการใช้งานทั้งในโหมด Station softAP และ Wi-Fi direct
  • มีบลูทูธในตัว รองรับการใช้งานในโหมด 2.0 และโหมด 4.0 BLE
  • ใช้แรงดันไฟฟ้าในการทำงาน 2.6V ถึง 3V
  • ทำงานได้ที่อุณหภูมิ -40◦C ถึง 125◦C
  • นอกจากนี้ ESP32 ยังมีเซ็นเซอร์ต่าง ๆ มาในตัวด้วย ดังนี้

  • วงจรกรองสัญญาณรบกวนในวงจรขยายสัญญาณ
  • เซ็นเซอร์แม่เหล็ก
  • เซ็นเซอร์สัมผัส (Capacitive touch) รองรับ 10 ช่อง
  • รองรับการเชื่อมต่อคลิสตอล 32.768kHz สำหรับใช้กับส่วนวงจรนับเวลาโดยเฉพาะ
  • ขาใช้งานต่าง ๆ ของ ESP32 รองรับการเชื่อมต่อบัสต่าง ๆ ดังนี้

  • มี GPIO จำนวน 32 ช่อง
  • รองรับ UART จำนวน 3 ช่อง
  • รองรับ SPI จำนวน 3 ช่อง
  • รองรับ I2C จำนวน 2 ช่อง
  • รองรับ ADC จำนวน 12 ช่อง
  • รองรับ DAC จำนวน 2 ช่อง
  • รองรับ I2S จำนวน 2 ช่อง
  • รองรับ PWM / Timer ทุกช่อง
  • รองรับการเชื่อมต่อกับ SD-Card


นอกจากนี้ ESP32 ยังรองรับฟังก์ชั่นเกี่ยวกับความปลอดภัยต่าง ๆ ดังนี้


  • รองรับการเข้ารหัส WiFi แบบ WEP และ WPA/WPA2 PSK/Enterprise
  • มีวงจรเข้ารหัส AES / SHA2 / Elliptical Curve Cryptography / RSA-4096 ในตัว


ในด้านประสิทธิ์ภาพการใช้งาน ตัว ESP32 สามารถทำงานได้ดี โดย

รับ – ส่ง ข้อมูลได้ความเร็วสูงสุดที่ 150Mbps เมื่อเชื่อมต่อแบบ 11n HT40 ได้ความเร็วสูงสุด 72Mbps เมื่อเชื่อมต่อแบบ 11n HT20 ได้ความเร็วสูงสุดที่ 54Mbps เมื่อเชื่อมต่อแบบ 11g และได้ความเร็วสูงสุดที่ 11Mbps เมื่อเชื่อมต่อแบบ 11b

เมื่อใช้การเชื่อมต่อผ่านโปรโตคอล UDP จะสามารถรับ – ส่งข้อมูลได้ที่ความเร็ว 135Mbps
ในโหมด Sleep ใช้กระแสไฟฟ้าเพียง 2.5uA

ด้วยเหตุนี้ ESP32 จึงเหมาะสำหรับนำมาใช้งานมาก ด้วยเหตุผลทางด้านราคา และประสิทธิ์ภาพที่ได้


บอร์ดพัฒนา ESP32

หลังจากชิปไอซี ESP32 เปิดตัวได้ไม่นาน ก็มีผู้ผลิตหลายรายที่ให้การตอบรับโดยการผลิตบอร์ดพัฒนา ESP32 ออกมา ช่วยให้ ESP32 สามารถนำมาพัฒนาได้ง่ายมากขึ้น ในแต่ละบอร์ดก็จะมีความแตกต่างกันในเรื่องของฟิเจอร์ ที่เพิ่มเติม  เรื่องขนาด และรุ่นของโมดูล ESP32 ที่เลือกใช้ ทำให้บอร์ดพัฒนา ESP32 เกิดขึ้นมาใหม่เสมอ


DevKitC ESP32

บอร์ดพัฒนา ESP32 ที่ผลิตโดยบริษัท Espressif ที่เป็นผู้ผลิตชิปไอซี ESP32 (ผู้ผลิตไอซี ผลิตโมดูล และผลิตบอร์ดพัฒนาเอง) เป็นบอร์ดพัฒนา ESP32 บอร์ดแรก ทำให้ตำแหน่งขาต่าง ๆ ของ DevKitC ESP32 ถูกใช้เป็นมาตรฐาน ของบอร์ดพัฒนา ESP32 ของบริษัท อื่นๆ อีกด้วย

บอร์ดพัฒนา DevKitC ESP32 มีอยู่ด้วยกัน 2 รุ่น คือ

V1 - บอร์ดสีฟ้า เป็นรุ่นแรก
V2 - เปลี่ยนสีของแผ่นวงจรพิมพ์เป็นสีดำ



บอร์ด DevKitC ESP32  ใช้โมดูลรุ่น ESP-WROOM-32 ที่บริษัท Espressif เป็นผู้ผลิตขึ้นเอง และใช้ชิปไอซีแปลง USB เป็น UART เบอร์ CP2102 จาก Silicon Labs สามารถเข้าโหมดอัพโหลดโปรแกรมแบบอัตโนมัติโดยใช้วงจรแบบ nodemcu มีรอม 4MB (หรือ 32Mbit) ใช้ไอซีเรกกูเลเตอร์แบบ LDO เบอร์ AMS1117-3.3 รองรับแรงดันเข้าสูงสุด 7V และจ่ายกระแสได้สูงสุด 700mA

ใช้พลังงานไฟฟ้าและสื่อสารผ่านพอร์ต MicroUSB มีขาต่อใช้งานทั้งหมด 38 ขา เรียงขาแบบเดียวกับบนโมดูล ESP-WROOM-32 เมื่อนำไปเสียบลงโพรโต้บอร์ด จะเหลือช่องให้ใช้งานเพียงด้านเดียว 1 ช่อง


การใช้งานขาต่างๆ ของ DevKitC ESP32




Arduino core for ESP32 WiFi chip


Espressif ได้พัฒนาชุดไลบารี่และคอมไพล์เลอร์สำหรับ Arduino ในชื่อ Arduino core for ESP32 WiFi chip การพัฒนา Arduino core for ESP32 WiFi chip จะทำไปควบคู่กับการพัฒนา ESP-DF โดยที่ ESP-IDF จะเป็นแกนหลัก เมื่อมีการเพิ่มฟิวเจอร์ใหม่ ๆ ให้ ESP-IDF แล้ว จึงจะมีการเพิ่มใน Arduino core for ESP32 WiFi chip


LuaNode

เป็นชื่อของชุดพัฒนา ESP32 ที่นำ Rumtime ของภาษา ภาษา Lua (pronounced 'LOO-ah' หรือออกเสียงว่า 'ลัว' หรือ 'ลูอ่า' ในภาษาโปรตุเกส) มาลงใน ESP32 ทำให้ ESP32 ใช้ภาษา Lua ได้ พัฒนาโดยบริษัท DOIT ที่ทำบอร์ดพัฒนา ESP32 ในชื่อ DOIT ESP32 Development Board มีขาต่อใช้งานทั้งหมด 30 ขา โดยความสามารถของ LuaNode คือรองรับคำสั่งที่ใช้บน Lua จริง ๆ แทบทุกคำสั่ง และรองรับการควบคุม WiFi เต็มรูปแบบ


การเลือกใช้งาน

บทความ โปรเจคหุ่นยนต์ ของ โรบอทสยาม นั้นจะใช้ Arduino core for ESP32 WiFi chip กับ บอร์ด DevKitC ESP32 มีขาต่อใช้งานทั้งหมด 38 ขา หรือ บอร์ด ที่มีตำแหน่งขาต่าง ๆ  อ้างอิงจาก DevKitC ESP32 ในการการพัฒนาเป็นหลัก





ลิงค์สินค้า : DevKitC V2 ESP32 Development Board WiFi + Bluetooth

ลิงค์ การติดตั้ง :  Arduino core for ESP32 WiFi chip

วันอาทิตย์ที่ 15 ตุลาคม พ.ศ. 2560

โปรเจค หุ่นยนต์ ESP32 ควบคุมด้วย แอพ Blynk ผ่าน WiFi



โปรเจค นี้จะเป็นการนำ  WeMos TTgo ESP32 มาทำเป็น หุ่นยนต์ Robot car  และ ควบคุมด้วยแอพ Blynk ผ่าน WiFi

บอร์ด ESP32 จากทาง WeMos เจ้าที่ทำบอร์ด ESP ออกมาอย่างหลากหลายและประสบความสำเร็จมาแล้วหลายบอร์ด และบอร์ดนี้เป็นบอร์ดที่พัฒนาเพิ่มขึ้นมาจากบอร์ดเดิม ที่นำเอา ESP32 มาลงบอร์ดและจัดขาให้เหมือนกับบอร์ด Arduino Uno ทำให้บอร์ดนี้สามารถรองรับ shield จากทางบอร์ด Arduino ได้หลายๆตัวเลยทีเดียว นอกจะใช้ shield ร่วมกันได้แล้ว ยังมีขาที่เหลือมาเพิ่มให้ได้ต่อ IO ได้มากขึ้นอีกต่างหาก และข้อดีของ ESP32 คือมี WiFi + Bluetooth ทั้งยังมีความเร็ว และ ความจำที่มากกว่า การเชื่อมต่อต่อแบบ MicroUSB และใช้ชิป USB เป็น CH340 

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



อุปกรณ์ที่ใช้



1. 2WD Smart Car Robot Chassis Kits

2. WeMos TTgo ESP32 WiFi + Bluetooth UNO D1 R32

3. 
Micro USB Cable Wire 1m for NodeMCU

4.  Motor Drive Module L298N

5. Jumper (M2M) cable 20cm Male to Male

6. Jumper (F2M) cable 20cm Female to Male

7. สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม.

8. รางถ่าน 18650 แบบ 2 ก้อน

9. ถ่านชาร์จ 18650 Panasonic NCR18650B 3.7v  จำนวน 2 ก้อน



1. ติดตั้ง Arduino core for ESP32


การจะใช้ ESP32  ได้นั้น จำเป็นต้องติดตั้ง Arduino core for ESP32  เพื่อ ทำการติดต่อ ระหว่าง Arduino IDE กับ ESP32


ลิงค์ : ขั้นตอนการติดตั้ง 
Arduino core for ESP32

.
https://robotsiam.blogspot.com/2017/09/arduino-core-for-esp32.html




2. ประกอบหุ่นยนต์



เริ่มต้นด้วยการ ประกอบ 2WD Smart Car Robot Chassis Kits




ภาพรวม การประกอบ รางถ่านแบบ 18650 และ เชื่อมต่อ Motor Drive Module L298N  เข้ากับ ESP32 ตามรูป






เริ่มด้วย ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด รางถ่านแบบ 18650 และ เชื่อมต่อ สายสีแดง ขั้วบวก เข้าที่ เพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF )
  



ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด Motor Drive Module L298N





ใช้ จั้มเปอร์ ผู้-ผู้ สีแดง ต่อจาก สวิทช์ อีกด้าน เข้า ไฟ+ Motor Drive  และ ใช้ จั้มเปอร์ ผู้-ผู้ สีดำ ต่อจากสายสีดำ ของรางถ่าน เข้า GND ของ Motor Drive 




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




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






ยึด 
TTgo ESP32.




ใช้ จั้มเปอร์ ผู้-ผู้ สีส้ม ต่อจาก ไฟ+ ของ Motor Driver เข้า ขา 5V ของ ESP32


และ ใช้ จั้มเปอร์ ผู้-ผู้ สีดำ ต่อจาก GND ของ Motor Driver เข้า ขา GND ของ ESP32


ด้าน 
TTgo ESP32 




ใช้ 
จั้มเปอร์ ผู้-เมีย ในการเชื่อมต่อ ระหว่าง 
Motor Driver กับ ESP32

Driver <-> 
ESP32

IN1 <-> 16
IN2 <-> 17
IN3 
<-> 12
IN4 
<-> 13





ด้าน Motor Driver 



ด้าน ESP32 






.

3. สร้างแอพ Blynk สำหรับควบคุมหุ่นยนต์ ESP32


ลิงค์การสร้างแอพ Blynk สำหรับควบคุมหุ่นยนต์  ESP32 ผ่าน WiFi 


https://robotsiam.blogspot.com/2017/10/blynk-ttgo-esp32.html




4. การติดตั้ง ไลบรารี่ 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 แล้ว


5. การอัพโหลดโปรแกรม


ใช้สาย 
MicroUSB เชื่อมต่อระหว่าง คอมพิวเตอร์ กับ ESP32





เปิดโปรแกรม Arduino (IDE)

ก่อน Upload โปรแกรม 
มีค่าเฉพาะที่ต้องแก้ไข อยู่ 3 ค่าด้วยกันคือ




4.1.  char auth[] = "blynk_key";



เป็นค่าที่เราได้รับจาก  ที่ Blynk ส่ง อีเมล ให้เรา ในขั้นตอน สร้างแอพ Blynk สำหรับควบคุมหุ่นยนต์ ESP32




ในตัวอย่างนี้แก้เป็น

char auth[] = "bf9431e24b89442ead921bb8ca5de49c";



4.2. 
char ssid[] = "wifi_SSID";

แก้เป็น ชื่อ WiFi ที่ต้องการเชื่อมต่อ


4.3. char pass[] = "wifi_password";

แก้เป็น รหัสผ่าน ของWiFiที่ต้องการเชื่อมต่อ



แล้วจีง Upload โค้ดที่แก้ไขแล้ว ไปยัง บอร์ด 
TTgo ESP32

...


/*
 * 
 * Blynk app controlled Robot with TTgo ESP32. 
 *  For more details visit:
 *  https://robotsiam.blogspot.com/2017/10/ttgo-esp32-blynk.html
 *  
 */

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

//pins to drive motors
int MotorLeft[2] = {13,12};  
int MotorRight[2] = {16,17};

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "blynk_key";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "wifi_SSID";
char pass[] = "wifi_password";


void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  MotorInit();
  //Serial.print("*Explore Robo Mode Computer: Controlled*\n\r");
  //Serial.println("Commands:\n W->Forward \n S->Backwards \n A->Left \n D->Right");
}

void loop()
{

  Blynk.run();

}

//Intialize the motor
void MotorInit()
{
  int i;
  for (i = 0 ; i < 2; i++)
  {
    pinMode(MotorLeft[i], OUTPUT);
    pinMode(MotorRight[i], OUTPUT);
  }
}
//Robot Driving Functions
void Robot_Forward()
{
  digitalWrite(MotorLeft[0], 0);
  digitalWrite(MotorLeft[1], 1);
  digitalWrite(MotorRight[0], 1);
  digitalWrite(MotorRight[1], 0);
}
void Robot_Backward()
{
  digitalWrite(MotorLeft[0], 1);
  digitalWrite(MotorLeft[1], 0);
  digitalWrite(MotorRight[0], 0);
  digitalWrite(MotorRight[1], 1);
}
void Robot_Left()
{
  digitalWrite(MotorLeft[0], 1);
  digitalWrite(MotorLeft[1], 0);
  digitalWrite(MotorRight[0], 1);
  digitalWrite(MotorRight[1], 0);
}
void Robot_Right()
{
  digitalWrite(MotorLeft[0], 0);
  digitalWrite(MotorLeft[1], 1);
  digitalWrite(MotorRight[0], 0);
  digitalWrite(MotorRight[1], 1);
}

void Robot_Stop()
{
  digitalWrite(MotorLeft[0], 0);
  digitalWrite(MotorLeft[1], 0);
  digitalWrite(MotorRight[0], 0);
  digitalWrite(MotorRight[1], 0);
}



BLYNK_WRITE(V1)
{
  int value = param.asInt(); // Get value as integer
  // Serial.println("Going Forward");
  if (value)
  {
    Robot_Forward();

  }
}

BLYNK_WRITE(V2)
{
  int value = param.asInt(); // Get value as integer
  //Serial.println("Moving Left");
  if (value)
  {

    Robot_Left();
    delay(200);
    Robot_Stop();
  }
}


BLYNK_WRITE(V3)
{
  int value = param.asInt(); // Get value as integer
  // Serial.println("Going back");
  if (value)
  {
    Robot_Backward();

  }
}


BLYNK_WRITE(V4)
{
  int value = param.asInt(); // Get value as integer
  //Serial.println("Moving Right");
  if (value)
  {
    Robot_Right();
    delay(200);
    Robot_Stop();

  }
}

BLYNK_WRITE(V5)
{
  int value = param.asInt(); // Get value as integer
  // Serial.println("Braking!!");
  if (value)
  {
    Robot_Stop();
  }
}



โปรแกรมที่แก้ไขแล้ว


ไปที่ Tool > Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port ให้เลือกตัวอื่นที่ไม่ใช่ COM1)


ในตัวอย่างเลือกเป็น "COM8"



ไปที่ Tools > Board เลือก "ESP32 Dev Module"



กดปุ่ม  เพื่ออัพโหลด


หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง


ถ้ามีปัญหา Upload ไม่เข้า


ให้กดปุ่ม  BOOT บนบอร์ด ของ ESP32 ค้างไว้สักครู่ ในขณะที่ทำการอัพโหลดโปรแกรม แล้วปล่อยเมื่อโปรแกรมเริ่มอัพโหลด


6. ทดสอบการทำงาน


ใส่ถ่าน แบบ 18650 จำนวน 2 ก้อน เข้าที่รางถ่าน




เปิดแอพ ควบคุมหุ่นยนต์ 
Blynk  -> ESP32_Robot (ที่สร้างไว้ ในขั้นตอนที่3)

เลือกเครื่องหมายสามเหลี่ยม ขวามือ



ทดสอบควบคุม หุ่นยนต์ TTgo ESP32




วีดีโอผลลัพธ์การทำงานของ โปรเจค หุ่นยนต์ TTgo ESP32 ควบคุมด้วย แอพ Blynk