Daftar Isi:

Accel Writing (Tangan Ajaib): 4 Langkah (dengan Gambar)
Accel Writing (Tangan Ajaib): 4 Langkah (dengan Gambar)

Video: Accel Writing (Tangan Ajaib): 4 Langkah (dengan Gambar)

Video: Accel Writing (Tangan Ajaib): 4 Langkah (dengan Gambar)
Video: INI TULISAN TANGAN TERBAGUS DI DUNIA 😱 PUNYAMU? 2024, November
Anonim
Accel Writing (Tangan Ajaib)
Accel Writing (Tangan Ajaib)
Accel Writing (Tangan Ajaib)
Accel Writing (Tangan Ajaib)
Accel Writing (Tangan Ajaib)
Accel Writing (Tangan Ajaib)

pengantar

Tangan Ajaib memungkinkan penyandang disabilitas dan gangguan keterampilan motorik untuk menikmati kreativitas menggambar dan menulis dalam lingkungan simulasi. Tangan Ajaib adalah sarung tangan yang dapat dipakai yang merasakan gerakan jari telunjuk Anda dan menerjemahkannya ke dalam gambar garis di layar komputer.

Bahan yang Dibutuhkan

LSM9DOF Breakout Board --- $24,95 ---

Adafruit Feather dengan Wifi --- $18,95 ---

Kabel Wanita/Wanita --- $1,95 ---

Pita/strip Velcro --- $3

Dua magnet dengan kekuatan yang sama --- Harga bervariasi

Bagaimana itu bekerja

Dengan menggunakan akselerometer, kita dapat mengumpulkan data percepatan untuk sumbu y yang akan membantu kita menentukan kapan jari pengguna bergerak ke atas dan ke bawah. Karena fakta bahwa akselerometer kami mengukur percepatan terhadap pusat bumi, kami tidak dapat menentukan percepatan sumbu x (kiri atau kanan). Untungnya papan breakout LSM9DOF juga berisi magnetometer yang memungkinkan kita mengumpulkan data tentang medan magnet. Kami menempatkan dua magnet terpisah 30 cm dan memiliki sarung tangan di antaranya. Jika data magnetik terbaca positif maka kita tahu sarung tangan bergerak ke kanan dan sebaliknya. Setelah semua data dikumpulkan di accelerometer/magnetometer, ia mengirimkan data melalui kabel ke bulu yang terhubung ke komputer wifi dan kemudian meneruskan data ke komputer yang kemudian dapat kita gunakan dalam kode kita.

Langkah 1: Prototipe Fisik 1

Prototipe Fisik 1
Prototipe Fisik 1
Prototipe Fisik 1
Prototipe Fisik 1

Prototipe ini dimaksudkan agar sarung tangan dijahit secara longgar di tangan agar tidak tergelincir di atas perangkat elektronik. Perangkat elektronik tersebut kemudian akan dipasangkan dengan velcro ke bagian bawah lengan baju besi yang dipadukan dengan sarung tangan dasar di tangan. Kemudian sarung tangan hijau akan tergelincir di atas alas dan perangkat elektronik….

Langkah-langkah dalam membuat prototipe sarung tangan:

  • Dapatkan dua potong kain yang cukup besar untuk dijiplak dengan tangan
  • Lacak tangan pada kedua potongan kain dan guntinglah
  • Letakkan kedua potongan tangan bersama-sama sehingga mereka benar-benar sejajar
  • Selanjutnya, untuk menyiapkan mesin jahit, jalankan benang melalui titik-titik yang ditunjukkan pada mesin
  • Saat mesin jahit sudah terpasang, angkat jarum dan letakkan dua potong kain yang disatukan di bawah jarum
  • Pastikan jarum berbaris di tepi kain, nyalakan mesin, dan jahit di sepanjang tepi kain, sambil membiarkan kedua bagian tidak dijahit di pergelangan tangan sehingga tangan bisa masuk.

Langkah 2: Prototipe Fisik 2

Prototipe Fisik 2
Prototipe Fisik 2
Prototipe Fisik 2
Prototipe Fisik 2

Prototipe terakhir kami adalah sarung tangan biasa yang dipadukan dengan tali Velcro yang dapat disesuaikan dengan pergelangan tangan mana pun. Sarung tangan dan tali dijahit bersama, dan perangkat elektronik dipasang ke sarung tangan melalui Velcro.

Langkah-langkah dalam membuat prototype sarung tangan ke-2:

  1. Beli sarung tangan, bahan sarung tangan tidak masalah.
  2. Beli tali pergelangan tangan velcro
  3. Beli baterai portabel
  4. Beli Velcro Lengket
  5. Dengan jarum jahit, pasang tali pergelangan tangan velcro ke dasar sarung tangan
  6. Tali pergelangan tangan harus dapat menyesuaikan dengan ukuran pergelangan tangan yang berbeda.
  7. Tempelkan selotip ke dasar akselerometer dan tempelkan ke jari telunjuk sarung tangan
  8. Tempelkan selotip pada bulu dan tempelkan pada bagian atas sarung tangan.
  9. Menggunakan kabel, sambungkan pin 3V3 di bulu ke pin VIN di akselerometer
  10. Menggunakan kabel, sambungkan pin GND di bulu ke pin GND akselerometer.
  11. Menggunakan kabel, sambungkan pin SCL di bulu ke pin SCL akselerometer.
  12. Menggunakan kabel, sambungkan pin SDA di bulu ke pin SDA accelerometer.
  13. Hubungkan setidaknya baterai 5 volt melalui usb ke bulu untuk memberikan daya.

Langkah 3: Magnet

magnet
magnet

Langkah 1: Letakkan dua magnet dengan kekuatan yang sama di seberang satu sama lain.

Langkah 2: Ukur jarak 30 cm antara dua magnet

Langkah 3: Tempatkan Magnetometer tepat di tengah kedua magnet. Anda harus menerima data sekitar 0 saat berada di tengah. Jika Anda menerima pembacaan nol lewati ke langkah 5.

Langkah 4: Jika pembacaan tidak nol atau mendekati nol maka Anda harus menyesuaikan jarak magnet. Jika pembacaan negatif, gerakkan magnet kiri satu cm atau 2 ke kiri atau sampai pembacaan nol. Jika positif lakukan hal yang sama kecuali dengan magnet kanan.

Langkah 5: Tulis kode yang menerima data dari magnetometer dan baca apakah itu positif atau negatif. Jika positif beri kode tarik garis ke kanan dan jika negatif tarik garis ke kiri.

Langkah 4: Kode

Kode
Kode

github.iu.edu/ise-e101-F17/MuscleMemory-Sw…

Pengantar:

Untuk memproses data dari akselerometer, hubungan klien/server harus dibuat antara bulu Adafruit dan server yang memproses data (berjalan di laptop/desktop). Dua file kode perlu dibuat: satu untuk klien (bulu Adafruit), dan yang lainnya untuk server (dalam hal ini, laptop Jarod). Klien ditulis dalam C++, dan server ditulis dengan python. Bahasa yang digunakan untuk klien penting karena Arduino sebagian besar adalah bahasa C++, dan mengubahnya untuk menggunakan bahasa yang berbeda itu sulit. Server dapat ditulis dalam bahasa apa pun, asalkan memiliki fitur jaringan.

Menyiapkan Klien:

Pertama, kita akan mengatur kode klien. Sebagian besar kode koneksi WiFi sudah tersedia melalui perpustakaan Adafruit. Kami mulai dengan memasukkan kelas yang relevan.

#sertakan #sertakan #sertakan #sertakan #sertakan

Tetapkan beberapa variabel apa yang akan digunakan di seluruh kode.

// Hubungkan ke jaringan const char* ssid = "MMServer"; const char* kata sandi = "MMServer-Kata Sandi"; // IP dan port server yang akan menerima data const char* host = "149.160.251.3"; port int const = 12347; bool terhubung = salah;

// Inisialisasi detektor gerakan

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0(1000);

Klien WiFiClient;

Buat fungsi setup() yang akan dijalankan segera setelah bulu dimulai.

// Siapkan koneksi WiFi, dan sambungkan ke servervoid setup() { Serial.begin(9600); penundaan(100);

Serial.println();

Serial.println(); Serial.print("Menghubungkan ke "); Serial.println(ssid); // Mulai WiFi WiFi.mulai(ssid, kata sandi); // Menghubungkan… while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Berhasil terhubung ke WiFi Serial.println(""); Serial.println("WiFi terhubung"); Serial.println("Alamat IP: "); Serial.println(WiFi.localIP());

#ifndef ESP8266

while(!Serial); #endif Serial.begin(9600); Serial.println("Uji Sensor");

// Inisialisasi sensor

if(!lsm.begin()) { // Ada masalah saat mendeteksi LSM9DS0 Serial.print(F("Ooops, tidak ada LSM9DS0 yang terdeteksi … Periksa kabel Anda atau I2C ADDR!")); sementara(1); } Serial.println(F("Ditemukan LSM9DS0 9DOF")); // Mulai menghubungkan ke server Serial.print("Menghubungkan ke "); Serial.println(host);

// Periksa koneksi yang berhasil. Jika gagal maka batalkan

if (!client.connect(host, port)) { Serial.println("koneksi gagal"); terhubung = salah; kembali; } else { terhubung = benar; }

//Mengatur penguatan sensor dan waktu integrasi

konfigurasikanSensor(); }

Kami kemudian membutuhkan fungsi loop yang akan berulang kali berulang. Dalam hal ini digunakan untuk mengirimkan data secara berulang dari akselerometer ke server dalam bentuk “[z_accel]:[y_mag]:[z_mag]”. klien.print(angka); fungsinya adalah apa yang mengirim data ke server.

void loop() { penundaan (250); if(connected){ // Ini akan mengirim data ke server sensor_event_t accel, mag, gyro, temp; lsm.getEvent(&accel, &mag, &gyro, &temp); Nomor string; angka += accel.acceleration.z; angka += ":"; angka += mag.magnetic.y; angka += ":"; angka += mag.magnetic.z; Serial.print(angka); klien.print(angka); Serial.println(); } else { buatKoneksi(); } }

Untuk beberapa fungsi utilitas, kita memerlukannya untuk membuat koneksi antara bulu dan server.

void buildConnection(){ if (!client.connect(host, port)) { Serial.println("koneksi gagal"); terhubung = salah; kembali; } else { terhubung = benar; } }

Kita juga perlu mengonfigurasi sensor dan memberikan rentang nilai yang akan dibacanya. Misalnya, akselerasi memiliki 5 opsi untuk rentang: 2g, 4g, 6g, 8g, dan 16g.

void configureSensor(void){ // Atur rentang akselerometer //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_2G); lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_4G); //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_6G); //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_8G); //lsm.setupAccel(lsm. LSM9DS0_ACCELRANGE_16G); // Setel sensitivitas magnetometer //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag(lsm. LSM9DS0_MAGGAIN_12GAUSS);

// Siapkan giroskop

lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_245DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_500DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_2000DPS); }

Menyiapkan Server:

Server akan menjadi file python yang akan berjalan di baris perintah komputer. Untuk memulai, impor kelas yang diperlukan.

impor socketimport ulang impor pyautogui

socket digunakan untuk jaringan. re digunakan untuk regex, atau manipulasi string. pyautogui adalah pustaka python yang memungkinkan gambar terjadi (dibahas nanti).

Selanjutnya, kita harus mendefinisikan beberapa variabel. Ini akan menjadi variabel global, sehingga mereka akan diakses dalam beberapa fungsi. Mereka akan digunakan nanti dalam kode.

i = 0n = 0 garis = 1

daftar_data =

mag_data =

mag_calib_y = 0 mag_offset_y = 0

z_kalib = 0

z_offset = 0 z_moving_offset = 0 z_diff = 0 z_real = 0 z_velo = 0 z_pos = 0

keep_offset = Salah

first_data = Benar

Kami sekarang membutuhkan fungsi untuk membuat server dan membukanya untuk koneksi masuk.

def startServer(): global i global first_data # menginisialisasi soket server serversoket = socket.socket(socket. AF_INET, socket. SOCK_STREAM) serverocket.setsockopt(socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # Alamat IP server dan host port = " 149.160.251.3" port = 12347 server_address = (host, port) # Buka server dan dengarkan koneksi masuk print ('Memulai server pada %s port %s' % server_address) serverocket.bind(server_address) serverocket.listen(5) # Tunggu koneksi… while True: print ('Menunggu koneksi…') # Terima koneksi masuk (clientsocket, alamat) = serverocket.accept() # Coba parsing data yang diterima try: print ('Koneksi dibuat dari ', alamat) while True: # Menerima data dan mengirimkannya untuk diproses data = clientsocket.recv(25) accel_data = re.split('[:]', str(data)) accel_data[0] = accel_data[0][2:] accel_data[1] = accel_data[1] accel_data[2] = accel_data[2][1:-1] print(accel_data) i+=1 if(i < 51): calibData(accel_data) else: movingAcce l(accel_data[0]) processData(accel_data) first_data = Salah akhirnya: # Tutup soket untuk mencegah kebocoran data yang tidak perlu clientsocket.close()

Kami sekarang membutuhkan fungsi yang akan memproses semua data. Langkah pertama yang harus dilakukan, dan fungsi pertama yang disebut, adalah kalibrasi sensor untuk tujuan perhitungan.

def calibData(daftar): global z_calib global z_offset global mag_data global mag_calib_y global mag_offset_y z_calib += float(daftar[0]) mag_calib_y += float(daftar[1]) if(i==50): z_offset = z_calib / 50 mag_offset_y = mag_calib_y / 50 z_calib = 0 mag_calib_y = 0 mag_data.append(mag_offset_y)

Selanjutnya, kita membuat offset percepatan bergerak. Hal ini membuat program mengenali ketika seseorang berhenti menggerakkan jarinya karena semua nilai percepatan yang dikirimkan ke server harus sama pada saat itu.

def movingAccel(num): global z_calib global z_diff global z_moving_offset global z_offset global data_list global n global keep_offset if(n 0.2 or z_diff < -0.2): # gerakan terdeteksi dalam data, restart keep_offset = True n = 0 z_calib = 0 z_moving_offset z_diff = 0 data_list = istirahat jika tidak keep_offset: # stasioner dalam data, setel z_offset baru z_offset = z_moving_offset print("New z_offset: ") print(z_offset) n = 0 z_calib = 0 z_moving_offset = 0 z_diff = [= 0 data] keep_offset = Salah keep_offset = Salah

Selanjutnya, kita melakukan beban matematika. Ini melibatkan penerjemahan data akselerasi menjadi data posisi yang memungkinkan kami memberi tahu arah pengguna menggerakkan jari mereka.

def processData(daftar): #[accel.z, mag.y] global z_offset global z_real global z_velo global z_pos global first_data global mag_data

z_real = float(daftar[0]) - z_offset

mag_y = list[1] mag_z = list[2] left = False right = False # Jangan proses akselerasi sampai benar-benar yakin telah dipercepat # Mencegah kebisingan mekanis berkontribusi pada posisi if(z_real -0.20): z_real = 0 #Mulai integrasi untuk menemukan posisi if(first_data): mag_data.append(mag_y) z_pos = (0,5 * z_real * 0,25 * 0,25) + (z_velo * 0,25) + z_pos z_velo = z_real * 0,25 pyautogui.moveTo(1500, 1000) else: z_pos = (0,5 * z_real * 0,25 * 0,25) + (z_velo * 0,25) + z_pos z_velo = (z_real * 0,25) + z_velo del mag_data[0] mag_data.append(mag_y) if(float(mag_data[1]) - float(mag_data[0]) > 0.03): right = True elif(float(mag_data[1]) - float(mag_data[0]) < -0.03): left = True if(right): movement(50, int(z_pos* 1000)) elif(kiri): gerakan(-50, int(z_pos*1000)) z_velo = 0 z_pos = 0

Sekarang, akhirnya, kita pindahkan kursor! Untuk melakukan ini, kami membuka jendela cat dan membuatnya menjadi layar penuh. Pustaka pyautogui berisi fungsi yang disebut pyautogui.dragRel(x, y); yang kita gunakan untuk menyeret kursor mouse dari satu titik ke titik berikutnya. Ini menggunakan data posisi relatif sehingga gerakan relatif terhadap posisi terakhir kursor.

def gerakan(x, y): print("pindah ke", x, -y) pyautogui.dragRel(x, -y)

Terakhir, kita perlu memanggil fungsi utama untuk mengizinkan semua kode ini berjalan.

# Memanggil fungsi untuk memulai serverstartServer()

Direkomendasikan: