Kazalo:

Cat Control Access Control (ESP8266 + servo motor + 3D tiskanje): 5 korakov (s slikami)
Cat Control Access Control (ESP8266 + servo motor + 3D tiskanje): 5 korakov (s slikami)

Video: Cat Control Access Control (ESP8266 + servo motor + 3D tiskanje): 5 korakov (s slikami)

Video: Cat Control Access Control (ESP8266 + servo motor + 3D tiskanje): 5 korakov (s slikami)
Video: 3D Printed Pin Support Challenge 😱 2024, November
Anonim
Image
Image
Cat Control Access Control (ESP8266 + servo motor + 3D tiskanje)
Cat Control Access Control (ESP8266 + servo motor + 3D tiskanje)

Ta projekt gre skozi postopek, ki sem ga uporabil za ustvarjanje avtomatizirane posode za mačje hrane za mojo starejšo diabetično mačko Chaz. Glej, preden mora dobiti insulin, mora zajtrkovati, vendar pogosto pozabim vzeti njegovo jed, preden grem spat, kar mu pokvari apetit in zavrže urnik insulina. Ta jed uporablja servo motor za zapiranje pokrova nad hrano med polnočjo in 7.30 uro. Skica Arduino mikrokrmilnika NodeMCU ESP8266 za nadzor urnika uporablja protokol omrežnega časa (NTP).

Ta projekt morda ni primeren za mlajše, bolj aktivne mačke. Chaz je tako star in krhek, ni nagnjen k temu, da bi posodo odprl, vendar je mogoče.

Če ste novi v Arduinu ali ESP8266, boste morda uživali v naslednjih predpogojih:

  • Navodila za razred Arduino
  • Razred Interneta stvari z navodili

Zaloge

  • 3D tiskalnik (uporabljam Creality CR-10s Pro)
  • Žarnica za 3D tiskalnik (uporabljam zlato PLA)
  • NodeMCU ESP8266 wifi mikrokrmilnik
  • USB kabel (od A do microB)
  • USB napajalnik
  • Mikro servo motor
  • Majhen izvijač in vijaki
  • Priključna žica
  • Zatiči glave
  • Plošča Perma-proto

Če želite spremljati, na čem delam, me spremljajte na YouTubu, Instagramu, Twitterju, Pinterestu in se naročite na moje novice. Kot sodelavec Amazon zaslužim s kvalificiranimi nakupi, ki jih opravite z mojimi partnerskimi povezavami.

Korak: 3D natisnjeni deli

3D natisnjeni deli
3D natisnjeni deli
3D natisnjeni deli
3D natisnjeni deli

Držalo za posodo za mačjo hrano temelji na zasnovi Ardyja Laija na Thingiverse. Naredil sem jo večjo za namestitev posode moje mačke in jo tudi skrajšal, saj je bila zaradi povečanja prevelika. Dodal sem nosilec za mikro servo motor in nekaj lukenj za kable, ki jih lahko usmerimo v notranjost.

Z modelom Tinkercad sem modeliral preprost pokrov, zasnovan za pritrditev na rog mikro serva. Moj dizajn lahko prevzamete neposredno iz Tinkercada in/ali prenesete STL -je, priložene temu koraku.

Natisnil sem dele na tiskalniku Creality CR-10s Pro z zlato nitjo PLA.

Razkritje: v času tega pisanja sem zaposlen pri Autodesku, ki izdeluje Tinkercad.

Korak: Pritrdite pokrov na servo motor

Pritrdite pokrov na servo motor
Pritrdite pokrov na servo motor
Pritrdite pokrov na servo motor
Pritrdite pokrov na servo motor

Z majhnim svedrom sem povečal velikost lukenj na servo rogu, nato pa z vijaki pritrdil servo na 3D natisnjen pokrov.

Korak: Zgradite vezje NodeMCU ESP8266

Zgradite vezje NodeMCU ESP8266
Zgradite vezje NodeMCU ESP8266
Zgradite vezje NodeMCU ESP8266
Zgradite vezje NodeMCU ESP8266
Zgradite vezje NodeMCU ESP8266
Zgradite vezje NodeMCU ESP8266
Zgradite vezje NodeMCU ESP8266
Zgradite vezje NodeMCU ESP8266

Vezje nadzira wifi mikrokrmilnik NodeMCU ESP8266. Za enostavno odstranitev mikro servo motorja sem uporabil zatiče glave na plošči perma-proto. Servo glave so povezane z NodeMCU na naslednji način:

Rumena servo žica: NodeMCU D1

Rdeča servo žica: NodeMCU napajanje (3V3 ali VIN)

Črna servo žica: ozemljitev NodeMCU (GND)

4. korak: Naložite kodo Arduino in preizkusite

Naložite Arduino kodo in test
Naložite Arduino kodo in test

Sestavite motor/pokrov v izrez v obliki motorja na 3D-tiskanem delu nosilca sklede. Glavo motorja priključite v nožice glave mikrokontrolerja in s kablom USB priključite vezje v računalnik.

Skica Arduino uporablja protokol omrežnega časa za pridobivanje trenutnega časa, nato pa odpre ali zapre pokrov v skladu s trdo kodiranim urnikom. Kopirajte naslednjo kodo, posodobite poverilnice za WiFi in časovni zamik UTC ter jo naložite na ploščo NodeMCU z uporabo Arduino IDE.

#vključi

#include #include #include ESP8266WiFiMulti wifiMulti; // Ustvarite primerek razreda ESP8266WiFiMulti, imenovan 'wifiMulti' WiFiUDP UDP; // Ustvarite primerek razreda WiFiUDP za pošiljanje in sprejemanje naslova IPAddress timeServerIP; // time.nist.gov Naslov strežnika NTP const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // časovni žig NTP je v prvih 48 bajtih sporočila bajta NTPBuffer [NTP_PACKET_SIZE]; // medpomnilnik za shranjevanje dohodnih in odhodnih paketov Servo myservo; // ustvarite servo objekt za nadzor servo // na večini plošč lahko ustvarite dvanajst servo objektov int pos = 0; // spremenljivka za shranjevanje položaja servo void setup () {myservo.attach (5); // pritrdi servo na pin 5 ali D1 na servo objekt // privzeto odpre pokrov Serial.println ("odpiranje pokrova"); for (pos = 95; pos> = 0; pos -= 1) {// gre od 95 stopinj do 0 stopinj myservo.write (pos); // povem servo, naj gre v položaj s spremenljivo zakasnitvijo 'pos' (15); // čaka 15 ms, da servo doseže položaj} Serial.begin (115200); // Zagon serijske komunikacije za pošiljanje sporočil v računalnik zakasnitev (10); Serial.println ("\ r / n"); startWiFi (); // Poskusite se povezati z določenimi dostopnimi točkami. Nato počakajte na začetek povezaveUDUD (); if (! WiFi.hostByName (NTPSerName, timeServerIP)) {// Pridobite naslov IP strežnika NTP Serial.println ("Iskanje DNS ni uspelo. Ponovni zagon."); Serial.flush (); ESP.reset (); } Serial.print ("IP časovnega strežnika: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nPošiljanje zahteve NTP …"); sendNTPpacket (timeServerIP); } brez podpisa dolg intervalNTP = 60000; // Zahtevaj čas NTP vsako minuto brez podpisa dolgo preduNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t časUNIX = 0; brez podpisa dolgo prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Če je minila minuta od zadnje zahteve NTP prevNTP = currentMillis; Serial.println ("\ r / nPošiljanje zahteve NTP …"); sendNTPpacket (timeServerIP); // Pošlji zahtevo NTP} uint32_t time = getTime (); // Preverimo, ali je prišel odziv NTP in dobimo (UNIX) čas if (time) {// Če je bil prejet nov časovni žig timeUNIX = time; Serial.print ("Odziv NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Več kot 1 ura od zadnjega odgovora NTP. Ponovni zagon."); Serial.flush (); ESP.reset (); } uint32_t dejanski čas = časUNIX + (currentMillis - zadnjiNTPResponse)/1000; uint32_t EasternTime = časUNIX - 18000 + (currentMillis - zadnjiNTPResponse)/1000; if (dejanski čas! = prevActualTime && timeUNIX! = 0) {// Če je od zadnjega tiskanja pretekla sekunda prevActualTime = dejanski čas; Serial.printf ("\ rUTC čas: / t%d:%d:%d", getHours (dejanski čas), getMinutes (dejanski čas), getSeconds (dejanski čas)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (EasternTime), getMinutes (EasternTime), getSeconds (EasternTime)); Serial.println (); } // 7:30 zjutraj if (getHours (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// odprite pokrov Serial.println ("odpiranje pokrova"); for (pos = 95; pos> = 0; pos -= 1) {// gre od 95 stopinj do 0 stopinj myservo.write (pos); // povem servo, naj gre v položaj s spremenljivo zakasnitvijo 'pos' (15); // čaka 15 ms, da servo doseže položaj}} // polnoč, če (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// zaprite pokrov Serial. println ("zapiranje pokrova"); for (pos = 0; pos <= 95; pos += 1) {// gre od 0 stopinj do 95 stopinj // v korakih po 1 stopinjo myservo.write (pos); // povem servo, naj gre v položaj s spremenljivo zakasnitvijo 'pos' (15); // čaka 15 ms, da servo doseže položaj}} /* // testiranje, če (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// zapremo pokrov Serial.println ("zapiranje pokrova"); for (pos = 0; pos = 0; pos -= 1) {// gre od 95 stopinj do 0 stopinj myservo.write (pos); // povem servo, naj gre v položaj s spremenljivo zakasnitvijo 'pos' (15); // čaka 15 ms, da servo doseže položaj}} */} void startWiFi () {// Poskusite se povezati z določenimi dostopnimi točkami. Nato počakajte na povezavo wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // dodamo omrežja Wi-Fi, s katerimi se želimo povezati //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Povezovanje"); while (wifiMulti.run ()! = WL_CONNECTED) {// Počakajte, da se Wi-Fi poveže z zakasnitvijo (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Povezano z"); Serial.println (WiFi. SSID ()); // Povejte nam, s katerim omrežjem smo povezani s Serial.print ("naslov IP: / t"); Serial.print (WiFi.localIP ()); // pošljite naslov IP ESP8266 računalniku Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Zagon UDP"); UDP.začetek (123); // Začnite poslušati sporočila UDP na vratih 123 Serial.print ("Lokalna vrata: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Če ni odgovora (še) vrni 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // preberemo paket v medpomnilnik // Združimo 4 bajte časovnega žiga v eno 32-bitno število uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Pretvorimo čas NTP v časovni žig UNIX: // Čas Unixa se začne 1. januarja 1970. To je 2208988800 sekund v času NTP: const uint32_t sevendeset let = 2208988800UL; // odštejemo sedemdeset let: uint32_t UNIXTime = NTPTime - sedemdeset let; return UNIXTime; } void sendNTPpacket (IP -naslov in naslov) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // vse bajte v vmesnem pomnilniku nastavimo na 0 // Inicializiramo vrednosti, potrebne za oblikovanje zahteve NTP NTPBuffer [0] = 0b11100011; // LI, Version, Mode // pošlji paket, ki zahteva časovni žig: UDP.beginPacket (naslov, 123); // NTP zahteve za prenos 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; }

5. korak: Uporabite ga

Uporabi!
Uporabi!
Uporabi!
Uporabi!

Žice napeljite v notranjost nosilca posode in napajalnik za mačke priključite v vtičnico s pomočjo napajalnika USB. Način, kako je napisana preprosta koda, naj bi se zagnal v "odprtem" stanju in spremenil le svoj položaj pokrova v časovnih pragih, ki so določeni v skici Arduino.

Hvala za spremljanje! Če naredite svojo različico, bi jo rad videl v spodnjem razdelku I Made It!

Če vam je ta projekt všeč, vas bodo morda zanimali še nekateri drugi:

  • Držalo za prizmo za mavrične portrete
  • Skladiščna stena iz vezanega lesa z Cat stolpom
  • LED svetilke Mason Jar (3D natisnjen pokrov)
  • Suha škatla z nitjo 3D tiskalnika
  • Vir napajanja USB v sili (3D natisnjeno)
  • Žareče LED gumijaste sladkarije
  • 3D natisnjeni geometrijski sejalnik z drenažo
  • Žareče 3D tiskano cvetje
  • Kako namestiti LED pod skuter (z Bluetooth)

Če želite spremljati, na čem delam, me spremljajte na YouTubu, Instagramu, Twitterju in Pinterestu.

Priporočena: