ผู้เขียนบทความ : นายพงศภัค นวลนิ่ม
คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง 1/2566
1.ความเป็นมา
-ปัจจุบันอุบัติเหตุที่เกิดจากรถจักรยานในตอนกลางคืนมักมีสาเหตุมากจากวิสัยทัศน์การมองเห็นของรถจักรยานไม่ดีอย่างที่ควรและเป็นอันตรายต่อรถคันอื่น การที่จะซื้อรถจักรยานที่มีอุปกรณ์อำนวยความสะดวกและมีระบบสความปลอดภัยครบก็ใช้งบประมาณค่อนข้างสูง ซึ่งบางคนก็ไม่ได้มีงบประมาณที่สูงขนาดนั้น เราจึงสร้างระบบตรวจจับแสงสว่างและรถด้านหลังขึ้นมาเพื่อความปลอดภัยและความสะดวกสบาย
การปรับปรุงความปลอดภัยและความสะดวกสบายในการขับรถจักรยานเป็นเรื่องสำคัญที่คุณสมบัติของเทคโนโลยีสามารถเพิ่มขึ้นอย่างมากในปัจจุบัน หนึ่งในวิธีที่สามารถทำได้นั้นคือการใช้ระบบอัตโนมัติที่สามารถตรวจจับแสงและรถด้านหลังบนรถจักรยาน
2.วัตถุประสงค์
1. เพื่อให้คนเดินทางเห็นและถูกเห็นได้มากขึ้น เพิ่มความปลอดภัยในการเคลื่อนที่ขณะที่มีความไม่สะดวกในการมองเห็น
2. เพื่อช่วยให้ผู้ขับขี่สามารถตอบสนองได้เร็วขึ้นและป้องกันการเกิดอุบัติเหตุที่อาจจะเกิดขึ้นได้
3. เพื่อเพิ่มความสะดวกสบายในการขับขี่ยานพาหนะ
3.ขอบเขต
1. ไฟเปิดทันทีเมื่อเข้าสู่พื้นที่ที่มีแสงน้อยและปิดเมื่อมีแสงเพียงพอ
2. เมื่อรถขับเข้าใกล้จักรยาน ระบบจะส่งการแจ้งเตือนทันที
3. ระบบเปิดไฟอัตโนมัติมีความไวในการตอบสนองต่อการเปลี่ยนแปลงของแสง
4. ระบบแจ้งเตือนมีความแม่นยำในการตรวจจับตำแหน่ง
4.ประโยชน์ที่คาดว่าจะได้รับ
1. ระบบเปิดไฟอัตโนมัติทำให้วิสัยทัศน์ในการมองเห็นกว้างมากยิ่งขึ้น
2. ระบบแจ้งเตือนทำให้ลดความเสี่ยงต่อการเกิดอุบัติเหตุจากรถคันอื่น
3. ทำให้ผู้ขับขี่ควบคุมความเร็วรถให้อยู่ในความเร็วที่เหมาะสม
4. สามารถนำความรู้การเขียนโปรแกรมไปประยุกต์ใช้ได้จริง
5. สามารถนำไปต่อยอดเพื่อเพิ่มมูลค่าได้
5.ความรู้ที่เกี่ยวข้อง
1. การเขียน code แบบ OOP
OOP หรือ Object Oriented Programming เป็นหลักการการเขียน Code แบบที่มอง Code ให้เป็น Object แทน เช่นถ้าจะเขียน โปรแกรม Streaming หนัง หลักการ OOP ก็จะมองว่าในการ Stream จะต้องมี วิดีโอ ที่มีระบุข้อมูลหนัง กับระบบ Streaming ในการเล่นวิดีโอให้คนดูได้ ซึ่งการที่ใช้หลักการ OOP ในการเขียน Code มันจะช่วยทำให้ Developer เห็นภาพรวมของ Code ได้ง่ายขึ้น สามารถทำความเข้าใจและแก้ไขได้ถูกที่อย่างรวดเร็ว เพราะการเขียน Code แบบนี้จะช่วยให้หา Code ได้ง่ายขึ้นด้วย นอกจากนั้น หลักการ OOP ก็ไม่ได้ยึดติดกับภาษาในการเขียนอันใดอันหนึ่งด้วย แทบจะทุกภาษาสามารถเขียนในรูปแบบของ OOP ได้ทั้งหมด
2. MCU – ESP32 เป็น Micro Controller ที่รองรับการเชื่อมต่อ WiFi , Bluetooth – BLE ในตัว ภาษาที่ใช้ในการพัฒนาโปรแกรมคือ ภาษา C หรือ Python ภาษา Python ต้องทำการอัพเกรดเฟิร์มแวร์ให้รองรับ Python การพัฒนาโปรแกรมขึ้นอยู่กับผู้ที่พัฒนา โปรแกรม IDE ที่ใช้พัฒนาคือ Arduino IDE หรือ Visual Studio สำหรับ Visual Studio จำเป็นต้องติดตั้ง Plugin Espressif IDF หรือ PlatformIO IDE และต้อง Enable (Arduino) ESP32 รองรับการเชื่อมต่อ WiFi และ BLE หรือ Bluetooth ได้โดยไม่ต้องซื้อโมดูลเพิ่มเติม บอร์ด ESP32 เองยังมีการทำงานที่แบ่งเป็น 2 Core และ Pin I/O เลือกฟั่งชั่นการทำงานได้ใน Pin เดียวกัน เช่น การแปลง Analog to Digital หรือ Digital to Analog การเชื่อมต่อ SD Card Camera PWD RTC และ Touch เป็นต้น
3. โมดูล Buzzer หรือ โมดูลส่งเสียง ใช้สร้างวงจรเตือนได้ ใช้ไฟเลี้ยง 3.3 – 5V ใช้ TR เบอร์ 9012 ในการขยายสัญญาณ โดยจะส่งเสียงร้องเมื่อมีการจ่ายไฟเข้าที่ขา I/O Buzzer จะมี 2 ชนิด คือ แบบ Active และ Passive – แบบ Active คือ จ่ายไฟ VCC เข้าไปแล้ว Buzzer จะทำงานทันที มีเสียงเพียงโทนเดียว ดังต่อเนื่องเมื่อยังจ่ายไฟอยู่ – แบบ Passive คือ จะไม่สามารถส่งเสียงดังได้ด้วยการเพียงจ่ายไฟ แต่ต้องเขียนโน๊ตเสียงให้มันด้วย ผ่านทางการ Coding ใน Micro controller
ในส่วนนี้ก็จะใช้งานแบบ Active
ตัวอย่าง Code กดปุ่มแล้วเกิดเสียง
int buttonPin = 4;
int led = 3;
int buzzer = 2;
int buttonState = 0;
int I = 0;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
Serial.begin(9600);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (I != buttonState ) {
I = buttonState;
if (buttonState == HIGH) {
digitalWrite(led, HIGH);
digitalWrite(buzzer, LOW);
Serial.println("Power On");
}
else {
digitalWrite(led, LOW);
digitalWrite(buzzer, HIGH);
Serial.println("Power Off");
}
}
}
4. โมดูล Ultrasonic HC-SR04 เป็น Arduino Ultrasonic Sensor ที่ยอดเยี่ยมและค่อนข้างเป็นที่นิยมในหมู่ผู้เขียนโค้ด เช่นเดียวกับสิ่งที่ค้างคาวทำ HC-SR04 ใช้ SONAR เพื่อวัดว่าวัตถุอยู่ห่างจากเอนทิตีหัวเรื่องเท่าใด มีการตรวจจับช่วงแบบไม่สัมผัสที่มีความแม่นยำสูงและโดดเด่น
HC-SR04 ให้การอ่านค่าที่เสถียรและมีรูปร่างและการออกแบบที่กะทัดรัดซึ่งใช้งานง่าย หาซื้อได้ตามสะดวก โดยมีความยาวตั้งแต่ 2 ซม. ถึง 400 ซม. ส่วนที่ดีที่สุดคือ แสงแดดหรือวัสดุสีดำจะไม่ส่งผลต่อการทำงาน
ตัวอย่าง Code การใช้งาน Ultrasonic HC-SR04
const int pingPin = 13;
int inPin = 12;
void setup() {
Serial.begin(9600);
}
void loop()
{
long duration, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
pinMode(inPin, INPUT);
duration = pulseIn(inPin, HIGH);
cm = microsecondsToCentimeters(duration);
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29 / 2;
}
5. LDR Photoresistor Sensor Module โมดูลเซ็นเซอร์แสง โดยใช้เซ็นเซอร์ LDR ในการตรวจจับ เมื่อมีการเปลี่ยนแปลงความเข้มแสงจะทำให้ความต้านทานเปลี่ยนแปลงตาม โมดูลนี้ให้สัญญาณออกมาเป็นแบบดิจิตอลและanalog
ตัวอย่างการทำงานของ Code LDR Moduln ร่วมกับ LED
int ledPin = 2;
int ledPin3 = 3;
int analogPin = 5; //ประกาศตัวแปร ให้ analogPin แทนขา analog ขาที่5
int val = 0;
void setup() {
pinMode(ledPin, OUTPUT); // sets the pin as output
pinMode(ledPin3, OUTPUT); // sets the pin as output
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A5);
val = analogRead(analogPin); //อ่านค่าสัญญาณ analog ขา5 ที่ต่อกับ LDR Photoresistor Sensor Module
Serial.print("val = "); // พิมพ์ข้อความส่งเข้าคอมพิวเตอร์ "val = "
Serial.println(val); // พิมพ์ค่าของตัวแปร val
if (val < 500) {
digitalWrite(ledPin, LOW); // สั่งให้ LED ที่ Pin2 ดับ
digitalWrite(ledPin3, HIGH); // สั่งให้ LED ที่ Pin3 ติดสว่าง
}
else {
digitalWrite(ledPin, HIGH); // สั่งให้ LED ที่ Pin2 ติดสว่าง
digitalWrite(ledPin3, LOW); // สั่งให้ LED ที่ Pin3 ดับ
}
delay(100);
}
6. Relay module หลักการทำงานวงจรของ Relay module คือ การเปิด – ปิดวงจรด้วยแม่เหล็กไฟฟ้า เมื่อขดลวดเหนี่ยวนำมีกระแสไหลผ่านจะมีคุณสมบัติเป็นแม่เหล็ก สามารถส่งแรงผลักหรือดูดเพื่อเปลี่ยนตำแหน่งสวิตช์ได้ ดังนั้น ใน Relay Module จะประกอบด้วยสองวงจรดังตัวอย่างในรูปข้างล่าง วงจรทางด้านซ้ายเป็นวงจรเพื่อเหนี่ยวนำขดลวดซึ่งจะต่ออยู่กับบอร์ดควบคุม วงจรด้านขวาเป็นวงจรของอุปกรณ์ที่เราต้องการขับ (ในรูปคือหลอดไฟ) โดยมีสวิตช์เปิดปิดวงจรตามแรงดูดของขดลวด หน้าสัมผัสของสวิตช์มี 2 ชนิด คือ
- หน้าสัมผัสปกติเปิดหรือ NO (Normally Open) หมายถึง หน้าสัมผัสที่เปิดในภาวะขดลวดไม่เหนี่ยวนำ
- หน้าสัมผัสปกติปิดหรือ NC (Normally Closed) หมายถึง หน้าสัมผัสที่ปิดในภาวะขดลวดไม่เหนี่ยวนำ
โดยทั่วไปแล้วหน้าสัมผัส NO คือ ฝั่งที่ทำให้กระแสครบวงจรในฝั่งอุปกรณ์ ดังแสดงในรูปตัวอย่าง นั่นหมายถึงจะต้องมีการจ่ายไฟให้ขดลวดในวงจรด้านซ้าย เพื่อดูดสวิตช์ในวงจรฝั่งขวามาที่หน้าสัมผัส NO วงจรจึงจะปิด และหลอดไฟจะติด การเปิดปิดกระแสผ่านขดลวดในวงจรฝั่งซ้าย กระทำผ่านการควบคุมไฟเลี้ยงทรานซิสเตอร์ เมื่อทำให้เกิดการจ่ายไฟเลี้ยง (VCC) ทรานซิสเตอร์จะนำกระแส ทำให้วงจรด้านขดลวดปิด และขดลวดจะทำหน้าที่เป็นแม่เหล็ก ซึ่งบอร์ด Arduino จะสามารถเข้ามาควบคุม Relay ได้ที่จุด ln1 กล่าวคือถ้าส่งลอจิก High จะไม่มีการจ่ายไฟเลี้ยง เนื่องจากไม่มีความต่างศักย์ ในทางกลับกัน หากส่งลอจิก Low จะทำให้วงจรปิด และสวิตช์จะเปลี่ยนทิศทาง ดังนั้นวงจร Relay ลักษณะนี้จึงเป็นแบบ Active Low
ตัวอย่างการทำงานของ Code Relay ร่วมกับ LED
int Relay1 = 2; // กำหนดขาใช้งาน
void setup()
{
pinMode(Relay1, OUTPUT); // กำหนดขาทำหน้าที่ให้ขา 2 เป็น OUTPUT
digitalWrite(Relay1, HIGH);
}
void loop()
{
digitalWrite(Relay1, LOW); // ส่งให้ไฟติด
delay(1000); // ดีเลย์ 1000ms
digitalWrite(Relay1, HIGH); // ส่งให้ไฟดับ
delay(1000); // ดีเลย์ 1000ms
}
6.ผลการดำเนินการ
Diagramของระบบ เป็นภาพรวมการทำงานของระบบ เพื่อทำให้เข้าใจการทำงานของระบบมากขึ้น
การทำงานของ Code ทั้งหมด
#define pingPin 5
#define inPin 18
#define buzzer 22
#define s1 21
#define light 36
class DistanceSensor {
private:
int trigPin;
int echoPin;
public:
DistanceSensor(int trigPin, int echoPin) : trigPin(trigPin), echoPin(echoPin) {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
long getDistance() {
long duration, cm;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = microsecondsToCentimeters(duration);
return cm;
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
};
class LightSensor {
private:
int pin;
public:
LightSensor(int pin) : pin(pin) {
pinMode(pin, INPUT);
}
int getLightValue() {
return analogRead(pin);
}
};
class Buzzer {
private:
int pin;
public:
Buzzer(int pin) : pin(pin) {
pinMode(pin, OUTPUT);
}
void buzz() {
digitalWrite(pin, LOW);
delay(250);
digitalWrite(pin, HIGH);
}
};
class LED {
private:
int pin;
public:
LED(int pin) : pin(pin) {
pinMode(pin, OUTPUT);
}
void turnOn() {
digitalWrite(pin, HIGH);
}
void turnOff() {
digitalWrite(pin, LOW);
}
};
void setup() {
Serial.begin(9600);
DistanceSensor distanceSensor(pingPin, inPin);
LightSensor lightSensor(light);
Buzzer buzzerControl(buzzer);
LED ledControl(s1);
}
void loop() {
DistanceSensor distanceSensor(pingPin, inPin);
LightSensor lightSensor(light);
Buzzer buzzerControl(buzzer);
LED ledControl(s1);
long cm = distanceSensor.getDistance();
Serial.print("ระยะ = ");
Serial.println(cm);
int lightValue = lightSensor.getLightValue();
Serial.print("The AO value: ");
Serial.println(lightValue);
if (lightValue > 2800) {
ledControl.turnOn();
if (cm < 300) {
buzzerControl.buzz();
} else {
delay(250);
}
delay(250);
} else {
ledControl.turnOff();
if (cm < 300) {
buzzerControl.buzz();
} else {
delay(250);
}
delay(250);
}
}
6.การทดลอง
ส่วนนี้จะกล่าวถึงการทดลองการทำงานของระบบ 1.การเปิดไฟในพื้นที่ที่มีแสงสว่างน้อย 2.การทดสอบการส่งเสียงแจ้งเตือนเมื่อมีวัตถุเข้ามาประชิด ถูกแบ่งออกเป็น 2 ส่วนดังนี้
6.1 การเปิด/ปิดไฟของไฟฉาย
ทดลองโดยการเปิดปิดไฟในห้อง เพื่อดูการทำงานของไฟฉาย
การบันทึกผลการทดลองการทำงานของไฟฉายจะทดลองเปิดปิดไฟอย่างละ 20 ครั้ง เพื่อบันทึกทำงานของไฟฉายอย่างละ 20 ครั้ง
6.2 การแจ้งเตือนผ่านเสียง
ทดลองโดยการนำวัตถุมาเคลื่อนไหวผ่านตัว Ultrasonic เพื่อดูการทำงานของการแจ้งเตือนด้วยเสียง
การบันทึกผลการทดลองการแจ้งเตือนผ่านเสียงจะทดลองโดยนำวัตถุมาผ่านUltrasonic 20 ครั้ง เพื่อบันทึกทำงานของการแจ้งเตือน 20 ครั้ง
7.สรุปผลการทดลอง
จากผลการทดลองระบบเปิดไฟอัตโนมัติในพื้นที่ที่มีแสงน้อย และระบบแจ้งเตือนเมื่อมีรถขับมาประชิดในจักรยานทำงานได้อย่างมีประสิทธิภาพตรงตามเงื่อนไขตามที่ทดลองไว้ การเปิดปิดไฟฉายทำงานได้อย่างมีประสิทธิภาพ ผลที่ได้คือ ความถูกต้องของการทำงานไฟฉายคือ ร้อยละ 100 ในส่วนของการการแจ้งเตือนผ่านเสียงก็ตรงตามเงื่อนไขที่กำหนด ผลที่ได้คือ ความถูกต้องของการแจ้งเตือนผ่านเสียงคือ ร้อยละ 90
ข้อเสนอแนะ
1.หากจะนำอุปกรณ์ไปติดตั้งในจักรยานจริงๆก็ควรทำให้มีขนาดที่กระทัดรัดไม่เกะกะจนเกินไป
8.อ้างอิง
[1] การใช้งาน ESP32
สืบค้นจาก https://www.cybertice.com/article/226
[2] การใช้งาน Ultrasonic sensor
สืบค้นจาก https://www.cybertice.com/article/288
[3] การใช้งาน LDR sensor
สืบค้นจาก https://www.ai-corporation.net/2021/12/22 [4] การใช้งาน Buzzer สืบค้นจาก บทที่ 21 ESP32 สั่งงานโมดูลเสียง Active Buzzer (สร้างระบบถอยรถ) | by Narin Damnuy (KruRin) | Medium
[5] การใช้งาน Relay
สืบค้นจาก https://www.cybertice.com/article/771
[6] ดับแปลงมาจากตัวอย่าง Project
https://ieeexplore.ieee.org/document/10242416