Интересный проект, расширяющий возможности стандартной док-станции домашнего робота Astro (от Amazon) диспенсером закусок и тем самым позволяющий автоматизировать доставку вкусняшек.
Как мы помним, робот Astro не оборудован манипулятором и поэтому не способен что-либо сделать самостоятельно. Фактически, робот может разъезжать по дому и способен только что-нибудь посмотреть.
Однако, оказывается и стандартную комплектацию робота можно использовать для некоторой домашней автоматизации.
Snacky — это диспенсер закусок, прикрепленный к зарядной док-станции робота Astro, что позволяет заказывать закуски командой отправки робота на подзарядку. Когда робот заезжает на док-станцию, диспенсер выгружает пакет с закусками в нишу на спине робота и пользователю остаётся только позвать робота к себе.
В основе Snacky лежит контроллер Arduino Uno и мотор-шилд. Для контроля присутствия робота используются два модуля инфракрасных датчиков, а спираль диспенсера вращает сервомашинка непрерывного вращения. Алгоритм работы очень простой: Arduino обнаруживает присутствие робота Astro при помощи инфракрасных датчиков и начинает вращать сервомашинку, чтобы спираль дозатора выбросила пакет.
Скетч для Arduino — snacky020123.ino
//snacky 020123
int wait=0;//wait=1 means delivery has been made
int snack=1;//no snack detected
int astro=1;//no astro request detected
void setup() {
pinMode(12,OUTPUT);//Motor channel A
pinMode(9,OUTPUT);//Brake channel A
pinMode(2,INPUT_PULLUP);//snack detector
pinMode(6,INPUT_PULLUP);//astro request detector
delay(1000);
astro=digitalRead(6);
if (astro==0) {
wait=1;
}
}
void loop() {
if (wait==0) {
astro=digitalRead(6);
if (astro==0) {//snack request initiated)
delay(2000);
astro=digitalRead(6);//read again
if (astro==0) {//time to start motor and dispense
digitalWrite(12,HIGH);//set motor direction
digitalWrite(9,LOW);//disengage brake
analogWrite(3,50);//turn on motor
snack=digitalRead(2);//read snack sensor
while(snack==1) {//keep running until detected
snack=digitalRead(2);
}
delay(500);//keep motor running a bit
analogWrite(3,0);//turn motor off
wait=1;
}
}
}
astro=digitalRead(6);
if (astro==1) {//left the charger
delay(15000);
astro=digitalRead(6);
if (astro==1) {//reset and wait
wait=0;
}
}
}
Ссылки
По теме
