جدول المحتويات:

التحكم في الوصول إلى طعام القطط (ESP8266 + محرك سيرفو + طباعة ثلاثية الأبعاد): 5 خطوات (بالصور)
التحكم في الوصول إلى طعام القطط (ESP8266 + محرك سيرفو + طباعة ثلاثية الأبعاد): 5 خطوات (بالصور)

فيديو: التحكم في الوصول إلى طعام القطط (ESP8266 + محرك سيرفو + طباعة ثلاثية الأبعاد): 5 خطوات (بالصور)

فيديو: التحكم في الوصول إلى طعام القطط (ESP8266 + محرك سيرفو + طباعة ثلاثية الأبعاد): 5 خطوات (بالصور)
فيديو: Side Iron [Maker Update #157] - Maker.io 2024, يونيو
Anonim
Image
Image
التحكم في الوصول إلى طعام القطط (ESP8266 + محرك سيرفو + طباعة ثلاثية الأبعاد)
التحكم في الوصول إلى طعام القطط (ESP8266 + محرك سيرفو + طباعة ثلاثية الأبعاد)

يمر هذا المشروع بالعملية التي استخدمتها لإنشاء وعاء طعام قطط آلي لقطتي المسنة تشاز. انظر ، إنه يحتاج إلى تناول وجبة الإفطار قبل أن يتمكن من الحصول على الأنسولين ، لكنني غالبًا ما أنسى أن أحضر طبق طعامه قبل أن أخلد إلى الفراش ، مما يفسد شهيته ويلغي جدول الأنسولين الخاص به. يستخدم هذا الطبق محركًا مؤازرًا لإغلاق غطاء فوق الطعام بين ساعات منتصف الليل والساعة 7:30 صباحًا. يستخدم رسم Arduino الخاص بالمتحكم الدقيق NodeMCU ESP8266 بروتوكول وقت الشبكة (NTP) للتحكم في الجدول.

قد لا يكون هذا المشروع مناسبًا للقطط الأصغر سنًا والأكثر نشاطًا. تشاز قديم جدًا وضعيف ، ولا يميل إلى محاولة فتح الوعاء ، لكن هذا ممكن.

إذا كنت جديدًا على Arduino أو ESP8266 ، فيمكنك الاستمتاع بإرشادات المتطلبات المسبقة التالية:

  • دروس اردوينو
  • Instructables إنترنت الأشياء Class

اللوازم

  • طابعة ثلاثية الأبعاد (أستخدم Creality CR-10s Pro)
  • خيوط طابعة ثلاثية الأبعاد (أستخدم PLA ذهبي)
  • متحكم واي فاي NodeMCU ESP8266
  • كابل USB (من A إلى microB)
  • محول طاقة USB
  • محرك سيرفو صغير
  • مفك صغير ومسامير
  • وصل الأسلاك
  • دبابيس الرأس
  • مجلس بيرما بروتو

لمواكبة ما أعمل عليه ، تابعوني على YouTube و Instagram و Twitter و Pinterest واشترك في رسالتي الإخبارية. بصفتي شريكًا في Amazon ، أكسب من عمليات الشراء المؤهلة التي تقوم بها باستخدام الروابط التابعة الخاصة بي.

الخطوة 1: أجزاء مطبوعة ثلاثية الأبعاد

أجزاء مطبوعة ثلاثية الأبعاد
أجزاء مطبوعة ثلاثية الأبعاد
أجزاء مطبوعة ثلاثية الأبعاد
أجزاء مطبوعة ثلاثية الأبعاد

يعتمد حامل وعاء طعام القطط على تصميم Ardy Lai على Thingiverse. لقد جعلتها أكبر لاستيعاب وعاء قطتي ، وجعلتها أقصر أيضًا لأن توسيعها جعلها طويلة جدًا. أضفت حاملًا لمحرك مؤازر صغير ، وبضع فتحات للكابلات لتوجيهها إلى الداخل.

لقد صممت غطاءًا بسيطًا باستخدام Tinkercad ، المصمم لربطه بقرن المؤازرة الدقيقة. يمكنك الحصول على تصميمي مباشرة من Tinkercad ، و / أو تنزيل STLs المرفقة بهذه الخطوة.

لقد قمت بطباعة الأجزاء على طابعة Creality CR-10s Pro الخاصة بي بفتيل PLA ذهبي.

الإفصاح: في وقت كتابة هذا التقرير ، كنت موظفًا في Autodesk ، مما يجعل Tinkercad.

الخطوة 2: قم بتوصيل الغطاء بمحرك سيرفو

إرفاق غطاء بمحرك سيرفو
إرفاق غطاء بمحرك سيرفو
قم بتوصيل الغطاء بمحرك سيرفو
قم بتوصيل الغطاء بمحرك سيرفو

لقد استخدمت مثقابًا صغيرًا لزيادة حجم الثقوب الموجودة على بوق المؤازرة ، ثم استخدمت البراغي لإرفاق المؤازرة بالغطاء المطبوع ثلاثي الأبعاد.

الخطوة 3: بناء دائرة NodeMCU ESP8266

بناء حلبة NodeMCU ESP8266
بناء حلبة NodeMCU ESP8266
بناء حلبة NodeMCU ESP8266
بناء حلبة NodeMCU ESP8266
بناء حلبة NodeMCU ESP8266
بناء حلبة NodeMCU ESP8266
بناء حلبة NodeMCU ESP8266
بناء حلبة NodeMCU ESP8266

يتم التحكم في الدائرة بواسطة متحكم واي فاي NodeMCU ESP8266. لقد استخدمت دبابيس رأس على لوحة perma-proto لجعل محرك سيرفو الصغير قابل للفصل بسهولة. تتصل رؤوس المؤازرة بـ NodeMCU على النحو التالي:

سلك مؤازر أصفر: NodeMCU D1

سلك مؤازر أحمر: طاقة NodeMCU (3V3 أو VIN)

سلك مؤازر أسود: NodeMCU ground (GND)

الخطوة 4: قم بتحميل كود Arduino واختباره

قم بتحميل كود اردوينو واختباره
قم بتحميل كود اردوينو واختباره

قم بتثبيت مجموعة المحرك / الغطاء في الفتحة على شكل محرك على الجزء المطبوع ثلاثي الأبعاد لحامل الوعاء. قم بتوصيل رأس المحرك في دبابيس رأس لوحة التحكم الدقيق ، وقم بتوصيل الدائرة بجهاز الكمبيوتر الخاص بك باستخدام كبل USB.

يستخدم مخطط Arduino بروتوكول وقت الشبكة لجلب الوقت الحالي ثم يفتح الغطاء أو يغلقه وفقًا لجدول زمني مشفر. انسخ الكود التالي ، وقم بتحديث بيانات اعتماد wifi الخاصة بك وإزاحة التوقيت العالمي المنسق (UTC) ، وقم بتحميله على لوحة NodeMCU الخاصة بك باستخدام Arduino IDE.

#يشمل

# تتضمن # تتضمن # تتضمن ESP8266WiFiMulti wifiMulti ؛ // قم بإنشاء مثيل لفئة ESP8266WiFiMulti ، تسمى "wifiMulti" WiFiUDP UDP ؛ // إنشاء مثيل لفئة WiFiUDP لإرسال واستقبال IPAddress timeServerIP ؛ // time.nist.gov عنوان خادم NTP const char * NTPServerName = "time.nist.gov" ؛ const int NTP_PACKET_SIZE = 48 ؛ // طابع زمني NTP موجود في أول 48 بايت من بايت الرسالة NTPBuffer [NTP_PACKET_SIZE] ؛ // المخزن المؤقت لاستيعاب الحزم الواردة والصادرة Servo myservo ؛ // إنشاء كائن مؤازر للتحكم في مؤازرة // يمكن إنشاء اثني عشر كائنًا مؤازرًا على معظم اللوحات int pos = 0 ؛ // متغير لتخزين إعداد الفراغ لموضع المؤازرة () {myservo.attach (5)؛ // يعلق المؤازرة على الدبوس 5 المعروف أيضًا باسم D1 بكائن المؤازرة // افتح الغطاء افتراضيًا Serial.println ("فتح الغطاء") ؛ لـ (pos = 95 ؛ pos> = 0 ؛ pos - = 1) {// ينتقل من 95 درجة إلى 0 درجة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // ينتظر 15 مللي ثانية حتى تصل المؤازرة إلى الموضع} Serial.begin (115200) ؛ // بدء الاتصال التسلسلي لإرسال رسائل إلى تأخير الكمبيوتر (10) ؛ Serial.println ("\ r / n")؛ startWiFi () ، // حاول الاتصال ببعض نقاط الوصول المحددة. ثم انتظر بدء اتصال UDP () ؛ if (! WiFi.hostByName (NTPServerName، timeServerIP)) {// احصل على عنوان IP لخادم NTP Serial.println ("فشل بحث DNS. إعادة التشغيل.") ؛ Serial.flush () ، ESP.reset () ، } Serial.print ("عنوان IP لخادم الوقت: / t") ؛ Serial.println (timeServerIP) ؛ Serial.println ("\ r / n إرسال طلب NTP …")؛ sendNTPpacket (timeServerIP) ؛ } فاصل زمني طويل بدون إشارة NTP = 60000 ؛ // طلب وقت NTP كل دقيقة بدون إشارة طويلة prevNTP = 0 ؛ long lastNTPResponse = millis () بدون توقيع ، uint32_t timeUNIX = 0 ؛ prevActualTime طويل بدون توقيع = 0 ؛ حلقة فارغة () {تيار طويل غير موقعة ميليس = ميليس () ؛ if (currentMillis - prevNTP> interalNTP) {// إذا مرت دقيقة منذ آخر طلب NTP prevNTP = currentMillis ؛ Serial.println ("\ r / n إرسال طلب NTP …")؛ sendNTPpacket (timeServerIP) ؛ // إرسال طلب NTP} uint32_t time = getTime () ؛ // تحقق مما إذا كانت استجابة NTP قد وصلت واحصل على وقت (UNIX) إذا (الوقت) {// إذا تم استلام طابع زمني جديد timeUNIX = time؛ Serial.print ("استجابة NTP: / t") ؛ Serial.println (timeUNIX) ؛ lastNTPResponse = currentMillis ؛ } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("أكثر من ساعة منذ آخر استجابة NTP. إعادة التشغيل.") ؛ Serial.flush () ، ESP.reset () ، } uint32_t activeTime = timeUNIX + (currentMillis - lastNTPResponse) / 1000 ؛ uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse) / 1000 ؛ if (activeTime! = prevActualTime && timeUNIX! = 0) {// إذا مرت ثانية منذ آخر طباعة prevActualTime = الفعليTime؛ Serial.printf ("\ rUTC time: / t٪ d:٪ d:٪ d"، getHours (realTime)، getMinutes (realTime)، getSeconds (realTime))؛ Serial.printf ("\ rEST (-5): / t٪ d:٪ d:٪ d" ، getHours (EasternTime) ، getMinutes (EasternTime) ، getSeconds (EasternTime)) ؛ Serial.println () ، } // 7:30 صباحًا إذا (getHours (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// open the lid Serial.println ("فتح الغطاء") ؛ لـ (pos = 95 ؛ pos> = 0 ؛ pos - = 1) {// ينتقل من 95 درجة إلى 0 درجة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // ينتظر 15 مللي ثانية حتى تصل المؤازرة إلى الموضع}} // منتصف الليل إذا (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// أغلق الغطاء التسلسلي. println ("إغلاق الغطاء") ؛ لـ (pos = 0 ؛ pos <= 95 ؛ pos + = 1) {// ينتقل من 0 درجة إلى 95 درجة // في خطوات من درجة واحدة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // ينتظر 15 مللي ثانية حتى تصل المؤازرة إلى الموضع}} / * // test if (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// أغلق الغطاء Serial.println ("إغلاق الغطاء") ؛ لـ (pos = 0 ؛ pos = 0 ؛ pos - = 1) {// ينتقل من 95 درجة إلى 0 درجة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // wait 15ms حتى تصل المؤازرة إلى الموضع}} * /} void startWiFi () {// حاول الاتصال ببعض نقاط الوصول المحددة. ثم انتظر اتصال wifiMulti.addAP ("ssid_from_AP_1"، "your_password_for_AP_1") ؛ // أضف شبكات Wi-Fi التي تريد الاتصال بها //wifiMulti.addAP("ssid_from_AP_2 "،" your_password_for_AP_2 ") ؛ //wifiMulti.addAP("ssid_from_AP_3 "،" your_password_for_AP_3 ") ؛ Serial.println ("توصيل") ؛ while (wifiMulti.run ()! = WL_CONNECTED) {// انتظر حتى تصل شبكة Wi-Fi للتأخير (250) ؛ Serial.print (".") ؛ } Serial.println ("\ r / n")؛ Serial.print ("متصل بـ") ؛ Serial.println (WiFi. SSID ()) ؛ // أخبرنا عن الشبكة التي نتصل بها بـ Serial.print ("عنوان IP: / t") ؛ Serial.print (WiFi.localIP ()) ؛ // أرسل عنوان IP الخاص بـ ESP8266 إلى الكمبيوتر Serial.println ("\ r / n") ؛ } void startUDP () {Serial.println ("بدء UDP") ؛ UDP.begin (123) ، // بدء الاستماع لرسائل UDP على المنفذ 123 Serial.print ("المنفذ المحلي: / t") ؛ Serial.println (UDP.localPort ()) ؛ Serial.println () ، } uint32_t getTime () {if (UDP.parsePacket () == 0) {// إذا لم تكن هناك استجابة (حتى الآن) فارجع 0 ؛ } UDP.read (NTPBuffer، NTP_PACKET_SIZE) ؛ // اقرأ الحزمة في المخزن المؤقت // ادمج 4 بايتات طابع زمني واحد في رقم 32 بت واحد uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43] ؛ // تحويل وقت NTP إلى طابع زمني UNIX: // يبدأ وقت Unix في 1 يناير 1970. هذا هو 2208988800 ثانية في وقت NTP: const uint32_t seventyYears = 2208988800UL؛ // طرح سبعين عامًا: uint32_t UNIXTime = NTPTime - سبعون عامًا ؛ إرجاع UNIXTime ؛ } sendNTPpacket باطل (عنوان IP وعنوان) {memset (NTPBuffer، 0، NTP_PACKET_SIZE) ؛ // قم بتعيين كل البايتات في المخزن المؤقت على 0 // تهيئة القيم المطلوبة لتكوين طلب NTP NTPBuffer [0] = 0b11100011 ؛ // LI ، الإصدار ، الوضع // أرسل حزمة تطلب طابعًا زمنيًا: UDP.beginPacket (العنوان ، 123) ؛ // طلبات NTP هي منفذ 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: استخدمها

استخدمه!
استخدمه!
استخدمه!
استخدمه!

قم بتوجيه الأسلاك الخاصة بك إلى داخل حامل الوعاء ، وقم بتوصيل وحدة تغذية القطط بمأخذ باستخدام محول التيار المتردد USB. الطريقة التي تتم بها كتابة الكود البسيط ، من المفترض أن يتم تمهيدها في حالة "الفتح" ، ولن تقوم إلا بتغيير موضع غطاءها عند الحدود الزمنية المحددة في مخطط Arduino.

شكرا للمتابعة على طول! إذا قمت بإنشاء نسختك الخاصة ، فأنا أحب أن أراها في قسم I Made It أدناه!

إذا أعجبك هذا المشروع ، فقد تكون مهتمًا ببعض الآخرين:

  • حامل موشور لصور قوس قزح
  • جدار تخزين الخشب الرقائقي مع برج القط
  • فوانيس برطمان ميسون LED (غطاء مطبوع ثلاثي الأبعاد)
  • صندوق جاف من خيوط الطابعة ثلاثية الأبعاد
  • مصدر طاقة USB للطوارئ (طباعة ثلاثية الأبعاد)
  • متوهجة LED حلوى غائر
  • زارع هندسي مطبوع ثلاثي الأبعاد مع الصرف الصحي
  • زهور متوهجة ثلاثية الأبعاد مطبوعة
  • كيفية تثبيت مصابيح LED تحت السكوتر (بالبلوتوث)

لمواكبة ما أعمل عليه ، تابعوني على YouTube و Instagram و Twitter و Pinterest.

موصى به: