Контроллер Arduino, УЗ-дальномер и сервомашинка — вот и всё, что понадобится для повторения подобной конструкции.
Скетч для Arduino (robo_trashcan.ino)
/*
Created 2016
by AlexGyver
AlexGyver Home Labs Inc.
*/
#include <Servo.h> //servo library
Servo servo;
int trigPin = 6;
int echoPin = 7;
long duration, dist, average;
int flag=0; //button flag
long aver[3]; //array for average
void setup() {
servo.attach(5);
pinMode(3,INPUT); //button on D3
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
servo.write(180); //open cap on power on
}
void measure() { //here is for range sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
dist = (duration/2) / 29.1; //obtain distance
}
void loop() {
if (digitalRead(3)==1 && flag==0) { //if button pressed
servo.write(180); //open the cap
delay(1000); //wait for servo
flag=1; //button pressed
}
if (digitalRead(3)==0 && flag==1) { //if button unpressed
servo.write(3); //close the cap
delay(1000); //wait for servo
flag=0;
}
if (flag==0) {
for (int i=0;i<=2;i++) { //average distance
measure();
aver[i]=dist;
delay(50); //delay between measurements
}
dist=(aver[0]+aver[1]+aver[2])/3; //average distance by 3 measurements
}
if (dist>10 && dist<30 && flag==0) { //if hand on the distance 10...30 cm
servo.write(180);
delay(10000); //wait 10 seconds
servo.write(3);
delay(1000);
}
if (dist>30 && dist<60 && flag==0) { //if hand on the distance 30...60 cm
servo.write(180);
delay(2500); //wait 2.5 seconds
servo.write(3);
delay(1000);
}
}
далее: Оптимизация работы роботизированной мусорки для работы от батареи
Ссылки
Robotized Trashcan
По теме
Роботизированный мусорный бак и реакция людей
Радиоуправляемый логотип Android-а из бачка для мусора
Arduino
Ардуино что это и зачем?
Arduino, термины, начало работы
Разновидности плат Arduino, а также про клоны, оригиналы и совместимость
КМБ для начинающих ардуинщиков
