Satura rādītājs:

Kaķu barības piekļuves kontrole (ESP8266 + servomotors + 3D drukāšana): 5 soļi (ar attēliem)
Kaķu barības piekļuves kontrole (ESP8266 + servomotors + 3D drukāšana): 5 soļi (ar attēliem)

Video: Kaķu barības piekļuves kontrole (ESP8266 + servomotors + 3D drukāšana): 5 soļi (ar attēliem)

Video: Kaķu barības piekļuves kontrole (ESP8266 + servomotors + 3D drukāšana): 5 soļi (ar attēliem)
Video: Avi Loeb: Searching for Extraterrestrial Life, UAP / UFOs, Interstellar Objects, David Grusch & more 2024, Jūnijs
Anonim
Image
Image
Kaķu barības piekļuves kontrole (ESP8266 + servomotors + 3D drukāšana)
Kaķu barības piekļuves kontrole (ESP8266 + servomotors + 3D drukāšana)

Šis projekts attiecas uz procesu, kuru es izmantoju, lai izveidotu automatizētu kaķu barības trauku manam vecāka gadagājuma diabēta kaķim Chaz. Redzi, viņam ir jāēd brokastis, pirms viņš var saņemt insulīnu, bet es bieži aizmirstu paņemt viņa ēdiena trauku pirms gulētiešanas, kas sabojā viņa apetīti un izslēdz viņa insulīna grafiku. Šis ēdiens izmanto servomotoru, lai aizvērtu vāku pār ēdienu no pusnakts līdz 7.30. Mikrokontrollera NodeMCU ESP8266 Arduino skice grafika kontrolei izmanto tīkla laika protokolu (NTP).

Šis projekts var nebūt piemērots jaunākiem, aktīvākiem kaķiem. Čass ir tik vecs un trausls, ka viņš nevēlas mēģināt atvērt bļodu, bet tas ir iespējams.

Ja esat jauns Arduino vai ESP8266 lietotājs, varat izmantot šādus obligātos ceļvežus:

  • Instrukcijas Arduino klase
  • Instrukciju priekšmetu interneta klase

Piegādes

  • 3D printeris (es izmantoju Creality CR-10s Pro)
  • 3D printera kvēldiegs (es izmantoju zelta PLA)
  • NodeMCU ESP8266 wifi mikrokontrolleris
  • USB kabelis (no A līdz microB)
  • USB strāvas adapteris
  • Mikro servo motors
  • Mazs skrūvgriezis un skrūves
  • Savienojuma vads
  • Galvenes tapas
  • Perma-proto dēlis

Lai neatpaliktu no tā, pie kā strādāju, sekojiet man pakalpojumā YouTube, Instagram, Twitter, Pinterest un abonējiet manu biļetenu. Kā Amazon asociētais darbinieks es nopelnu no kvalificētiem pirkumiem, ko veicat, izmantojot manas saistītās saites.

1. darbība: 3D drukātās detaļas

3D drukātas detaļas
3D drukātas detaļas
3D drukātas detaļas
3D drukātas detaļas

Kaķu barības bļodas turētāja pamatā ir Ardy Lai dizains vietnē Thingiverse. Es padarīju to lielāku, lai ietilptu mana kaķa bļodā, kā arī padarīju to īsāku, jo, palielinot to, tas bija kļuvis pārāk garš. Es pievienoju turētāju mikro servo motoram un pāris caurumus kabeļiem, lai tos novirzītu uz iekšpusi.

Es modelēju vienkāršu vāku, izmantojot Tinkercad, kas paredzēts piestiprināšanai pie mikro servo raga. Jūs varat paņemt manu dizainu tieši no Tinkercad un/vai lejupielādēt šim solim pievienotos STL.

Es drukāju detaļas savā Creality CR-10s Pro printerī ar zelta PLA kvēldiegu.

Informācijas atklāšana: šīs rakstīšanas laikā esmu Autodesk darbinieks, kas ražo Tinkercad.

2. solis: piestipriniet vāku servomotorei

Pievienojiet vāku servomotorei
Pievienojiet vāku servomotorei
Pievienojiet vāku servomotorei
Pievienojiet vāku servomotorei

Es izmantoju nelielu urbi, lai palielinātu caurumus caur servo ragu, pēc tam ar skrūvēm piestiprināju servo pie 3D drukātā vāka.

3. darbība: izveidojiet NodeMCU ESP8266 shēmu

Izveidojiet NodeMCU ESP8266 shēmu
Izveidojiet NodeMCU ESP8266 shēmu
Izveidojiet NodeMCU ESP8266 shēmu
Izveidojiet NodeMCU ESP8266 shēmu
Izveidojiet NodeMCU ESP8266 shēmu
Izveidojiet NodeMCU ESP8266 shēmu
Izveidojiet NodeMCU ESP8266 shēmu
Izveidojiet NodeMCU ESP8266 shēmu

Ķēdi kontrolē NodeMCU ESP8266 wifi mikrokontrolleris. Es izmantoju galvenes tapas uz perma-proto plates, lai padarītu mikro servo motoru viegli noņemamu. Servo galvenes ir savienotas ar NodeMCU šādi:

Dzeltenais servo vads: NodeMCU D1

Sarkanais servo vads: NodeMCU jauda (3V3 vai VIN)

Melns servo vads: NodeMCU zemējums (GND)

4. darbība: augšupielādējiet Arduino kodu un pārbaudiet

Augšupielādējiet Arduino kodu un pārbaudiet
Augšupielādējiet Arduino kodu un pārbaudiet

Uzstādiet motora/vāka bloku motora formas izgriezumā uz bļodas turētāja 3D drukātās daļas. Pievienojiet motora galveni mikrokontrollera plates galvenes tapām un pievienojiet ķēdi datoram, izmantojot USB kabeli.

Arduino skice izmanto tīkla laika protokolu, lai iegūtu pašreizējo laiku, un pēc tam atver vai aizver vāku saskaņā ar stingri kodētu grafiku. Kopējiet šo kodu, atjauniniet savus wifi akreditācijas datus un UTC laika nobīdi un augšupielādējiet to savā NodeMCU panelī, izmantojot Arduino IDE.

#iekļaut

#iekļaut #iekļaut #iekļaut ESP8266WiFiMulti wifiMulti; // Izveidojiet ESP8266WiFiMulti klases instanci ar nosaukumu 'wifiMulti' WiFiUDP UDP; // Izveidojiet WiFiUDP klases instanci, lai nosūtītu un saņemtu IPAddress timeServerIP; // time.nist.gov NTP servera adrese const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP laika zīmogs ir ziņojuma baitos pirmajos 48 baitos NTPBuffer [NTP_PACKET_SIZE]; // buferis ienākošo un izejošo pakešu glabāšanai Servo myservo; // izveidot servo objektu, lai kontrolētu servo // uz vairuma dēļu var izveidot divpadsmit servo objektus int pos = 0; // mainīgais, lai saglabātu servo pozīciju void setup () {myservo.attach (5); // piestiprina servo objektam servo uz pin 5 aka D1 // pēc noklusējuma atveriet vāku Serial.println ("vāka atvēršana"); par (pos = 95; pos> = 0; pos -= 1) {// iet no 95 grādiem līdz 0 grādiem myservo.write (pos); // sakiet servo, lai tas mainītos 'pos' kavējumā (15); // gaida 15 ms, kamēr servo sasniegs pozīciju} Serial.begin (115200); // Sāciet seriālo komunikāciju, lai nosūtītu ziņojumus uz datoru aizkave (10); Serial.println ("\ r / n"); startWiFi (); // Mēģiniet izveidot savienojumu ar dažiem piekļuves punktiem. Pēc tam gaidiet savienojuma sākšanuUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Iegūstiet NTP servera Serial.println IP adresi ("DNS uzmeklēšana neizdevās. Atsāknēšana"); Serial.flush (); ESP.reset (); } Serial.print ("Laika servera IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nSūta NTP pieprasījumu …"); sendNTPpacket (timeServerIP); } neparakstīts garš intervālsNTP = 60000; // Pieprasīt NTP laiku katru minūti neparakstīts garš prevNTP = 0; neparakstīts ilgi lastNTPResponse = milis (); uint32_t timeUNIX = 0; neparakstīts garš prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Ja kopš pēdējā NTP pieprasījuma ir pagājusi minūte prevNTP = currentMillis; Serial.println ("\ r / nSūta NTP pieprasījumu …"); sendNTPpacket (timeServerIP); // Nosūtīt NTP pieprasījumu} uint32_t time = getTime (); // Pārbaudiet, vai ir pienākusi NTP atbilde, un iegūstiet (UNIX) laiku, ja (laiks) {// Ja ir saņemts jauns laika zīmogs timeUNIX = laiks; Serial.print ("NTP atbilde: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } cits if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Vairāk nekā 1 stunda kopš pēdējās NTP atbildes. Atsāknēšana."); Serial.flush (); ESP.reset (); } uint32_t factTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (faktiskais laiks! = prevActualTime && timeUNIX! = 0) {// Ja kopš pēdējās drukāšanas ir pagājusi sekunde prevActualTime = faktiskais laiks; Serial.printf ("\ rUTC laiks: / t%d:%d:%d", getHours (faktiskais laiks), getMinutes (faktiskais laiks), getSeconds (faktiskais laiks)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (eastTime)); Sērijas.println (); } // 7:30 am if (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// atveriet vāku Serial.println ("vāka atvēršana"); par (pos = 95; pos> = 0; pos -= 1) {// iet no 95 grādiem līdz 0 grādiem myservo.write (pos); // sakiet servo, lai tas mainītos 'pos' kavējumā (15); // gaida 15 ms, lai servo sasniegtu pozīciju}} // pusnakts, ja (getHours (eastTime) == 0 && get get Mininutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// aizveriet vāku Sērija. println ("vāka aizvēršana"); par (pos = 0; pos <= 95; pos += 1) {// iet no 0 grādiem līdz 95 grādiem // soļos 1 grāds myservo.write (pos); // sakiet servo, lai tas mainītos 'pos' kavējumā (15); // gaida 15 ms, lai servo sasniegtu pozīciju}} /* // pārbauda, vai (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// aizveriet vāku Serial.println ("vāka aizvēršana"); par (pos = 0; pos = 0; pos -= 1) {// iet no 95 grādiem līdz 0 grādiem myservo.write (pos); // sakiet servo, lai tas mainītos 'pos' kavējumā (15); // gaida 15 ms, lai servo sasniegtu pozīciju}} */} void startWiFi () {// Mēģiniet izveidot savienojumu ar dažiem piekļuves punktiem. Pēc tam gaidiet savienojumu wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // pievienojiet Wi-Fi tīklus, ar kuriem vēlaties izveidot savienojumu //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Savienojums"); while (wifiMulti.run ()! = WL_CONNECTED) {// Pagaidiet, līdz Wi-Fi savienojums aizkavējas (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Savienots ar"); Serial.println (WiFi. SSID ()); // Pastāsti, ar kādu tīklu mēs esam savienoti ar Serial.print ("IP adrese: / t"); Sērijas nospiedums (WiFi.localIP ()); // Nosūtiet ESP8266 IP adresi uz datoru Serial.println ("\ r / n"); } void startUDP () {Serial.println ("UDP palaišana"); UDP.sākas (123); // Sāciet klausīties UDP ziņojumus portā 123 Serial.print ("Vietējais ports: / t"); Serial.println (UDP.localPort ()); Sērijas.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Ja nav atbildes (pagaidām), atgrieziet 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // paketes lasīšana buferī // Apvienojiet 4 laika zīmoga baitus vienā 32 bitu skaitlī uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Pārvērst NTP laiku UNIX laika zīmogā: // Unix laiks sākas 1970. gada 1. janvārī. Tas ir 2208988800 sekundes NTP laikā: const uint32_t sevenyYears = 2208988800UL; // atņem septiņdesmit gadus: uint32_t UNIXTime = NTPTime - sevenyYears; atgriezt UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // iestatīt visus baitus buferī uz 0 // Inicializēt vērtības, kas nepieciešamas, lai izveidotu NTP pieprasījumu NTPBuffer [0] = 0b11100011; // LI, versija, režīms // nosūtīt paketi, pieprasot laika zīmogu: UDP.beginPacket (adrese, 123); // NTP pieprasījumi jānosūta uz portu 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. darbība: izmantojiet to

Lieto to!
Lieto to!
Lieto to!
Lieto to!

Novietojiet vadus pie bļodas turētāja iekšpuses un pievienojiet kaķu barotāju kontaktligzdai, izmantojot USB maiņstrāvas adapteri. Vienkāršā koda rakstīšanas veids ir paredzēts palaišanai "atvērtā" stāvoklī, un tas mainīs vāka stāvokli tikai laika sliekšņos, kas norādīti Arduino skicē.

Paldies, ka sekojat līdzi! Ja jūs izveidojat savu versiju, es labprāt to redzētu sadaļā I Made It!

Ja jums patīk šis projekts, jūs varētu interesēt daži mani citi:

  • Prizmas turētājs varavīksnes portretiem
  • Saplākšņa uzglabāšanas siena ar kaķu torni
  • LED Mason Jar Lanterns (3D drukāts vāks)
  • 3D printera šķiedru sausā kaste
  • Ārkārtas USB barošanas avots (3D drukāts)
  • Kvēlojoša LED gumijas konfekte
  • 3D drukāts ģeometriskais stādītājs ar drenāžu
  • Kvēlojoši 3D drukāti ziedi
  • Kā uzstādīt gaismas diodes zem motorollera (ar Bluetooth)

Lai neatpaliktu no tā, pie kā strādāju, sekojiet man pakalpojumā YouTube, Instagram, Twitter un Pinterest.

Ieteicams: