ข้ามไปที่เนื้อหาหลัก

ESP32 #6: หุ่นยนต์ควบคุมด้วยเว็บบราวเซอร์



WiFi ถือเป็นหัวใจสำคัญและเป็นจุดเด่นของ ESP32 เลยก็ว่าได้ ด้วยการรวมส่วนของ WiFi มาในชิปพร้อมกับไมโครคอนโทรลเลอร์ทำให้สามารถประหยัดพื้นที่โดยรวมของระบบได้ รวมทั้งทำให้สามารถจัดการเรื่องของพลังงานได้ง่ายมากยิ่งขึ้น นอกจากนี้การใช้งาน  โดยมีคุณสมบัติพิเศษคือสามารถเลือกโหมดการใช้งาน WiFi ได้ 3 โหมด คือ โหมด AP (Access Point) โหมด STA (Station) และโหมด AP+STA ซึ่งทั้ง 3 โหมดจะมีการใช้งานที่แตกต่างกันเล็กน้อย โดยในโปรเจคนี้ จะเลือกการใช้งาน ในโหมด STA (Station)

โหมด STA

STA ย่อมาจาก Station เป็นโหมดที่จะใช้ DevKitC ESP32 ไปเชื่อมต่อกับอุปกรณ์ปล่อยสัญญาณอื่น ๆ เช่น เร้าเตอร์ โทรศัพท์มือถือที่เปิดฮอตสปอต การใช้งานในโหมดนี้นิยมใช้กับงานที่ต้องการเชื่อมต่ออินทราเน็ต หรือมีการสื่อสารกับอุปกรณ์หลาย ๆอย่าง ในวงแลน

ในงานด้าน IoT Smart Home และ Smart Farm มักใช้งานในโหมดนี้เพื่อส่งข้อมูลจากเซ็นเซอร์ขึ้นไปบนระบบคลาวด์และใช้โหมดนี้เพื่อเชื่อมต่อกับระบบคลาวด์รับคำสั่งมีสั่งอุปกรณ์ต่าง ๆ ให้ทำงานผ่านอินทราเน็ต


หุ่นยนต์ควบคุมด้วยเว็บบราวเซอร์

หากต้องการใช้งานอินเตอร์เน็ต-อินทราเน็ต หรือต้องการให้อุปกรณ์หลาย ๆ ตัวสามารถเข้ามาสื่อสารได้ จำเป็นต้องใช้งานในโหมด STA เพื่อให้ Access Point เป็นอุปกรณ์ตัวกลางในการสื่อสาร

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


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


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 ก้อน

...


โดยการทำโปรเจคมีขั้นตอนดังนี้


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

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

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


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



ลิงค์การประกอบหุ่นยนต์ DevKitC ESP32


https://robotsiam.blogspot.com/2017/11/esp32-4.html



3.ทดสอบการเคลื่อนที่ของหุ่นยนต์ 



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


https://robotsiam.blogspot.com/2017/11/esp32-5-gpio-devkitc.html


4.เขียนโค้ดควบคุมหุ่นยนต์ 



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






เปิด โปรแกรม Arduino IDE ขึ้นมา เขียนโปรแกรม หรือ  Sketch  ตามโค้ดด้านล่างนี้




/*
    Robot with DevKitC ESP32.
    For more details visit:
    http://www.robotsiam.com

*/


#include <WiFi.h>

const char* ssid     = "YOUR_NETWORK_NAME";
const char* password = "YOUR_NETWORK_PASSWORD";

WiFiServer server(80);

// Motor A pins

int pinA2 = 12;
int pinA1 = 13;


//Motor B pins

int pinB2 = 32;
int pinB1 = 33;

void setup()
{
  Serial.begin(115200);

  pinMode(pinA1, OUTPUT);
  pinMode(pinA2, OUTPUT);
  pinMode(pinB1, OUTPUT);
  pinMode(pinB2, OUTPUT);


  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();

}

int value = 0;

void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("New Client.");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("<h1>");
            client.print("<br>");
            client.print("Click <a href=\"/FORWARD\">FORWARD</a>.<br>");
            client.print("<br>");

            client.print("Click <a href=\"/BACKWARD\">BACKWARD</a>.<br>");
            client.print("<br>");

            client.print("Click <a href=\"/TURNLEFT\">TURNLEFT</a>.<br>");
            client.print("<br>");

            client.print("Click <a href=\"/TURNRIGHT\">TURNRIGHT</a>.<br>");
            client.print("<br>");
            client.print("</h1>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /xH" or "GET /xL":
        if (currentLine.endsWith("GET /FORWARD")) {
          forward(400);
          coast(1);
        }

        if (currentLine.endsWith("GET /BACKWARD")) {
          backward(400);
          coast(1);
        }

        if (currentLine.endsWith("GET /TURNLEFT")) {
          turnLeft(1000);
          forward(10);
          coast(1);
        }

        if (currentLine.endsWith("GET /TURNRIGHT")) {
          turnRight(1000);
          forward(10);
          coast(1);
        }

      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

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



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);
}




ก่อนการอัพโหลดต้องแก้ไขโค้ด ตรงที่เป็นสีแดงให้ถูกต้องก่อน โดย


"
YOUR_NETWORK_NAME" คือ ชื่อWiFiที่ต้องการเชื่อมต่อ


"
YOUR_NETWORK_PASSWORD" คือ รหัสผ่าน





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





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


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




ไปที่ Tools -> Upload Speed : เลือกเป็น "115200"




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




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




ไปที่ Tools -> Serial Monitor





เลือก Both NL & CR และ เลือก 115200 baud


Serial Monitor จะแสดง ไอพี ของ DevKitC ESP32 ในตัวอย่างคือ 192.168.1.40





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


ใสถ่าน แบบ 18650 แรงดันไฟเฉลี่ย 3.7V  (3400 mAh)  จำนวน 2 ก้อน



เปิด เว็บบราวเซอร์




ที่ URL ป้อนไอพีที่ได้จาก Serial Monitor ในตัวอย่างคือ 192.168.1.40

แล้วคลิก ทดสอบการทำงาน



วีดีโอผลลัพธ์ หุ่นยนต์ควบคุมด้วยเว็บบราวเซอร์ DevKitC ESP32


โพสต์ยอดนิยมจากบล็อกนี้

การใช้งาน IR Infrared Obstacle Avoidance Sensor Module

โมดูลเซ็นเซอร์แสงสำหรับตรวจจับวัตถุกีดขวาง   IR Infrared Obstacle Avoidance Sensor Module โมดูลเซ็นเซอร์แสงสำหรับตรวจจับวัตถุกีดขวาง    IR Infrared Obstacle Avoidance Sensor Module โดยโมดูลนี้ จะมีตัวรับและตัวส่ง infrared ในตัว ตัวสัญญาณ(สีขาว) infrared จะส่งสัญญาณออกมา และเมื่อมีวัตถุมาบัง คลื่นสัญญาณ infrared  ที่ถูกสั่งออกมาจะสะท้องกลับไปเข้าตัวรับสัญญาณ (สีดำ) สามารถนำมาใช้ตรวจจับวัตถุที่อยู่ตรงหน้าได้ และสามารถปรับความไว ระยะการตรวจจับ ใกล้หรือไกลได้ ภายตัวเซ็นเซอร์แบบนี้จะมีตัวส่ง Emitter และ ตัวรับ Receiver ติดตั้งภายในตัวเดียวกัน ทำให้ไม่จำเป็นต้องเดินสายไฟทั้งสองฝั่ง เหมือนแบบ Opposed Mode ทำให้การติดตั้งใช้งานได้ง่ายกว่า แต่อย่างไรก็ตามจำเป็นต้องติดตั้งตัวแผ่นสะท้อนหรือ Reflector ไว้ตรงข้ามกับตัวเซ็นเซอร์เอง โดยโฟโต้เซ็นเซอร์แบบที่ใช้แผ่นสะท้อนแบบนี้จะเหมาะสำหรับชิ้นงานที่มีลักษณะทึบแสงไม่เป็นมันวาว เนื่องจากอาจทำให้ตัวเซ็นเซอร์เข้าใจผิดว่าเป็นตัวแผ่นสะท้อน และ ทำให้ทำงานผิดพลาดได้ เซ็นเซอร์แบบนี้จะมีช่วงในการทำงาน หรือ ระยะในการตรวจจับจะได้ใกล้กว่าแบบ O

การติดตั้ง Library ของ DHT Sensor DHT11 , DHT21 , DHT22

การติดตั้ง Library ของ DHT Sensor ไลบรารี DHT ใช้สำหรับในการให้เซ็นเซอร์ DHT  อ่านอุณหภูมิและความชื้นด้วย  Arduino หรือ ESP8266 ได้ คลิกที่นี่เพื่อดาวน์โหลดไลบรารี ของเซ็นเซอร์ DHT https://github.com/adafruit/DHT-sensor-library เปิดโปรแกรม Arduino IDE  ไปที่ Skecth -> Include Library -> Add .ZIP Library... ไปที่ ไลบรารี DHT-sensor-library ที่เรา ดาวน์โหลด มา ตรวจสอบที่ Skecth -> Include Library  จะพบ ไลบรารี DHT sensor library เพิ่มเข้ามาใน Arduino IDE ของเรา ไปที่ Skecth -> Include Library -> Manage Libraries... ไปที่ช่องค้นหา พิมพ์ DHT -> Enter (เพื่อค้นหา DHT sensor library ) เมื่อพบ DHT sensor library แล้ว ให้คลิก More info คลิกที่ Select Vers.. ในตัวอย่าง เลือก Version 1.2.3 คลิก Install คลิก Close เพิ่ม #include <DHT.h> ไปที่ส่วนบนสุดของโค้ด #include <DHT.h> void setup() {   // put your setup code here, to run once: } void loop() {   // put your main

ESP32 #2: การติดตั้ง Arduino core for ESP32 WiFi chip

ในบทความนี้จะเป็นการแนะนำการติดตั้งโปรแกรม Arduino IDE ตั้งแต่ต้น ไปจนถึงการติดตั้งชุดพัฒนา Arduino core for ESP32 WiFi chip และ การตรวจสอบว่าติดตั้งสำเร็จหรือไม่ “Arduino” แต่เดิมเป็นแพลตฟอร์มที่ใช้ในการพัฒนาเฟิร์มแวร์ให้กับบอร์ด Arudino เท่านั้น แต่ภายหลังกลุ่มผู้พัฒนาโปรแกรม Arduino IDE ได้เริ่มรองรับการติดตั้งชุดพัฒนาเฟิร์มแวร์ให้กับบอร์ดอื่น ๆ ด้วย ทำให้บอร์ดอื่น ๆ ที่รองรับการเขียนโปรแกรมด้วยภาษา C/C++ สามารถเข้ามาใช้โปรแกรม Arduino IDE ในการพัฒนาได้ นอกจากข้อดีของโปรแกรม Arduino IDE แล้ว ชุดไลบารี่ต่าง ๆ ที่ทำมารองรับกับแพลตฟอร์ม Arduino ก็จะสามารถนำมาใช้งานกับบอร์ดอื่น ๆ ได้ด้วย การจะใช้ Arduino core for ESP32 กับ Arduino IDE ได้นั้น มีขั้นตอนดังนี้ คือ 1. ติดตั้งโปรแกรม Arduino (IDE) ลิงค์ดาวโหลด Arduino (IDE)  https://www.arduino.cc/en/Main/Software 2. ติดตั้ง แพลตฟอร์ม ESP32 ในการเริ่มต้นเราจะต้องอัปเดตผู้จัดการบอร์ดด้วย URL ที่กำหนดเอง เปิด Arduino IDE และไปที่ File > Preferences คัดลอก URL ด้านล่างลงใน Additional Board Manager URLs: แล้ว คลิก