Taula de continguts:

Control d’accés als aliments per a gats (ESP8266 + Servomotor + Impressió 3D): 5 passos (amb imatges)
Control d’accés als aliments per a gats (ESP8266 + Servomotor + Impressió 3D): 5 passos (amb imatges)

Vídeo: Control d’accés als aliments per a gats (ESP8266 + Servomotor + Impressió 3D): 5 passos (amb imatges)

Vídeo: Control d’accés als aliments per a gats (ESP8266 + Servomotor + Impressió 3D): 5 passos (amb imatges)
Vídeo: The Disappearing Computer — and a World Where You Can Take AI Everywhere | Imran Chaudhri | TED 2024, Juny
Anonim
Image
Image
Control d’accés als aliments per a gats (ESP8266 + Servomotor + impressió 3D)
Control d’accés als aliments per a gats (ESP8266 + Servomotor + impressió 3D)

Aquest projecte repassa el procés que vaig utilitzar per crear un bol automatitzat de menjar per a gats, per al meu gat diabètic Chaz, de gent gran. Mireu, necessita esmorzar abans d’obtenir la insulina, però sovint m’oblido de recollir el plat per menjar abans d’anar a dormir, cosa que li fa malbé la gana i li deixa el programa d’insulina. Aquest plat utilitza un servomotor per tancar una tapa sobre el menjar entre les hores de mitjanit i les 7:30 del matí. L’esbós Arduino del microcontrolador NodeMCU ESP8266 utilitza Network Time Protocol (NTP) per controlar la programació.

És possible que aquest projecte no sigui adequat per a gats més actius i joves. Chaz és tan vell i fràgil que no s’inclina per intentar obrir el bol, però és possible.

Si no coneixeu l’Arduino o l’ESP8266, podeu gaudir de les següents guies prerequisits:

  • Classes Arduino instructables
  • Classe d'Instructibles d'Internet de les Coses

Subministraments

  • Impressora 3D (faig servir un Creality CR-10s Pro)
  • Filament de la impressora 3D (estic fent servir PLA daurat)
  • Microcontrolador wifi NodeMCU ESP8266
  • Cable USB (A a microB)
  • Adaptador d'alimentació USB
  • Micro servo motor
  • Tornavís petit i cargols
  • Cable de connexió
  • Pins de capçalera
  • Tauler Perma-proto

Per estar al dia del que estic treballant, segueix-me a YouTube, Instagram, Twitter, Pinterest i subscriu-te al meu butlletí. Com a col·laborador d'Amazon, guanyo de les compres qualificatives que feu mitjançant els meus enllaços d'afiliació.

Pas 1: peces impreses en 3D

Parts impreses en 3D
Parts impreses en 3D
Parts impreses en 3D
Parts impreses en 3D

El porta-bol per a menjar per a gats es basa en el disseny d’Ardy Lai a Thingiverse. El vaig fer més gran per adaptar-lo al bol del meu gat i també el vaig fer més curt, ja que augmentar-lo l’havia fet massa alt. Vaig afegir un suport per a un micro servomotor i un parell de forats perquè els cables es dirigissin cap a l'interior.

Vaig modelar una tapa senzilla amb Tinkercad, dissenyada per fixar-la a la banya del micro servo. Podeu agafar el meu disseny directament des de Tinkercad i / o descarregar els STL adjunts a aquest pas.

Vaig imprimir les peces de la meva impressora Creality CR-10s Pro amb filament PLA daurat.

Divulgació: en el moment d’escriure aquest article, jo era un empleat d’Autodesk, que fa de Tinkercad.

Pas 2: fixeu la tapa al servomotor

Connecteu la tapa al servomotor
Connecteu la tapa al servomotor
Connecteu la tapa al servomotor
Connecteu la tapa al servomotor

Vaig utilitzar una broca petita per augmentar la mida dels forats de la banya del servo i després vaig utilitzar cargols per fixar el servo a la tapa impresa en 3D.

Pas 3: Creeu un circuit NodeMCU ESP8266

Construeix el circuit NodeMCU ESP8266
Construeix el circuit NodeMCU ESP8266
Construeix el circuit NodeMCU ESP8266
Construeix el circuit NodeMCU ESP8266
Construeix el circuit NodeMCU ESP8266
Construeix el circuit NodeMCU ESP8266
Construeix el circuit NodeMCU ESP8266
Construeix el circuit NodeMCU ESP8266

El circuit està controlat per un microcontrolador wifi NodeMCU ESP8266. He utilitzat pins de capçalera en una placa perma-proto per fer que el micro servo motor es desmuntés fàcilment.

Servo filferro groc: NodeMCU D1

Servo cable vermell: alimentació NodeMCU (3V3 o VIN)

Servo cable negre: terra NodeMCU (GND)

Pas 4: pengeu el codi Arduino i proveu-lo

Pengeu el codi i proveu Arduino
Pengeu el codi i proveu Arduino

Instal·leu el conjunt del motor / tapa a la retallada en forma de motor del suport imprès en 3D del suport del bol. Connecteu la capçalera del motor als pins de capçalera de la placa del microcontrolador i connecteu el circuit a l’ordinador amb un cable USB.

L'esbós d'Arduino utilitza el protocol de temps de xarxa per obtenir l'hora actual i, a continuació, obre o tanca la tapa segons una programació codificada. Copieu el codi següent, actualitzeu les vostres credencials de wifi i el desplaçament horari UTC i pengeu-lo a la vostra placa NodeMCU mitjançant l'IDE Arduino.

#incloure

#include #include #include ESP8266WiFiMulti wifiMulti; // Creeu una instància de la classe ESP8266WiFiMulti, anomenada 'wifiMulti' WiFiUDP UDP; // Creeu una instància de la classe WiFiUDP per enviar i rebre IPAddress timeServerIP; // time.nist.gov adreça del servidor NTP const char * NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // La marca de temps NTP es troba en els primers 48 bytes del byte de missatge NTPBuffer [NTP_PACKET_SIZE]; // memòria intermèdia per contenir paquets entrants i sortints Servo myservo; // crear un objecte servo per controlar un servo // es poden crear dotze servos objectes a la majoria de taules int pos = 0; // variable per emmagatzemar la posició de la posició del servo () {myservo.attach (5); // connecta el servo al pin 5 també conegut com D1 a l'objecte servo // obre la tapa per defecte Serial.println ("obrint la tapa"); for (pos = 95; pos> = 0; pos - = 1) {// va de 95 graus a 0 graus myservo.write (pos); // digueu al servo que vagi a la posició amb un retard variable de "pos" (15); // espera 15 ms perquè el servo assoleixi la posició} Serial.begin (115200); // Inicieu la comunicació en sèrie per enviar missatges al retard de l'ordinador (10); Serial.println ("\ r / n"); startWiFi (); // Intenteu connectar-vos a alguns punts d'accés determinats. A continuació, espereu una connexió startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Obteniu l'adreça IP del servidor NTP Serial.println ("Error de cerca DNS. Reinici."); Serial.flush (); ESP.reset (); } Serial.print ("IP del servidor de temps: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nEnviament de sol·licitud NTP …"); sendNTPpacket (timeServerIP); } interval llarg sense signar NTP = 60000; // Sol·liciteu temps NTP cada minut sense signar llarg prevNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t temps UNIX = 0; sense signar llarg prevActualTime = 0; bucle buit () {sense signe llarg actualMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Si ha passat un minut des de la darrera sol·licitud NTP prevNTP = currentMillis; Serial.println ("\ r / nEnviament de sol·licitud NTP …"); sendNTPpacket (timeServerIP); // Envia una sol·licitud NTP} uint32_t time = getTime (); // Comproveu si ha arribat una resposta NTP i obteniu el temps (UNIX) if (hora) {// Si s’ha rebut una nova marca de temps timeUNIX = time; Serial.print ("Resposta NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Més d'1 hora des de l'última resposta NTP. Reinici."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse) / 1000; uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse) / 1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Si ha passat un segon des de la darrera impressió prevActualTime = actualTime; 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 (EasternTime), getSeconds (EasternTime)); Serial.println (); } // 7:30 am if (getHours (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// obriu la tapa Serial.println ("obertura de la tapa"); for (pos = 95; pos> = 0; pos - = 1) {// va de 95 graus a 0 graus myservo.write (pos); // digueu al servo que vagi a la posició amb un retard variable de "pos" (15); // espera 15 ms perquè el servo assoleixi la posició}} // mitjanit if (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// tanqueu la tapa de sèrie. println ("tancament de la tapa"); for (pos = 0; pos <= 95; pos + = 1) {// va de 0 graus a 95 graus // en passos d'1 grau myservo.write (pos); // digueu al servo que vagi a la posició amb un retard variable de "pos" (15); // espera 15 ms perquè el servo assoleixi la posició}} / * // comprovant si (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// tanqueu la tapa Serial.println ("tancament de la tapa"); for (pos = 0; pos = 0; pos - = 1) {// va de 95 a 0 graus myservo.write (pos); // digueu al servo que vagi a la posició amb un retard variable de "pos" (15); // espera 15 ms perquè el servo assoleixi la posició}} * /} void startWiFi () {// Intenteu connectar-vos a alguns punts d'accés determinats. A continuació, espereu una connexió wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // afegiu xarxes Wi-Fi a les quals vulgueu connectar //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Connexió"); while (wifiMulti.run ()! = WL_CONNECTED) {// Espereu que el Wi-Fi es connecti amb retard (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Connectat a"); Serial.println (WiFi. SSID ()); // Digueu-nos a quina xarxa estem connectats a Serial.print ("adreça IP: / t"); Serial.print (WiFi.localIP ()); // Envieu l'adreça IP de l'ESP8266 a l'ordinador Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Iniciant UDP"); UDP.begin (123); // Comenceu a escoltar els missatges UDP al port 123 Serial.print ("Port local: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Si encara no hi ha resposta, torneu 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // llegir el paquet al buffer // Combineu els 4 bytes de marca de temps en un número de 32 bits uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Converteix l'hora NTP a una marca de temps UNIX: // L'hora Unix comença l'1 de gener de 1970. Això suposa 2208988800 segons en temps NTP: const uint32_t sevenyYears = 2208988800UL; // restar setanta anys: uint32_t UNIXTime = NTPTime - setanta anys; torna UNIXTime; } void sendNTPpacket (adreça i adreça IP) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // defineix tots els bytes del buffer a 0 // Inicialitza els valors necessaris per formar la sol·licitud NTP NTPBuffer [0] = 0b11100011; // LI, Versió, Mode // envia un paquet sol·licitant una marca de temps: UDP.beginPacket (adreça, 123); // Les sol·licituds NTP es porten al port 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {retorna UNIXTime% 60; } inline int getMinutes (uint32_t UNIXTime) {return UNIXTime / 60% 60; } inline int getHours (uint32_t UNIXTime) {return UNIXTime / 3600% 24; }

Pas 5: utilitzeu-lo

Utilitza-ho!
Utilitza-ho!
Utilitza-ho!
Utilitza-ho!

Encaminar els cables cap a l'interior del porta-bol i connectar l'alimentador de gats a una presa de corrent mitjançant un adaptador de CA USB. La forma en què s’escriu el codi simple, s’ha d’iniciar en estat “obert” i només canviarà la posició de la tapa en els llindars de temps especificats a l’esbós d’Arduino.

Gràcies per seguir-ho! Si en feu la vostra pròpia versió, m’encantaria veure-la a la secció I Made It que hi ha a continuació.

Si us agrada aquest projecte, potser us interessaran alguns dels meus altres:

  • Porta-prisma per a retrats d'arc de Sant Martí
  • Paret d'emmagatzematge de fusta contraxapada amb torre Cat
  • Llanternes LED Mason Jar (tapa impresa en 3D)
  • Impressora 3D Filament Dry Box
  • Font d'alimentació USB d'emergència (impresa en 3D)
  • Caramel Gummy LED brillant
  • Sembradora geomètrica impresa en 3D amb drenatge
  • Flors impreses en 3D brillants
  • Com instal·lar LEDs sota un scooter (amb Bluetooth)

Per estar al dia del que estic treballant, segueix-me a YouTube, Instagram, Twitter i Pinterest.

Recomanat: