Automatyczny dyspenser karmy

Automatyczny dyspenser karmy

Wakacje to okres, gdy często wyjeżdżamy z domu na dłuższy czas. Jeśli nie mamy nikogo, kto może zająć się naszymi zwierzętami domowymi w pełnym zakresie godzin, to automatyczny karmnik może być idealnym rozwiązaniem, aby nasz pupil bezpiecznie czekał do naszego powrotu.

Automatyczne dyspensery do karmy dla zwierząt, które wydają im w określonych momentach pewną ilość karmy to nic nowego. Tego rodzaju urządzenia dostępne są komercyjnie na rynku już od dłuższego czasu. To świetne rozwiązanie dla zapracowanych właścicieli zwierząt domowych. W poniższym projekcie prezentujemy modyfikację klasycznego dozownika karmy. Ten zaprezentowany w tym artykule sterowany jest przez Twittera – karmnik automatycznie dozuje jedzenie w odpowiedzi na aktywność na skojarzonym koncie na Twitterze. Projekt jest kontrolowany przez Arduino i wykorzystuje moduł (shield) Arduino Ethernet do odbierania danych z Twittera.

Potrzebne elementy

W pierwszej kolejności potrzebny będzie elektroniczny karmnik. Wystarczy każdy, który pozwala na elektryczne sterowanie dozownikiem karmy. Autor zastosował prosty dozownik, który sterowany jest z pomocą przycisków. Jedynym problemem, jaki pozostał do rozwiązania, było naciskanie przycisków. Zostało to zrealizowane za pomocą fotorezystorów.

Do zestawienia prostego układu, sterującego dwoma przyciskami dyspensera potrzebne będą:

  • cztery fotooporniki CdS lub podobne, o rezystancji odwrotnie proporcjonalnej do natężenia oświetlenia,
  • dwa oporniki 10 kΩ oraz dwa oporniki 4,7 kΩ,
  • dwie superjasne białe diody elektroluminescencyjne,
  • oporniki do ograniczenia prądu diod LED,
  • dwa microswitche.

Aby obliczyć wartość rezystancji opornika, ograniczającego prąd diod LED musimy znać dwa parametry diod LED – prąd pracy oraz spadek napięcia. Dla użytych przez autora białych diod parametry te wynoszą odpowiednio, 30 mA oraz 3,6 V. Aby obliczyć wartość rezystora korzystamy ze wzoru:

Gdzie VCC to napięcie zasilania (w naszym przypadku 5 V), VLED to spadek napięcia na diodzie (3,6 V), a ILED to prąd diody, jaki chcemy ustawić w naszym systemie (30 mA). Zatem (5 V–3,6 V)/(0,03)≈47 Ω. Zaokrąglając wartość opornika do najbliższej z szeregu (na ogół E24 – ±5%), warto zaokrąglać w górę, aby nie przekroczyć zadanego prądu, co mogłoby doprowadzić do uszkodzenia diody LED.

Oprócz powyższych elementów potrzebne będą jeszcze:

  • moduł Arduino UNO lub inny, kompatybilny moduł z mikrokontrolerem,
  • płytka Arduino Shield,
  • płytka uniwersalna,
  • goldpiny,
  • baterie lub zasilacz 5 V do zasilania Arduino, diod LED itd.

Jeśli chodzi o narzędzia, potrzebne będą lutownica do wykonania połączeń poszczególnych elementów oraz wiertarka do wykonania przeróbek w obudowie i elektronice dyspensera do karmy.

Adaptacja komercyjnego dozownika karmy

Autor konstrukcji do swojego projektu wybrał niedrogi dyspenser, który zakupił przez internet, pokazany na fotografii tytułowej. Najpierw należy dostać się do jego wnętrza. Model ten otwiera się po odkręceniu ośmiu śrub z podstawy karmnika i ostrożnym uniesieniu dolnego panelu dyspensera. Podczas zdejmowania dolnego panelu trzeba uważać – w systemie znajduje się kilka przewodów, które na stałe łączą dolny panel z korpusem. Uważajcie, aby ich nie nadwerężać czy uszkodzić.

Fotografia 1. Elektronika w dyspenserze karmy

Następnie z systemu możemy odkręcić płytkę drukowaną z elektroniką, kontrolującą urządzenie. Należy wykręcić sześć małych śrubek z płytki sterującej. Jedna ze śrub jest ukryta pod małą płytką drukowaną na górze głównej płytki drukowanej. Elektronikę od strony tej małej płytki pokazano na fotografii 1. Po wykręceniu wszystkich śrub płytki, powinno być możliwe łatwe zdjęcie plastikowej obudowy. Można teraz przystąpić do modyfikacji elektroniki.

Rysunek 1. Schemat elektryczny układu sterującego

Na rysunku 1 został pokazany schemat elektryczny układu. Podajnik zastosowany w projekcie jest przeznaczony do ręcznego dozowania żywności, gdy przyciski „ustaw” i „objętość” są wciśnięte w tym samym czasie. Podłączając światłoczułe rezystory do tych przycisków, możliwe jest symulowanie zadziałania przycisku w bardzo prosty sposób. Gdy fotorezystory nie są wystawione na działanie światła, ich opór jest bardzo wysoki – tak właśnie jest w stanie domyślnym, ponieważ w obudowie urządzenia jest ciemno. Procesor w podajniku będzie uznawał, że przyciski nie są naciśnięte. Gdy poprzez Arduino zostanie zaświecona dioda LED w pobliżu fotorezystora, opór tego elementu zmniejszy się na tyle nisko, aby procesor podajnika odczytał to, jako naciśnięcie przycisku. Do diod LED dołączone są również dwa dodatkowe microswitche. Pozwalają one ręcznie włączać diody LED w celu testowania i debugowania systemu. Te przyciski nie są niezbędne w projekcie, ale są przydatne podczas pierwszego uruchamiania urządzenia.

Całość zasilana jest z baterii dozownika. Wykorzystuje on cztery baterie rozmiaru D (LR20) połączone szeregowo, co daje około 6 V, z których można zasilać Arduino i jego peryferia. Jeśli nie chcemy stosować dodatkowego zasilacza, może to być dostateczne źródło prądu.

Modyfikacja przycisków

Aby podłączyć się do przycisków sterujących dyspenserem, należy zlokalizować je na płytce drukowanej. Najprościej zrobić to porównując rozkład przycisków na PCB z podpisami na obudowie. Na przyciskach znajdują się drobne, metalowe blaszki, które pełnią rolę przycisku, zwierającego ze sobą dwa pola pod naciskiem. Aby zmodyfikować urządzenie należy w pierwszej kolejności usunąć te blaszki.

Fotografia 2. Oryginalna płytka drukowana dyspensera karmy (a) i wykonane przeróbki (b)

Na fotografii 2a pokazano płytkę drukowaną urządzenia. W górnej części PCB widać pola lutownicze ze zdjętymi blaszkami. Każdy zewnętrzny pierścień pod przyciskiem ma wywiercone dwa otwory, w których osadzone są blaszki. W płytce drukowanej należy wywiercić dwa dodatkowe otwory – po jednym w każdym z wewnętrznych okrągłych pól przycisku, tak jak pokazano na fotografii 2b. Następnie do płytki należy przylutować cztery przewody tak, aby każdy z czterech odsłoniętych padów przycisków miał jeden przewód podłączony do niego. Teraz można płytkę zainstalować z powrotem na jej oryginalnym miejscu i podłączyć do Arduino.

Emulowane przyciski

W następnej kolejności należy budować emulator przycisków, wykorzystujący fotooporniki. W tym celu zastosowana zostanie płytka uniwersalna z wlutowanymi goldpinami, taka jak pokazano na fotografii 3a.

Fotografia 3. Płytka uniwersalna emulatora przycisków (a), zamontowana do modułu z Ethernetem (b)

Następnie zostaje ona umieszczona na module z Ethernetem (fotografia 3b). Płytka prototypowa zawiera obwody, które umożliwiają modułowi Arduino sterowanie przyciskami. Goldpiny połączone są do pinów 0...7 linii zasilania, analogowych i cyfrowych. Większość z nich nie jest wykorzystywana przez system i jest wlutowana tam tylko po to, aby ustabilizować płytkę uniwersalną na module sieciowym.

Następnie należy wlutować dwa oporniki ograniczające prąd diod LED – w naszym przypadku 47 Ω. Z jednej strony rezystory te łączymy z cyfrowymi wyjściami Arduino – 2 oraz 3. Następnie zaginamy diody LED i lutujemy je na płytce, łącząc ich anody z wcześniej wlutowanymi opornikami 47 Ω. Katody diod łączymy z masą obwodu.

Fotografia 4. Płytka emulatora przycisków z wlutowanymi diodami LED i fotorezystorami

Diody LED muszą być zamontowane tak, jak pokazano na fotografii 4. Następnie należy zainstalować fotooporniki – po dwa, połączone szeregowo, na każdą diodę LED. Należy zainstalować je na płytce uniwersalnej naprzeciwko diod LED. Dodatkowo, do fotooporników dołączane są szeregowo rezystory 4,7 kΩ oraz 10 kΩ.

Teraz do płytki można dołączyć zasilanie z baterii w urządzeniu i finalnie przylutować przewody z przycisków na oryginalnej płytce dyspensera. Na tym etapie można zmontować całość oraz wykonać otwory w obudowie do podłączenia kabla Ethernetowego oraz USB do Arduino.

Firmware

Oprogramowanie będzie odczytywać dane przychodzące z Twittera, więc jeśli na wskazanym koncie (nomnomnomfeeder) pojawi się tweet „feed me!” Arduino zapali dwie diody LED podłączone do pinów 2 i 3 na 1 sekundę, powodując rozpoczęcie sekwencji dostarczania żywności. Kod programu pokazano na listingu 1.

Listing 1. Oprogramowanie dyspensera sterowanego z Twittera

#include <SPI.h>
#include <Ethernet.h>

boolean justFed = 1;   //zmienna zapobiegająca przekarmieniu

byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };  // Adres MAC
IPAddress ip(190,298,34,132);               // Adres IP

EthernetClient client;  // inicjalizacja biblioteki

const int requestInterval = 60000;    // opóźnienie pomiędzy zapytaniami
char serverName[] = "api.twitter.com";  // URL Twittera
boolean requested;                    // flaga zapytania
long lastAttemptTime = 0;             // licznik czasu od ostatniego zapytania
String currentLine = "";              // bufor dla linijki pobranej z serwera
String tweet = "";                    // bufor całego tweeta
boolean readingTweet = false;         // flaga czytania tweeta

void setup() {
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 // rezerwacja pamięci dla buforów
 currentLine.reserve(256);
 tweet.reserve(150);
 Serial.begin(9600);     // inicjalizacja portu szeregowego
 if (!Ethernet.begin(mac)) { // próba inicjalizacji DHCP
   Ethernet.begin(mac, ip);  // stałe IP w prypadku niepowodzenia
 }
 connectToServer();      // połączenie z serwerem Twittera
 testing();          // autotest sprzętu
}

void loop() {
 if (justFed){
   if (client.connected()) {
     if (client.available()) {
       char inChar = client.read();      // odczytaj nadchodzące bity
       currentLine += inChar;          // dodaj odczytane bity do linii
       if (inChar == ‘\n’) {         // nowa linia
         currentLine = "";
       }
   // jeśli linia kończy się tagiem <text>, dalej znajduje sę tweet
       if ( currentLine.endsWith("<text>")) {
         readingTweet = true;          // początek tweeta
         tweet = "";
       }
       // jeśli czytane są bity tweeta, dodawane są do bufora tweeta
       if (readingTweet) {
         if (inChar != ‘<’) {
           tweet += inChar;
         }
         else {
           // znak "<" oznacza koniec tweeta
           readingTweet = false;
           Serial.println(tweet);
           if(tweet == ">feed me!"){
            digitalWrite(2, HIGH);
            digitalWrite(3, HIGH);
            Serial.println("LED ON!");
            delay(1000);             // włącz na 1 sekundę
            digitalWrite(2, LOW);
            digitalWrite(3, LOW);
            justFed = 0;
           }
           if(tweet != ">feed me!"){
            digitalWrite(2, LOW);
            digitalWrite(3, LOW);
            Serial.println("LED OFF!");
           }
           client.stop();            // zatrzymaj połączenie z serwerem
         }
       }
     }   
   }
   else if (millis() - lastAttemptTime > requestInterval) { // cykliczne powtarzanie zapytania
     connectToServer();
   }
 }
 else if (millis() - lastAttemptTime > 14400000){ // jeżeli minęły 4h od ostatniego karmienia
   justFed = 1;
 }
}

void testing(){
 digitalWrite(2, HIGH);
 digitalWrite(3, HIGH);
 delay(1000);
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
}
 
void connectToServer() {
 Serial.println("connecting to server...");  // spróbuj się połączyć i poczekaj 1 ms
 if (client.connect(serverName, 80)) {
   Serial.println("making HTTP request...");
 // zapytanie HTTP GET do serwera Twittera
   client.println("GET /1/statuses/user_timeline.xml?screen_name=nomnomnomfeeder&count=1 HTTP/1.1");
   client.println("HOST: api.twitter.com");
   client.println();
 }
 lastAttemptTime = millis();         // zapisz czas wysłania zapytania
}   

Program działa w dużej pętli, kontrolowanej flagą, która sygnalizuje czy dyspenser wydał posiłek czy nie.

Flaga jest zerowana co cztery godziny. Jeśli flaga pozwala na kolejne karmienie, system łączy się z Twitterem, pobiera nowego tweeta i parsuje go. Jeśli nie ma tweeta lub ma on inną treść, niż ustalona, nie dzieje się nic, a system oczekuje przez ustalony czas (domyślnie 1 minuta), przed wysłaniem kolejnego zapytania.

Autor do kompilacji swojego firmware wykorzystał Arduino 1.0, ale nowsze wersje powinny równie dobrze działać. Firmware korzysta z dwóch bibliotek, które w wersji 1.0 są domyślnie zainstalowane:

  • Ethernet (dla nakładki Ethernet),
  • EthernetDHCP (do samodzielnej konfiguracji adresu IP, jeśli sieć korzysta z DHCP).

W kodzie trzeba dokonać dwóch edycji, zanim oprogramowanie będzie gotowe do użycia. Po pierwsze – należy wprowadzić adres IP urządzenia, który musi pasować do sieci, w jakiej pracować ma system, np.:

IPAddress ip(190,298,34,132);

Jeśli nie znamy adresu IP, jaki poprawnie pracować będzie w naszej sieci, to można skorzystać z funkcji DHCP. Wtedy router automatycznie nada numer IP modułowi po podłączeniu go do sieci.

Po drugie – należy również wprowadzić nazwę użytkownika swojego konta na Twitterze w następującym wierszu, zastępując NAZWA:

client.println("GET /1/statuses/user_timeline.xml?screen_name=NAZWA&count=1 HTTP/1.1");

Jedyne, co pozostało, to zaprogramować płytkę Arduino, podłączyć kabel sieciowy i napisać na Tweeterze ustalony wpis. Dyspenser powinien zareagować w czasie minuty lub mniej. Podajnik nie będzie odbierać kolejnych tweetów przez cztery godziny (aby zapobiec nadmiernemu karmieniu), w tym czasie wystarczy dodać kolejną wiadomość, aby zastąpić „feed me!” jako ostatnią wiadomość na koncie.

Podsumowanie

Urządzenie jest proste w montażu i obsłudze. Wystarczy podłączyć podajnik do internetu, założyć konto na Twitterze i tweetować hasło ustawione w oprogramowaniu. W ciągu minuty karmnik wyda karmę a my możemy być spokojni o naszego pupila (fotografia 5).

Fotografia 5. Końcowy test urządzenia zakończony pełnym sukcesem

Bazując na oprogramowaniu pokazanym w tym projekcie można sterować także wieloma innymi urządzeniami. Jest to doskonały przykład tego, jak w prosty sposób można automatyzować dowolne urządzenia elektroniczne, korzystając z darmowego portalu społecznościowego.

Nikodem Czechowski, EP

Źródło:
https://bit.ly/3zJ6BE6
https://bit.ly/3BLNvPS
https://bit.ly/3zAIWFY

Artykuł ukazał się w
Elektronika Praktyczna
sierpień 2021
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik grudzień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna grudzień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich grudzień 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów