Tangan Robotik Terkontrol EMG Presisi: Panduan Integrasi dan Pembuatan InMoov
Komponen dan Perlengkapan
- Perangkat uECG – 3 unit
- Tangan inMoov – 1 unit
- Arduino Nano R3 – 1 unit
- Driver PWM 16-saluran Adafruit PCA9685 – 1 unit
- Modul nRF24 (Generik) – 1 unit
Tentang Proyek
Tim kami memiliki cerita panjang dengan tangan robotik. Sementara kami mencoba membuat tangan proteksi yang andal, untuk proyek ini saya menggunakan contoh tangan open source yang baik: inMoov.
Saya tidak akan membahas detail perakitan tangan - sudah dijelaskan dengan baik di situs proyek dan cukup rumit. Saya akan fokus pada kontrol, karena itu sepenuhnya baru :) Selain itu, lihat bagaimana teknologi ini berkembang seiring waktu dalam proyek berikutnya: https://www.hackster.io/the_3d6/seeing-muscles-at-work-8-channel-emg-with-leds-039d69
1. Pemrosesan Sinyal
Kontrol didasarkan pada EMG - aktivitas listrik otot. Sinyal EMG diperoleh oleh tiga perangkat uECG (saya tahu, seharusnya merupakan monitor ECG, tetapi karena didasarkan pada ADC generik, dapat mengukur biosinyal apa pun - termasuk EMG). Untuk pemrosesan EMG, uECG memiliki mode khusus di mana mengeluarkan data spektrum 32-bin, dan "rata-rata jendela otot" (intensitas spektral rata-rata antara 75 dan 440 Hz). Gambar spektrum terlihat seperti ini:
Di sini frekuensi berada pada sumbu vertikal (pada masing-masing 3 plot, frekuensi rendah di bawah, tinggi di atas - dari 0 hingga 488 Hz dengan langkah sekitar 15 Hz), waktu pada sumbu horizontal (data lama di kiri, secara keseluruhan sekitar 10 detik di layar). Intensitas dienkode dengan warna: biru - rendah, hijau - sedang, kuning - tinggi, merah - lebih tinggi. Untuk pengenalan gerakan yang andal, pemrosesan gambar yang tepat oleh PC diperlukan. Namun untuk aktivasi sederhana jari tangan robotik, cukup menggunakan nilai rata-rata pada 3 saluran - uECG nyaman menyediakannya pada byte paket tertentu sehingga sketsa Arduino dapat mengurai nilainya. Nilai-nilai ini terlihat jauh lebih sederhana:
Grafik merah, hijau, biru adalah nilai mentah dari perangkat uECG pada berbagai grup otot saat saya menekan jempol, jari manis, dan jari tengah secara berturut-turut. Untuk mata kita kasus-kasus ini jelas berbeda, tetapi kita perlu mengubah nilai-nilai tersebut menjadi "skor jari" sehingga program dapat mengeluarkan nilai ke servo tangan. Masalahnya, sinyal dari grup otot "dicampur": dalam kasus 1 dan 3 intensitas sinyal biru kira-kira sama - tetapi merah dan hijau berbeda. Dalam kasus 2 dan 3 sinyal hijau sama - tetapi biru dan merah berbeda. Untuk "memisahkan"nya, saya telah menggunakan rumidata cukup sederhana:
S0 = V0^2 / (( V1 * a0 + b0)( V2 * c0 + d0))
di mana S0 - skor untuk saluran 0, V0, V1, V2 - nilai mentah untuk saluran 0, 1, 2, dan a, b, c, d - koefisien yang saya sesuaikan secara manual (a dan c dari 0,3 hingga 2,0, b dan d adalah 15 dan 20, Anda perlu mengubahnya untuk menyesuaikan dengan penempatan sensor Anda sendiri). Skor yang sama dihitung untuk saluran 1 dan 2. Setelah ini, grafik menjadi hampir terpisah sempurna:
Untuk gerakan yang sama (kali ini jari manis, jari tengah, dan kemudian jempol) sinyal jelas dan dapat dengan mudah diterjemahkan ke gerakan servo dengan membandingkan dengan ambang batas.
2. Skematik
Skematik cukup sederhana, Anda hanya memerlukan modul nRF24, PCA9685 atau pengontrol PWM I2C serupa, dan sumber daya 5V arus tinggi yang cukup untuk menggerakkan semua servo sekaligus (jadi memerlukan daya rated setidaknya 5A untuk operasi stabil).
Daftar penghubungan:
- Pin 1 nRF24 (GND) - GND Arduino
- Pin 2 nRF24 (Vcc) - 3.3v Arduino
- Pin 3 nRF24 (Chip Enable) - D9 Arduino
- Pin 4 nRF24 (SPI:CS) - D8 Arduino
- Pin 5 nRF24 (SPI:SCK) - D13 Arduino
- Pin 6 nRF24 (SPI:MOSI) - D11 Arduino
- Pin 7 nRF24 (SPI:MISO) - D12 Arduino
- SDA PCA9685 - A4 Arduino
- SCL PCA9685 - A5 Arduino
- Vcc PCA9685 - 5v Arduino
- GND PCA9685 - GND Arduino
- V+ PCA9685 - sumber daya 5V arus tinggi
- GND PCA9685 - GND sumber daya arus tinggi
- Servo jari: ke saluran PCA 0-4, dalam notasi saya jempol - saluran 0, telunjuk - saluran 1, dst.
3. Penempatan Sensor EMG
Untuk mendapatkan pembacaan yang wajar, penting untuk menempatkan perangkat uECG, yang merekam aktivitas otot, di tempat yang tepat. Meskipun banyak opsi yang mungkin di sini, masing-masing memerlukan pendekatan pemrosesan sinyal yang berbeda - jadi saya membagikan yang telah saya gunakan:
Mungkin terdengar tidak intuitif, tetapi sinyal otot jempol lebih terlihat di sisi seberang lengan, jadi salah satu sensor ditempatkan di sana, dan semuanya ditempatkan dekat siku (otot memiliki sebagian besar tubuhnya di area tersebut, tetapi Anda ingin memeriksa tepat di mana otot Anda berada - ada perbedaan individual yang cukup besar)
4. Kode
Sebelum menjalankan program utama, Anda perlu menemukan ID unit dari perangkat uECG Anda sendiri (dilakukan dengan mencantumkan baris 101 dan menyalakan perangkat satu per satu) dan mengisinya ke dalam array unit_ids (baris 37).
#include <SPI.h>
#include <RF24.h>
#include <RF24_config.h>
#include <nRF24L01.h>
#include <Adafruit_PWMServoDriver.h>
#include <Wire.h>
#define SERVOMIN 150 // panjang pulsa minimum (dari 4096)
#define SERVOMAX 600 // panjang pulsa maksimum (dari 4096)
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int rf_cen = 9; // pin chip enable nRF24
int rf_cs = 8; // pin CS nRF24
RF24 rf(rf_cen, rf_cs);
// alamat pipe - di-hardcode di sisi uECG
uint8_t pipe_rx[8] = {0x0E, 0xE6, 0x0D, 0xA7, 0, 0, 0, 0};
// ... kode lengkap tersedia dalam file asli
5. Hasil
Dengan beberapa eksperimen yang memakan waktu sekitar 2 jam, saya dapatkan operasi yang cukup andal (video menunjukkan kasus tipikal):
Perilaku tidak sempurna dan dengan pemrosesan ini hanya dapat mengenali jari terbuka dan tertutup (dan bahkan tidak semua 5, hanya mendeteksi 3 grup otot: jempol, telunjuk dan tengah bersama, jari manis dan kelingking bersama). Namun "AI" yang menganalisis sinyal hanya memakai 3 baris kode di sini dan menggunakan satu nilai dari setiap saluran. Saya yakin jauh lebih banyak dapat dilakukan dengan menganalisis gambar spektrum 32-bin di PC atau smartphone. Juga, versi ini hanya menggunakan 3 perangkat uECG (saluran EMG). Dengan lebih banyak saluran seharusnya mungkin untuk mengenali pola yang benar-benar kompleks - tapi itu poin proyek, untuk memberikan titik awal bagi siapa pun yang tertarik :) Kontrol tangan pasti bukan aplikasi satu-satunya untuk sistem seperti ini.
Kode Sumber
emg_hand_control2.ino
// Kode lengkap untuk kontrol tangan robotik berbasis EMG
#include <SPI.h> #include <RF24.h> #include <RF24_config.h> #include <nRF24L01.h> #include <Adafruit_PWMServoDriver.h> #include <Wire.h>
// ... kode lengkap tersedia dalam file asli
Skematik
nrf24_hand_control_5jcEeCP8a3.fzz