Sommario:

Controllo dell'accesso al cibo per gatti (ESP8266 + servomotore + stampa 3D): 5 passaggi (con immagini)
Controllo dell'accesso al cibo per gatti (ESP8266 + servomotore + stampa 3D): 5 passaggi (con immagini)

Video: Controllo dell'accesso al cibo per gatti (ESP8266 + servomotore + stampa 3D): 5 passaggi (con immagini)

Video: Controllo dell'accesso al cibo per gatti (ESP8266 + servomotore + stampa 3D): 5 passaggi (con immagini)
Video: Side Iron [Maker Update #157] - Maker.io 2024, Dicembre
Anonim
Image
Image
Controllo dell'accesso al cibo per gatti (ESP8266 + servomotore + stampa 3D)
Controllo dell'accesso al cibo per gatti (ESP8266 + servomotore + stampa 3D)

Questo progetto ripercorre il processo che ho usato per creare una ciotola automatizzata per cibo per gatti, per il mio anziano gatto diabetico Chaz. Vedi, ha bisogno di fare colazione prima di poter prendere l'insulina, ma spesso dimentico di prendere il suo piatto di cibo prima di andare a letto, il che gli rovina l'appetito e fa perdere il suo programma di insulina. Questo piatto utilizza un servomotore per chiudere un coperchio sul cibo tra la mezzanotte e le 7:30. Lo sketch Arduino del microcontrollore NodeMCU ESP8266 utilizza Network Time Protocol (NTP) per controllare la pianificazione.

Questo progetto potrebbe non essere adatto a gatti più giovani e più attivi. Chaz è così vecchio e fragile, non è incline a provare ad aprire la ciotola, ma è possibile.

Se non conosci Arduino o ESP8266, potresti goderti le seguenti guide ai prerequisiti:

  • Classe Arduino Instructables
  • Instructables Internet of Things Class

Forniture

  • Stampante 3D (uso una Creality CR-10s Pro)
  • Filamento per stampante 3D (sto usando PLA oro)
  • Microcontrollore wifi NodeMCU ESP8266
  • Cavo USB (da A a microB)
  • Adattatore di alimentazione USB
  • Micro servomotore
  • Piccolo cacciavite e viti
  • Cavo di collegamento
  • Perni di intestazione
  • Scheda Perma-proto

Per stare al passo con quello a cui sto lavorando, seguimi su YouTube, Instagram, Twitter, Pinterest e iscriviti alla mia newsletter. In qualità di Associato Amazon, guadagno dagli acquisti idonei che effettui utilizzando i miei link di affiliazione.

Passaggio 1: parti stampate in 3D

Parti stampate in 3D
Parti stampate in 3D
Parti stampate in 3D
Parti stampate in 3D

Il supporto per la ciotola del cibo per gatti si basa sul design di Ardy Lai su Thingiverse. L'ho ingrandito per ospitare la ciotola del mio gatto, e l'ho anche accorciato poiché il ridimensionamento lo aveva reso troppo alto. Ho aggiunto un supporto per un micro servomotore e un paio di fori per far passare i cavi all'interno.

Ho modellato un semplice coperchio usando Tinkercad, progettato per attaccarlo al corno del micro servo. Puoi prendere il mio design direttamente da Tinkercad e/o scaricare gli STL allegati a questo passaggio.

Ho stampato le parti sulla mia stampante Creality CR-10s Pro con filamento PLA dorato.

Divulgazione: al momento in cui scrivo, sono un dipendente di Autodesk, che produce Tinkercad.

Passaggio 2: collegare il coperchio al servomotore

Collegare il coperchio al servomotore
Collegare il coperchio al servomotore
Collegare il coperchio al servomotore
Collegare il coperchio al servomotore

Ho usato una piccola punta da trapano per aumentare le dimensioni dei fori sulla squadretta del servo, quindi ho usato le viti per fissare il servo al coperchio stampato in 3D.

Passaggio 3: crea il circuito NodeMCU ESP8266

Costruisci il circuito NodeMCU ESP8266
Costruisci il circuito NodeMCU ESP8266
Costruisci il circuito NodeMCU ESP8266
Costruisci il circuito NodeMCU ESP8266
Costruisci il circuito NodeMCU ESP8266
Costruisci il circuito NodeMCU ESP8266
Costruisci il circuito NodeMCU ESP8266
Costruisci il circuito NodeMCU ESP8266

Il circuito è controllato da un microcontrollore wifi NodeMCU ESP8266. Ho usato i pin di intestazione su una scheda perma-proto per rendere il micro servomotore facilmente staccabile. Le intestazioni del servo sono collegate al NodeMCU come segue:

Cavo servo giallo: NodeMCU D1

Cavo servo rosso: alimentazione NodeMCU (3V3 o VIN)

Cavo servo nero: terra NodeMCU (GND)

Passaggio 4: carica il codice Arduino e prova

Carica codice Arduino e prova
Carica codice Arduino e prova

Installa il gruppo motore/coperchio nell'apertura a forma di motore sulla parte stampata in 3D del supporto della ciotola. Collega l'intestazione del motore ai pin dell'intestazione della scheda del microcontrollore e collega il circuito al computer con un cavo USB.

Lo sketch Arduino utilizza Network Time Protocol per recuperare l'ora corrente e quindi apre o chiude il coperchio in base a una pianificazione codificata. Copia il codice seguente, aggiorna le tue credenziali Wi-Fi e l'offset dell'ora UTC e caricalo sulla scheda NodeMCU utilizzando l'IDE Arduino.

#includere

#include #include #include ESP8266WiFiMulti wifiMulti; // Crea un'istanza della classe ESP8266WiFiMulti, chiamata 'wifiMulti' WiFiUDP UDP; // Crea un'istanza della classe WiFiUDP per inviare e ricevere IPAddress timeServerIP; // time.nist.gov Indirizzo del server NTP const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Il timestamp NTP è nei primi 48 byte del byte del messaggio NTPBuffer[NTP_PACKET_SIZE]; // buffer per contenere i pacchetti in entrata e in uscita Servo myservo; // crea un oggetto servo per controllare un servo // dodici oggetti servo possono essere creati sulla maggior parte delle schede int pos = 0; // variabile per memorizzare la posizione del servo void setup() { myservo.attach(5); // collega il servo sul pin 5 alias D1 all'oggetto servo //apri il coperchio di default Serial.println("opening the lid"); for (pos = 95; pos >= 0; pos -= 1) { // va da 95 gradi a 0 gradi myservo.write(pos); // dice al servo di andare in posizione nella variabile 'pos' delay(15); // attende 15ms che il servo raggiunga la posizione } Serial.begin(115200); // Avvia la comunicazione seriale per inviare messaggi al computer delay(10); Serial.println("\r\n"); startWiFi(); // Prova a connetterti ad alcuni punti di accesso dati. Quindi attendi una connessione startUDP(); if(!WiFi.hostByName(NTPServerName, timeServerIP)) { // Ottieni l'indirizzo IP del server NTP Serial.println("Ricerca DNS fallita. Riavvio."); Serial.flush(); ESP.reset(); } Serial.print("IP server orario:\t"); Serial.println(timeServerIP); Serial.println("\r\nInvio richiesta NTP…"); sendNTPacket(timeServerIP); } intervallo lungo senza segno NTP = 60000; // Richiedi tempo NTP ogni minuto unsigned long prevNTP = 0; unsigned long lastNTPResponse = millis(); uint32_t timeUNIX = 0; unsigned long prevActualTime = 0; void loop() { unsigned long currentMillis = millis(); if (currentMillis - prevNTP > intervalNTP) { // Se è trascorso un minuto dall'ultima richiesta NTP prevNTP = currentMillis; Serial.println("\r\nInvio richiesta NTP…"); sendNTPacket(timeServerIP); // Invia una richiesta NTP } uint32_t time = getTime(); // Controlla se è arrivata una risposta NTP e ottieni l'ora (UNIX) if (time) { // Se è stata ricevuta una nuova marca temporale timeUNIX = ora; Serial.print("Risposta NTP:\t"); Serial.println(timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse) > 3600000) { Serial.println("Più di 1 ora dall'ultima risposta NTP. Riavvio."); Serial.flush(); ESP.reset(); } uint32_t currentTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime != prevActualTime && timeUNIX != 0) { // Se è trascorso un secondo dall'ultima stampa prevActualTime = currentTime; Serial.printf("\rUTC time:\t%d:%d:%d ", getHours(actualTime), getMinutes(actualTime), getSeconds(actualTime)); Serial.printf("\rEST (-5):\t%d:%d:%d ", getHours(easternTime), getMinutes(eastTime), getSeconds(eastTime)); Serial.println(); } // 7:30 am if(getHours(easternTime) == 7 && getMinutes(easternTime) == 30 && getSeconds(easternTime) == 0){ //apri il coperchio Serial.println("apre il coperchio"); for (pos = 95; pos >= 0; pos -= 1) { // va da 95 gradi a 0 gradi myservo.write(pos); // dice al servo di andare in posizione nella variabile 'pos' delay(15); // attende 15 ms che il servo raggiunga la posizione } } // mezzanotte if(getHours(easternTime) == 0 && getMinutes(easternTime) == 0 && getSeconds(easternTime) == 0){ //chiudere il coperchio Serial. println("chiudi il coperchio"); for (pos = 0; pos <= 95; pos += 1) { // va da 0 gradi a 95 gradi // in passi di 1 grado myservo.write(pos); // dice al servo di andare in posizione nella variabile 'pos' delay(15); // attende 15ms che il servo raggiunga la posizione } } /* // testing if(getHours(easternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ //chiudere il coperchio Serial.println("chiudere il coperchio"); for (pos = 0; pos = 0; pos -= 1) { // va da 95 gradi a 0 gradi myservo.write(pos); // dice al servo di andare in posizione nella variabile 'pos' delay(15); // aspetta 15ms che il servo raggiunga la posizione } } */ } void startWiFi() { // Prova a connetterti ad alcuni punti di accesso dati. Quindi attendi una connessione wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // aggiungi le reti Wi-Fi a cui vuoi connetterti //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("Connessione"); while (wifiMulti.run() != WL_CONNECTED) { // Attendi che il Wi-Fi si connetta delay(250); Serial.print('.'); } Serial.println("\r\n"); Serial.print("Connesso a"); Serial.println(WiFi. SSID()); // Dicci a quale rete siamo connessi Serial.print("Indirizzo IP:\t"); Serial.print(WiFi.localIP()); // Invia l'indirizzo IP dell'ESP8266 al computer Serial.println("\r\n"); } void startUDP() { Serial.println("Avvio di UDP"); UDP.begin(123); // Avvia l'ascolto dei messaggi UDP sulla porta 123 Serial.print("Porta locale:\t"); Serial.println(UDP.localPort()); Serial.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) { // Se non c'è (ancora) risposta return 0; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // legge il pacchetto nel buffer // Combina i 4 byte di timestamp in un numero a 32 bit uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTP Buffer[41] << 16) | (NTP Buffer[42] << 8) | NTPBuffer[43]; // Converti l'ora NTP in un timestamp UNIX: // L'ora Unix inizia il 1 gennaio 1970. Sono 2208988800 secondi nell'ora NTP: const uint32_t seventyYears = 2208988800UL; // sottrae settanta anni: uint32_t UNIXTime = NTPTime - settanta anni; restituisce UNIXTime; } void sendNTPpacket(IPAddress& address) { memset(NTPBuffer, 0, NTP_PACKET_SIZE); // imposta tutti i byte nel buffer a 0 // Inizializza i valori necessari per formare la richiesta NTP NTPBuffer[0] = 0b11100011; // LI, Version, Mode // invia un pacchetto richiedendo un timestamp: UDP.beginPacket(address, 123); // Le richieste NTP vanno alla porta 123 UDP.write(NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } inline int getSeconds(uint32_t UNIXTime) { return UNIXTime % 60; } inline int getMinutes(uint32_t UNIXTime) { return UNIXTime / 60 % 60; } inline int getHours(uint32_t UNIXTime) { return UNIXTime / 3600 % 24; }

Passaggio 5: usalo

Usalo!
Usalo!
Usalo!
Usalo!

Instrada i cavi all'interno del supporto della ciotola e collega la mangiatoia per gatti a una presa utilizzando un adattatore CA USB. Il modo in cui è scritto il codice semplice, è pensato per essere avviato nello stato "aperto" e cambierà solo la posizione del coperchio alle soglie temporali specificate nello schizzo Arduino.

Grazie per aver seguito! Se crei la tua versione, mi piacerebbe vederla nella sezione L'ho fatta qui sotto!

Se ti piace questo progetto, potresti essere interessato ad alcuni dei miei altri:

  • Portaprisma per ritratti arcobaleno
  • Parete portaoggetti in compensato con torre per gatti
  • Lanterne LED Mason Jar (coperchio stampato 3D)
  • Scatola asciutta del filamento della stampante 3D
  • Fonte di alimentazione USB di emergenza (stampa 3D)
  • Caramella gommosa a LED incandescente
  • Fioriera geometrica stampata in 3D con drenaggio
  • Fiori luminosi stampati in 3D
  • Come installare i LED sotto uno scooter (con Bluetooth)

Per stare al passo con ciò a cui sto lavorando, seguimi su YouTube, Instagram, Twitter e Pinterest.

Consigliato: