智能垃圾桶(dustbin)是傳統(tǒng)垃轉(zhuǎn)存設(shè)備的替代者。本項(xiàng)目采用基于MCU的Arduino Uno開發(fā)板,通過伺服馬達(dá)和超聲波傳感器,實(shí)現(xiàn)了對(duì)傳統(tǒng)垃圾桶的智能化升級(jí)改造。
1.項(xiàng)目介紹
項(xiàng)目中的超聲波傳感器安置于垃圾桶的頂部,感測(cè)來跡象的狀態(tài),其閾值設(shè)置成一個(gè)特別電平。Arduino編程邏輯如下:當(dāng)有人靠近垃圾桶前方并伸手丟垃圾時(shí),伺服馬達(dá)開始動(dòng)作,并打開垃圾桶的蓋子,讓人把廢物丟進(jìn)垃圾桶里。
由于住戶不用動(dòng)手開蓋,并在離開時(shí)自動(dòng)關(guān)閉,避免了傳統(tǒng)垃圾桶蓋子長(zhǎng)期打開散發(fā)氣味、危害環(huán)境的弊端,還能培養(yǎng)住戶和小孩養(yǎng)成良好衛(wèi)生習(xí)慣,保持環(huán)境干凈、整潔。
通常,垃圾箱分為干、濕、可回收、有毒害四類。本項(xiàng)目通過檢測(cè)人手的存在決定箱蓋的打開、閉合,還能夠識(shí)別丟進(jìn)來的垃圾的種類,并區(qū)分為可生物降解,獲非降解兩類。
?
2.物料介紹
項(xiàng)目物料清單如下:
12v電源適配器
Arduino Uno開發(fā)板
Arduino Nano
HC-SR04超聲波傳感器
微型伺服馬達(dá)
面包板
工具及軟件:示波器、可變電源、數(shù)字萬用表、烙鐵、PCB打孔機(jī)
(1)超聲波傳感器
超聲波傳感器工作時(shí)會(huì)發(fā)出一個(gè)超出人類聽覺范圍的超聲波,其換能器相當(dāng)于話筒,可接收超聲波信號(hào)并轉(zhuǎn)換成電信號(hào)。超聲波是振動(dòng)頻率高于20kHz的機(jī)械波,具有頻率高、波長(zhǎng)短、繞射現(xiàn)象小、方向性好等特點(diǎn)。
本項(xiàng)目與其他一樣,也使用單換能器來發(fā)送脈沖合接收回聲。如圖2所示,傳感器向某一方向發(fā)射超聲波時(shí)開始計(jì)時(shí),超聲波碰到障礙物時(shí)返回,根據(jù)時(shí)間差和超聲波速度可以估算出發(fā)射位置到障礙物的距離。
項(xiàng)目使用的HC-SRO4傳感器模塊的四個(gè)引腳分別為:Vcc(5V電源)、觸發(fā)引腳、回聲引腳、接地(0V)。工作時(shí),采用IO觸發(fā)測(cè)距10us的高電平信號(hào),模塊自動(dòng)發(fā)送8個(gè)40khz的方波,自動(dòng)檢測(cè)是否有回聲。如果有回聲,通過IO輸出一高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。HC-SRO4性能參數(shù)如下:
工作使用電壓:DC5V
靜態(tài)電流:小于2mA
電平輸出:高5V
電平輸出:底0V
感應(yīng)角度:不大于15度
探測(cè)距離:2-450cm
高精度:可達(dá)0.3cm
(2)伺服馬達(dá)
伺服馬達(dá)是可以讓物體精確轉(zhuǎn)動(dòng)的電氣元件,可以控制速度,位置精度非常準(zhǔn)確。伺服電機(jī)轉(zhuǎn)子轉(zhuǎn)速受輸入信號(hào)控制,并能快速反應(yīng),在自動(dòng)控制系統(tǒng)中,用作執(zhí)行元件,且具有機(jī)電時(shí)間常數(shù)小、線性度高等特性,可把所收到的電信號(hào)轉(zhuǎn)換成電動(dòng)機(jī)軸上的角位移或角速度輸出。
?
伺服馬達(dá)分為直流和交流兩大類,當(dāng)信號(hào)電壓為零時(shí)無自轉(zhuǎn)現(xiàn)象,轉(zhuǎn)速隨著轉(zhuǎn)矩的增加而勻速下降。Micro Servo 9G伺服馬達(dá)參數(shù)如下:
重量: 9g
尺寸: 22.2 x 11.8 x 31mm approx.
失速轉(zhuǎn)矩: 1.8kgf·cm
運(yùn)行速度: 0.1s/60度
工作電壓: 4.8V(~5V)
死區(qū)寬度: 10μs
工作溫度: 0–55oC
模擬力矩: 4.8V@1.80kg-cm)
旋轉(zhuǎn)范圍: 180°
脈沖周期: ca. 20ms
脈沖寬度: 500-2400μs
(3)Arduino UNO
Arduino是一個(gè)構(gòu)架電子項(xiàng)目的開源平臺(tái),包括一個(gè)物理可編程電路板和一套開發(fā)環(huán)境軟件(IDE),IDE可在PC運(yùn)行,用來向Arduino板子寫入代碼或上傳代碼。
Arduino的Uno版本更加普及,適合藝術(shù)家、設(shè)計(jì)師、發(fā)燒友和各種愛好DIY的人群,可用來控制按鈕、LEDs、馬達(dá)、喇叭、GPS單元、照相機(jī),甚至于手機(jī)和電視機(jī)。
Arduino有很多種類,但大多數(shù)板子上面的元器件是一樣的。以下按標(biāo)號(hào)逐一解釋:
標(biāo)號(hào)1:USB座。可通過USB電纜連接電腦或者電源,為Arduino UNO供電。從PC向Arduino開發(fā)板上傳代碼,也是通過這個(gè)USB電纜進(jìn)行的。
標(biāo)號(hào)3:GND引腳。Arduino有多個(gè)接地引腳,功能是一樣的。
標(biāo)號(hào)4:5V電源。提供5V電壓。
標(biāo)號(hào)5:3.3V電源。提供3.3V電壓。
標(biāo)號(hào)6:模擬輸入引腳(A0--A5),用來讀取來自模擬傳感器(如溫度傳感器)的信號(hào),并轉(zhuǎn)換成我們能夠識(shí)別的數(shù)字。
標(biāo)號(hào)7:數(shù)字輸入引腳(0--13),用以數(shù)字輸入(如按鈕被按下)信號(hào),或者輸出數(shù)字信號(hào)(如驅(qū)動(dòng)一個(gè)LED)。
標(biāo)號(hào)8:PWM引腳 (3, 5, 6, 9, 10, 11)。本質(zhì)上屬于數(shù)字引腳,也可用作PWM。可用來模擬某些輸出,如LED的亮度變化。
標(biāo)號(hào)9:AREF引腳,表示模擬參考,大多數(shù)情況下不用,有時(shí)用來設(shè)置一個(gè)作為上限的外部模擬電壓。
標(biāo)號(hào)10:復(fù)位按鈕。按個(gè)案件非常有用,按下就立即接地,并重啟任何上傳到Arduino的代碼。
標(biāo)號(hào)11:電源LED指示器。只要將Arduino接上電源,這個(gè)LED就一直點(diǎn)亮。如果不亮,馬上檢查電路,看看哪里出錯(cuò)了?
標(biāo)號(hào)12:TX RX LEDs指示燈,點(diǎn)亮表示正在接收或發(fā)射數(shù)據(jù)。
標(biāo)號(hào)13:主控IC芯片,來自愛特梅爾的ATmega。
標(biāo)號(hào)14:穩(wěn)壓芯片。
3.項(xiàng)目目標(biāo)
該項(xiàng)目的目的是建立一個(gè)原型,在有人準(zhǔn)備扔垃圾的時(shí)候自動(dòng)打開垃圾箱蓋子,并檢測(cè)剛?cè)舆M(jìn)來垃圾的種類,具體參考原理圖。Arduino連接方法如下:
HC-SRO4傳感器模塊引腳VCC連接到Arduino引腳+5VDC,引腳Trig連接到Arduino引腳7,引腳Echo連接到Arduino引腳6,引腳GND連接到Arduino引腳GND。
伺服馬達(dá)SG-90的Red引腳連接Arduino 3.3v,Black引腳連接Arduino GND,Orange引腳連接Arduino Pin 8。
4.代碼編程
按照上述說明把Arduino與超聲波傳感器、伺服馬達(dá)連接好后,就開始上傳代碼。
該智能垃圾箱的伺服數(shù)據(jù)庫為:
// Download Servo Library
//https://www.electroniclinic.com/arduino-libraries-download-and-projects-they-are-used-in-project-codes/
#include?
// Defines Tirg and Echo pins of the Ultrasonic Sensor
const int trigPin = 6;
const int echoPin = 7;
// Variables for the duration and the distance
long duration;
int distance;
Servo myServo; // Creates a servo object for controlling the servo motor
void setup() {
?pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
?pinMode(echoPin, INPUT); // Sets the echoPin as an Input
?Serial.begin(9600);
?myServo.attach(9); // Defines on which pin is the servo motor attached
}
void loop() {
?// rotates the servo motor from 15 to 165 degrees
?for (int i = 15; i <= 165; i++) {
? ?myServo.write(i);
? ?delay(30);
? ?distance = calculateDistance();// Calls a function for calculating the distance measured by the Ultrasonic sensor for each degree
? ?Serial.print(i); // Sends the current degree into the Serial Port
? ?Serial.print(","); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
? ?Serial.print(distance); // Sends the distance value into the Serial Port
? ?Serial.print("."); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
?}
?// Repeats the previous lines from 165 to 15 degrees
?for (int i = 165; i > 15; i--) {
? ?myServo.write(i);
? ?delay(30);
? ?distance = calculateDistance();
? ?Serial.print(i);
? ?Serial.print(",");
? ?Serial.print(distance);
? ?Serial.print(".");
?}
}
// Function for calculating the distance measured by the Ultrasonic sensor
int calculateDistance() {
?digitalWrite(trigPin, LOW);
?delayMicroseconds(2);
?// Sets the trigPin on HIGH state for 10 micro seconds
?digitalWrite(trigPin, HIGH);
?delayMicroseconds(10);
?digitalWrite(trigPin, LOW);
?duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
?distance = duration * 0.034 / 2;
?return distance;
}
開始編程前,我們先添加 Servo.h 頭文件,
#include
接下來,定義觸發(fā)和回聲引腳。HC-SR04超聲波傳感器的觸發(fā)和回聲引腳分別連接于Arduino的pins 6、7。
const int trigPin = 6;
const int echoPin = 7;
// Variables for the duration and the distance
long duration;
int distance;
Servo myServo; // Creates a servo object for controlling the servo motor
setup() function runs only one time with the Arduino board is turned ON.
void setup() {
?pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
?pinMode(echoPin, INPUT); // Sets the echoPin as an Input
?Serial.begin(9600);
?myServo.attach(9); // Defines on which pin is the servo motor attached
}
void loop() {
?// rotates the servo motor from 15 to 165 degrees
?for (int i = 15; i <= 165; i++) {
? ?myServo.write(i);
? ?delay(30);
? ?distance = calculateDistance();// Calls a function for calculating the distance measured by the Ultrasonic sensor for each degree
? ?Serial.print(i); // Sends the current degree into the Serial Port
? ?Serial.print(“,”); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
? ?Serial.print(distance); // Sends the distance value into the Serial Port
? ?Serial.print(“.”); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
?}
?
?// Repeats the previous lines from 165 to 15 degrees
?for (int i = 165; i > 15; i–) {
? ?myServo.write(i);
? ?delay(30);
? ?distance = calculateDistance();
? ?Serial.print(i);
? ?Serial.print(“,”);
? ?Serial.print(distance);
? ?Serial.print(“.”);
?}
}
// Function for calculating the distance measured by the Ultrasonic sensor
int calculateDistance() {
?digitalWrite(trigPin, LOW);
?delayMicroseconds(2);
?// Sets the trigPin on HIGH state for 10 micro seconds
?digitalWrite(trigPin, HIGH);
?delayMicroseconds(10);
?digitalWrite(trigPin, LOW);
?duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
?distance = duration * 0.034 / 2;
?return distance;
審核編輯:符乾江
評(píng)論
查看更多