Table des matières:
- Fournitures
- Étape 1: Pièces imprimées en 3D
- Étape 2: Fixez le couvercle au servomoteur
- Étape 3: Construire le circuit NodeMCU ESP8266
- Étape 4: Téléchargez le code Arduino et testez
- Étape 5: Utilisez-le
Vidéo: Contrôle d'accès à la nourriture pour chat (ESP8266 + servomoteur + impression 3D): 5 étapes (avec photos)
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:05
Ce projet reprend le processus que j'ai utilisé pour créer un bol de nourriture pour chat automatisé, pour mon chat diabétique âgé Chaz. Vous voyez, il a besoin de petit-déjeuner avant de pouvoir prendre son insuline, mais j'oublie souvent de ramasser son plat de nourriture avant d'aller au lit, ce qui lui gâche l'appétit et perturbe son programme d'insuline. Ce plat utilise un servomoteur pour fermer un couvercle sur les aliments entre minuit et 7h30. L'esquisse Arduino du microcontrôleur NodeMCU ESP8266 utilise le protocole NTP (Network Time Protocol) pour contrôler le calendrier.
Ce projet peut ne pas convenir aux chats plus jeunes et plus actifs. Chaz est si vieux et frêle qu'il n'est pas enclin à essayer de forcer le bol, mais c'est possible.
Si vous débutez avec l'Arduino ou l'ESP8266, vous pouvez profiter des guides de prérequis suivants:
- Instructables Arduino Classe
- Instructables Internet des objets classe
Fournitures
- Imprimante 3D (j'utilise une Creality CR-10s Pro)
- Filament d'imprimante 3D (j'utilise du PLA doré)
- Microcontrôleur wifi NodeMCU ESP8266
- Câble USB (A vers microB)
- Adaptateur secteur USB
- Micro servomoteur
- Petit tournevis et vis
- Brancher le fil
- Broches d'en-tête
- Carte perma-proto
Pour suivre ce sur quoi je travaille, suivez-moi sur YouTube, Instagram, Twitter, Pinterest et abonnez-vous à ma newsletter. En tant qu'associé Amazon, je gagne des achats éligibles que vous effectuez en utilisant mes liens d'affiliation.
Étape 1: Pièces imprimées en 3D
Le support de bol de nourriture pour chat est basé sur la conception d'Ardy Lai sur Thingiverse. Je l'ai agrandi pour accueillir la gamelle de mon chat et je l'ai également raccourci car l'agrandir l'avait rendu trop grand. J'ai ajouté un support pour un micro servomoteur et quelques trous pour les câbles à acheminer vers l'intérieur.
J'ai modélisé un simple couvercle à l'aide de Tinkercad, conçu pour se fixer à la corne du micro servo. Vous pouvez récupérer mon design directement depuis Tinkercad et/ou télécharger les STL attachées à cette étape.
J'ai imprimé les pièces sur mon imprimante Creality CR-10s Pro avec du filament PLA doré.
Divulgation: au moment d'écrire ces lignes, je suis un employé d'Autodesk, qui fabrique Tinkercad.
Étape 2: Fixez le couvercle au servomoteur
J'ai utilisé un petit foret pour augmenter la taille des trous sur le palonnier du servo, puis j'ai utilisé des vis pour fixer le servo au couvercle imprimé en 3D.
Étape 3: Construire le circuit NodeMCU ESP8266
Le circuit est contrôlé par un microcontrôleur wifi NodeMCU ESP8266. J'ai utilisé des broches d'en-tête sur une carte perma-proto pour rendre le micro servomoteur facilement détachable. Les en-têtes de servo sont connectés au NodeMCU comme suit:
Fil de servo jaune: NodeMCU D1
Fil servo rouge: alimentation NodeMCU (3V3 ou VIN)
Fil de servo noir: masse NodeMCU (GND)
Étape 4: Téléchargez le code Arduino et testez
Installez votre ensemble moteur/couvercle dans la découpe en forme de moteur sur la pièce imprimée en 3D du porte-bol. Branchez l'embase du moteur dans les broches d'en-tête de la carte du microcontrôleur et branchez le circuit sur votre ordinateur avec un câble USB.
L'esquisse Arduino utilise Network Time Protocol pour récupérer l'heure actuelle, puis ouvre ou ferme le couvercle selon un calendrier codé en dur. Copiez le code suivant, mettez à jour vos informations d'identification wifi et le décalage horaire UTC, et téléchargez-le sur votre carte NodeMCU à l'aide de l'IDE Arduino.
#comprendre
#include #include #include ESP8266WiFiMulti wifiMulti; // Créez une instance de la classe ESP8266WiFiMulti, appelée 'wifiMulti' WiFiUDP UDP; // Crée une instance de la classe WiFiUDP pour envoyer et recevoir l'adresse IP timeServerIP; // time.nist.gov Adresse du serveur NTP const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // L'horodatage NTP se trouve dans les 48 premiers octets de l'octet de message NTPBuffer[NTP_PACKET_SIZE]; // tampon pour contenir les paquets entrants et sortants Servo myservo; // créer un objet servo pour contrôler un servo // douze objets servo peuvent être créés sur la plupart des cartes int pos = 0; // variable pour stocker la position du servo void setup() { myservo.attach(5); // attache le servo sur la broche 5 aka D1 à l'objet servo // ouvre le couvercle par défaut Serial.println (" ouverture du couvercle "); for (pos = 95; pos >= 0; pos -= 1) { // passe de 95 degrés à 0 degrés myservo.write(pos); // dit au servo de se positionner dans la variable 'pos' delay(15); // attend 15ms que le servo atteigne la position } Serial.begin(115200); // Démarre la communication série pour envoyer des messages à l'ordinateur delay(10); Serial.println("\r\n"); démarrerWiFi(); // Essayez de vous connecter à certains points d'accès donnés. Attendez ensuite une connexion startUDP(); if(!WiFi.hostByName(NTPServerName, timeServerIP)) { // Récupère l'adresse IP du serveur NTP Serial.println("La recherche DNS a échoué. Redémarrage."); Serial.flush(); ESP.reset(); } Serial.print("IP du serveur de temps:\t"); Serial.println(timeServerIP); Serial.println("\r\nEnvoi de la requête NTP …"); sendNTPpacket(timeServerIP); } intervalle long non signéNTP = 60000; // Demande l'heure NTP toutes les minutes non signée long prevNTP = 0; non signé long lastNTPResponse = millis(); uint32_t timeUNIX = 0; prevActualTime long non signé = 0; void loop() { long currentMillis non signé = millis(); if (currentMillis - prevNTP > intervalNTP) { // Si une minute s'est écoulée depuis la dernière requête NTP prevNTP = currentMillis; Serial.println("\r\nEnvoi de la requête NTP …"); sendNTPpacket(timeServerIP); // Envoie une requête NTP } uint32_t time = getTime(); // Vérifiez si une réponse NTP est arrivée et obtenez l'heure (UNIX) if (time) { // Si un nouvel horodatage a été reçu timeUNIX = time; Serial.print("Réponse NTP:\t"); Serial.println(timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse) > 3600000) { Serial.println("Plus d'une heure depuis la dernière réponse NTP. Redémarrage."); 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 une seconde s'est écoulée depuis la dernière impression 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(); } // 7h30 if(getHours(EasternTime) == 7 && getMinutes(EasternTime) == 30 && getSeconds(EasternTime) == 0){ //ouvrir le couvercle Serial.println("ouvrir le couvercle"); for (pos = 95; pos >= 0; pos -= 1) { // passe de 95 degrés à 0 degrés myservo.write(pos); // dit au servo de se positionner dans la variable 'pos' delay(15); // attend 15ms que le servo atteigne la position } } // minuit if(getHours(EasternTime) == 0 && getMinutes(easternTime) == 0 && getSeconds(easternTime) == 0){ //ferme le couvercle Serial. println("fermer le couvercle"); for (pos = 0; pos <= 95; pos += 1) { // passe de 0 degré à 95 degrés // par pas de 1 degré myservo.write(pos); // dit au servo de se positionner dans la variable 'pos' delay(15); // attend 15ms que le servo atteigne la position } } /* // test if(getHours(EasternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ //ferme le couvercle Serial.println("fermer le couvercle"); for (pos = 0; pos = 0; pos -= 1) { // passe de 95 degrés à 0 degrés myservo.write(pos); // dit au servo de se positionner dans la variable 'pos' delay(15); // attend 15 ms que le servo atteigne la position } } */ } void startWiFi() { // Essayez de vous connecter à certains points d'accès donnés. Attendez ensuite une connexion wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // ajoutez les réseaux Wi-Fi auxquels vous souhaitez vous connecter //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("Connexion"); while (wifiMulti.run() != WL_CONNECTED) { // Attendre que le Wi-Fi se connecte delay(250); Serial.print('.'); } Serial.println("\r\n"); Serial.print("Connecté à "); Serial.println(WiFi. SSID()); // Dites-nous à quel réseau nous sommes connectés Serial.print("IP address:\t"); Serial.print(WiFi.localIP()); // Envoyez l'adresse IP de l'ESP8266 à l'ordinateur Serial.println("\r\n"); } void startUDP() { Serial.println("Démarrage UDP"); UDP.début(123); // Commencer à écouter les messages UDP sur le port 123 Serial.print("Local port:\t"); Serial.println(UDP.localPort()); Serial.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) { // S'il n'y a pas (encore) de réponse, retourne 0; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // lit le paquet dans le tampon // Combine les 4 octets d'horodatage en un nombre de 32 bits uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTPBuffer[41] << 16) | (NTPBuffer[42] << 8) | NTPBuffer[43]; // Convertir l'heure NTP en horodatage UNIX: // L'heure Unix commence le 1er janvier 1970. C'est 2208988800 secondes en temps NTP: const uint32_t seventyYears = 2208988800UL; // soustrait soixante-dix ans: uint32_t UNIXTime = NTPTime - soixante-dixYears; renvoyer UNIXTime; } void sendNTPpacket(IPAddress& address) { memset(NTPBuffer, 0, NTP_PACKET_SIZE); // définit tous les octets du tampon sur 0 // Initialise les valeurs nécessaires pour former la requête NTP NTPBuffer[0] = 0b11100011; // LI, Version, Mode // envoie un paquet demandant un horodatage: UDP.beginPacket(address, 123); // Les requêtes NTP doivent être envoyées au port 123 UDP.write(NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } int int getSeconds(uint32_t UNIXTime) { return UNIXTime % 60; } int int getMinutes(uint32_t UNIXTime) { return UNIXTime / 60 % 60; } int int getHours(uint32_t UNIXTime) { return UNIXTime / 3600 % 24; }
Étape 5: Utilisez-le
Acheminez vos fils vers l'intérieur du porte-bol et branchez votre mangeoire pour chat dans une prise à l'aide d'un adaptateur secteur USB. La façon dont le code simple est écrit, il est destiné à être démarré dans l'état "ouvert", et ne changera sa position de couvercle qu'aux seuils de temps spécifiés dans l'esquisse Arduino.
Merci d'avoir suivi ! Si vous créez votre propre version, j'aimerais la voir dans la section I Made It ci-dessous !
Si vous aimez ce projet, vous pourriez être intéressé par certains de mes autres:
- Support prisme pour portraits arc-en-ciel
- Mur de rangement en contreplaqué avec tour pour chat
- Lanternes LED Mason Jar (couvercle imprimé 3D)
- Boîte sèche de filament d'imprimante 3D
- Source d'alimentation USB d'urgence (imprimé 3D)
- Bonbons gélifiés à DEL brillants
- Jardinière géométrique imprimée en 3D avec drainage
- Fleurs lumineuses imprimées en 3D
- Comment installer des LED sous un scooter (avec Bluetooth)
Pour suivre ce sur quoi je travaille, suivez-moi sur YouTube, Instagram, Twitter et Pinterest.
Conseillé:
Fixateur de chat triste, jouet pour chat Catch-Me - Projet scolaire : 3 étapes
Triste Cat Fixer, Catch-Me Cat Toy - Projet scolaire : Voici notre produit, c'est une souris jouet interactive : Catch-Me Cat Toy. Voici une liste des problèmes auxquels sont confrontés de nombreux chats dans notre société : Les chats de nos jours deviennent inactifs et déprimés sans rien faireLa plupart des propriétaires sont occupés par le travail ou l'école et votre ca
Projet Arduino : Distributeur de nourriture pour chat : 6 étapes
Projet Arduino : Distributeur de nourriture pour chat : cette instructable a été créée pour répondre aux exigences du projet Makecourse à l'Université de Floride du Sud (www.makecourse.com)
Dispositif de couverture de bol de nourriture pour chat : 4 étapes
Dispositif de couverture de bol de nourriture pour chat : cette instructable a été créée pour répondre aux exigences du projet du Makecourse à l'Université de Floride du Sud (www.makecourse.com) Dans cette instructable, je vais vous montrer comment j'ai fabriqué mon dispositif de couverture de bol de nourriture pour chat. Cet appareil était
Catapulte automatique pour lancer de la nourriture pour animaux de compagnie (chien, chat, poulet, etc.), lancer des balles et plus encore ! : 4 étapes (avec photos)
Catapulte automatique pour lancer de la nourriture pour animaux de compagnie (chien, chat, poulet, etc.), lancer des balles et plus encore ! : Bonjour et bienvenue dans mon premier Instructable ! Notre chien adore sa nourriture, elle va littéralement tout manger en quelques secondes. J'ai imaginé des moyens de ralentir cela, des balles avec la nourriture à l'intérieur à la jeter partout dans la cour. Étonnamment, elle est
Distributeur de nourriture pour chiens alimenté par Arduino : 10 étapes (avec photos)
Distributeur de nourriture pour chiens alimenté par Arduino : si votre maison ressemble à la mienne, certaines tâches peuvent être oubliées lorsque vous êtes pressé. Ne laissez pas votre animal de compagnie être oublié ! Ce distributeur automatique de croquettes pour chiens utilise un Arduino pour livrer la bonne quantité de croquettes au bon moment. Tout pa