引言
在朋友家見到感應垃圾桶后,覺得很有趣。好在用Arduino實現這個想法并不困難,花了大概三個小時自己做了一個。使用的是HC-SR04超聲波測距模塊和SG90舵機,都相當便宜,性能也基本滿足要求。成品如下,右邊是自己DIY的樹莓派電腦。
成品
制作過程
一、制作箱體
制作箱體花了好些時間,原本是全部使用硬紙板制作的,做完后發現存在變形的問題,于是改用木板制作了背面和左右兩個面。背面使用木板是為了盒蓋的開關更加穩定,右面使用木板是為了固定開關裝置。
舵機安裝
舵機控制的盒蓋開關部分固定在右側板子上。舵機控制的盒蓋開關部分制作時有點難度,可以通過畫示意圖的方法找到合適的連桿。簡圖與實物的對比如下,a是鉸鏈的轉動點與舵機的轉動點的連線,b是舵機柄,c是連桿。其中鉸鏈的轉動點(A點)和連桿的末端(D點)是固定的,可以轉動不能移動。啟動時舵機柄(b)順時針旋轉90度,帶動a和c的運動。這樣就可以根據盒蓋需要打開的角度(即a變化的角度),選擇合適的連桿以及固定點。
連桿選擇
二、連接電路
電路圖如下,接線很簡單。值得注意的是,Arduino自帶
servo
函數進行舵機的控制,使用servo
函數控制舵機時,舵機的控制線要接PWM數字口。我使用的板子是Arduino UNO,所有PWM數字口都有~標識。選擇了其中的D9作為舵機的控制接口。這里AA電池只是示意,5V供電即可,可以用5V2.1A輸出的移動電源供電。
電路
三、寫入代碼
#include <Servo.h>
Servo servo;
int servoPin = 9;
int trigPin = 6;
int echoPin = 7;
long duration, distance;
long aver[3];
void setup() {
servo.attach(servoPin);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
servo.write(0);
delay(1000);
servo.detach();
}
void measure() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
distance = duration *0.034 / 2;
}
void loop() {
for (int i=0;i<=2;i++) {
measure();
aver[i]=distance;
delay(50);
}
distance=(aver[0]+aver[1]+aver[2])/3;
if (distance<40) {
servo.attach(servoPin);
delay(1);
servo.write(90);
delay(5000);
servo.write(0);
delay(1000);
servo.detach();
}
}