Sisällysluettelo:

Kissanruoan kulunvalvonta (ESP8266 + servomoottori + 3D -tulostus): 5 vaihetta (kuvilla)
Kissanruoan kulunvalvonta (ESP8266 + servomoottori + 3D -tulostus): 5 vaihetta (kuvilla)

Video: Kissanruoan kulunvalvonta (ESP8266 + servomoottori + 3D -tulostus): 5 vaihetta (kuvilla)

Video: Kissanruoan kulunvalvonta (ESP8266 + servomoottori + 3D -tulostus): 5 vaihetta (kuvilla)
Video: Дрессированный кот... Кормушка, напечатанная на 3D-принтере..!! #3dпечать #smartcat #кошачий корм 2024, Kesäkuu
Anonim
Image
Image
Kissanruoan pääsyn valvonta (ESP8266 + servomoottori + 3D -tulostus)
Kissanruoan pääsyn valvonta (ESP8266 + servomoottori + 3D -tulostus)

Tässä projektissa käsitellään prosessia, jota käytin luodessani automaattisen kissanruokakupin ikääntyneelle diabeettiselle kissalle Chazille. Hänen täytyy syödä aamiaista ennen kuin hän saa insuliininsä, mutta unohdan usein noutaa hänen ruokalajinsa ennen nukkumaanmenoa, mikä pilaa hänen ruokahalunsa ja heittää pois hänen insuliiniaikataulunsa. Tämä ruokalaji käyttää servomoottoria sulkemaan ruoan kannen keskiyön ja 7.30 välillä. NodeMCU ESP8266 -mikro -ohjaimen Arduino -luonnos hallitsee aikataulua Network Time Protocol (NTP) -protokollalla.

Tämä projekti ei ehkä sovi nuoremmille, aktiivisemmille kissoille. Chaz on niin vanha ja hauras, ettei hän ole taipuvainen yrittämään puristaa kulhoa auki, mutta se on mahdollista.

Jos olet uusi Arduino- tai ESP8266 -laitteessa, saatat nauttia seuraavista ennakko -oppaista:

  • Ohjattavat Arduino -luokat
  • Ohjattavat esineiden Internet -luokka

Tarvikkeet

  • 3D-tulostin (käytän Creality CR-10s Prota)
  • 3D -tulostimen filamentti (käytän kultaista PLA: ta)
  • NodeMCU ESP8266 wifi -mikrokontrolleri
  • USB -kaapeli (A - microB)
  • USB -virtalähde
  • Mikroservomoottori
  • Pieni ruuvimeisseli ja ruuvit
  • Liitäntäjohto
  • Otsikon nastat
  • Perma-proto-levy

Jos haluat pysyä ajan tasalla siitä, mitä työskentelen, seuraa minua YouTubessa, Instagramissa, Twitterissä, Pinterestissä ja tilaa uutiskirjeeni. Amazon -yhteistyökumppanina ansaitsen hyväksytyistä ostoista, joita teet kumppanilinkkien avulla.

Vaihe 1: 3D -tulostetut osat

3D -tulostetut osat
3D -tulostetut osat
3D -tulostetut osat
3D -tulostetut osat

Kissanruoan kulhon pidike perustuu Ardy Lai: n Thingiverse -mallin suunnitteluun. Tein sen suuremmaksi, jotta se mahtuu kissani kulhoon, ja lyhensin sitä myös, koska sen skaalaaminen oli tehnyt siitä liian korkean. Lisäsin pidikkeen mikroservomoottorille ja pari reikää kaapeleille sisäreitille.

Mallin yksinkertaisen kannen Tinkercadilla, joka on suunniteltu kiinnitettäväksi mikroservon sarveen. Voit napata suunnitteluni suoraan Tinkercadista ja/tai ladata tähän vaiheeseen liitetyt STL -tiedostot.

Tulostin osat Creality CR-10s Pro -tulostimellani kultaisella PLA-filamentilla.

Paljastaminen: tämän kirjoituksen aikaan olen Tinkercadia valmistavan Autodeskin työntekijä.

Vaihe 2: Kiinnitä kansi servomoottoriin

Kiinnitä kansi servomoottoriin
Kiinnitä kansi servomoottoriin
Kiinnitä kansi servomoottoriin
Kiinnitä kansi servomoottoriin

Käytin pientä poranterää servosarven reikien koon kasvattamiseen ja kiinnitin sitten ruuveilla servon 3D -painettuun kanteen.

Vaihe 3: Rakenna NodeMCU ESP8266 -piiri

Rakenna NodeMCU ESP8266 -piiri
Rakenna NodeMCU ESP8266 -piiri
Rakenna NodeMCU ESP8266 -piiri
Rakenna NodeMCU ESP8266 -piiri
Rakenna NodeMCU ESP8266 -piiri
Rakenna NodeMCU ESP8266 -piiri
Rakenna NodeMCU ESP8266 -piiri
Rakenna NodeMCU ESP8266 -piiri

Piiriä ohjaa NodeMCU ESP8266 wifi -mikro -ohjain. Käytin otsikkotappeja perma-proto-kortilla, jotta mikro-servomoottori olisi helposti irrotettavissa.

Keltainen servojohto: NodeMCU D1

Punainen servojohto: NodeMCU -teho (3V3 tai VIN)

Musta servolanka: NodeMCU -maa (GND)

Vaihe 4: Lataa Arduino -koodi ja testi

Lataa Arduino -koodi ja testi
Lataa Arduino -koodi ja testi

Asenna moottori/kansiyksikkö kulhonpidikkeen 3D-painetun osan moottorin muotoiseen aukkoon. Kytke moottorin liitin mikrokortin otsikkotappeihin ja kytke piiri tietokoneeseen USB -kaapelilla.

Arduino-luonnos hakee nykyisen ajan Network Time Protocol -protokollalla ja avaa tai sulkee kannen kovakoodatun aikataulun mukaisesti. Kopioi seuraava koodi, päivitä wifi -tunnuksesi ja UTC -aikaero ja lähetä se NodeMCU -kortillesi Arduino IDE: n avulla.

#sisältää

#Sisällytä #Sisällytä #Sisällytä ESP8266WiFiMulti wifiMulti; // Luo ESP8266WiFiMulti -luokan ilmentymä, nimeltään wifiMulti WiFiUDP UDP; // Luo WiFiUDP -luokan ilmentymä lähettää ja vastaanottaa IPAddress timeServerIP; // time.nist.gov NTP -palvelimen osoite const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP -aikaleima on viestin tavussa 48 ensimmäistä tavua NTPBuffer [NTP_PACKET_SIZE]; // puskuri saapuvien ja lähtevien pakettien säilyttämiseksi Servo myservo; // servo -objektin luominen servoa ohjaamaan // kaksitoista servo -objektia voidaan luoda useimmille taulukoille int pos = 0; // muuttuja servoasennon tallentamiseen void setup () {myservo.attach (5); // kiinnittää nastan 5 eli D1: n servon servobjektiin // avaa kansi oletuksena Serial.println ("kannen avaaminen"); for (pos = 95; pos> = 0; pos -= 1) {// siirtyy 95 asteesta 0 asteeseen myservo.write (pos); // käske servoa siirtymään asentoon muuttujan "pos" viiveessä (15); // odottaa 15 ms, kunnes servo saavuttaa asennon} Serial.begin (115200); // Käynnistä sarjaliikenne viestien lähettämiseksi tietokoneelle viive (10); Serial.println ("\ r / n"); startWiFi (); // Yritä muodostaa yhteys tiettyihin tukiasemiin. Odota sitten yhteyden käynnistymistäUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Hanki NTP -palvelimen Serial.println IP -osoite ("DNS -haku epäonnistui. Uudelleenkäynnistys."); Sarja.huuhtelu (); ESP.nollaus (); } Serial.print ("Aikapalvelimen IP: / t"); Sarja.println (timeServerIP); Serial.println ("\ r / nLähetetään NTP -pyyntö …"); sendNTPpacket (timeServerIP); } allekirjoittamaton pitkä väliNTP = 60000; // Pyydä NTP -aikaa joka minuutti unsigned long prevNTP = 0; allekirjoittamaton pitkä lastNTPResponse = millis (); uint32_t timeUNIX = 0; allekirjoittamaton pitkä prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Jos minuutti on kulunut viimeisestä NTP -pyynnöstä prevNTP = currentMillis; Serial.println ("\ r / nLähetetään NTP -pyyntö …"); sendNTPpacket (timeServerIP); // Lähetä NTP -pyyntö} uint32_t time = getTime (); // Tarkista onko NTP -vastaus saapunut ja hanki (UNIX) aika jos (aika) {// Jos uusi aikaleima on vastaanotettu timeUNIX = time; Serial.print ("NTP -vastaus: / t"); Sarja.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Yli tunti viimeisestä NTP -vastauksesta. Käynnistys uudelleen."); Sarja.huuhtelu (); ESP.nollaus (); } uint32_t factTimeTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (factTime! = prevActualTime && timeUNIX! = 0) {// Jos edellisen tulostuksen jälkeen on kulunut sekunti prevActualTime = factTime; Serial.printf ("\ rUTC aika: / t%d:%d:%d", getHours (todellinen aika), getMinutes (todellinen aika), getSeconds (todellinen aika)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (eastTime)); Sarja.println (); } // 7:30 am if (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// avaa kansi Serial.println ("kannen avaaminen"); for (pos = 95; pos> = 0; pos -= 1) {// siirtyy 95 asteesta 0 asteeseen myservo.write (pos); // käske servoa siirtymään asentoon muuttujan "pos" viiveessä (15); // odottaa 15 ms, kunnes servo saavuttaa asennon}}} keskiyö, jos (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// sulje kansi Serial. println ("kannen sulkeminen"); for (pos = 0; pos <= 95; pos += 1) {// siirtyy 0 asteesta 95 asteeseen // 1 asteen askelin myservo.write (pos); // käske servoa siirtymään asentoon muuttujan "pos" viiveessä (15); // odottaa 15 ms, kunnes servo saavuttaa asennon}} /* // testataan, onko (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// sulje kansi Serial.println ("kannen sulkeminen"); for (pos = 0; pos = 0; pos -= 1) {// siirtyy 95 asteesta 0 asteeseen myservo.write (pos); // käske servoa siirtymään asentoon muuttujan "pos" viiveessä (15); // odottaa 15 ms, kunnes servo saavuttaa asennon}} * */ void startWiFi () {// Yritä muodostaa yhteys tiettyihin tukiasemiin. Odota sitten yhteyden muodostamista wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // lisää Wi-Fi-verkot, joihin haluat muodostaa yhteyden //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Yhdistäminen"); while (wifiMulti.run ()! = WL_CONNECTED) {// Odota, että Wi-Fi muodostaa yhteyden viive (250); Serial.print ('.'); } Sarja.println ("\ r / n"); Serial.print ("Yhdistetty"); Serial.println (WiFi. SSID ()); // Kerro meille, mihin verkkoon olemme yhteydessä Serial.print ("IP -osoite: / t"); Sarjajälki (WiFi.localIP ()); // Lähetä ESP8266: n IP -osoite tietokoneelle Serial.println ("\ r / n"); } void startUDP () {Serial.println ("UDP: n käynnistäminen"); UDP.bin (123); // Aloita UDP -viestien kuuntelu portista 123 Serial.print ("Paikallinen portti: / t"); Serial.println (UDP.localPort ()); Sarja.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Jos vastausta ei ole (vielä), palauta 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // lukee paketin puskuriin // Yhdistä 4 aikaleiman tavua yhdeksi 32-bittiseksi numeroksi uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTP -puskuri [43]; // Muunna NTP -aika UNIX -aikaleimaksi: // Unix -aika alkaa 1. tammikuuta 1970. NTP -aika on 2208988800 sekuntia: const uint32_t sevenyYears = 2208988800UL; // vähennä seitsemänkymmentä vuotta: uint32_t UNIXTime = NTPTime - sevenyYears; palauta UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // aseta puskurin kaikki tavut arvoon 0 // Alusta NTP -pyynnön muodostamiseen tarvittavat arvot NTPBuffer [0] = 0b11100011; // LI, versio, tila // lähetä paketti, joka pyytää aikaleimaa: UDP.beginPacket (osoite, 123); // NTP -pyynnöt lähetetään porttiin 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; }

Vaihe 5: Käytä sitä

Käytä sitä!
Käytä sitä!
Käytä sitä!
Käytä sitä!

Vie johdot kulhon pidikkeen sisäpuolelle ja kytke kissan syöttölaite pistorasiaan USB -verkkolaitteen avulla. Yksinkertaisen koodin kirjoitustapa on tarkoitettu käynnistettäväksi "auki" -tilassa, ja se muuttaa kannen asentoa vain Arduino -luonnoksessa määritetyillä aikarajoilla.

Kiitos seurannasta! Jos teet oman version, haluaisin nähdä sen alla olevasta Tehty -osiosta!

Jos pidät tästä projektista, saatat olla kiinnostunut joistakin muista:

  • Prismanpidike Rainbow -muotokuville
  • Vanerivarasto Cat Towerilla
  • LED Mason Jar Lanterns (3D -painettu kansi)
  • 3D -tulostuslangan kuivarasia
  • Hätä -USB -virtalähde (3D -tulostettu)
  • Hehkuva LED -karkki
  • 3D -painettu geometrinen kylvökone, jossa on viemäröinti
  • Hehkuva 3D -painettu kukka
  • LEDien asentaminen skootterin alle (Bluetoothilla)

Jos haluat pysyä ajan tasalla siitä, mitä työskentelen, seuraa minua YouTubessa, Instagramissa, Twitterissä ja Pinterestissä.

Suositeltava: