Tartalomjegyzék:

Macskaeledel -hozzáférés -szabályozás (ESP8266 + szervomotor + 3D nyomtatás): 5 lépés (képekkel)
Macskaeledel -hozzáférés -szabályozás (ESP8266 + szervomotor + 3D nyomtatás): 5 lépés (képekkel)

Videó: Macskaeledel -hozzáférés -szabályozás (ESP8266 + szervomotor + 3D nyomtatás): 5 lépés (képekkel)

Videó: Macskaeledel -hozzáférés -szabályozás (ESP8266 + szervomotor + 3D nyomtatás): 5 lépés (képekkel)
Videó: Multiple Servo Motor Control #servo #arduino #esp32 #diy 2024, Június
Anonim
Image
Image
Macskaeledel -hozzáférés -szabályozás (ESP8266 + szervomotor + 3D nyomtatás)
Macskaeledel -hozzáférés -szabályozás (ESP8266 + szervomotor + 3D nyomtatás)

Ez a projekt átfogja azt a folyamatot, amellyel egy automatizált macskaeledelt készítettem az idős, cukorbeteg macskámnak, Chaznak. Látja, reggeliznie kell, mielőtt megkapná az inzulinját, de gyakran elfelejtem felvenni az ételét, mielőtt lefekszem, ami elrontja az étvágyát, és leállítja az inzulinbeosztását. Ez az étel szervo motorral zárja le a fedelet az étel felett éjfél és reggel 7.30 között. A NodeMCU ESP8266 mikrovezérlő Arduino vázlata a hálózati időprotokollt (NTP) használja az ütemezés vezérléséhez.

Ez a projekt nem alkalmas fiatalabb, aktívabb macskák számára. Chaz olyan öreg és törékeny, hogy nem hajlandó kinyitni a tálat, de lehetséges.

Ha még nem ismeri az Arduino -t vagy az ESP8266 -ot, akkor a következő előfeltételekhez kapcsolódó útmutatókat élvezheti:

  • Utasítható Arduino osztály
  • Utasítható dolgok internete

Kellékek

  • 3D nyomtató (Creality CR-10s Pro-t használok)
  • 3D nyomtatószál (arany PLA -t használok)
  • NodeMCU ESP8266 wifi mikrokontroller
  • USB kábel (A - microB)
  • USB hálózati adapter
  • Mikroszervó motor
  • Kis csavarhúzó és csavarok
  • Csatlakozó vezeték
  • Fejléc csapok
  • Perma-proto tábla

Ha lépést akar tartani azzal, amin dolgozom, kövessen a YouTube -on, az Instagram -on, a Twitteren, a Pinteresten, és iratkozzon fel hírlevelemre. Amazon -munkatársként a kapcsolt linkjeim segítségével végzett minősített vásárlásokból keresek.

1. lépés: 3D nyomtatott alkatrészek

3D nyomtatott alkatrészek
3D nyomtatott alkatrészek
3D nyomtatott alkatrészek
3D nyomtatott alkatrészek

A macskatáp táltartó Ardy Lai Thingiverse -n alapuló tervezésén alapul. Nagyobbá tettem, hogy elférjen a macskám tálja, és rövidebbre is tettem, mivel a méretezés túl magas lett. Hozzáadtam egy tartót egy mikroszervo motorhoz, és néhány lyukat a kábelekhez, amelyek a belsejébe vezethetők.

Egy egyszerű fedelet modelleztem Tinkercad segítségével, amelyet úgy terveztek, hogy a mikroszervó szarvához rögzítse. A designomat közvetlenül a Tinkercad -ból szerezheti be, és/vagy letöltheti az ehhez a lépéshez csatolt STL -eket.

Az alkatrészeket a Creality CR-10s Pro nyomtatómra nyomtam, arany PLA szállal.

Nyilvánosságra hozatal: írásom idején a Tinkercad -ot gyártó Autodesk alkalmazottja vagyok.

Lépés: Csatlakoztassa a fedelet a szervomotorhoz

Csatlakoztassa a fedelet a szervomotorhoz
Csatlakoztassa a fedelet a szervomotorhoz
Csatlakoztassa a fedelet a szervomotorhoz
Csatlakoztassa a fedelet a szervomotorhoz

Egy kis fúrószárral növeltem a szervo kürtön lévő lyukak méretét, majd csavarokkal rögzítettem a szervót a 3D nyomtatott fedélhez.

3. lépés: Építse fel a NodeMCU ESP8266 áramkört

Építse fel a NodeMCU ESP8266 áramkört
Építse fel a NodeMCU ESP8266 áramkört
Építse fel a NodeMCU ESP8266 áramkört
Építse fel a NodeMCU ESP8266 áramkört
Építse fel a NodeMCU ESP8266 áramkört
Építse fel a NodeMCU ESP8266 áramkört
Építse fel a NodeMCU ESP8266 áramkört
Építse fel a NodeMCU ESP8266 áramkört

Az áramkört egy NodeMCU ESP8266 wifi mikrokontroller vezérli. Fejléccsapokat használtam egy perma-proto táblán, hogy a mikroszervo motor könnyen leválasztható legyen. A szervo fejrészek az alábbiak szerint vannak csatlakoztatva a NodeMCU-hoz:

Sárga szervohuzal: NodeMCU D1

Piros szervóhuzal: NodeMCU táp (3V3 vagy VIN)

Fekete szervohuzal: NodeMCU földelés (GND)

Lépés: Töltse fel az Arduino kódot és a tesztet

Töltse fel az Arduino kódot és tesztet
Töltse fel az Arduino kódot és tesztet

Szerelje be a motor/fedél szerelvényt a tálca tartó 3D nyomtatott részének motor alakú kivágásába. Csatlakoztassa a motor fejét a mikrokontroller kártya fejléceihez, és csatlakoztassa az áramkört a számítógéphez USB -kábellel.

Az Arduino-vázlat a Network Time Protocol protokollt használja az aktuális idő lekéréséhez, majd nyitva vagy zárva tartja a fedelet egy keményen kódolt ütemezés szerint. Másolja ki a következő kódot, frissítse a wifi hitelesítő adatait és az UTC időeltolódást, majd töltse fel a NodeMCU kártyára az Arduino IDE használatával.

#befoglalni

#include #include #include ESP8266WiFiMulti wifiMulti; // Az ESP8266WiFiMulti osztály példányának létrehozása, wifiMulti WiFiUDP UDP néven; // Hozzon létre egy példányt a WiFiUDP osztályból IPAddress küldésére és fogadására timeServerIP; // time.nist.gov NTP szerver cím const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Az NTP időbélyegző az üzenet első 48 bájtjában van, bájt NTPBuffer [NTP_PACKET_SIZE]; // puffer a bejövő és kimenő csomagok tárolására Servo myservo; // szervoobjektum létrehozása a szervó vezérlésére // tizenkét szervo objektum hozható létre a legtöbb táblán int pos = 0; // változó a szervo pozíció tárolására void setup () {myservo.attach (5); // csatolja a szervót az 5 -ös tűn, azaz D1 -en a szervo objektumhoz // alapértelmezés szerint nyissa ki a fedelet Serial.println ("a fedél kinyitása"); for (pos = 95; pos> = 0; pos -= 1) {// 95 fokról 0 fokra megy myservo.write (pos); // mondja meg a szervónak, hogy menjen a pozícióba a "pos" késleltetésben (15); // 15 ms -ot vár, amíg a szervó eléri a pozíciót} Serial.begin (115200); // Indítsa el a soros kommunikációt, hogy üzeneteket küldjön a számítógépnek késleltetés (10); Serial.println ("\ r / n"); startWiFi (); // Próbáljon csatlakozni néhány megadott hozzáférési ponthoz. Ezután várja meg a kapcsolat indításátUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Az NTP -kiszolgáló Serial.println IP -címének lekérése ("A DNS -keresés sikertelen. Újraindítás."); Serial.flush (); ESP.reset (); } Serial.print ("Időszerver IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nNTP kérés küldése …"); sendNTPpacket (timeServerIP); } előjel nélküli hosszú intervallumNTP = 60000; // NTP idő kérése percenként unsigned long prevNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t timeUNIX = 0; unsigned long prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Ha egy perc telt el az utolsó NTP -kérés óta prevNTP = currentMillis; Serial.println ("\ r / nNTP kérés küldése …"); sendNTPpacket (timeServerIP); // NTP kérés küldése} uint32_t time = getTime (); // Ellenőrizze, hogy érkezett -e NTP válasz, és kapja meg a (UNIX) időt, ha (idő) {// Ha új időbélyeg érkezett, timeUNIX = time; Serial.print ("NTP válasz: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if (((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Több mint 1 óra az utolsó NTP válasz óta. Újraindítás."); Serial.flush (); ESP.reset (); } uint32_t aktualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (ténylegesidő! = prevActualTime && timeUNIX! = 0) {// Ha egy másodperc telt el az utolsó nyomtatás óta prevActualTime = ténylegesidő; Serial.printf ("\ rUTC idő: / t%d:%d:%d", getHours (tényleges idő), getMinutes (tényleges idő), getSeconds (tényleges idő)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (eastTime)); Sorozat.println (); } // 7:30 am if (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// nyissa ki a fedelet Serial.println ("a fedél kinyitása"); for (pos = 95; pos> = 0; pos -= 1) {// 95 fokról 0 fokra megy myservo.write (pos); // mondja meg a szervónak, hogy menjen a pozícióba a "pos" késleltetésben (15); // 15 ms -ot vár, amíg a szervó eléri a pozíciót}} // éjfél, ha (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// csukja be a fedelet Serial. println ("a fedél lezárása"); for (pos = 0; pos <= 95; pos += 1) {// 0 fokról 95 fokra megy 1 fokos lépésekben myservo.write (pos); // mondja meg a szervónak, hogy menjen a pozícióba a "pos" késleltetésben (15); // 15 ms -ig vár, amíg a szervó eléri a pozíciót}} /* // teszteli, hogy (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// csukja be a fedelet Serial.println ("a fedél lezárása"); for (pos = 0; pos = 0; pos -= 1) {// 95 fokról 0 fokra megy myservo.write (pos); // mondja meg a szervónak, hogy menjen a pozícióba a "pos" késleltetésben (15); // 15 ms -ot vár, amíg a szervó eléri a pozíciót}} * */ void startWiFi () {// Próbáljon meg csatlakozni néhány megadott hozzáférési ponthoz. Ezután várja meg a kapcsolatot wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // olyan Wi-Fi hálózatok hozzáadása, amelyekhez csatlakozni szeretne //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Csatlakozás"); while (wifiMulti.run ()! = WL_CONNECTED) {// Várja meg a Wi-Fi csatlakozási késleltetését (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Csatlakoztatva"); Serial.println (WiFi. SSID ()); // Mondja el, hogy milyen hálózathoz kapcsolódunk a Serial.print ("IP -cím: / t"); Serial.print (WiFi.localIP ()); // Küldje el az ESP8266 IP -címét a számítógépnek Serial.println ("\ r / n"); } void startUDP () {Serial.println ("UDP indítása"); UDP.begin (123); // Kezdje el figyelni az UDP üzeneteket a 123 -as porton Serial.print ("Helyi port: / t"); Serial.println (UDP.localPort ()); Sorozat.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Ha nincs válasz (még), adja vissza 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // a csomag beolvasása a pufferbe // Kombinálja a 4 időbélyeg bájtját egy 32 bites számba uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Az NTP idő konvertálása UNIX időbélyegzővé: // A Unix idő 1970. január 1 -jén kezdődik. Ez 2208988800 másodperc NTP idő alatt: const uint32_t sevenyYears = 2208988800UL; // kivonni hetven évet: uint32_t UNIXTime = NTPTime - sevenyYears; return UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // állítsa a puffer összes bájtját 0 -ra // Inicializálja az NTP kérés létrehozásához szükséges értékeket NTPBuffer [0] = 0b11100011; // LI, verzió, mód // csomag küldése időbélyeget kérve: UDP.beginPacket (cím, 123); // Az NTP kérések a 123 -as UDP portra íródnak (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. lépés: Használd

Használd!
Használd!
Használd!
Használd!

Vezesse el a vezetékeket a tál tartó belsejébe, és csatlakoztassa a macskaadagolót egy konnektorhoz egy USB hálózati adapter segítségével. Az egyszerű kód írásának módja "nyitott" állapotban történő indításra szolgál, és csak az Arduino vázlatban meghatározott időküszöbökön változtatja meg a fedél helyzetét.

Köszönöm, hogy követtek! Ha elkészíted a saját verziódat, szívesen megnézném az alábbi Készített részben!

Ha tetszik ez a projekt, akkor érdekelhet néhány más is:

  • Prizma tartó szivárvány portrékhoz
  • Rétegelt lemez tárolófal macska toronnyal
  • LED Mason Jar Lanterns (3D nyomtatott fedél)
  • 3D nyomtatószál száraz doboz
  • Sürgősségi USB áramforrás (3D nyomtatott)
  • Izzó LED gumicukor
  • 3D nyomtatott geometriai vetőgép vízelvezetéssel
  • Ragyogó 3D nyomtatott virágok
  • LED -ek telepítése robogó alá (Bluetooth -on)

Ha lépést akar tartani azzal, amin dolgozom, kövessen engem a YouTube -on, az Instagramon, a Twitteren és a Pinteresten.

Ajánlott: