基于Arduino的感應垃圾桶

引言

在朋友家見到感應垃圾桶后,覺得很有趣。好在用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();      
  }
}

演示視頻

感應垃圾桶

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。