Интересный проект, расширяющий возможности стандартной док-станции домашнего робота 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; } } }
Ссылки
По теме