GPIO ย่อมาจาก general purpose input/output เรียกเป็นภาษาไทยง่ายๆว่า พอร์ตเอนกประสงค์ คือเราสามารถควบคุม คอนโทรลให้เป็น ค่าต่างๆได้ และเรายังสามารถกำหนด GPIO เหล่านี้ให้เป็น INPUT หรือ OUTPUT ก็ได้
DevKitC ESP32 มี GPIO ทั้งหมด 32 ขา ในการใช้งาน GPIO มีสิ่งที่ต้องพึงระมัดระวังให้มากเป็นพิเศษก็คือเรื่อง ในการต่อสาย เนื่องจาก GPIO เหล่านี้ ใช้ไฟ 3.3 โวลต์ และทนแรงดันไฟฟ้าได้แค่ 3.3V เท่านั้น ดังนั้นถ้าหากใช้ไฟ 5 โวลต์ มาต่อเข้ากับ port นี้ก็จะพังทันที ไม่สามารถใช้งานได้อีกต่อไป และไม่สามารถเปลี่ยน หรือ ซ่อมแซมได้
การควบคุมโหมดใช้งานขา GPIO แบบดิจิตอล
ในการใช้งานขา GPIO แบบดิจิตอล จำเป็นต้องมีการควบคุมหรือบอกให้ขา GPIO นั้น ๆ ได้รู้ว่าต้องการจะให้ใช้รับค่าดิจิตอลเข้ามา หรือจะให้เขียนค่าออกไป ซึ่งจะใช้คำสั่ง pinMode() ในการกำหนด
คำสั่ง pinMode() มีรูปแบบการใช้งานดังนี้
void pinMode( pin, mode);
จะเห็นได้ว่าฟังก์ชั่นมีค่าพารามิเตอร์ 2 ตัว คือ
pin – กำหนดหมายเลขขา GPIO ที่ต้องการควบคุม
mode – โหมดที่ต้องการกำหนดให้ขา GPIO ซึ่งสามารถเป็นได้ดังนี้
INPUT – กำหนดให้ขา GPIO มีสถานะเป็นอินพุต รอรับค่าเข้ามา
OUTPUT – กำหนดให้ขา GPIO มีสถานะเป็นเอาต์พุต รอเขียนค่าออกไป
การกำหนดขา GPIO ของ DevKitC ESP32
โดยดูได้จาก PINOUT ของ DevKitC ESP32 ตามภาพด้านล่าง
โดยให้ใช้ตัวเลขหลัง GPIO ในการกำหนดขาใช้งาน ตัวอย่างเช่น
pinMode(12, OUTPUT);
คือ กำหนดให้ GPIO ขาที่ 12 ให้มีสถานะเป็นเอาต์พุต รอเขียนค่าออกไป
ส่วนใหญ่นิยมเขียนที่ ฟังก์ชั่น void setup()
การเขียนค่าเอาต์พุตแบบดิจิตอล
เอาต์พุตแบบดิจิตอล คือการใช้งานขา GPIO ในการ เขียนค่าสถานะแบบดิจิตอล ซึ่งใช้งานตั้งอยู่บนพื้นฐานดิจิตอล คือค่าที่ได้หรือค่าที่เขียนจะมีแค่ 2 สถานะ คือสถานะ HIGH และสถานะ LOW ซึ่งขา GPIO จะรองรับการจ่ายกระแสสูงสุดเพียง 12mA เท่านั้น
ซึ่งการเขียนค่าเอาต์พุตแบบดิจิตอลจะใช้คำสั่ง digitalWrite() มีรูปแบบการใช้งานดังนี้
digitalWrite(pin, value);
มีค่าพารามิเตอร์ 2 ตัว คือ
pin – กำหนดหมายเลขขา GPIO ที่ต้องการเขียนค่า
value – ค่าที่ต้องการเขียนออกไป สามารถเป็นได้ดังนี้
HIGH – เขียนค่าลอจิก 1 หรือสถานะ HIGH หรือแรงดัน 3V ออกไป
LOW – เขียนค่าลอจิก 0 หรือสถานะ LOW หรือเทียบเท่ากับขากราว์ด
ตัวอย่างเช่น
digitalWrite(12, HIGH);
คือ กำหนดให้ GPIO ขาที่ 12 ให้มีสถานะ HIGH หรือแรงดัน 3V ออกไป
ส่วนใหญ่นิยมเขียนที่ ฟังก์ชั่น void loop()
เตรียมความพร้อม ประกอบหุ่นยนต์ DevKitC ESP32
ลิงค์การประกอบหุ่นยนต์ DevKitC ESP32
https://esp32robot.blogspot.com/2019/09/devkitc-esp32-v4-car.html
ทดสอบการเคลื่อนที่ของหุ่นยนต์ และ เอาต์พุตแบบดิจิตอล
เราจะใช้ หุ่นยนต์ DevKitC ESP32 ที่เราประกอบเสร็จแล้วในขั้นตอนที่ผ่านมา ทดสอบการเคลื่อนที่ของหุ่นยนต์ และ การใช้งานเอาต์พุตแบบดิจิตอล
### อุปกรณ์ที่ใช้ ###
1 . 4WD Smart Robot Car Chassis Kits
2. DevKitC V4 ESP32 Development Board ESP-WROOM-32D
3. Micro USB Cable Wire 1m
4. Breadboard 8.5CM x 5.5CM 400 holes // จำนวน 2 ชิ้น
5. Motor Driver Module L298N
6. สกรูหัวกลม+น็อตตัวเมีย ขนาด 3มม ยาว 12มม
7. Jumper 20cm Male to Male
8. Jumper 20cm Female to Male
9. เพาเวอร์สวิตซ์สำหรับเปิดปิด
10. รางถ่าน 18650 แบบ 2 ก้อน
11. ถ่านชาร์จ 18650 Panasonic NCR18650B 3.7v 3400mAh // จำนวน 2 ก้อน
...
เชื่อมต่อสาย Micro USB ระหว่าง คอมพิวเตอร์ กับ DevKitC ESP32
เปิด โปรแกรม Arduino IDE ขึ้นมา เขียนโปรแกรม หรือ Sketch ตามโค้ดด้านล่างนี้
// Motor A pins
int pinA2 = 12;
int pinA1 = 13;
//Motor B pins
int pinB2 = 32;
int pinB1 = 33;
boolean run = true;
void setup() {
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);
}
void loop() {
if (run) {
delay(2000);
//Go forward
forward(1000);
//Go backward
backward(1000);
//Turn left
turnLeft(1000);
coast(200);
//Turn right
turnRight(1000);
coast(200);
//This stops the loop
run = false;
}
}
//ฟังก์ชั่นหลักในการควบคุมมอเตอร์
void forward(int time)
{
motorAForward();
motorBForward();
delay(time);
}
void backward(int time)
{
motorABackward();
motorBBackward();
delay(time);
}
void turnLeft(int time)
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, LOW);
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
delay(time);
}
void turnRight(int time)
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, LOW);
delay(time);
}
void coast(int time)
{
motorACoast();
motorBCoast();
delay(time);
}
void brake(int time)
{
motorABrake();
motorBBrake();
delay(time);
}
//ฟังก์ชั่นรองในการควบคุมมอเตอร์
//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);
}
ไปที่ Tools -> Board เลือก "ESP32 Dev Module"
ไปที่ Tools -> Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port ให้เลือกตัวอื่นที่ไม่ใช่ COM1)
ในตัวอย่างเลือกเป็น "COM12"
ไปที่ Tools -> Upload Speed : เลือกเป็น "115200"
กดปุ่ม เพื่ออัพโหลด
ตั้งชื่อไฟล์ เป็น Test_DevKitC_Robot_V1 -> Save โปรแกรม จะทำการ อัพโหลด
หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง
ใสถ่าน แบบ 18650 แรงดันไฟเฉลี่ย 3.7V (3400 mAh) จำนวน 2 ก้อน
แล้วทดสอบการทำงาน โปรแกรมนี้จะทำงานเพียง 1 ครั้ง ถ้าต้องการทดลองใหม่ให้ ปิดเปิด สวิทช์ไฟใหม่
ยกลงวางที่พื้นแล้วทดสอบ เปิด สวิทช์ไฟ ถ้าทุกอย่างถูกต้อง รถจะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว เลี้ยวขวา กลับสู่ตำแหน่งเดิม
วีดีโอผลลัพธ์ ทดสอบการเคลื่อนที่ของหุ่นยนต์ DevKitC ESP32
...
ไม่มีความคิดเห็น:
แสดงความคิดเห็น