Orodha ya maudhui:

Udhibiti wa Upataji Chakula cha Paka (ESP8266 + Servo Motor + 3D Uchapishaji): Hatua 5 (na Picha)
Udhibiti wa Upataji Chakula cha Paka (ESP8266 + Servo Motor + 3D Uchapishaji): Hatua 5 (na Picha)

Video: Udhibiti wa Upataji Chakula cha Paka (ESP8266 + Servo Motor + 3D Uchapishaji): Hatua 5 (na Picha)

Video: Udhibiti wa Upataji Chakula cha Paka (ESP8266 + Servo Motor + 3D Uchapishaji): Hatua 5 (na Picha)
Video: SKR 1.4 - Marlin automatic stepper fan controller 2024, Novemba
Anonim
Image
Image
Udhibiti wa Upataji Chakula cha Paka (ESP8266 + Servo Motor + 3D Printing)
Udhibiti wa Upataji Chakula cha Paka (ESP8266 + Servo Motor + 3D Printing)

Mradi huu unapita juu ya mchakato nilioutumia kuunda bakuli la chakula cha paka, kwa paka yangu mzee wa kisukari Chaz. Unaona, anahitaji kula kiamsha kinywa kabla ya kupata insulini yake, lakini mara nyingi mimi husahau kuchukua chakula chake kabla sijalala, ambayo huharibu hamu yake na kutupa ratiba ya insulini. Sahani hii hutumia servo motor kufunga kifuniko juu ya chakula kati ya masaa ya saa sita usiku na 7:30 asubuhi. Mchoro wa Arduino wa NodeMCU ESP8266 hutumia Itifaki ya Wakati wa Mtandao (NTP) kudhibiti ratiba.

Mradi huu hauwezi kufaa kwa paka mchanga, anayefanya kazi zaidi. Chaz ni mzee na dhaifu, haelekei kujaribu kufungua bakuli, lakini inawezekana.

Ikiwa wewe ni mpya kwa Arduino au ESP8266, unaweza kufurahiya miongozo ifuatayo ya lazima:

  • Darasa la Arduino la Maagizo
  • Maagizo ya Mtandao ya Darasa la Vitu

Vifaa

  • Printa ya 3D (ninatumia Pro Creality CR-10s Pro)
  • Faili ya printa ya 3D (ninatumia PLA ya dhahabu)
  • NodeMCU ESP8266 mdhibiti mdogo wa wifi
  • Kebo ya USB (A hadi microB)
  • Adapta ya umeme ya USB
  • Micro servo motor
  • Bisibisi ndogo na vis
  • Kuunganisha waya
  • Pini za kichwa
  • Bodi ya Perma-proto

Ili kuendelea na kile ninachofanya kazi, nifuate kwenye YouTube, Instagram, Twitter, Pinterest, na ujiandikishe kwa jarida langu. Kama Mshirika wa Amazon nilipata kutokana na ununuzi unaostahiki unayotumia viungo vyangu vya ushirika.

Hatua ya 1: Sehemu zilizochapishwa za 3D

Sehemu zilizochapishwa za 3D
Sehemu zilizochapishwa za 3D
Sehemu zilizochapishwa za 3D
Sehemu zilizochapishwa za 3D

Mmiliki wa bakuli la chakula cha paka anategemea muundo wa Ardy Lai kwenye Thingiverse. Nilifanya iwe kubwa zaidi kuchukua bakuli la paka wangu, na pia kuifanya fupi kwani kuiongezea ilikuwa imeifanya kuwa ndefu sana. Niliongeza mmiliki wa motor ndogo ya servo, na mashimo kadhaa ya nyaya za kuelekea ndani.

Niliunda kifuniko rahisi kutumia Tinkercad, iliyoundwa iliyoundwa kushikamana na pembe ya servo ndogo. Unaweza kunyakua muundo wangu moja kwa moja kutoka Tinkercad, na / au kupakua STL zilizounganishwa na hatua hii.

Nilichapisha sehemu kwenye printa yangu ya Uumbaji CR-10s Pro na filamenti ya dhahabu ya PLA.

Ufunuo: wakati wa maandishi haya, mimi ni mfanyakazi wa Autodesk, ambayo hufanya Tinkercad.

Hatua ya 2: Ambatisha kifuniko kwa Servo Motor

Ambatisha kifuniko kwa Servo Motor
Ambatisha kifuniko kwa Servo Motor
Ambatisha kifuniko kwa Servo Motor
Ambatisha kifuniko kwa Servo Motor

Nilitumia kisima kidogo ili kuongeza saizi ya mashimo kwenye pembe ya servo, kisha nikatumia screws kushikamana na servo kwenye kifuniko kilichochapishwa cha 3D.

Hatua ya 3: Jenga Mzunguko wa NodeMCU ESP8266

Jenga Mzunguko wa NodeMCU ESP8266
Jenga Mzunguko wa NodeMCU ESP8266
Jenga Mzunguko wa NodeMCU ESP8266
Jenga Mzunguko wa NodeMCU ESP8266
Jenga Mzunguko wa NodeMCU ESP8266
Jenga Mzunguko wa NodeMCU ESP8266
Jenga Mzunguko wa NodeMCU ESP8266
Jenga Mzunguko wa NodeMCU ESP8266

Mzunguko unadhibitiwa na mdhibiti mdogo wa wifi ya NodeMCU ESP8266. Nilitumia pini za kichwa kwenye bodi ya perma-proto ili kufanya motor ndogo ya servo ipatikane. Vichwa vya servo vimeunganishwa na NodeMCU kama ifuatavyo:

Waya wa servo ya manjano: NodeMCU D1

Waya nyekundu ya servo: NodeMCU nguvu (3V3 au VIN)

Waya nyeusi ya servo: NodeMCU ardhi (GND)

Hatua ya 4: Pakia Nambari ya Arduino na Jaribio

Pakia Nambari na Jaribio la Arduino
Pakia Nambari na Jaribio la Arduino

Sakinisha mkusanyiko wako wa gari / kifuniko kwenye kipande cha umbo la gari kwenye kishikilio cha 3D cha sehemu ya bakuli. Chomeka kichwa cha gari kwenye pini za kichwa cha bodi ya microcontroller, na unganisha mzunguko kwenye kompyuta yako na kebo ya USB.

Mchoro wa Arduino hutumia Itifaki ya Muda wa Mtandao kuchukua wakati wa sasa na kisha kufungua au kufunga kifuniko kulingana na ratiba yenye nambari ngumu. Nakili nambari ifuatayo, sasisha vitambulisho vyako vya wifi na muda uliowekwa wa UTC, na uipakie kwenye bodi yako ya NodeMCU ukitumia Arduino IDE.

# pamoja

# pamoja na # pamoja na # pamoja na ESP8266WiFiMulti wifiMulti; // Unda mfano wa darasa la ESP8266WiFiMulti, iitwayo 'wifiMulti' WiFiUDP UDP; // Unda mfano wa darasa la WiFiUDP kutuma na kupokea IPAddress timeServerIP; // time.nist.gov anwani ya seva ya NTP const char * NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Muhuri wa wakati wa NTP uko katika kaa 48 za kwanza za ujumbe Byte NTPBuffer [NTP_PACKET_SIZE]; // bafa ya kushikilia pakiti zinazoingia na zinazotoka Servo myservo; // tengeneza kitu cha servo kudhibiti vitu vya servo // vitu kumi na mbili vya servo vinaweza kuundwa kwenye bodi nyingi int pos = 0; // kutofautisha kuhifadhi nafasi ya servo batili kuanzisha () {myservo.attach (5); // inaambatisha servo kwenye pini 5 aka D1 kwa kitu cha servo // kufungua kifuniko na default Serial.println ("kufungua kifuniko"); kwa (pos = 95; pos> = 0; pos - = 1) {// huenda kutoka digrii 95 hadi digrii 0 myservo.write (pos); // sema servo kwenda kwenye msimamo katika ucheleweshaji wa 'pos' (15); // inasubiri 15ms kwa servo kufikia msimamo} Serial.begin (115200); // Anzisha mawasiliano ya serial kutuma ujumbe kwa ucheleweshaji wa kompyuta (10); Serial.println ("\ r / n"); AnzaWiFi (); // Jaribu kuungana na sehemu zingine za ufikiaji. Kisha subiri muunganisho wa startUDP (); ikiwa (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Pata anwani ya IP ya seva ya NTP Serial.println ("utaftaji wa DNS umeshindwa. Kuanzisha upya."); Serial.flush (); Kuweka upya (); } Serial.print ("IP server: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nTuma ombi la NTP …"); tumaNTPpacket (timeServerIP); } muda usiotiwa sainiNTP = 60000; // Omba wakati wa NTP kila dakika isiyosainiwa prevNTP = 0; unsigned last longNTPResponse = millis (); wakati wa uint32_UNIX = 0; prevA muda halisi = 0; kitanzi batili () {unsigned long currentMillis = millis (); ikiwa (currentMillis - prevNTP> intervalNTP) {// Ikiwa dakika imepita tangu ombi la mwisho la NTP prevNTP = currentMillis; Serial.println ("\ r / nTuma ombi la NTP …"); tumaNTPpacket (timeServerIP); // Tuma ombi la NTP} uint32_t time = getTime (); // Angalia ikiwa jibu la NTP limewasili na upate wakati wa (UNIX) ikiwa (saa) {// Ikiwa muhuri wa muda mpya umepokelewa wakatiUNIX = muda; Serial.print ("Jibu la NTP: / t"); Serial.println (mudaUNIX); mwishoNTPResponse = currentMillis; } mwingine ikiwa ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Zaidi ya saa 1 tangu majibu ya NTP ya mwisho. Kuanzisha upya."); Serial.flush (); Kuweka upya (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse) / 1000; uint32_t easternTime = wakatiUNIX - 18000 + (currentMillis - lastNTPResponse) / 1000; ikiwa (realTime! = preTActualTime && timeUNIX! = 0) {// Ikiwa sekunde imepita tangu kuchapisha mwisho prevActualTime = actualTime; Serial. Serial. Serial.println (); } // 7:30 asubuhi ikiwa (GetHours (easternTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// fungua kifuniko Serial.println ("kufungua kifuniko"); kwa (pos = 95; pos> = 0; pos - = 1) {// huenda kutoka digrii 95 hadi digrii 0 myservo.write (pos); // sema servo kwenda kwenye msimamo katika ucheleweshaji wa 'pos' (15); // inasubiri 15ms kwa servo kufikia msimamo}} // usiku wa manane ikiwa (GetHours (easternTime) == 0 && getMinutes (easternTime) == 0 && getSeconds (easternTime) == 0) {// funga mfuniko Serial. println ("kufunga kifuniko"); kwa (pos = 0; pos <= 95; pos + = 1) {// huenda kutoka digrii 0 hadi digrii 95 // kwa hatua za digrii 1 myservo.write (pos); // sema servo kwenda kwenye msimamo katika ucheleweshaji wa 'pos' (15); // inasubiri 15ms kwa servo kufikia msimamo}} / * // kupima ikiwa (GetHours (easternTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (easternTime) == 0) {// funga kifuniko Serial.println ("kufunga kifuniko"); kwa (pos = 0; pos = 0; pos - = 1) {// huenda kutoka digrii 95 hadi digrii 0 myservo.write (pos); // sema servo kwenda kwenye msimamo katika ucheleweshaji wa 'pos' (15); // inasubiri 15ms ili servo ifikie nafasi}} * /} batili startWiFi () {// Jaribu kuungana na sehemu zingine za ufikiaji. Kisha subiri unganisho wifiMulti.addAP ("ssid_from_AP_1", "password_word_for_AP_1 yako"); // ongeza mitandao ya Wi-Fi unayotaka kuunganisha kwa //wifiMulti.addAP ("tenda_kutoka_AP_2", "neno_lipya_kwa_AP_2"); //wifiMulti.addAP ("siri_kutoka_AP_3", "neno_lipya_kwa_AP_3"); Serial.println ("Kuunganisha"); wakati (wifiMulti.run ()! = WL_CONNECTED) {// Subiri Wi-Fi iunganishe kuchelewa (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Imeunganishwa na"); Serial.println (WiFi. SSID ()); // Tuambie ni mtandao gani tumeunganishwa na Serial.print ("Anwani ya IP: / t"); Rekodi ya serial (WiFi.localIP ()); // Tuma anwani ya IP ya ESP8266 kwa kompyuta Serial.println ("\ r / n"); } batili startUDP () {Serial.println ("Kuanzisha UDP"); Kuanza kwa UDP (123); // Anza kusikiliza ujumbe wa UDP kwenye bandari 123 Serial.print ("Bandari ya Mitaa: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t GetTime () {if (UDP.parsePacket () == 0) {// Ikiwa hakuna majibu (bado) rudisha 0; } Kusoma UDP (NTPBuffer, NTP_PACKET_SIZE); // soma pakiti ndani ya bafa // Unganisha kaiti 4 za muhuri wa saa kuwa nambari moja ya 32-bit uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Badilisha wakati wa NTP kwa stempu ya wakati ya UNIX: // Wakati wa Unix huanza Januari 1 1970. Hiyo ni sekunde 2208988800 kwa wakati wa NTP: const uint32_t sabiniYears = 2208988800UL; // toa miaka sabini: uint32_t UNIXTime = Muda wa NTP - Miaka sabini; kurudi UNIXTime; } batili tumaNTPpacket (IPAddress & anwani) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // weka baiti zote kwenye bafa hadi 0 // Anzisha nambari zinazohitajika kuunda ombi la NTPBuffer [0] = 0b11100011; // LI, Toleo, Njia // tuma pakiti inayouliza muhuri wa muda: UDP.beginPacket (anwani, 123); // Maombi ya NTP ni kuweka bandari 123 UDP. Andika (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {kurudi UNIXTime% 60; } inline int getMinutes (uint32_t UNIXTime) {kurudi UNIXTime / 60% 60; } inline int getHours (uint32_t UNIXTime) {kurudi UNIXTime / 3600% 24; }

Hatua ya 5: Itumie

Itumie!
Itumie!
Itumie!
Itumie!

Peleka waya zako kwa ndani ya kishika bakuli, na unganisha kipishi chako cha paka kwenye duka kwa kutumia adapta ya USB AC. Njia ambayo nambari rahisi imeandikwa, imekusudiwa kutolewa kwenye hali ya "wazi", na itabadilisha tu nafasi yake ya kifuniko kwa vizingiti vya wakati vilivyoainishwa kwenye mchoro wa Arduino.

Asante kwa kufuata pamoja! Ikiwa utafanya toleo lako mwenyewe, ningependa kuiona kwenye sehemu ya I Made It hapo chini!

Ikiwa unapenda mradi huu, unaweza kupendezwa na wengine wangu:

  • Mmiliki wa Prism kwa Picha za Upinde wa mvua
  • Ukuta wa Plywood na Mnara wa Paka
  • Taa za Mason za Jar za LED (kifuniko kilichochapishwa cha 3D)
  • 3D Printer filament Sanduku kavu
  • Chanzo cha Dharura cha USB Power (3D Imechapishwa)
  • Inang'aa Peremende ya Gummy ya LED
  • Mpandaji wa Kijiometri aliyechapishwa na 3D na Mifereji ya maji
  • Inang'aa Maua yaliyochapishwa ya 3D
  • Jinsi ya Kufunga LEDs Chini ya Pikipiki (na Bluetooth)

Ili kuendelea na kile ninachofanya kazi, nifuate kwenye YouTube, Instagram, Twitter, na Pinterest.

Ilipendekeza: