Სარჩევი:

კატის საკვების წვდომის კონტროლი (ESP8266 + სერვო ძრავა + 3D ბეჭდვა): 5 ნაბიჯი (სურათებით)
კატის საკვების წვდომის კონტროლი (ESP8266 + სერვო ძრავა + 3D ბეჭდვა): 5 ნაბიჯი (სურათებით)

ვიდეო: კატის საკვების წვდომის კონტროლი (ESP8266 + სერვო ძრავა + 3D ბეჭდვა): 5 ნაბიჯი (სურათებით)

ვიდეო: კატის საკვების წვდომის კონტროლი (ESP8266 + სერვო ძრავა + 3D ბეჭდვა): 5 ნაბიჯი (სურათებით)
ვიდეო: კატების რეაქცია კიტრის მწნილზე 2024, ივნისი
Anonim
Image
Image
კატის საკვების წვდომის კონტროლი (ESP8266 + სერვო ძრავა + 3D ბეჭდვა)
კატის საკვების წვდომის კონტროლი (ESP8266 + სერვო ძრავა + 3D ბეჭდვა)

ეს პროექტი მიდის იმ პროცესზე, რომელსაც მე ვიყენებდი კატების საკვების ავტომატური თასის შესაქმნელად, ჩემი ხანდაზმული დიაბეტიანი კატის ჩაზისთვის. ხედავთ, მას სჭირდება საუზმე, სანამ ინსულინს მიიღებს, მაგრამ მე ხშირად მავიწყდება ძილის წინ მისი კერძის აღება, რაც მას მადას აფუჭებს და ინსულინის გრაფიკს უქმნის. ეს კერძი იყენებს სერვო ძრავას, რათა დახუროს საჭმელზე შუაღამის საათიდან დილის 7:30 საათამდე. NodeMCU ESP8266 მიკროკონტროლერის Arduino ესკიზი იყენებს ქსელის დროის პროტოკოლს (NTP) გრაფიკის გასაკონტროლებლად.

ეს პროექტი შეიძლება არ იყოს შესაფერისი ახალგაზრდა, უფრო აქტიური კატებისთვის. ჩაზი იმდენად ძველი და სუსტია, მას არ აქვს სურვილი, რომ თასი გახსნას, მაგრამ ეს შესაძლებელია.

თუ თქვენ ახალი ხართ Arduino– ში ან ESP8266– ში, შეგიძლიათ ისარგებლოთ შემდეგი წინაპირობული სახელმძღვანელოებით:

  • ინსტრუქცია Arduino კლასი
  • ინსტრუქციის საგნები ინტერნეტი კლასი

მარაგები

  • 3D პრინტერი (მე ვიყენებ Creality CR-10s Pro)
  • 3D პრინტერის ძაფები (მე ვიყენებ ოქროს PLA- ს)
  • NodeMCU ESP8266 wifi მიკროკონტროლი
  • USB კაბელი (A– დან microB– მდე)
  • USB დენის ადაპტერი
  • მიკრო სერვო ძრავა
  • პატარა ხრახნიანი და ხრახნები
  • დასაკავშირებელი მავთული
  • სათაურის ქინძისთავები
  • პერმა-პროტო დაფა

იმის გასაგრძელებლად, რაზეც ვმუშაობ, გამომყევით YouTube- ზე, Instagram- ზე, Twitter- ზე, Pinterest- ზე და გამოიწერეთ ჩემი ბიულეტენი. როგორც ამაზონის ასოცირებული, მე ვიღებ შესყიდვების შესასრულებლად, რომელსაც აკეთებთ ჩემი შვილობილი ბმულების გამოყენებით.

ნაბიჯი 1: 3D ნაბეჭდი ნაწილები

3D ნაბეჭდი ნაწილები
3D ნაბეჭდი ნაწილები
3D ნაბეჭდი ნაწილები
3D ნაბეჭდი ნაწილები

კატის საკვების თასის დამჭერი ემყარება არდი ლაის დიზაინს Thingiverse- ზე. მე გავზარდე ჩემი კატის თასის განთავსება და ასევე უფრო მოკლე გავხდი მას შემდეგ, რაც მისმა გაფართოებამ ის ძალიან მაღალი გახადა. მე დავამატე მიკრო სერვო ძრავის დამჭერი და კაბელების რამდენიმე ხვრელი, რომლითაც შიგნიდან მიემართება.

მე მოვამზადე მარტივი სახურავი Tinkercad– ის გამოყენებით, რომელიც შექმნილია მიკრო სერვოის რქაზე მიმაგრებისთვის. თქვენ შეგიძლიათ აიღოთ ჩემი დიზაინი პირდაპირ Tinkercad– დან და/ან გადმოწეროთ ამ საფეხურზე დამაგრებული STL– ები.

ნაწილები დავბეჭდე ჩემს Creality CR-10s Pro პრინტერზე ოქროს PLA ძაფით.

გამჟღავნება: ამ წერის დროს, მე ვარ Autodesk- ის თანამშრომელი, რომელიც ქმნის Tinkercad- ს.

ნაბიჯი 2: მიამაგრეთ სახურავი სერვო მოტორზე

მიამაგრეთ სახურავი სერვო მოტორზე
მიამაგრეთ სახურავი სერვო მოტორზე
მიამაგრეთ სახურავი სერვო მოტორზე
მიამაგრეთ სახურავი სერვო მოტორზე

მე გამოვიყენე პატარა საბურღი, რათა გავზარდო ხვრელების ზომა სერვო რქაზე, შემდეგ კი ხრახნები გამოვიყენე, რათა სერვერი მიმაგრებულიყო 3D დაბეჭდილ სახურავზე.

ნაბიჯი 3: შექმენით NodeMCU ESP8266 წრე

შექმენით NodeMCU ESP8266 წრე
შექმენით NodeMCU ESP8266 წრე
შექმენით NodeMCU ESP8266 წრე
შექმენით NodeMCU ESP8266 წრე
შექმენით NodeMCU ESP8266 წრე
შექმენით NodeMCU ESP8266 წრე
შექმენით NodeMCU ESP8266 წრე
შექმენით NodeMCU ESP8266 წრე

წრე აკონტროლებს NodeMCU ESP8266 wifi მიკროკონტროლერს. მე გამოვიყენე სათაურის ქინძისთავები პერმა-პროტო დაფაზე, რათა მიკრო სერვო ძრავა ადვილად მოხსნადი იყოს. სერვო სათაურები დაკავშირებულია NodeMCU– თან შემდეგნაირად:

ყვითელი სერვო მავთული: NodeMCU D1

წითელი სერვო მავთული: NodeMCU ძალა (3V3 ან VIN)

შავი servo wire: NodeMCU ground (GND)

ნაბიჯი 4: ატვირთეთ Arduino კოდი და ტესტი

ატვირთეთ Arduino კოდი და ტესტი
ატვირთეთ Arduino კოდი და ტესტი

დააინსტალირეთ თქვენი ძრავის/სახურავის ასამბლეა საავტომობილო ფორმის ჭრილში თასის მფლობელის 3D ბეჭდვით ნაწილზე. შეაერთეთ ძრავის სათაური მიკროკონტროლერის დაფის სათაურის ქინძისთავებში და ჩართეთ წრე თქვენს კომპიუტერში 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; // servo ობიექტის შექმნა servo- ს გასაკონტროლებლად // თორმეტი servo ობიექტის შექმნა შესაძლებელია უმეტეს დაფებზე int pos = 0; // ცვლადი, რათა შეინახოთ servo position void setup () {myservo.attach (5); // მიამაგრებს servo pin 5 aka D1- ს servo ობიექტზე // გახსენით სახურავი ნაგულისხმევად Serial.println ("სახურავის გახსნა"); for (pos = 95; pos> = 0; pos -= 1) {// მიდის 95 გრადუსიდან 0 გრადუსამდე myservo.write (pos); // უთხარი სერვოს, რომ წავიდეს პოზიტიურში ცვლადი 'pos' დაგვიანებით (15); // ელოდება 15 წმ სანამ სერვო მიაღწევს პოზიციას} Serial.begin (115200); // დაიწყეთ სერიული კომუნიკაცია კომპიუტერთან შეტყობინებების გასაგზავნად (10); Serial.println ("\ r / n"); startWiFi (); // სცადეთ დაკავშირება მოცემულ წვდომის წერტილებთან. შემდეგ დაელოდეთ კავშირის startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// მიიღეთ NTP სერვერის IP მისამართი Serial.println ("DNS ძებნა ვერ მოხერხდა. გადატვირთვა."); Serial.flush (); ESP.reset (); } Serial.print ("დროის სერვერის IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / n NTP მოთხოვნის გაგზავნა …"); sendNTP პაკეტი (timeServerIP); } ხელმოუწერელი ხანგრძლივი ინტერვალი NTP = 60000; // მოითხოვეთ NTP დრო ყოველ წუთს ხელმოუწერელი ხანგრძლივი prevNTP = 0; ხელმოუწერელი გრძელი ბოლო NTPResponse = millis (); uint32_t დრო UNIX = 0; ხელმოუწერელი ხანგრძლივი prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// თუ ერთი წუთი გავიდა ბოლო NTP მოთხოვნიდან prevNTP = currentMillis; Serial.println ("\ r / n NTP მოთხოვნის გაგზავნა …"); sendNTP პაკეტი (timeServerIP); // NTP მოთხოვნის გაგზავნა} uint32_t time = getTime (); // შეამოწმეთ ჩამოვიდა თუ არა NTP პასუხი და მიიღეთ (UNIX) დრო თუ (დრო) {// თუ ახალი დროის ნიშნული იქნა მიღებული დრო UNIX = დრო; Serial.print ("NTP პასუხი: / t"); Serial.println (დრო UNIX); lastNTPResponse = მიმდინარე მილი; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("ბოლო NTP პასუხიდან 1 საათზე მეტია. გადატვირთვა."); Serial.flush (); ESP.reset (); } uint32_t ფაქტობრივი დრო = დრო UNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = დრო UNIX - 18000 + (მიმდინარე მილილი - ბოლო NTP პასუხი)/1000; თუ (ფაქტობრივი დრო! = prevActualTime && დრო UNIX! = 0) {// თუ წამში გავიდა ბოლო ბეჭდვის შემდეგ prevActualTime = ფაქტობრივი დრო; Serial.printf ("\ rUTC დრო: / t%d:%d:%d", getHours (actualTime), getMinutes (ფაქტობრივი დრო), getSeconds (ფაქტობრივი დრო)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (EasternTime)); Serial.println (); } // დილის 7:30 საათზე, თუ (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// გახსენით სახურავი Serial.println ("ხსნის სახურავს"); for (pos = 95; pos> = 0; pos -= 1) {// მიდის 95 გრადუსიდან 0 გრადუსამდე myservo.write (pos); // უთხარი სერვოს, რომ წავიდეს პოზიტიურში ცვლადი 'pos' დაგვიანებით (15); // ელოდება 15 წმ სერვოს პოზიციის მისაღწევად}} // შუაღამისას თუ (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// დახურეთ სახურავი სერიული. println ("სახურავის დახურვა"); for (pos = 0; pos <= 95; pos += 1) {// მიდის 0 გრადუსიდან 95 გრადუსამდე // 1 გრადუსიანი ნაბიჯებით myservo.write (pos); // უთხარი სერვოს, რომ წავიდეს პოზიტიურში ცვლადი 'pos' დაგვიანებით (15); // ელოდება 15 წმ სერვოს პოზიციის მისაღწევად}} /* // ტესტირება თუ (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// დახურეთ სახურავი Serial.println ("სახურავის დახურვა"); for (pos = 0; pos = 0; pos -= 1) {// მიდის 95 გრადუსიდან 0 გრადუსამდე myservo.write (pos); // უთხარი სერვოს, რომ წავიდეს პოზიტიურში ცვლადი 'pos' დაგვიანებით (15); // ელოდება 15 წმ სანამ სერვო მიაღწევს პოზიციას}} */} 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.println ("\ r / n"); Serial.print ("დაკავშირებულია"); Serial.println (WiFi. SSID ()); // გვითხარით რა ქსელთან ვართ დაკავშირებული Serial.print ("IP მისამართი: / t"); Serial.print (WiFi.localIP ()); // გაუგზავნეთ ESP8266- ის IP მისამართი კომპიუტერს Serial.println ("\ r / n"); } void startUDP () {Serial.println ("დაწყებული UDP"); UDP. დასაწყისი (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 დრო იწყება 1970 წლის 1 იანვარს. ეს არის 2208988800 წამი NTP დროში: const uint32_t სამოცდაათი წელი = 2208988800UL; // გამოვაკლოთ სამოცდაათი წელი: uint32_t UNIXTime = NTPTime - სამოცდაათი წელი; დაბრუნება UNIXTime; } void sendNTPpacket (IPAddress & address) {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) {დაბრუნება UNIXTime % 60; } inline int getMinutes (uint32_t UNIXTime) {დაბრუნება UNIXTime / 60 % 60; } inline int getHours (uint32_t UNIXTime) {დაბრუნება UNIXTime / 3600 % 24; }

ნაბიჯი 5: გამოიყენეთ იგი

Გამოიყენე!
Გამოიყენე!
Გამოიყენე!
Გამოიყენე!

გაუშვით თქვენი მავთულები თასის საყრდენის შიგნით და შეაერთეთ თქვენი კატის მიმწოდებელი ქსელში USB AC ადაპტერის გამოყენებით. როგორც მარტივი კოდი იწერება, ის იგულისხმება ჩატვირთვაში "ღია" მდგომარეობაში და შეიცვლის სახურავის პოზიციას მხოლოდ არდუინოს ესკიზში მითითებული დროის ზღურბლზე.

მადლობა თანადგომისთვის! თუ თქვენ შექმნით თქვენს საკუთარ ვერსიას, დიდი სიამოვნებით ვნახავდი მას ქვემოთ, I made it!

თუ მოგწონთ ეს პროექტი, შეიძლება დაგაინტერესოთ ზოგიერთი სხვა:

  • პრიზმის მფლობელი ცისარტყელის პორტრეტებისთვის
  • პლაივუდის შესანახი კედელი კატის კოშკით
  • LED Mason Jar Lanterns (3D დაბეჭდილი სახურავი)
  • 3D პრინტერის ძაფის მშრალი ყუთი
  • გადაუდებელი USB დენის წყარო (3D ბეჭდვით)
  • მბზინავი LED Gummy Candy
  • 3D დაბეჭდილი გეომეტრიული პლანტერი დრენაჟით
  • გაბრწყინებული 3D დაბეჭდილი ყვავილები
  • როგორ დააინსტალიროთ LED- ები სკუტერის ქვეშ (Bluetooth– ით)

იმის გასაგრძელებლად, რაზეც ვმუშაობ, გამომყევით YouTube- ზე, Instagram- ზე, Twitter- ზე და Pinterest- ზე.

გირჩევთ: