Jam Cuckoo Berdasarkan Lego Mindstorms

Dua setengah tahun yang lalu saya membeli kit Lego Mindstorms EV3 untuk mengambil langkah pertama saya dalam robotika. Setelah menggulung unit ev3dev ke controller dan bermain cukup dengan mesin SSH dan kontrol sensor, saya didinginkan untuk pembelian selama dua tahun. Alasannya adalah karena saya tidak memiliki imajinasi yang cukup untuk memungkinkannya: setelah beberapa model rakitan dari Lego Technics (baik kotak dan buatan sendiri), saya sudah terbiasa dengan keajaiban seperti mainan yang dikendalikan dari jarak jauh, dan robot sederhana seperti model-model dari Lego yang dipresentasikan di pameran Krakow, sebagai orang yang dulu bekerja pada sistem telemekanik, tidak lagi mengilhami inspirasi yang cukup. Saya tidak benar-benar ingin mengulangi pengalaman orang lain.

Pada akhirnya, saya sadar: jam kukuk bisa menjadi model yang cukup kompleks, menarik, praktis, dan tidak terlalu usang. Terinspirasi oleh ide ini, saya mulai berbisnis.

Menurut ide saya, model itu tidak hanya menjadi mainan, tetapi perangkat yang berfungsi penuh. Ini sepenuhnya mungkin: jam menggantung di dinding saya dan menampilkan waktu saat ini dalam mode 24/7. Saya tidak mengatur sendiri tugas mereproduksi mekanisme aslinya dalam semua detail - misalnya, panahnya independen, suara direproduksi melalui speaker pengontrol, dan bobot serta pendulum digunakan khusus untuk lingkungan sekitar. Karena itu, setelah mentransfer semua pekerjaan utama ke bagian perangkat lunak, saya mengumpulkan mekanisme dalam versi sesederhana mungkin. Saya tidak mendokumentasikan seluruh proses perakitan, jadi saya tidak dapat mengumpulkan model lagi dalam bentuk yang sama; Namun demikian, prinsip-prinsip dasar pemasangan perangkat lunak dan mekanika sedemikian rupa sehingga program harus bekerja dengan modifikasi minimal pada model lain yang dirakit sesuai dengan prinsip yang sama.

Jam tangan dalam berbagai bentuk disajikan dalam video yang saya posting di Youtube:


Informasi dasar tentang model disajikan dalam video. Di bawah ini saya akan memberi tahu Anda sedikit lebih detail tentang mekanika, tentang perangkat lunak, serta tentang masalah yang muncul selama perakitan dan pengoperasian desain ini.

Mekaniknya


Perakitan bagian mekanik memakan waktu 6 hari. Setelah meletakkan kotak-kotak Lego di atas meja, selama liburan Tahun Baru, saya mengumpulkan mekanisme yang berbeda dari versi final hanya di pintu-pintu di mana cuckoo hidup (lebih lanjut tentang ini di bawah). Saya tidak punya keahlian desain khusus, jadi arloji itu adalah kotak persegi panjang dengan dua tangan dan sebuah tombol bertanda titik-titik di sisi depan. Di bagian atas arloji terdapat kompartemen yang ditutup oleh dua pintu, di mana cuckoo telah duduk, dan di bagian bawah terdapat pendulum skematik dan dua beban. Bagian diambil dari beberapa set Lego: satu Lego Mindstorms EV3 (31313) , dua grader Volvo (42030) , satu truk Mercedes dengan booming pneumatik (42043) dan satu truk crane (42009) . Terlepas dari banyaknya set, hampir tidak ada detail yang cukup untuk model dengan ukuran ini - penutup arloji dirakit dari potongan-potongan warna yang berbeda, yang, bagaimanapun, tidak menarik perhatian, karena dengan pemasangan di dinding itu berada di atas ketinggian mata.

Sebagai menit, bar standar Lego Technics untuk 15 unit digunakan. Itu ditempatkan pada poros, dengan kuat menghubungkannya ke mesin. Dengan demikian, akurasi pengaturan jarum menit ternyata cukup sehingga dapat digunakan untuk menentukan waktu yang akurat untuk menit. Jarum penunjuk jam lebih pendek dan dipasang pada mekanisme putar. Ini terhubung ke mesin melalui beberapa roda gigi, sehingga ada reaksi yang cukup nyata - namun, tidak begitu besar sehingga menyebabkan masalah dengan menentukan waktu.

Tangan digerakkan oleh dua motor besar (LM). Selain itu, dipasangkan dengan masing-masing jarum eksternal, yang lain berfungsi, yang internal - untuk jarum menit, ditetapkan pada sumbu yang sama dengan yang pertama, dan untuk jam, mekanisme putar digandakan di bagian dalam arloji. Tujuan panah dalam adalah untuk menekan tombol (Sensor sentuh) sambil melewati panah luar melalui posisi atas. Dengan demikian, pengontrol memiliki kemampuan untuk menentukan posisi panah segera setelah dinyalakan, dan mengatur posisi mereka yang benar berdasarkan waktu sistem, menyelamatkan pengguna dari keharusan memasukkan secara manual panah.

Bobot memiliki fungsi dekoratif murni. Awalnya, saya berpikir untuk melakukan satu berat, yang perlahan-lahan akan lebih rendah (seperti pada arloji normal), dan kemudian dengan cepat menarik ke posisi atas (analog dari lilitan manual jam pendulum). Saya kemudian menolak opsi ini karena beberapa alasan. Pertama, mekanisme perpindahan rasio gigi antara mesin dan bobot menambah kompleksitas ekstra pada model (dan penggerak pendulum dari mesin yang sama hanya menambahnya). Kedua, eyeliner cepat, apa pun kata orang, akan menjadi operasi yang berisik, tetapi saya ingin arloji bekerja setenang mungkin. Ketiga, dalam jam kukuk konvensional, biasanya ada dua bobot (satu menyediakan jam, kukuk kedua), dan menempatkan di bagian bawah arloji segera dua roda flip untuk rantai akan menyebabkan peningkatan yang lebih besar dalam ukuran model.

Melanjutkan dari ini, saya mengambil jalan yang lebih sederhana: Saya benar-benar memasang dua beban pada arloji, tetapi menempatkannya di sirkuit umum yang dilemparkan ke atas satu roda penggerak. Dalam versi ini, bobot selalu bergerak dalam arah anti-cuaca, turun secara bergantian. Perilaku ini tidak ada hubungannya dengan jam pendulum nyata, tetapi terlihat cukup menarik.

Rantai terbuat dari trim biasa tiga unit menggunakan kombinasi kapak dan piston: piston tergelincir adalah bagian yang agak langka, dan saya menggunakan kapak untuk menggandakan panjang rantai yang dihasilkan. Itu tidak mudah untuk membuat roda yang menggerakkan rantai seperti itu tanpa selip dan rusak, tetapi pada akhirnya, itu mungkin.

Sedangkan untuk mengalihkan arah pergerakan bobot, ide pertama saya adalah membuatnya menjadi murni mekanis: ketika mengangkat ke dinding bawah kotak arloji, sumbu lebar yang dipasang langsung di atas beban menekan pelat melalui rantai yang dilewati rantai dan menyebabkan roda berputar. Saya akan menggunakan elemen switching sama dengan, misalnya, crane 42009 : roda penggerak, penggeser, memasuki kopling dengan tetangga kanan atau kiri. Gagasan ini, bagaimanapun, tidak terbang: pelat tekanan membawa bagian geser ke posisi tengah ketika tidak terlibat dengan tetangga kanan atau kiri, torsi berhenti datang ke roda, dan sakelar membeku di posisi tengah.

Untuk memperbaiki situasi ini, saya memutuskan untuk menambahkan segitiga yang dapat dipindah-pindah ke sirkuit ini, kedua sisinya memiliki panjang tetap, dan yang ketiga akan diwakili oleh bagian geser pegas yang digunakan dalam suspensi truk derek yang sama. Arti dari desain ini adalah bahwa segitiga selalu berada di sisi panel tekanan yang sesuai dengan berat angkat: ketika berat mencapai bagian atas, panel menekan pada segitiga, pegas menekan, segitiga melewati posisi keseimbangan dan kemudian "melempar" ke sisi lain, melepaskan energi yang disimpan oleh pegas. Energi ini, menurut rencanaku, seharusnya menggeser sakelar kecepatan melalui posisi setimbang, segera menerjemahkannya ke posisi berlawanan.

Namun, saya gagal menstabilkan sistem ini. Dengan ukuran jam, Anda dapat memahami bahwa mekanisme miniatur bukan hal saya, tetapi dengan peningkatan ukuran simpul, distorsi yang timbul di dalamnya menyebabkan gesekan, yang memakan sebagian besar energi switching. Setelah tersiksa dengan mekanisme ini, saya akhirnya memutuskan untuk memindahkan semua pekerjaan kotor ke mikrokontroler dengan memasang tombol di atas panel dorong (Sensor sentuh) alih-alih mekanik yang rumit.

Sedikit aritmatika sederhana. EV3 memiliki empat input dan empat output. Dua input dan dua output sudah ditempati oleh tombol dan mesin panah, masing-masing. Menambahkan ke sirkuit ini motor memutar roda rantai dan dua tombol berarti bahwa, pertama, saya tidak punya port gratis untuk menghubungkan sensor posisi cuckoo (saya pikir menggunakan pengukur jarak optik untuk keperluan ini), dan kedua, bahwa node yang tersisa (cuckoo dan pendulum) hanya memiliki satu mesin. Saya mempertimbangkan opsi di mana kedua panel dorong di atas beban akan terhubung ke tombol umum, tetapi menolaknya, karena jika saat menyalakan jam, salah satu bobot akan berada di posisi atas, menahan tombol, arloji tidak akan memiliki cukup informasi untuk memilih arah pergerakan rantai.

Karena pendulum lebih mudah dikaitkan dengan mekanisme gerakan rantai daripada dengan cuckoo (baik dalam hal sifat gerakan dan lokasinya), saya menempatkan motor besar lainnya di bagian bawah tubuh, yang, pertama, menggerakkan pendulum bolak-balik (1 putaran mesin) diterjemahkan menjadi satu ayunan lengkap pendulum), dan kedua - melalui gigi reduksi memutar roda, yang menggerakkan rantai. Sistem semacam itu memiliki kerugian bahwa ketika membalikkan arah gerakan rantai dan, dengan demikian, putaran mesin, bandul juga mengubah arah gerakan, bahkan jika itu berada di posisi tengah, yang mungkin terlihat jelek. Namun, mengubah arah pergerakan bobot adalah operasi yang agak jarang, jadi saya mengabaikan masalah ini. Kelemahan lain dari perakitan saya adalah permainan yang agak tergantikan di drive pendulum, itulah sebabnya ketika bergerak lambat, pendulum berhenti di titik yang lebih rendah untuk sepersekian detik untuk mata yang terlihat. Saya terlalu malas untuk memperbaiki masalah ini.

Berbicara tentang kecepatan bandul. Setelah bereksperimen dengannya, saya memilih nilai 30 derajat mesin per detik. Ini berarti bahwa pendulum berosilasi sepenuhnya dalam 12 detik. Ini banyak, namun, dengan meningkatnya kecepatan, mesin mulai melolong, dan prospek untuk terus mendengarkan lagunya tidak tersenyum sama sekali kepada saya. Itu terlalu malas untuk melalui mekanisme dan memperkenalkan overdrive, jadi saya memilih format "lunar". Rasio roda gigi antara mesin dan roda penggerak rantai sedemikian rupa sehingga beratnya beralih dari posisi bawah ke posisi atas dalam 40-50 menit.

Tetap bebas setelah semua manipulasi sebelumnya, port EV3 menempati motor tengah (motor Medium), yang menggerakkan cuckoo. Cuckoo itu sendiri dirakit dari bagian teknik Lego yang sama. Ketinggiannya, burung itu mencapai 11 unit dan ditempatkan pada batang yang dapat ditarik (di atas ini di truk derek yang disebutkan di atas, pemberhentian jarak jauh ditempatkan). Mekanisme miniatur memperkenalkan transmisi antara sayap burung dan ekornya, di mana saya melemparkan kabel ke dalam arloji. Panjang kabel dipilih sehingga cuckoo pergi sepenuhnya dengan sayapnya ke bawah dan hanya di ujung gerakan sedikit merentangkannya. Ternyata atmosfer - hanya pada tingkat mekanisasi model jam tangan sederhana. Tidak adanya sensor posisi dikompensasi oleh fakta bahwa drive cuckoo dinyalakan melalui gigi yang tergelincir - ini membantu untuk tidak merusak mesin, bahkan jika itu mencoba untuk memindahkan cuckoo melampaui titik batas. Pintu-pintu itu terhubung erat ke papan tempat burung itu dipasang, dan terbuka bersamaan dengan kepergian cuckoo itu sendiri.

Awalnya, saya menggunakan 11 oleh 5 untuk 1 unit panel sebagai pintu, tetapi ini ternyata merupakan ide yang buruk: ujung-ujungnya tidak bulat, dan pintu-pintu, yang menempel pada bagian yang berdekatan, sering diblokir, meninggalkan cuckoo di dalam. Video ini menunjukkan versi kedua dari rakitan pintu - trim biasa dengan tepi bundar tidak menyebabkan masalah seperti itu. Selain itu, versi "papan" pintu terbuka dan tertutup lebih tenang.

Arloji terpasang pada tali yang dibaut ke dinding. Keseluruhan struktur memiliki berat lebih dari satu kilogram.

Pada ini, deskripsi bagian mekanik, pada prinsipnya, berakhir. Hanya tetap menyebutkan bahwa model ini 100% dirakit dari Lego Mindstorms dan Lego Technics, dan satu-satunya bagian yang tidak berlaku untuk kit ini adalah kabel listrik, yang saya solder ke EV3 saya, sehingga saya tidak perlu mengganti baterai setiap saat. Kawat ini menuju ke catu daya yang terhubung ke stopkontak.

Programnya


Majelis ev3dev menyediakan binder untuk banyak bahasa pemrograman. Agar tidak mengalami kesulitan dengan perakitan, saya memutuskan untuk membatasi diri pada skrip Python. Skrip ini tersedia di repositori GitLab . Di bawah ini saya akan secara singkat membahas fungsinya.

Kode yang menggerakkan panah relatif sederhana - menghitung ulang menit dan jam ke dalam derajat rotasi mesin menggunakan data pada jumlah derajat mesin per putaran panah dan pergeseran awal panah dari posisi vertikal. Semua kesenangan dimulai ketika program mencoba untuk mendapatkan data ini.

Seperti yang sudah saya katakan, diputuskan untuk meninggalkan koneksi manual penembak. Sebaliknya, saat start-up, arloji melakukan kalibrasi dengan menentukan parameter geometri. Kalibrasi dilakukan untuk kedua tangan secara independen satu sama lain.

Algoritma kalibrasi adalah sebagai berikut. Pertama, mesin mulai berputar pada kecepatan yang relatif tinggi (saya menggunakan nilai empiris 180 derajat per detik) sampai sinyal konfirmasi berasal dari tombol yang memperbaiki posisi atas panah. Setelah itu, mesin mengatur ulang kecepatan ke 30 derajat per detik dan terus memutar panah searah jarum jam (arah putaran mesin dijahit dalam program) hingga terpisah dari titik pembukaan terakhir tombol sebesar 70 derajat. Setelah itu, panah melewati posisi atas di arah yang berlawanan, memperbaiki penutupan pertama dan bukaan terakhir dari kontak (tombol dapat berbunyi di posisi tepi). Beranjak dari pembukaan terakhir dengan 70 derajat yang sama, panah sekali lagi mengubah arah gerak ke garis lurus, dan prosedur untuk mendaftarkan sirkuit pertama dan sirkuit terakhir diulang.

Diyakini bahwa posisi atas panah sesuai dengan rata-rata aritmatika antara keempat nilai yang diperoleh. Praktek menunjukkan bahwa perkiraan ini cukup baik - penyimpangan posisi target jarum menit dari yang sebenarnya jarang lebih dari 1 langkah dan hampir tidak pernah melebihi dua langkah. (Video menunjukkan penyimpangan yang lebih signifikan karena fakta bahwa untuk tujuan pemotretan, saya menerjemahkan waktu sistem, dan tangan bergerak lebih cepat daripada selama operasi normal, meningkatkan kesalahan koreksi pada setiap revolusi, lihat di bawah.) Untuk arah searah jarum jam, backlash memakan akurasi, tetapi algoritma, tentu saja, menggunakan yang sama.

Setelah menghitung posisi atas panah dan perbedaan antara saklar pertama pada sensor dan sebenarnya posisi atas panah (nilai ini akan diperlukan untuk koreksi, lihat di bawah), algoritma kalibrasi kembali meningkatkan kecepatan mesin hingga 180 derajat per detik dan mengulangi pencarian untuk posisi atas. Perbedaan antara dua posisi atas berturut-turut menentukan panjang putaran penuh panah dalam satuan putaran mesin. Prosedur pencarian posisi teratas diulang lima kali, yang memungkinkan kami untuk meratakan nilai yang diperoleh dan sedikit meningkatkan akurasi.

Setelah kalibrasi selesai, tangan masuk ke mode tampilan waktu saat ini. Selain itu, pada setiap lingkaran panah, algoritma memperbaiki posisi di mana pemutus sirkuit pertama kali ditutup. Perbedaan antara sudut aktual dan yang diharapkan dari putaran mesin saat ini adalah jumlah koreksi; Jadi, bahkan jika panjang lingkaran penuh tidak dihitung dengan benar pada tahap kalibrasi (hasil debug menunjukkan bahwa deviasi jarang melebihi 1 derajat), koreksi pada setiap lingkaran tidak memungkinkan panah untuk bergeser karena akumulasi kesalahan.

Harap dicatat bahwa satu-satunya informasi tentang rasio mesin dan panah, yang secara eksplisit dijahit ke dalam program, adalah arah putaran mesin (maju atau mundur) yang sesuai dengan gerakan maju panah. Berkat sensor posisi, kebutuhan untuk data pada rasio roda gigi dan posisi awal panah menghilang. Jadi, jika Anda mengumpulkan arloji yang, selain jam dan menit, jarum detik juga akan disajikan, algoritme akan memungkinkan Anda untuk menggunakannya dengan menambahkan hanya beberapa baris, tanpa membuang waktu untuk menghitung gigi.

Apa yang hilang dalam program gerakan panah adalah perlindungan terhadap kelebihan atau hilangnya keakuratan. Saya tidak menyelidiki pertanyaan tentang apa yang akan terjadi sebelumnya: kedalaman bit dari sudut putaran mesin akan meluap, atau panah akan mulai bergerak tersentak-sentak karena keberangkatan akurasi dalam angka yang lebih tinggi dari angka floating-point. Namun, latihan menunjukkan bahwa pada waktu beberapa minggu, hal seperti ini tidak terjadi. Jika saya pernah menemui masalah ini, kemungkinan besar saya hanya akan menambahkan perintah pengaturan ulang mesin pada setiap putaran, dengan koreksi sudut yang sesuai dalam program.

Jika kelas Hand di program saya bertanggung jawab untuk pergerakan panah, maka kelas LedIndication kemudian menyala, lalu matikan LED pada panel depan EV3. Saya tahu bahwa efek yang sama dapat dicapai dengan satu tim, tetapi pada awalnya fitur ini dirancang untuk melacak crash program, dan kemudian tetap ada. Tidak ada yang lebih menarik di kelas ini.

Kelas Pendulum bertanggung jawab atas pergerakan bobot dan pendulum.Algoritme hanya menyalakan mesin dalam satu arah dan memutarnya dengan kecepatan konstan sampai tombol yang sesuai dengan pengangkatan lengkap berat ini dijepit; setelah itu, arah gerakan motor terbalik.

Di kelas ini, omong-omong, perlindungan terhadap crash program disajikan, yang terdiri dari fakta bahwa mesin menyala hanya 2 detik dengan periode pembaruan perintah 1 detik. Jika saya menyalakan mesin dalam mode rotasi konstan, maka ketika program mogok, mengistirahatkan tombol, saya akan terus bergerak ke atas, yang dapat menyebabkan motor kelebihan beban, tergelincir roda gigi atau bahkan kerusakan pada mekanisme. Perlindungan memungkinkan Anda untuk mencegah masalah ini.

Akhirnya, kelas Cuckoo menjalankan cuckoo setiap kali nilai 59 menit diganti dengan nilai 0 menit. Pertama, kukuk didorong sepenuhnya, lalu kukuk sekali, mereproduksi suara melalui speaker EV3, dan kemudian lagi bersembunyi di kotak arloji. Gerakan ini diulangi sesuai dengan jam saat ini - dari 1 hingga 12 kali. Suara itu diambil dari perpustakaan FreeSound gratis dan diedit agar terdengar lebih baik di EV3. (Saya tidak dapat mengatakan bahwa saya senang dengan hasilnya, karena bass hampir tidak terdengar ketika palu mengenai musim semi.)

Penundaan antara perintah penghapusan kukuk dan perintah reproduksi suara dipilih secara eksperimental sehingga suara terdengar pada saat ketika kukuk mencapai posisi ekstrem. Namun, ev3dev memiliki sedikit masalah dengan ini: karena pemuatan sistem, suara lambat secara berkala, terutama jika ada koneksi SSH ke jam pada saat itu. Penundaan bisa sampai beberapa detik. Saya tidak yakin apakah ini masalah untuk controller saya, build itu sendiri, atau pembaruan yang diterima dari jaringan (setelah menginstal ev3dev, saya tidak terbiasa menggunakan perintah apt get upgrade, walaupun saya mungkin seharusnya tidak melakukan itu), tetapi rata-rata cuckoo terdengar normal, jadi Saya tidak akan men-debug pertanyaan ini.

Ngomong-ngomong, bug terhubung dengan penundaan suara di salah satu versi awal program, ketika saya belum menambahkan harapan akhir pemutaran: jika kukuk berhasil bersembunyi dan muncul kembali selama waktu tunda, suara berikutnya โ€œtertelanโ€, dan jumlah โ€œkukukโ€ tidak cocok. jumlah jam. Kemudian, saya memodifikasi program sehingga cuckoo mengharapkan suara berakhir pada posisi ekstrem dan baru kemudian pergi untuk siklus berikutnya.

Interval setengah jam disuarakan oleh sinyal tunggal yang diperoleh dari suara asli yang sama. Cuckoo tidak muncul.

Kecepatan putaran mesin yang menggerakkan cuckoo, dan sudut rotasi dijahit dalam program. Pada awal program, kukuk ditarik ke dalam kasing - dengan mempertimbangkan gigi selip yang dipasang pada sumbu mesin, operasi ini aman, tetapi memiliki efek jika kukuk berada di luar kasing pada saat jam mulai.

Agar tidak mengganggu tidur, cuckoo cuckoo hanya ada di siang hari. Hari kerjanya dimulai pukul sepuluh pagi, dan terakhir kali ia bersuara adalah tengah malam. Saya juga mematikan kukuk pada saat saya mendapat panggilan kerja mingguan di Skype, agar tidak mengganggu.

Program diinstal sebagai layanan dan dimulai ketika Debian dimulai. Dengan demikian, itu cukup untuk menyalakan jam, dan mereka melakukan semuanya sendiri. Waktu diambil dari Internet - di EV3 saya ada dongle WiFi. Setelah jam dimulai, saya biasanya memutus jaringan, agar tidak membuat beban tambahan pada prosesor.

Program ini tersedia di bawah lisensi BSD. Jika Anda memiliki keinginan untuk membangun model yang serupa dan menggunakan perangkat lunak saya, saya hanya akan senang.

Source: https://habr.com/ru/post/id417255/


All Articles