Mục lục:

Kiểm soát truy cập thức ăn cho mèo (ESP8266 + Động cơ Servo + In 3D): 5 bước (có hình ảnh)
Kiểm soát truy cập thức ăn cho mèo (ESP8266 + Động cơ Servo + In 3D): 5 bước (có hình ảnh)

Video: Kiểm soát truy cập thức ăn cho mèo (ESP8266 + Động cơ Servo + In 3D): 5 bước (có hình ảnh)

Video: Kiểm soát truy cập thức ăn cho mèo (ESP8266 + Động cơ Servo + In 3D): 5 bước (có hình ảnh)
Video: ✨✨✨Mô hình 30 - Phân loại rác thải - Bộ Kit Microbit PH2.0 2024, Tháng sáu
Anonim
Image
Image
Kiểm soát truy cập thức ăn cho mèo (ESP8266 + Động cơ Servo + In 3D)
Kiểm soát truy cập thức ăn cho mèo (ESP8266 + Động cơ Servo + In 3D)

Dự án này xem xét lại quá trình tôi đã sử dụng để tạo ra một chiếc bát đựng thức ăn cho mèo tự động, dành cho con mèo Chaz bị bệnh tiểu đường lớn tuổi của tôi. Thấy chưa, anh ấy cần ăn sáng trước khi có thể nạp insulin, nhưng tôi thường quên gắp món ăn cho anh ấy trước khi đi ngủ, điều này làm anh ấy mất cảm giác thèm ăn và làm mất đi lịch trình insulin của anh ấy. Món ăn này sử dụng động cơ servo để đóng nắp thực phẩm trong khoảng thời gian từ nửa đêm đến 7:30 sáng. Bản phác thảo Arduino của vi điều khiển NodeMCU ESP8266 sử dụng Giao thức thời gian mạng (NTP) để kiểm soát lịch trình.

Dự án này có thể không phù hợp với những con mèo nhỏ hơn, năng động hơn. Chaz đã quá già và yếu, ông ấy không có ý định cố gắng cạy chiếc bát ra, nhưng điều đó là có thể.

Nếu bạn mới sử dụng Arduino hoặc ESP8266, bạn có thể tận hưởng các hướng dẫn điều kiện tiên quyết sau:

  • Lớp học Arduino có thể giảng dạy
  • Lớp học Internet of Things có thể giảng dạy

Quân nhu

  • Máy in 3D (tôi sử dụng Creality CR-10s Pro)
  • Dây tóc máy in 3D (Tôi đang sử dụng PLA vàng)
  • Bộ vi điều khiển wifi NodeMCU ESP8266
  • Cáp USB (A đến microB)
  • Bộ chuyển đổi nguồn USB
  • Động cơ servo siêu nhỏ
  • Tuốc nơ vít và ốc vít nhỏ
  • Trèo lên dây
  • Chân tiêu đề
  • Perma-proto board

Để cập nhật những gì tôi đang làm, hãy theo dõi tôi trên YouTube, Instagram, Twitter, Pinterest và đăng ký nhận bản tin của tôi. Với tư cách là Cộng tác viên của Amazon, tôi kiếm được từ các giao dịch mua đủ điều kiện mà bạn thực hiện bằng cách sử dụng các liên kết liên kết của tôi.

Bước 1: Các bộ phận in 3D

Bộ phận in 3D
Bộ phận in 3D
Bộ phận in 3D
Bộ phận in 3D

Giá đỡ bát đựng thức ăn cho mèo dựa trên thiết kế của Ardy Lai trên Thingiverse. Tôi đã làm cho nó lớn hơn để chứa bát mèo của tôi, và cũng làm cho nó ngắn hơn vì việc mở rộng nó đã khiến nó quá cao. Tôi đã thêm một giá đỡ cho một động cơ servo vi mô và một vài lỗ để cáp đi vào bên trong.

Tôi đã tạo mô hình một chiếc nắp đơn giản bằng Tinkercad, được thiết kế để gắn vào sừng của micro servo. Bạn có thể lấy thiết kế của tôi trực tiếp từ Tinkercad và / hoặc tải xuống các STL được đính kèm trong bước này.

Tôi đã in các bộ phận trên máy in Creality CR-10s Pro của mình bằng dây tóc PLA vàng.

Tiết lộ: tại thời điểm viết bài này, tôi là nhân viên của Autodesk, công ty sản xuất Tinkercad.

Bước 2: Gắn Nắp vào Động cơ Servo

Gắn nắp vào động cơ Servo
Gắn nắp vào động cơ Servo
Gắn nắp vào động cơ Servo
Gắn nắp vào động cơ Servo

Tôi đã sử dụng một mũi khoan nhỏ để tăng kích thước của các lỗ trên sừng servo, sau đó sử dụng vít để gắn servo vào nắp in 3D.

Bước 3: Xây dựng mạch NodeMCU ESP8266

Xây dựng mạch NodeMCU ESP8266
Xây dựng mạch NodeMCU ESP8266
Xây dựng mạch NodeMCU ESP8266
Xây dựng mạch NodeMCU ESP8266
Xây dựng mạch NodeMCU ESP8266
Xây dựng mạch NodeMCU ESP8266
Xây dựng mạch NodeMCU ESP8266
Xây dựng mạch NodeMCU ESP8266

Mạch được điều khiển bởi một vi điều khiển wifi NodeMCU ESP8266. Tôi đã sử dụng các chân tiêu đề trên bảng perma-proto để làm cho động cơ servo vi mô có thể dễ dàng tháo rời. Các đầu cắm servo được kết nối với NodeMCU như sau:

Dây servo màu vàng: NodeMCU D1

Dây servo màu đỏ: Nguồn NodeMCU (3V3 hoặc VIN)

Dây servo màu đen: NodeMCU nối đất (GND)

Bước 4: Tải lên mã Arduino và kiểm tra

Tải lên mã và thử nghiệm Arduino
Tải lên mã và thử nghiệm Arduino

Lắp cụm mô tơ / nắp của bạn vào phần cắt hình mô tơ trên phần được in 3D của giá đỡ bát. Cắm đầu cắm động cơ vào chân cắm đầu cắm của bảng vi điều khiển và cắm mạch vào máy tính của bạn bằng cáp USB.

Bản phác thảo Arduino sử dụng Giao thức thời gian mạng để tìm nạp thời gian hiện tại và sau đó mở hoặc đóng nắp theo một lịch trình được mã hóa cứng. Sao chép mã sau, cập nhật thông tin đăng nhập wifi và thời gian bù giờ UTC của bạn và tải nó lên bảng NodeMCU của bạn bằng Arduino IDE.

#bao gồm

#include #include #include ESP8266WiFiMulti wifiMulti; // Tạo một thể hiện của lớp ESP8266WiFiMulti, được gọi là 'wifiMulti' WiFiUDP UDP; // Tạo một thể hiện của lớp WiFiUDP để gửi và nhận IPAddress timeServerIP; // time.nist.gov Địa chỉ máy chủ NTP const char * NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Dấu thời gian NTP nằm trong 48 byte đầu tiên của byte thông báo NTPBuffer [NTP_PACKET_SIZE]; // bộ đệm để chứa các gói đến và đi Servo myservo; // tạo đối tượng servo để điều khiển một servo // 12 đối tượng servo có thể được tạo trên hầu hết các bảng int pos = 0; // biến lưu vị trí servo void setup () {myservo.attach (5); // gắn servo trên chân 5 aka D1 vào đối tượng servo // mở nắp theo mặc định Serial.println ("mở nắp"); for (pos = 95; pos> = 0; pos - = 1) {// đi từ 95 độ xuống 0 độ myservo.write (pos); // yêu cầu servo chuyển đến vị trí trong biến 'pos' delay (15); // đợi 15ms để servo đến vị trí} Serial.begin (115200); // Khởi động giao tiếp Serial để gửi thông báo đến máy tính delay (10); Serial.println ("\ r / n"); startWiFi (); // Cố gắng kết nối với một số điểm truy cập nhất định. Sau đó đợi kết nối startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Lấy địa chỉ IP của máy chủ NTP Serial.println ("Tra cứu DNS không thành công. Đang khởi động lại."); Serial.flush (); ESP.reset (); } Serial.print ("IP máy chủ thời gian: / t"); Serial.println (timeServerIP); Serial.println ("\ r / n Đang gửi yêu cầu NTP…"); sendNTPpacket (timeServerIP); } khoảng dài không dấuNTP = 60000; // Yêu cầu thời gian NTP mỗi phút không được đánh dấu dài trước đâyNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t timeUNIX = 0; unsigned long presActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - presNTP> khoảngNTP) {// Nếu một phút đã trôi qua kể từ lần yêu cầu NTP cuối cùng trước đó, trước khi có yêu cầu NTP = currentMillis; Serial.println ("\ r / n Đang gửi yêu cầu NTP…"); sendNTPpacket (timeServerIP); // Gửi yêu cầu NTP} uint32_t time = getTime (); // Kiểm tra xem phản hồi NTP đã đến chưa và lấy thời gian (UNIX) if (time) {// Nếu nhận được dấu thời gian mới timeUNIX = time; Serial.print ("Phản hồi NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Hơn 1 giờ kể từ lần phản hồi NTP cuối cùng. Đang khởi động lại."); Serial.flush (); ESP.reset (); } uint32_t realityTime = timeUNIX + (currentMillis - lastNTPResponse) / 1000; uint32_t westernTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse) / 1000; if (Thực tế thời gian! = Thời gian thực tế & Thời gian thực tế! 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 am if (getHours (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// mở nắp Serial.println ("mở nắp"); for (pos = 95; pos> = 0; pos - = 1) {// đi từ 95 độ xuống 0 độ myservo.write (pos); // yêu cầu servo chuyển đến vị trí trong biến 'pos' delay (15); // đợi 15ms để servo đến vị trí}} // nửa đêm if (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// đóng nắp Serial. println ("đóng nắp"); for (pos = 0; pos <= 95; pos + = 1) {// đi từ 0 độ đến 95 độ // theo từng bước 1 độ myservo.write (pos); // yêu cầu servo chuyển đến vị trí trong biến 'pos' delay (15); // đợi 15ms để servo đến vị trí}} / * // kiểm tra if (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (westernTime) == 0) {// đóng nắp Serial.println ("đóng nắp"); for (pos = 0; pos = 0; pos - = 1) {// đi từ 95 độ xuống 0 độ myservo.write (pos); // yêu cầu servo chuyển đến vị trí trong biến 'pos' delay (15); // đợi 15ms để servo đến vị trí}} * /} void startWiFi () {// Cố gắng kết nối với một số điểm truy cập nhất định. Sau đó đợi kết nối wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // thêm mạng Wi-Fi bạn muốn kết nối với //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Đang kết nối"); while (wifiMulti.run ()! = WL_CONNECTED) {// Chờ kết nối Wi-Fi trễ (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Đã kết nối với"); Serial.println (WiFi. SSID ()); // Cho chúng tôi biết chúng tôi đang kết nối mạng nào với Serial.print ("Địa chỉ IP: / t"); Serial.print (WiFi.localIP ()); // Gửi địa chỉ IP của ESP8266 đến máy tính Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Khởi động UDP"); UDP.begin (123); // Bắt đầu nghe thông báo UDP trên cổng 123 Serial.print ("Cổng cục bộ: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Nếu không có phản hồi (chưa) return 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // đọc gói tin vào bộ đệm // Kết hợp 4 byte dấu thời gian thành một số 32-bit uint32_t NTPTime = (NTPBuffer [40] << 24) | (Bộ đệm NTPB [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Chuyển đổi thời gian NTP thành dấu thời gian UNIX: // Thời gian Unix bắt đầu vào ngày 1 tháng 1 năm 1970. Đó là 2208988800 giây trong thời gian NTP: const uint32_t bảyyYears = 2208988800UL; // trừ đi bảy mươi năm: uint32_t UNIXTime = NTPTime - bảy mươi năm; trả về UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // đặt tất cả các byte trong bộ đệm thành 0 // Khởi tạo các giá trị cần thiết để hình thành yêu cầu NTP NTPBuffer [0] = 0b11100011; // LI, Phiên bản, Chế độ // gửi một gói yêu cầu dấu thời gian: UDP.beginPacket (address, 123); // Yêu cầu NTP đến cổng 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {return UNIXTime% 60; } nội tuyến int getMinutes (uint32_t UNIXTime) {return UNIXTime / 60% 60; } inline int getHours (uint32_t UNIXTime) {return UNIXTime / 3600% 24; }

Bước 5: Sử dụng nó

Sử dụng nó!
Sử dụng nó!
Sử dụng nó!
Sử dụng nó!

Luồn dây của bạn vào bên trong giá đỡ bát và cắm máng ăn cho mèo vào ổ cắm bằng bộ chuyển đổi AC USB. Cách viết mã đơn giản, nó có nghĩa là được khởi động ở trạng thái "mở" và sẽ chỉ thay đổi vị trí nắp của nó tại các ngưỡng thời gian được chỉ định trong bản phác thảo Arduino.

Cảm ơn vì đã theo dõi! Nếu bạn tạo phiên bản của riêng mình, tôi rất muốn xem nó trong phần Tôi đã tạo ra nó bên dưới!

Nếu bạn thích dự án này, bạn có thể quan tâm đến một số dự án khác của tôi:

  • Giá đỡ lăng kính cho chân dung cầu vồng
  • Tường lưu trữ ván ép với tháp mèo
  • Đèn lồng LED Mason Jar (nắp in 3D)
  • Hộp khô sợi máy in 3D
  • Nguồn điện USB khẩn cấp (in 3D)
  • Kẹo dẻo LED phát sáng
  • Máy trồng cây hình học in 3D có hệ thống thoát nước
  • Hoa in 3D phát sáng
  • Cách cài đặt đèn LED dưới xe tay ga (có Bluetooth)

Để cập nhật những gì tôi đang làm, hãy theo dõi tôi trên YouTube, Instagram, Twitter và Pinterest.

Đề xuất: