เซ็นเซอร์วัดระยะทาง
สำหรับเซ็นเซอร์วัดระยะทาง สามารถนำไปใช้ในการวัดขนาดสิ่งของ ตรวจจับสิ่งกีดขวางได้ โดยในด้าน Smart Farm มักนำไปใช้วัดระดับน้ำในถังน้ำ หรือนำไปใช้วัดระดับน้ำในบ่อน้ำ เพื่อให้แจ้งเตือน หรือเติมนำอัตโนมัติ สำหรับเซ็นเซอร์วัดระยะห่างจะมีทั้งแบบใช้แสง และใช้คลื่นเสียง
BLE
BLE ย่อมาจาก Bluetooth Low Energy หรืออาจแปลเป็นไทยได้ว่า บลูทูธพลังงานต่ำ ตามหลักแล้วอุปกรณ์ BLE จะใช้พลังงานน้อยมาก ๆ บางอุปกรณ์เครมว่าสามารถอยู่ได้ต่อเนื่องนาน 1 ปี โดยใช้พลังงานจากถ่านกระดุมเพียงก้อนเดียว
หุ่นยนต์หลบหลีกสิ่งกีดขวาง ส่งค่าผ่าน Bluetooth
โดยในโปรเจคนี้เราจะสร้างหุ่นยนต์หลบหลีกสิ่งกีดขวาง ส่งค่าผ่าน Bluetooth โดยให้หุ่นยนต์ตัดสินใจโดยอัตโนมัติ ด้วยการวัดระยะทาง จาก สิ่งกีดขวาง และ เมื่อมีสิ่งกีดขวางอยู่ในระยะที่กำหนดไว้ ในตัวอย่างคือ น้อยกว่า 20 เซ็นติเมตร ให้หุ่นยนต์ ถอยหลัง แล้ว เลี้ยวซ้าย หลบสิ่งกีดขวางนั้นเสมอ โดยในขณะที่ทำงานจะให้ส่งค่าระยะทางที่วัดได้ ส่งค่าผ่านทาง Bluetooth มายัง สมาร์ทโฟน ของเราด้วย
### อุปกรณ์ที่ใช้ ###
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 ก้อน
12. HY-SRF05 SRF05 Ultrasonic Distance Sensor Module
13. Mounting Bracket for HC-SR04 แบบสั้น
...
โดยการทำโปรเจคมีขั้นตอนดังนี้
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.ประกอบเซ็นเซอร์วัดระยะทาง HY-SRF05
HY-SRF05 SRF05 Ultrasonic Distance Sensor Module โมดูลวัดระยะด้วยคลื่นอัลตร้าโซนิค ใช้การสื่อสารกับไมโครคอนโทรลเลอร์ผ่านการทริกสัญญาณ สามารถวัดระยะห่างได้ตั้งแต่ 2 เซ็นติเมตร ไปจนถึง 4 เมตร ใช้แรงดันไฟฟ้า 5V การวัดระยะทางโดยใช้ โมดูล Ultrasonic มีความแม่นยำในการวัดระยะทาง การทำงานเป็นแบบคลื่นสะท้อนกลับแล้วนำมาคำนวน จึงเหมาะสำหรับมาใช้ในการหลบหลีกสิ่งกีดขวาง ตรวจจับวัตถุที่อยู่ในรัศมีที่ต้องการ
ประกอบ SRF05 เข้ากับ Mounting Bracket แล้วยึดเข้ากับหุ่นยนต์ดังรูป
เชื่อมต่อ SRF05 เข้ากับ ESP32
Trig <-> IO15 (ESP32)
Echo <-> IO2 (ESP32)
Vcc <-> 5V (Motor Driver)
GND <-> GND (ไฟ- ของ Breadboard)
เชื่อมต่อสายจาก SRF05
เข้ากับ ESP32
Trig <-> IO15
Trig <-> IO15
Echo <-> IO2
Vcc ไปที่ Motor Driver (ใช้สาย ผู้-เมีย 2 เส้น เชื่อมต่อกัน)
Vcc <-> 5V (สายสีแดงเส้นที่ 3 จากซ้ายมือ)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfIE7of2nlVNuy_o-FMP79cpVV_TK9Xqr86XGPyagJXO0SXayrwiQ2cnwKnSgGW3GvL2iczGddtCGnlsTUHzuIsNWkJRJHrE0yJDinFwVW3zFn3l2-5iNhRMmPCxyKwpyRMk99Aoe2QbRm/s640/4.jpg)
GND <-> GND (ไฟ- ของ Breadboard)
ภาพรวมการต่อ หุ่นยนต์หลบหลีกสิ่งกีดขวาง
เชื่อมต่อสาย Micro USB ระหว่าง คอมพิวเตอร์ กับ DevKitC ESP32
เปิด โปรแกรม Arduino IDE ขึ้นมา เขียนโปรแกรม หรือ Sketch ตามโค้ดด้านล่างนี้
const unsigned int TRIG_PIN=15;
const unsigned int ECHO_PIN=2;
const unsigned int BAUD_RATE=115200;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(BAUD_RATE);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
const unsigned long duration= pulseIn(ECHO_PIN, HIGH);
int distance= duration/29/2;
if(duration==0){
Serial.println("Warning: no pulse from sensor");
}
else{
Serial.print("distance to nearest object:");
Serial.println(distance);
Serial.println(" cm");
}
delay(100);
}
ไปที่ Tools -> Board เลือก "ESP32 Dev Module"
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXvz8I06VXeFegOeJitlGOw_8zReOCMmtCrhv3PU7iCOF6C9UzZeRFD2ccm_6_6eDj38ubiIflY5W3DSCRqxFM0E4M_UzNCMucdnwJKDZI4hyphenhyphenQYnNhkLJDFrs8HEXlXwuiNGFnwxYTAzbv/s640/7.jpg)
ไปที่ Tools -> Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port ให้เลือกตัวอื่นที่ไม่ใช่ COM1)
ในตัวอย่างเลือกเป็น "COM12"
ไปที่ Tools -> Upload Speed : เลือกเป็น "115200"
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtXFFsWfuapdpyHY_FC6t_r5bgTN2EzGTjNoxWKXC71K1E3li6cbEIMPiD3xP-qZHfzJgrN0aeqkTRP7alZdv47CxQXqaphv_INKT5WtVoXYEi04ccpwlw0o5UY7bbD-QQurCwtxeBICZF/s640/11.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1dJOYPDo0i6vqCCUUETBUjIbXVIpKR1TOPFcuqzB66adEaQkyNrdJrXddsaKO3ZQuoxBubul6TUqoltCQdQIRQPcGNO7WJqRT-xgyknSJCfbei_HJZE8H27a5k0MWea8i5ttkDXVAEXsz/s640/13.jpg)
เลือก Both NL & CR และ เลือก 115200 baud
Serial Monitor จะแสดง ระยะทางที่ห่าง จาก สิ่งกีดขวาง มีหน่วยเป็น cm (เซนติเมตร)
แสดงว่า การเชื่อมต่อ SRF05 ของเรานั้นถูกต้อง และ พร้อมใช้งานแล้ว
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgy26ErJXLp6dzHgjQ0N_XRi7Z-q49fXuZHnBF40ZHTucUlKug_Dfh6kGAq_rye5iNBjBl82J4ui3Z92gIj-pU8sB4-Vwp3Esbfcw9y9kKE43RKjztZyAQQq9mJLGSupgYSpLTCTOK6Wur/s640/14.jpg)
ทดลอง ส่งค่า ระยะทางที่ห่าง จาก สิ่งกีดขวาง ผ่านทาง Bluetooth ไปยัง สมาร์ทโฟน
โดยอัพโหลด โค้ดด้านล่างนี้ ไปยัง ESP32
#include "SimpleBLE.h"
const unsigned int TRIG_PIN = 15;
const unsigned int ECHO_PIN = 2;
//long x;
int x ;
SimpleBLE ble;
String BLEname = "ESP000";
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(115200);
Serial.setDebugOutput(true);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
const unsigned long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 29 / 2;
x = (distance);
Serial.println(x);
if (x > 100) {
BLEname = "ESP" + String(x);
} else {
if (x > 10) {
BLEname = "ESP0" + String(x);
} else {
BLEname = "ESP00" + String(x);
}
}
Serial.println(BLEname);
ble.begin(BLEname);
delay(100);
}
เปิดการเชื่อมต่อ บลูทูธ จะพบ อุปกรณ์ที่พร้อมใช้งาน ในตัวอย่าง เช่น ESP093 รอจนเชื่อมต่อเสร็จ
ดาวน์โหลดแอป Sparks ESP Companion.apk
ไปที่
https://github.com/LiveSparks/ESP32-basic-BLE/tree/master/app
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitE8BW3JG5jFSFL2UK_n2mJjhEhnDm_-eP6-Mubjj2IHpRJsbibu0vgr-Z7rYFSh87ctW2Uw2tksdjLnB9GKYm6Y1DwyHqOaD2EgExKlyFTFuWczBR6A8xCMCC40DIsCXL5b5sz8qcUaOW/s640/16.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjPlHchP7-vc6KOrte2eqSvpBse2-abPng0c8aTpxilZqKaE9tItdl0czJLqefB9dNDGqVlNXhT9oTKgNnxuPRfgAkbCF0fzJ6fwKrpsrkQUXCT2Lp4Xs_0cNJih4psWGO6aM15UoqEJ1E/s640/20.jpg)
ไปที่ Tools -> Board เลือก "ESP32 Dev Module"
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXvz8I06VXeFegOeJitlGOw_8zReOCMmtCrhv3PU7iCOF6C9UzZeRFD2ccm_6_6eDj38ubiIflY5W3DSCRqxFM0E4M_UzNCMucdnwJKDZI4hyphenhyphenQYnNhkLJDFrs8HEXlXwuiNGFnwxYTAzbv/s640/7.jpg)
ไปที่ Tools -> Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port ให้เลือกตัวอื่นที่ไม่ใช่ COM1)
ในตัวอย่างเลือกเป็น "COM12"
ไปที่ Tools -> Upload Speed : เลือกเป็น "115200"
กดปุ่ม
เพื่ออัพโหลด
![](https://cz.lnwfile.com/_/cz/_raw/qw/6x/4y.png)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtXFFsWfuapdpyHY_FC6t_r5bgTN2EzGTjNoxWKXC71K1E3li6cbEIMPiD3xP-qZHfzJgrN0aeqkTRP7alZdv47CxQXqaphv_INKT5WtVoXYEi04ccpwlw0o5UY7bbD-QQurCwtxeBICZF/s640/11.jpg)
หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง
เปิดสวิตช์ไฟ จากรางถ่านเข้าสู่หุ่นยนต์
แล้วไปที่ Tools -> Serial Monitor
แล้วไปที่ Tools -> Serial Monitor
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1dJOYPDo0i6vqCCUUETBUjIbXVIpKR1TOPFcuqzB66adEaQkyNrdJrXddsaKO3ZQuoxBubul6TUqoltCQdQIRQPcGNO7WJqRT-xgyknSJCfbei_HJZE8H27a5k0MWea8i5ttkDXVAEXsz/s640/13.jpg)
เลือก Both NL & CR และ เลือก 115200 baud
Serial Monitor จะแสดง ระยะทางที่ห่าง จาก สิ่งกีดขวาง มีหน่วยเป็น cm (เซนติเมตร)
แสดงว่า การเชื่อมต่อ SRF05 ของเรานั้นถูกต้อง และ พร้อมใช้งานแล้ว
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgy26ErJXLp6dzHgjQ0N_XRi7Z-q49fXuZHnBF40ZHTucUlKug_Dfh6kGAq_rye5iNBjBl82J4ui3Z92gIj-pU8sB4-Vwp3Esbfcw9y9kKE43RKjztZyAQQq9mJLGSupgYSpLTCTOK6Wur/s640/14.jpg)
ทดลอง ส่งค่า ระยะทางที่ห่าง จาก สิ่งกีดขวาง ผ่านทาง Bluetooth ไปยัง สมาร์ทโฟน
โดยอัพโหลด โค้ดด้านล่างนี้ ไปยัง ESP32
#include "SimpleBLE.h"
const unsigned int TRIG_PIN = 15;
const unsigned int ECHO_PIN = 2;
//long x;
int x ;
SimpleBLE ble;
String BLEname = "ESP000";
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(115200);
Serial.setDebugOutput(true);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
const unsigned long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 29 / 2;
x = (distance);
Serial.println(x);
if (x > 100) {
BLEname = "ESP" + String(x);
} else {
if (x > 10) {
BLEname = "ESP0" + String(x);
} else {
BLEname = "ESP00" + String(x);
}
}
Serial.println(BLEname);
ble.begin(BLEname);
delay(100);
}
เปิดการเชื่อมต่อ บลูทูธ จะพบ อุปกรณ์ที่พร้อมใช้งาน ในตัวอย่าง เช่น ESP093 รอจนเชื่อมต่อเสร็จ
ดาวน์โหลดแอป Sparks ESP Companion.apk
ไปที่
https://github.com/LiveSparks/ESP32-basic-BLE/tree/master/app
แล้วติดตั้ง ลงใน สมาร์ทโฟน แอนดรอย ของเรา ตามขั้นตอนปรกติ ทั่วไป
เมื่อติดตั้งเสร็จให้เปิดแอปขึ้นมา
เมื่อติดตั้งเสร็จให้เปิดแอปขึ้นมา
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitE8BW3JG5jFSFL2UK_n2mJjhEhnDm_-eP6-Mubjj2IHpRJsbibu0vgr-Z7rYFSh87ctW2Uw2tksdjLnB9GKYm6Y1DwyHqOaD2EgExKlyFTFuWczBR6A8xCMCC40DIsCXL5b5sz8qcUaOW/s640/16.jpg)
คลิกที่ Start Scanning
แอปจะแสดง ค่า ระยะทางที่ห่าง จาก สิ่งกีดขวาง เปลี่ยนค่าไปตามระยะทาง มีหน่วยเป็น cm (เซนติเมตร) แสดงว่า แอป Sparks ESP นั้นพร้อมใช้งานแล้ว
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjPlHchP7-vc6KOrte2eqSvpBse2-abPng0c8aTpxilZqKaE9tItdl0czJLqefB9dNDGqVlNXhT9oTKgNnxuPRfgAkbCF0fzJ6fwKrpsrkQUXCT2Lp4Xs_0cNJih4psWGO6aM15UoqEJ1E/s640/20.jpg)
5.เขียนโค้ดหุ่นยนต์หลบหลีกสิ่งกีดขวาง ส่งค่าผ่าน Bluetooth
อัพโหลด โค้ดด้านล่างนี้ ไปยัง ESP32
/*
Obstacle Robot with DevKitC ESP32.
For more details visit:
https://robotsiam.blogspot.com/2017/12/esp32-8-bluetooth.html
*/
#include "SimpleBLE.h"
const unsigned int TRIG_PIN = 15;
const unsigned int ECHO_PIN = 2;
// Motor A pins
int pinA2 = 12;
int pinA1 = 13;
//Motor B pins
int pinB2 = 32;
int pinB1 = 33;
//long x;
int x ;
SimpleBLE ble;
String BLEname = "ESP000";
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(115200);
Serial.setDebugOutput(true);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
const unsigned long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 29 / 2;
x = (distance);
Serial.println(x);
if (x > 100) {
BLEname = "ESP" + String(x);
} else {
if (x > 10) {
BLEname = "ESP0" + String(x);
} else {
BLEname = "ESP00" + String(x);
}
}
Serial.println(BLEname);
ble.begin(BLEname);
if (distance < 20) {
backward(400);
coast(200);
turnLeft(1000);
}
else {
forward(1);
}
delay(100);
}
//ฟังก์ชั่นหลักในการควบคุมมอเตอร์
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);
}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRk8rryzzTmFVLfluv_RFL5z1oiHHRKRU2Tvu5kUOTgwiHqoKHYc-ixJJazngsyZ0nWmRYtfwZ3GAJS1wG7J53crUk7Af-4Oj02w8xdlTaQQVNzGTF17atS-AqGKA27yy06rHERWumakJi/s640/22.jpg)
วีดีโอผลลัพธ์ หุ่นยนต์หลบหลีกสิ่งกีดขวาง ส่งค่าผ่าน Bluetooth