สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
นวัตกรรมทางเทคนิคสี่ประการทำให้โครงการนี้เป็นไปได้: 1977 Rowe AMI Jukebox, ชุดแขนหุ่นยนต์ PlotClock, ไมโครคอนโทรลเลอร์ WeMos/ESP 8266 และบริการ Blynk App/Cloud
หมายเหตุ: หากคุณไม่มีตู้เพลงอยู่ในมือ อย่าหยุดอ่าน! โครงการนี้สามารถนำมาใช้เพื่อควบคุมสิ่งต่าง ๆ ที่ควบคุมด้วยนิ้วมือของมนุษย์ได้อย่างง่ายดาย ตัวอย่างหนึ่งอาจเป็นนิ้วของหุ่นยนต์ที่เล่นระนาดแบบดั้งเดิม – บางทีคำแนะนำนั้นอาจมาจากคุณ!
Rowe AMI R-81 Jukebox อายุ 40 ปีของฉันยังคงทำงานได้ดีในการเล่นซิงเกิลไวนิลแบบวินเทจจากยุค 60's 70' และ 80's น้ำหนักมากกว่า 160 กก. (360 ปอนด์) เครื่องเล่นนี้ไม่พกพาง่ายเหมือนเครื่องเล่น MP สมัยใหม่ แต่ในยุคอินเทอร์เน็ต ตอนนี้คุณสามารถพกตู้เพลงและแผ่นเสียง 200 แผ่นในกระเป๋าของคุณ - แน่นอน! และคุณยังสามารถใช้เพลย์ลิสต์ของคุณเองที่จัดเก็บไว้ในไมโครคอนโทรลเลอร์ได้อีกด้วย!
หุ่นยนต์ Amazing PlotClock ได้รับการออกแบบมาเพื่อแสดงเวลาปัจจุบันโดยการวาดตัวเลขเวลาบนกระดานที่ลบได้ การปรับตัวของฉันสำหรับ PlotClock คือการใช้มันเป็นนิ้วหุ่นยนต์สำหรับการกดปุ่มเลือกเพลงของ Jukebox
Plotclock”finger” นั้นขับเคลื่อนด้วยเซอร์โว 3 ตัวที่ควบคุมโดยไมโครคอนโทรลเลอร์ WeMos สิ่งมหัศจรรย์ชิ้นนี้ (เกือบ) เข้ากันได้กับ Arduino Uno และมีความสามารถ WiFi ดังนั้นจึงสามารถควบคุมตู้เพลงแบบไร้สายได้จากทุกที่ในโลก
ครีมบนเค้กมาจากแอพ Blynk ที่ใช้งานง่ายอย่างไม่น่าเชื่อและ Blynk Cloud Server ที่ให้ส่วนต่อประสานผู้ใช้โทรศัพท์มือถือ / แท็บเล็ตที่ดีพร้อมความคล่องตัวเต็มรูปแบบ
ขั้นตอนที่ 1: ฮาร์ดแวร์
ตู้เพลง
ตู้เพลงของโครงการคือ 1977 Rowe AMI R-81 ตู้เพลงเก่าที่มีปุ่มเลือกจะใช้งานได้ โดยสังเกตจากข้อจำกัดบางประการของ PlotClock: การออกแบบแขนดั้งเดิมของ PlotClock สามารถครอบคลุมพื้นที่ได้ประมาณ 5 x 12 ซม. ดังนั้นเลย์เอาต์ของปุ่มตู้เพลง (พื้นที่รวมถึงปุ่มเลือกทั้งหมด) จึงต้องมีขนาดประมาณนั้น ปุ่มของตู้เพลงรุ่นเก่าอาจต้องการแรงผลักมากกว่าที่เซอร์โว PlotClock สามารถให้ได้
AMI R-81 มีหน่วยความจำที่สามารถจัดเก็บการเลือกทั้งหมด 200 รายการ การเลือกจะเล่นตามลำดับที่จัดเก็บไว้ในนิตยสารบันทึก (ประเภทภาพหมุน) ไม่ใช่ลำดับที่เลือก การเลือกหลายรายการสำหรับหนึ่งบันทึกจะเล่นเพียงครั้งเดียว
พล็อตนาฬิกา
Plotclock เป็นชุด DIY ที่มีจำหน่ายทั่วไปรวมถึงชิ้นส่วนเครื่องจักรกล, 3 เซอร์โว, Arduino Uno R3, บอร์ดขยาย Arduino และสาย USB ประมาณ 30 USD นี่เป็นการซื้อที่ดี (เช่น Banggood.com) โครงการนี้ไม่ได้ใช้ Arduino, บอร์ดต่อขยาย และสาย USB
มีบทช่วยสอนทางอินเทอร์เน็ต/YouTube ดีๆ มากมายสำหรับการเขียน Plotclock - เช่น นี้: PlotClock คำแนะนำ
static1.squarespace.com/static/52cb189ee4b012ff9269fa8e/t/5526946be4b0ed8e0b3cd296/1428591723698/plotclock_final_instructions.pdf
WeMos
WeMos D1 R2 คือไมโครคอนโทรลเลอร์ที่ใช้ ESP8266 สามารถตั้งโปรแกรมโดยใช้ Arduino IDE และมีความสามารถ WiFi ดังนั้นจึงเป็นฮาร์ดแวร์ที่สมบูรณ์แบบสำหรับโครงการนี้
ขั้นตอนที่ 2: การปรับเทียบ
การสอบเทียบเป็นภารกิจในการค้นหาค่ามุมที่ถูกต้องสำหรับมุมเซอร์โว (ระหว่าง 0 ถึง 180 องศา) เพื่อให้สอดคล้องกับตำแหน่งทางกายภาพของปุ่มเลือก ค่ามุมสามารถหาได้จากเลขคณิตตรีโกณมิติหรือใช้ซอฟต์แวร์ CAD ฉันได้รับค่าประมาณจากเพื่อนของฉันที่รู้วิธีใช้ AutoCad
อย่างไรก็ตาม การสอบเทียบขั้นสุดท้ายต้องทำโดยการลองผิดลองถูก การใช้รูปแบบปุ่มที่วาดบนแผ่นกระดาษ เป็นไปได้ที่จะทำ”การทดสอบเดสก์ท็อป” เพื่อค้นหาค่ามุมที่ถูกต้อง
ขั้นตอนที่ 3: การประกอบ
การเดินสายไฟ
การเชื่อมต่อจากเซอร์โว Plotclock ไปยัง Wemos ทำได้ด้วยสายไฟ 5 เส้น: +5, GND, D4, D5 และ D6 ดูรายละเอียดในรูปและรหัส
การติดตั้งบนตู้เพลง
ฉันไม่อยากทำรูสกรูใดๆ ให้กับตู้เพลงอายุ 40 ปี ที่อยู่รอดมายาวนานโดยไม่มีความเสียหายร้ายแรง ด้วยการใช้น้ำยาซีลยางแบบอ่อน ฉันแก้ไขรายการมุมอลูมิเนียมใต้คอนโซลตู้เพลง กาวยางทำให้ยึดแน่นและสามารถแกะออกได้โดยไม่ทิ้งรอยใดๆ ตัว PlotClock ต้องการมุมอลูมิเนียมขนาดเล็กสองมุมเพื่อช่วยติดตั้งบนแผ่นอะคริลิก จากนั้นแผ่นอะคริลิกจะติดตั้งเข้ากับรายการมุมด้วยคลิปหนีบสปริงสองตัว ทำให้สามารถปรับขั้นสุดท้ายในแนวตั้งและแนวนอนได้
ขั้นตอนที่ 4: Blynk
Blynk เป็นแอปฟรีสำหรับควบคุมไมโครคอนโทรลเลอร์หลายประเภทจากระยะไกล ด้วย Blynk คุณสามารถสร้างอินเทอร์เฟซผู้ใช้ที่ดีได้อย่างง่ายดายโดยใช้วิดเจ็ตหลายประเภท มีวิดเจ็ตเดียวเท่านั้นที่จำเป็นสำหรับโปรเจ็กต์นี้: วิดเจ็ตตาราง
ขั้นตอนที่ 5: ซอฟต์แวร์
แอพ Blynk
ไม่มีการเข้ารหัสที่ด้านแอป”การสนทนา” ระหว่างแอพ (Blynk) และไมโครคอนโทรลเลอร์ (WeMos) ได้รับการจัดการโดย”Virtual pins” ซึ่งโดยพื้นฐานแล้วเป็นช่องทางสำหรับการส่งและรับข้อมูลระหว่างทั้งสอง ตัวอย่างเช่น พินเสมือนใช้เพื่อส่งหมายเลขแถวของเพลงที่เลือกจากแอป Blynk ไปยัง WeMos และ Wemos จะจัดการส่วนที่เหลือ เช่น ส่งคำสั่งไปยังเซอร์โว Plotclock
รหัส WeMos
/**************************************************************
วิดเจ็ตตารางที่ V2 ********************************************** ****************/ #define BLYNK_PRINT Serial #include #include #include char auth = "--YOUR AUTH CODE--"; //Jukebox โปรเจ็กต์ char ssid = "--YOUR SSID--"; char pass = "--รหัสผ่าน WIFI ของคุณ--"; int ค[50]; //อาร์เรย์สำหรับตำแหน่งบันทึกตู้เพลง (100-299) Servo myservo1; //ยก Servo myservo2; //แขนซ้าย Servo myservo3; // แขนขวา int pos1 = 0; int pos2 = 0; int pos3 = 0; int btn=0; การตั้งค่าเป็นโมฆะ () { myservo1.attach (2); // ปักหมุด D4, ยก myservo2.attach(14); // ปักหมุด D5 ซ้าย myservo3.attach(12); // ปักหมุด D6 ขวา myservo1.write (140); myservo2.write(90); myservo3.write(90); Serial.begin(115200); Blynk.begin(รับรองความถูกต้อง, ssid, ผ่าน); // แจ้งเตือนทันทีเมื่อเริ่มต้น //String msg = "Jukebox WeMos เชื่อมต่อกับ: "; //Blynk.notify(msg + ssid); //ล้างตารางเมื่อเริ่มต้น Blynk.virtualWrite(V2, "clr"); populateTable(); } BLYNK_WRITE(V2) //รับคำสั่งจาก Table widget V2 { String cmd = param[0].asStr(); //param[0]="select" หรือ "deselect", param[1]=row Serial.print("\nTable: BLYNK_WRITE(V2) cmd: "); Serial.print(cmd); การเลือก int = c[param[1].asInt()]; //หมายเลขแถวที่เลือกอยู่ในพารามิเตอร์ [1] Serial.println("\nSelection: "); Serial.println (เลือก); process_selection(การเลือก); } โมฆะ populateTable() { int i = 0; Serial.println("กำลังเติมตาราง…"); Blynk.virtualWrite(V2, "เพิ่ม", 0, "Be My Baby - The Supremes", 112); ค = 112; Blynk.virtualWrite(V2, "add", 1, "Number One - Jerry Williams", 176); ผม++; ค = 176; Blynk.virtualWrite(V2, "add", 2, "All My Loving - The Beatles", 184); ผม++; ค = 184; Blynk.virtualWrite(V2, "add", 3, "In the Summertime - Mungo Jerry", 236); ผม++; ค = 236; Blynk.virtualWrite(V2, "เพิ่ม", 4, "Black Cloud - Chubby Checker", 155); ผม++; ค = 155; Blynk.virtualWrite(V2, "เพิ่ม", 5, "Mamy Blue - Pop-Tops", 260); ผม++; ค = 260; Blynk.virtualWrite(V2, "เพิ่ม", 6, "It's Gonna Be Alright - Gerry & Pacemakers", 145); ผม++; ค = 145; Blynk.virtualWrite(V2, "add", 7, "My Way - Tom Jones", 193); ผม++; ค = 193; Blynk.virtualWrite(V2, "เพิ่ม", 8, "ซานเบอร์นาดิโน - คริสตี้", 149); ผม++; ค = 149; Blynk.virtualWrite(V2, "เพิ่ม", 9, "The Twist - Chubby Checker", 169); ผม++; ค = 169;
ล่าช้า (1000);
} โมฆะ process_selection (การเลือก int) { // แยกการเลือกตัวเลข 3 หลัก (เช่น 178) ถึง 3 ปุ่ม: int btn1 = int (การเลือก/100); //ปุ่มแรก Serial.println("\nBtn1: "); Serial.println(btn1); ถ้า (btn1 == 1 || btn1 == 2) // ปุ่มแรกต้องเป็น 1 หรือ 2 - มิฉะนั้นให้ทำการรีเซ็ต { push_button (btn1); การเลือก = การเลือก - (btn1 * 100); int btn2 = int(การเลือก/10); //ปุ่มที่สอง Serial.println("\nBtn2: "); Serial.println(btn2); push_button(btn2); การเลือก = การเลือก - (btn2 * 10); int btn3 = int(การเลือก); //ปุ่มที่สาม Serial.println("\nBtn3: "); Serial.println(btn3); push_button(btn3); } อื่น ๆ { push_button(11); // ปุ่มรีเซ็ต } // รีเซ็ตตำแหน่งเซอร์โวเมื่อทั้งหมดล่าช้า (2000); myservo1.write(140); myservo2.write(90); myservo3.write (90);} เป็นโมฆะ push_button (int btn) {// นี่เรียกว่า 3 ครั้งสำหรับการเลือกแต่ละครั้ง // การกดปุ่มจริงจะเสร็จสิ้นหลังจากแต่ละปุ่ม (ค้นหา 'การกดปุ่มจริง') สวิตช์ (btn) { กรณีที่ 1: set_servo_angles (134, 136); ///1 พัก; กรณีที่ 2: set_servo_angles (128, 110); ///2 พัก; กรณีที่ 3: set_servo_angles (112, 88); ///3 พัก; กรณีที่ 4: set_servo_angles (89, 68); ///4 พัก; กรณีที่ 5: set_servo_angles (62, 55); ///5 พัก; กรณีที่ 6: set_servo_angles (172, 131); ///พัก 6 ครั้ง; กรณีที่ 7: set_servo_angles (163, 106); ///7 พัก; กรณีที่ 8: set_servo_angles (140, 83); ///8 พัก; กรณีที่ 9: set_servo_angles (104, 58); //9 พัก; กรณีที่ 0: set_servo_angles (75, 36); //0 พัก; กรณีที่ 11: set_servo_angles (36, 30); //11 พัก; } // end switch } เป็นโมฆะ set_servo_angles (int pos2, int pos3) { myservo2.write (pos2); myservo3.write(pos3); // ตำแหน่งเซอร์โวพร้อม - กดปุ่มจริง: หน่วงเวลา (500); myservo1.write(60); // ล่าช้า (500); myservo1.write(140); //ขึ้นล่าช้า(500); } วงเป็นโมฆะ () { Blynk.run (); }
ขั้นตอนที่ 6: ขั้นตอนในอนาคต
วิดเจ็ตวิดีโอ - วิดีโอสดและสตรีมเสียงไปยังแอป Blynk (ทดสอบแล้ว - ใช้งานได้)
วิดเจ็ต Webhook - ดาวน์โหลดเพลย์ลิสต์ตามต้องการจากคลาวด์ (ทดสอบแล้ว - ใช้งานได้)
วิดเจ็ตตาราง - ยินดีต้อนรับการปรับปรุงเล็กน้อยในวิดเจ็ต (คำแนะนำที่ส่งไปยังนักพัฒนา Blynk)