วันจันทร์ที่ 13 พฤศจิกายน พ.ศ. 2560

ESP32 #5: GPIO และ ทดสอบการเคลื่อนที่ของหุ่นยนต์



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://robotsiam.blogspot.com/2017/11/esp32-4.html


ทดสอบการเคลื่อนที่ของหุ่นยนต์ และ เอาต์พุตแบบดิจิตอล



เราจะใช้ หุ่นยนต์ DevKitC ESP32 ที่เราประกอบเสร็จแล้วในขั้นตอนที่ผ่านมา ทดสอบการเคลื่อนที่ของหุ่นยนต์ และ การใช้งานเอาต์พุตแบบดิจิตอล


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


1 . 4WD Smart Robot Car Chassis Kits

2. DevKitC V2 ESP32 Development Board

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(600);
    //Go backward
    backward(600);
    //Turn left
    turnLeft(700);
    coast(200);
    //Turn right
    turnRight(700);
    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)
{
  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);
}


//ฟังก์ชั่นรองในการควบคุมมอเตอร์


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


...

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

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