Diterjemahkan dari instrables.com , penulis proyek: Matlek
Pada artikel ini saya akan menjelaskan secara rinci proses pembuatan "sarung tangan pintar" dan panel LED-nya, yang dirancang untuk meningkatkan keselamatan pengendara sepeda dan orang lain yang melakukan perjalanan di jalan raya. Pertama, Anda dapat melihat demonstrasi kecil tentang cara kerjanya:
Bagaimana itu bekerja
Sarung tangan berisi papan Arduino yang mengumpulkan data dari giroskop dan akselerometer. Kode tersebut menggunakan model tinyML dari "pembelajaran mesin kecil" dan mengenali gerakan: setiap gerakan tangan dianalisis dan diubah menjadi sinyal (tangan dimiringkan ke kiri, kanan, maju, mundur, dll.). Sinyal dikirim melalui Bluetooth (BLE) ke mikrokontroler lain yang terhubung dengan matriks LED (yang, misalnya, dapat dipasang ke ransel). Menurut sinyal yang diterima, matriks mengeluarkan urutan karakter tertentu - sehingga pengendara dan pengendara sepeda lain dapat memahami apa yang akan dilakukan pengendara sepeda (misalnya, dapat berupa panah ke kiri, kanan, atau teks).
Asal proyek
Pertama, saya mengendarai sepeda ke kantor, dan menghabiskan lebih dari satu jam sehari di sadel (menempuh jarak sekitar 22 km). Itu selalu menarik, tetapi saya tinggal di salah satu kota terpadat di Prancis, di mana sering terjadi kecelakaan yang melibatkan mobil dan pengendara sepeda. Juga, Marseille adalah kota terburuk bagi pengendara sepeda di Prancis - jalur sepeda sangat terbatas . Oleh karena itu, proyek ini didedikasikan untuk meningkatkan keselamatan pengendara sepeda dan mencoba menarik perhatian otoritas kota untuk masalah ini.
Kedua, proyek ini akan membantu semua anggota gerakan untuk berkomunikasi dan lebih memahami satu sama lain. Dari sudut pandang saya, sebagian besar masalah yang terjadi di jalan raya disebabkan oleh beberapa pengguna jalan yang salah paham, yang mengakibatkan ketakutan dan kemudian agresi. Saya ingin perangkat semacam itu membantu peserta lalu lintas lebih memahami satu sama lain. Panah menunjukkan arah, dan Anda juga dapat menampilkan teks per huruf (namun, saya sepenuhnya dan sepenuhnya mendukung prasasti yang sopan dan konstruktif, untuk menghindari konflik).
Mengapa Smart Glove?
Saya mulai mengerjakan proyek ini di musim dingin dan cuaca dingin memotivasi saya untuk memasang perangkat ke sarung tangan saya. Tetapi saya segera menyadari bahwa idenya tidak terlalu bagus, karena di daerah kami cukup panas di musim panas. Jadi saya memutuskan akan lebih baik menempatkan perangkat di dalam kotak dan mengikatnya ke lengan saya. Tetapi karena saya tidak tahu bagaimana menamainya secara berbeda, saya memutuskan untuk meninggalkan kata βsarung tanganβ di judulnya.
"Cerdas" berasal dari teknik pembelajaran mesin yang saya gunakan dalam proyek ini.
Inspirasi
Proyek ini pada dasarnya merupakan campuran dari dua proyek lainnya. Saya tidak memulai dari awal, tetapi menggunakan praktik terbaik mereka, yang kemudian saya kembangkan lebih lanjut. Inilah yang saya terinspirasi saat mengembangkan:
- pengenalan gerakan dengan Arduino Nano 33 BLE SENSE.
- bukan proyek khusus, tetapi konsep menggunakan array LED untuk pengendara sepeda. Ada banyak proyek semacam itu - beberapa menggunakan ransel dengan panel terintegrasi, yang lain hanya menawarkan matriks siap pakai yang dapat ditempatkan di mana saja. Bagaimanapun, matriks LED ini dikontrol oleh remote control daripada pengenalan gerakan.
Komponen
Untuk pencetakan 3D - printer 3D atau akses ke printer.
Elektronik
- Arduino Nano 33 BLE SENSE;
- MI lain dengan BLE (Arduino Nano 33 BLE, Arduino 33 BLE SENSE, Arduino nano 33 IOT, ESP32, dll.). Saya memutuskan untuk menggunakan papan ESP32.
- Strip LED (WS2812B). Saya menggunakan 160 LED untuk membuat matriks 20x8;
- Buffer 4 tingkat dari 3V ke 5V: 74AHCT125.
- Kapasitor 1000 uF.
- Sakelar SPST, 3 pcs.
- Papan roti.
- Kabel.
- Baterai 9 V.
- Baterai eksternal.
- 3.
- -.
1: (, )
Setelah membaca artikel tentang Arduino dan pembelajaran mesin, saya memutuskan untuk mencobanya juga. Karena ada beberapa papan Arduino Nano baru belakangan ini, saya membuat pelat perbandingan untuk membuat pilihan terbaik sebelum membeli.
Semua papan menarik, tetapi saya hanya dapat menggunakan satu untuk pengenalan gerakan - Arduino Nano 33 BLE SENSE. Hanya dia yang memiliki sensor yang tepat dan dukungan Tensorflow Lite. Hal menarik lainnya adalah bahwa papan Arduino Nano 33 IOT, BLE dan BLE SENSE memiliki Bluetooth mereka sendiri, sehingga salah satunya dapat digunakan pada matriks LED untuk menerima sinyal BLE.
Kode yang dimuat ke papan didasarkan pada banyak program Arduino berbeda yang saya temukan selama pengembangan. Oleh karena itu, sebelum mulai bekerja, saya memutuskan untuk mengujinya dengan contoh yang saya temukan.
Ayo bermain dengan BLE
Dalam proyek ini, komunikasi Bluetooth sangat penting karena begitulah cara sinyal dikirim dari sensor ke rangkaian LED. Sebelumnya, saya tidak pernah menghubungkan dua papan Arduino melalui BLE. Jadi saya berlatih dengan contoh berikut dari perpustakaan ArduinoBLE :
- Sketsa LedControl yang digunakan dengan board Arduino Nano 33 BLE Sense dan tombol dengan resistor pull-up yang terhubung ke pin 2. Contoh tersebut melakukan polling periferal BLE hingga menemukan layanan dengan UUID 19b10000-e8f2-537e-4f6c-d104768a1214. Setelah mendeteksinya dan membuat koneksi, itu akan mengontrol LED BLE periferal dari jarak jauh dengan menekan sebuah tombol.
- Sketsa untuk LED dan Arduino Nano 33 IoT.
Sayangnya, saya memiliki banyak masalah dengan sketsa untuk papan LED - 3 "rusak" saat memuatnya. Saya tidak tahu apa masalahnya, tetapi saya memutuskan untuk mengganti papan Arduino dengan MI lain dengan BLE - papan ESP32. Dengan papan baru, saya menggunakan yang berikut:
- BLE_write sketsa dari pustaka BLE ESP32 ARDUINO. Saya menambahkan beberapa perubahan untuk membuatnya bekerja dengan papan Arduino Nano 33 BLE SENSE. Pada langkah 10, Anda dapat membandingkan sketsa BLE_write dan sketsa matriks Smartglove_BLE_LED yang saya tulis dan unggah.
Mari bermain dengan LED RGB built-in
Tahukah Anda bahwa papan Arduino Nano 33 BLE SENSE memiliki LED RGB bawaan? Dalam proyek ini, mereka akan berguna untuk memeriksa operasi pengenalan gerakan yang benar. Kami harus memverifikasi bahwa sinyal telah dikirim ke rangkaian LED - namun, karena panel kemungkinan besar berada di bagian belakang pengendara sepeda, akan sulit baginya untuk memahami bahwa pengenalan gerakan berfungsi dan sinyal telah dikirim.
Tidak ada yang rumit di sini, saya hanya mengubah sedikit contoh Blink . Kode menunjukkan bahwa LED merah pada pin 22, hijau pada pin 23, biru pada pin 24. Sinyal input LOW menyalakan LED, HIGH - mematikan.
const int LED_BUILTIN_RED = 22;
const int LED_BUILTIN_GREEN = 23;
const int LED_BUILTIN_BLUE = 24;
// setup
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN_RED, OUTPUT);
pinMode(LED_BUILTIN_GREEN, OUTPUT);
pinMode(LED_BUILTIN_BLUE, OUTPUT);
}
// loop
void loop() {
digitalWrite(LED_BUILTIN_RED, LOW); // LED (HIGH β )
delay(1000); //
digitalWrite(LED_BUILTIN_RED, HIGH); // LED, LOW
delay(1000); //
digitalWrite(LED_BUILTIN_GREEN, LOW); // LED (HIGH β )
delay(1000); //
digitalWrite(LED_BUILTIN_GREEN, HIGH); // LED, LOW
delay(1000); //
digitalWrite(LED_BUILTIN_BLUE, LOW); // LED (HIGH β )
delay(1000); //
digitalWrite(LED_BUILTIN_BLUE, HIGH); // LED, LOW
delay(1000); //
}
Mari bermain dengan pengenalan gerakan dan tinyML
Terakhir, saya mempelajari tutorial tentang penggunaan machine learning di Arduino, dan berlatih dengan contoh pengenalan gerakan. Contoh tersebut dibagi menjadi tiga bagian utama:
- Pengenalan data dengan program IMU_Capture (dan Arduino Nano 33 BLE sense);
- Pelatihan model pada data yang direkam di google colab (di komputer);
- Menggunakan model Arduino terlatih dengan IMU_Classifier untuk pengenalan pola (sekali lagi di papan Arduino).
Langkah 2: sarung tangan 1/6 (elektronik)
Dari langkah 2 hingga 7, saya berikan diagram yang sama, yang menunjukkan langkah-langkah di atasnya agar lebih mudah bagi Anda untuk memahami proses pembuatan sarung tangan.
Sirkuit elektronik untuk sarung tangan ini sangat sederhana:
- Papan Arduino.
- Baterai 9V (Saya menggunakan baterai isi ulang).
- Sakelar SPST.
Langkah 3: sarung tangan 2/6 - badan
Kasingnya sederhana, dan hanya terdiri dari dua bagian, dicetak pada printer 3D:
- Bagian kuning berisi papan Arduino, baterai dan sakelar. Bukaan di casing memungkinkan Anda untuk mengisi ulang baterai dan memprogram ulang papan Arduino tanpa harus membongkar casing.
- Bagian hitam adalah penutup yang melindungi baterai dan papan.
Saya menempelkannya ke tangan saya dengan setrip Velcro.
Saya juga menggambar logo, yang kemudian saya tempelkan ke tutupnya. Ini mewakili pengendara sepeda yang dilihat dari atas dan memiliki tiga anak panah - lurus ke depan, kiri dan kanan. Anak panah keempat dipisahkan dari tiga lainnya karena sepeda tidak mundur.
File
content.instructables.com/ORIG/FS2/L3M3/K9N93ZYW/FS2L3M3K9N93ZYW.stl
content.instructables.com/ORIG/F72/21NG/K9N93ZZG/F7221NGK9N93ZZG.stl
content.instructables.com/NORIG9SZFD3. stl
Langkah 4: sarung tangan 3/6: perekaman data
Setelah merakit perangkat, saatnya menulis data. Tujuannya adalah untuk merekam setiap gerakan beberapa kali. Saya mengatur ambang batas untuk giroskop, dan ketika melampaui nilai ini, Arduino mulai mengeluarkan data yang direkam ke monitor.
Saya merekam gerakan berikut:
- Tangan menunjuk ke kiri (isyarat pengendara sepeda standar untuk berbelok ke kiri).
- Pengereman (gerakan dengan jari meraih tuas rem).
- Tangannya bersandar.
- Tangannya condong ke depan.
- Tangannya condong ke kiri.
- Tangannya condong ke kanan.
Secara alami, Anda dapat merekam gerakan Anda.
Untuk merekam data, saya menulis program yang mengganti warna pada LED setelah setiap 20 pukulan. Itu membantu saya memahami kapan harus beralih ke isyarat lain. Saya menghubungkan Arduino ke komputer saya, membuka program pelacakan port, dan meletakkan laptop di ransel saya.
Setelah merekam semua gerakan, saya melanjutkan ke tahap terakhir - saya menyalin output data ke program dan menyimpannya dalam format csv.
content.instructables.com/ORIG/FC7/B0JT/K9UEA78V/FC7B0JTK9UEA78V.ino
Langkah 5: sarung tangan 4/6: pelatihan
Untuk pelatihan, saya menggunakan contoh berikut , mengoreksi hanya beberapa baris di dalamnya. Sebelum pelatihan, ada baiknya memeriksa bahwa untuk setiap gerakan Anda memiliki file csv Anda sendiri, dan data di setiap file mengacu pada gerakan khusus ini.
Di situs web Google Colab, gunakan tautan di bagian "Unggah data" untuk mengunggah data Anda.
Di bagian "Data Grafik (opsional)", tambahkan nama salah satu file.
filename = "Arm_left.csv"
Kemudian perbaiki baris ini untuk hanya mengeluarkan data giroskop:
#index = range(1, len(df['aX']) + 1)
index = range(1, len(df['gX']) + 1)
Komentari baris berikut - kami tidak menggunakan data akselerometer:
#plt.plot(index, df['aX'], 'g.', label='x', linestyle='solid', marker=',')
#plt.plot(index, df['aY'], 'b.', label='y', linestyle='solid', marker=',')
#plt.plot(index, df['aZ'], 'r.', label='z', linestyle='solid', marker=',')
#plt.title("Acceleration")
#plt.xlabel("Sample #")
#plt.ylabel("Acceleration (G)")
#plt.legend()
#plt.show()
Di bagian "Parse dan persiapkan data", tambahkan semua nama file:
#GESTURES = ["punch", "flex",]
GESTURES = ["Arm_left", "Brake", "Hand_back-tilt", "Hand_front-tilt", "Hand_left-tilt", "Hand_right-tilt"]
Ubah jumlah sampel dengan satu gerakan jika Anda mengubahnya dalam kode Arduino:
#SAMPLES_PER_GESTURE = 119
SAMPLES_PER_GESTURE = 64
Tetap hanya untuk mengomentari percepatan:
# normalize the input data, between 0 to 1:
# - acceleration is between: -4 to +4
# - gyroscope is between: -2000 to +2000
tensor += [
#(df['aX'][index] + 4) / 8,
#(df['aY'][index] + 4) / 8,
#(df['aZ'][index] + 4) / 8,
(df['gX'][index] + 2000) / 4000,
(df['gY'][index] + 2000) / 4000,
(df['gZ'][index] + 2000) / 4000
]
Setelah melalui seluruh program, Anda dapat mendownload model terlatih.
File
content.instructables.com/ORIG/F7A/GLEK/K9UEA8Z5/F7AGLEKK9UEA8Z5.csv
content.instructables.com/ORIG/FV1/853G/K9UEA8Z6/FV1853GK9UEA8Z6.csv
content.instructables.com/ORIG8/FQKD9. csv
content.instructables.com/ORIG/F7N/P7AG/K9UEA8Z9/F7NP7AGK9UEA8Z9.csv
content.instructables.com/ORIG/FD4/WZRM/K9UEA8ZA/FD4WZRMK9UEA8ZA.csv
content.in7EA8Fstru2.com .csv
Langkah 6: Sarung Tangan 5/6:
Kode Arduino Kode terakhir sarung tangan pintar saya adalah campuran dari program berikut:
- contoh "LED" dari library "ArduinoBLE" (Periferal> LED).
- "IMU_Classifier" dari sini .
Saya tidak akan mengembangkannya secara rinci di sini, saya hanya merekomendasikan membaca program aslinya untuk lebih memahami apa yang sedang terjadi.
Tambahkan model Anda ke kode dan Anda dapat mengujinya!
File
content.instructables.com/ORIG/F9N/4SBK/K9UEA98M/F9N4SBKK9UEA98M.h
content.instructables.com/ORIG/FKZ/ODO9/KB52VXZK/FKZODO9KB52VXZK.ino
Langkah 7: sarung tangan 6/6: tes
Seperti yang Anda lihat dari video, LED menyala secara berbeda tergantung pada gerakan yang dikenali:
Langkah 8: 1/4 Matriks LED: Elektronik
Seperti yang saya sebutkan, ketika mengunggah sketsa dari perpustakaan ArduinoBLE untuk LED pada Arduino Nano 33 BLE SENSE, saya mengalami beberapa masalah. Jadi saya memutuskan untuk menggunakan ESP32 alih-alih papan ini. Karena itu, pada foto di atas Anda dapat melihat kedua papan.
Karena papan Arduino Nano 33 BLE SENSE dan ESP32 beroperasi dengan logika 3.3V, saya menambahkan buffer 4 tingkat dari 3V ke 5V (74AHCT125) seperti yang direkomendasikan dalam instruksi dari Adafruit .
Saya juga menambahkan kapasitor 100uF untuk melindungi LED dari lonjakan tegangan mendadak.
Saya mengumpulkan seluruh sirkuit di papan tempat memotong roti.
Dapat dilihat bahwa saya menggunakan kedua konektor catu daya eksternal, karena saya khawatir matriks LED membutuhkan terlalu banyak arus. Oleh karena itu, matriks dan MI diberi daya dari konektor yang berbeda dari sumber daya eksternal.
Langkah 9: Larik LED 2/4: Badan
Saya membutuhkan kotak matriks LED prefabrikasi. Oleh karena itu, terdiri dari beberapa bagian (dan juga karena printer 3D saya sangat kecil), dan saya telah menyediakan lubang untuk baut di dalamnya.
Saya menggunakan Velcro lagi untuk memasang panel.
File
content.instructables.com/ORIG/FH6/TB4H/K9N93ZZJ/FH6TB4HK9N93ZZJ.stl content.instructables.com/ORIG/FK3/BZPC/K9N93ZZK/FK3BZPCK9N93ZZK.stl
content.instructFLZK9N93Z
content.instructFLZK9N93Z. stl
content.instructables.com/ORIG/F38/BF1P/K9N93ZZM/F38BF1PK9N93ZZM.stl
content.instructables.com/ORIG/FJC/DQMY/K9N93ZZN/FJCDQMYK9N93ZZN.stl
content.inelqvf9qfr / .stl
content.instructables.com/ORIG/FJE/C5FG/K9N93ZZR/FJEC5FGK9N93ZZR.stl
content.instructables.com/ORIG/F55/1X43/K9N93ZZS/F551X43K9N93ZZS.stl
Langkah 10: 3/4 LED Matrix: Arduino Code
Kode yang dihasilkan adalah campuran dari kode-kode berikut (dan modifikasinya):
- BLE_Tulis contoh dari pustaka BLE ESP32 ARDUINO.
- Contoh MatrixGFXDemo64 dari perpustakaan FastLED NeoMatrix.
Saya tidak akan mengembangkannya secara rinci di sini, saya hanya merekomendasikan membaca program aslinya untuk lebih memahami apa yang sedang terjadi.
content.instructables.com/ORIG/FIR/RETZ/KB52VXP4/FIRRETZKB52VXP4.ino
Langkah 11: Matriks LED 4/4: pengujian
Saatnya memeriksa semuanya! Setelah mengenali setiap gerakan, sinyal dikirim ke matriks LED, dan itu menunjukkan pola tertentu. Terlihat bahwa LED pada sarung tangan menyala sesuai dengan gerakan yang dikenali.
Langkah 12: Tes Akhir dan Kesimpulan
Beginilah tampilannya secara langsung:
Saya sangat senang dengan perangkat yang dihasilkan. Berkat proyek ini, saya merasa jauh lebih percaya diri dengan tinyML dan BLE. Sejak itu, saya membeli lagi Arduino Nano 33 IOT, dan sekarang saya terlibat dalam proyek yang sangat menarik, yang akan saya tulis nanti. Apa yang akan saya ubah di versi kedua dari perangkat yang saya jelaskan:
- «». , . - - , . .
- . , USB . , . .
- . , . , ( 20 ). β , .
Saya membutuhkan waktu beberapa bulan untuk menyelesaikan proyek dan menulis teks ini. Jika ada sesuatu yang tidak jelas, atau beberapa file hilang, tulis di komentar artikel asli .
Lihat juga: