ภาพรวมของระบบถังขยะควบคุมอัตโนมัติประกอบด้วยส่วนประกอบหลัก 3 ส่วนได้แก่ตัวควบคุมเซ็นเซอร์และมอเตอร์ควบคุมในที่นี้ส่วน input ให้มาจากเซ็นเซอร์เซ็นเซอร์อัลตร้าโซนิคและ output ที่สามารถควบคุมการเคลื่อนไหวนั่นคือมอเตอร์ขนาดเล็กนั่นเอง
วิธีทำถังขยะอัตโนมัติโดยใช้อาดูโน่และเซอร์โวมอเตอร์และอัลตร้าโซนิคเซนเซอร์ การทำถังขยะอัตโนมัติโดยใช้ Arduino เซอร์โวมอเตอร์ และเซ็นเซอร์อัลตราโซนิกเป็นโครงการง่ายๆ ที่สามารถทำได้ในไม่กี่ขั้นตอน นี่คือโครงร่างทั่วไปของวิธีเริ่มต้นใช้งาน: หลักการทำงานของ เซ็นเซอร์อัลตราโซนิก HC-SR04 เป็นอุปกรณ์ยอดนิยมและราคาไม่แพงที่สามารถใช้วัดระยะทางไปยังวัตถุได้ ทำงานโดยปล่อยคลื่นเสียงความถี่สูงและวัดเวลาที่คลื่นเสียงสะท้อนกลับหลังจากกระทบวัตถุ หากต้องการใช้เซ็นเซอร์อัลตราโซนิก HC-SR04 กับบอร์ด Arduino จะต้องเชื่อมต่อเข้ากับบอร์ดโดยใช้สายจัมเปอร์ HC-SR04 มี 4 พิน คือ Vcc, Trig, Echo และ GND
รวบรวมวัสดุที่จำเป็น:
- BDMC04 บอร์ดอาดุยโน่ Arduino Uno R3 Compatible DIP IC CH340 USB Cable
- MT0501 เซอร์โวมอเตอร์ RC Servo Motor Micro RC SG90 Black
- SSUS01 เซ็นเซอร์อัลตราโซนิก เซ็นเซอร์จับระยะ Ultrasonic Sensor HC-SR04
- แหล่งพลังงาน (เช่น แบตเตอรี่หรือแหล่งจ่ายไฟ DC 4.5 – 12V)
- รังถ่านใส่แบตเตอรี่ Battery Holder
- สายไฟจัมเปอร์ Jumper Wire
- ถังขยะขนาดเล็กตามแต่จะหาได้
ตั้งค่าฮาร์ดแวร์:
- เชื่อมต่อเซอร์โวมอเตอร์เข้ากับ บอร์ด Arduino UNO R3 โดยใช้สายจัมเปอร์
- เชื่อมต่อเซ็นเซอร์อัลตราโซนิกเข้ากับ บอร์ด Arduino UNO R3 โดยใช้สายจัมเปอร์
- เชื่อมต่อแหล่งจ่ายไฟ DC 4.5 – 12V เข้ากับ บอร์ด Arduino Uno R3 ผ่านทางขั้ว DC Jack 5.5×2.1mm
- Code นี้ เซอร์โวมอเตอร์เชื่อมต่ออยู่กับขา 8 ของ บอร์ด Arduino Uno R3
- ขา Trig Pin ของเซ็นเซอร์อัลตราโซนิกเชื่อมต่อกับขา 9 ของ บอร์ด Arduino Uno R3
- ขา echo Pin ของเซ็นเซอร์อัลตราโซนิกเชื่อมต่อกับขา 10 ของ บอร์ด Arduino Uno R3
How HC-SR04 Ultrasonic Module Distance Sensor works
เซ็นเซอร์จะส่ง Ping ที่เวลา t1 และรับการ Ping ที่เด้งที่เวลา t2 เมื่อทราบความเร็วของเสียง ความแตกต่างของเวลา Δt = t2 – t1 สามารถทำให้เราทราบระยะทางของวัตถุได้
- D, distance = (t2 – t1/2)
- D, distance = (Δt /2)
- D, distance = (duration/2)
ตัวอย่างเช่น ถ้า Δt = 500us เรารู้ว่าต้องใช้เวลา 250us ในการส่ง Ping ไปกระทบวัตถุ และอีก 250us ในการกลับมา
ความเร็วเสียง c โดยประมาณในอากาศแห้งกำหนดโดย สมการ:
- c = 331.5 + 0.6 * [อุณหภูมิอากาศเป็นองศาเซลเซียส]
ที่ 20°C,
- c = 331.5 + 0.6 * 20
- c = 343.5 m/s
ถ้าเราแปลงความเร็วเป็นเซนติเมตรต่อไมโครวินาที เราจะได้:
- c = 343.5 * (100/1000000)
- c = 0.03435 cm./s
ระยะทางคือ
หรือ
- distance = 250*0.03435 = 8.6cm.
แทนที่จะใช้ความเร็วของเสียง เราสามารถใช้ “อัตราเร็วของเสียง” ได้เช่นกัน
อัตราเร็วของเสียง = 1 / c
อัตราเร็วของเสียง = 1 / 0.03435
อัตราเร็วของเสียง = 29.1ss/cm
ในกรณีนี้ สมการที่ใช้คำนวณระยะทางจะกลายเป็น:
- distance = (Δt/2) / อัตราเร็วของเสียง
และสำหรับตัวอย่างด้านบน:
- distance = 250 / 29.1
- distance = 8.6 cm
https://www.instructables.com/Using-a-SR04/
แผนผังการต่อสายไฟ
https://oshwlab.com/s2insupply/arduino-automatic-waste-bin
เขียน Code: arduino Code เชื่อมต่ออัลตราโซนิคเซนเซอร์เพื่อควบคุมเซอร์โวมอเตอร์
- ใช้ Arduino Integrated Development Environment (IDE) เพื่อเขียนโปรแกรมที่จะควบคุมเซอร์โวมอเตอร์และเซ็นเซอร์อัลตราโซนิก
- กำหนดตัวแปร
- const int trigPin = 9; // define trigPin for ultrasonic sensor
- const int echoPin = 10; // define echoPin for ultrasonic sensor
- myservo.attach(8); // attach the servo to pin 8
- ตั้งค่าเซอร์โวมอเตอร์และเซ็นเซอร์อัลตราโซนิก
- ในฟังก์ชันลูป ใช้เซ็นเซอร์อัลตราโซนิกเพื่อวัดระยะทางไปยังวัตถุ
- หากระยะทางต่ำกว่าเกณฑ์ที่กำหนด ให้เปิดใช้งานเซอร์โวมอเตอร์เพื่อเปิดถังขยะ
- เซ็นเซอร์อัลตราโซนิกจะใช้เพื่อวัดระยะทางไปยังวัตถุ หากระยะห่างน้อยกว่า 20 ซม. เซอร์โวมอเตอร์จะตั้งค่าเป็น 0 องศาเป็นเวลา 1 วินาที จากนั้นตั้งค่าเป็น 90 องศา
- หากระยะทางมากกว่า 20 ซม. เซอร์โวมอเตอร์จะตั้งค่าเป็น 90 องศา
- อัพโหลดโค้ดไปยังบอร์ด Arduino
- ทดสอบและดีบัก
- ทดสอบโปรแกรมโดยวางวัตถุไว้ด้านหน้าเซ็นเซอร์อัลตราโซนิก และตรวจสอบว่าเซอร์โวมอเตอร์เคลื่อนที่เพื่อเปิดถังขยะ
- ดีบักปัญหา ที่เกิดขึ้นโดยใช้เครื่องมือดีบักในตัว Arduino IDE และตรวจหาข้อผิดพลาดทางไวยากรณ์หรือข้อผิดพลาดเชิงตรรกะในโค้ดของเรา
ตัวอย่าง Arduino Code เชื่อมต่ออัลตราโซนิคเซนเซอร์เพื่อวัดระยะทางไปยังวัตถุ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
// define the pins for Ultrasonic Sensor HC-SR04 const int trigPin = 9; // define the trigPin and trigPin for the Ultrasonic Sensor HC-SR04 const int echoPin = 10; // define the trigPin and echoPin for the Ultrasonic Sensor HC-SR04 void setup() { // initialize the pins as outputs and inputs pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // start the serial communication Serial.begin(9600); } void loop() { // send a pulse to the trigPin digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // measure the time it takes for the pulse to return long duration = pulseIn(echoPin, HIGH); // calculate the distance based on the speed of sound int distance = duration * 0.034 / 2; // print the distance to the serial monitor Serial.println(distance); // wait a bit before taking the next measurement delay(100); } |
ตัวอย่าง Arduino Code เชื่อมต่ออัลตราโซนิคเซนเซอร์เพื่อวัดระยะทางไปยังวัตถุและควบคุมเซอร์โวมอเตอร์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
#include <Servo.h> // include the Servo library Servo myservo; // create a servo object // define the pins for Ultrasonic Sensor HC-SR04 const int trigPin = 9; // define the trigPin and trigPin for the Ultrasonic Sensor HC-SR04 const int echoPin = 10; // define the trigPin and echoPin for the Ultrasonic Sensor HC-SR04 void setup() { myservo.attach(8); // attach the servo to pin 8 pinMode(trigPin, OUTPUT); // set the trigPin as an output pinMode(echoPin, INPUT); // set the echoPin as an input // start the serial communication Serial.begin(9600); } void loop() { long duration, distance; // create variables to store the duration and distance digitalWrite(trigPin, LOW); // set the trigPin low delayMicroseconds(2); // wait for 2 microseconds digitalWrite(trigPin, HIGH); // set the trigPin high delayMicroseconds(10); // wait for 10 microseconds digitalWrite(trigPin, LOW); // set the trigPin low duration = pulseIn(echoPin, HIGH); // read the duration of the pulse distance = (duration/2) / 29.1; // calculate the distance in centimeters if (distance < 20) { // if the distance is less than 20 cm myservo.write(0); // set the servo to 0 degrees delay(1000); // wait for 1 second myservo.write(90); // set the servo to 90 degrees } else { // if the distance is greater than 20 cm myservo.write(90); // set the servo to 90 degrees Serial.println(distance); } } |