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ć.
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.
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.
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.
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.
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.
#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).
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