Mục lục:

Viết Accel (Bàn tay ma thuật): 4 bước (có hình ảnh)
Viết Accel (Bàn tay ma thuật): 4 bước (có hình ảnh)

Video: Viết Accel (Bàn tay ma thuật): 4 bước (có hình ảnh)

Video: Viết Accel (Bàn tay ma thuật): 4 bước (có hình ảnh)
Video: Thanh niên lần đầu chưa có kinh nghiệm kiểu#funny #tiktok 2024, Tháng mười một
Anonim
Accel Writing (Bàn tay ma thuật)
Accel Writing (Bàn tay ma thuật)
Accel Writing (Bàn tay ma thuật)
Accel Writing (Bàn tay ma thuật)
Accel Writing (Bàn tay ma thuật)
Accel Writing (Bàn tay ma thuật)

Giới thiệu

Bàn tay ma thuật cho phép người khuyết tật và suy giảm kỹ năng vận động tận hưởng khả năng sáng tạo của việc vẽ và viết trong một môi trường mô phỏng. Magic Hand là một loại găng tay có thể đeo được, cảm nhận chuyển động của ngón trỏ của bạn và chuyển nó thành bản vẽ các đường trên màn hình máy tính.

Vật liệu cần thiết

Bảng đột phá LSM9DOF --- $ 24,95 ---

Adafruit Feather có Wifi --- $ 18,95 ---

Dây Nữ / Nữ --- $ 1,95 ---

Dải băng / Velcro --- $ 3

Hai nam châm có độ bền bằng nhau --- Giá khác nhau

Làm thế nào nó hoạt động

Bằng cách sử dụng gia tốc kế, chúng tôi có thể thu thập dữ liệu gia tốc cho trục y, điều này sẽ giúp chúng tôi xác định thời điểm ngón tay người dùng di chuyển lên và xuống. Do thực tế là gia tốc kế của chúng tôi đo gia tốc đối với tâm trái đất, chúng tôi không thể xác định gia tốc của trục x (trái hoặc phải). May mắn thay, bảng đột phá LSM9DOF cũng chứa một từ kế cho phép chúng tôi thu thập dữ liệu về từ trường. Chúng tôi đặt hai nam châm cách nhau 30 cm và có một chiếc găng tay ở giữa. Nếu dữ liệu từ trường đọc là dương thì chúng ta biết găng tay đang di chuyển sang phải và ngược lại. Sau khi tất cả dữ liệu được thu thập trong gia tốc kế / từ kế, nó sẽ gửi dữ liệu qua dây dẫn tới chiếc lông vũ được kết nối với máy tính wifi và sau đó chuyển tiếp dữ liệu đến máy tính mà chúng ta có thể sử dụng trong mã của mình.

Bước 1: Nguyên mẫu vật lý 1

Nguyên mẫu vật lý 1
Nguyên mẫu vật lý 1
Nguyên mẫu vật lý 1
Nguyên mẫu vật lý 1

Nguyên mẫu này có nghĩa là chiếc găng tay được khâu lại với nhau một cách lỏng lẻo trên bàn tay để nó có thể trượt qua các thiết bị điện tử. Thiết bị điện tử sau đó sẽ được gắn bằng khóa dán vào đế dưới áo giáp kết hợp với một chiếc găng tay cơ bản trên tay. Khi đó chiếc găng tay màu xanh lá cây sẽ trượt qua phần đế và các thiết bị điện tử….

Các bước tạo ra chiếc găng tay nguyên mẫu:

  • Lấy hai mảnh vải đủ lớn để theo dõi bàn tay
  • Tra tay lên cả hai mảnh vải và cắt chúng ra
  • Đặt hai vết cắt bằng tay lại với nhau để chúng được liên kết hoàn hảo
  • Tiếp theo, để chuẩn bị máy may, chạy chỉ qua các điểm được chỉ định trên máy
  • Khi máy may được thiết lập, nhấc kim lên và đặt hai mảnh vải ghép lại với nhau dưới kim
  • Đảm bảo kim thẳng hàng trên mép vải, khởi động máy và may dọc theo mép vải, đồng thời để hai mảnh vải không bị cuốn vào cổ tay để một bàn tay có thể nhét vào.

Bước 2: Nguyên mẫu vật lý 2

Nguyên mẫu vật lý 2
Nguyên mẫu vật lý 2
Nguyên mẫu vật lý 2
Nguyên mẫu vật lý 2

Nguyên mẫu cuối cùng của chúng tôi là một chiếc găng tay thông thường kết hợp với dây đeo Velcro có thể điều chỉnh cho phù hợp với bất kỳ cổ tay nào. Găng tay và dây đeo được khâu lại với nhau, và các thiết bị điện tử được gắn vào găng tay thông qua Velcro.

Các bước tạo nguyên mẫu thứ 2 của găng tay:

  1. Mua một chiếc găng tay, chất liệu của chiếc găng tay không quan trọng.
  2. Mua dây đeo tay khóa dán
  3. Mua pin di động
  4. Mua miếng dán dính
  5. Dùng kim khâu gắn dây đeo cổ tay khóa dán vào đế găng tay
  6. Dây đeo cổ tay có thể điều chỉnh các kích cỡ cổ tay khác nhau.
  7. Gắn băng dính vào đế của máy đo gia tốc và dán vào ngón trỏ của găng tay
  8. Dán băng dính vào chiếc lông vũ và gắn vào đầu găng tay.
  9. Sử dụng dây kết nối chân 3V3 trong lông vũ với chân VIN trong máy đo gia tốc
  10. Sử dụng dây kết nối chân GND trong lông vũ với chân GND của máy đo gia tốc.
  11. Sử dụng dây kết nối chân SCL trong lông vũ với chân SCL của máy đo gia tốc.
  12. Sử dụng dây kết nối chân SDA trong lông vũ với chân SDA của máy đo gia tốc.
  13. Kết nối ít nhất một pin 5 volt thông qua usb với lông để cung cấp năng lượng.

Bước 3: Nam châm

Nam châm
Nam châm

Bước 1: Đặt hai nam châm có cường độ bằng nhau nằm đối diện nhau.

Bước 2: Đo khoảng cách 30 cm giữa hai nam châm

Bước 3: Đặt Magnetometer chính xác vào giữa hai nam châm. Bạn sẽ nhận được dữ liệu xung quanh 0 trong khi dữ liệu ở giữa. Nếu bạn nhận được kết quả đọc bằng 0, hãy chuyển sang bước 5.

Bước 4: Nếu số đọc không bằng 0 hoặc gần bằng 0 thì bạn phải điều chỉnh khoảng cách của các nam châm. Nếu số đọc là âm, hãy di chuyển nam châm sang trái một cm hoặc 2 cm hoặc cho đến khi số đọc bằng không. Nếu nó là dương tính, hãy làm điều tương tự ngoại trừ với nam châm phù hợp.

Bước 5: Viết mã chấp nhận dữ liệu từ từ kế và đọc dữ liệu đó là dương hay âm. Nếu tích cực có mã vẽ một đường bên phải và nếu tiêu cực vẽ một đường bên trái.

Bước 4: Mã

Mã số
Mã số

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

Giới thiệu:

Để xử lý dữ liệu từ gia tốc kế, phải thiết lập mối quan hệ máy khách / máy chủ giữa Adafruit fur và máy chủ xử lý dữ liệu (chạy trên máy tính xách tay / máy tính để bàn). Hai tệp mã sẽ cần được tạo: một tệp cho máy khách (lông Adafruit) và tệp kia cho máy chủ (trong trường hợp này là máy tính xách tay của Jarod). Máy khách được viết bằng C ++ và máy chủ được viết bằng python. Ngôn ngữ được sử dụng cho máy khách rất quan trọng vì Arduino chủ yếu là ngôn ngữ C ++ và việc thay đổi nó sang một ngôn ngữ khác là rất khó. Máy chủ có thể được viết bằng bất kỳ ngôn ngữ nào, miễn là nó có các tính năng mạng.

Thiết lập Khách hàng:

Đầu tiên, chúng tôi sẽ thiết lập mã khách hàng. Hầu hết mã kết nối WiFi đều có sẵn thông qua các thư viện Adafruit. Chúng tôi bắt đầu bằng cách bao gồm các lớp học có liên quan.

#include #include #include #include #include

Đặt một số biến những gì sẽ được sử dụng trong suốt mã.

// Kết nối với mạng const char * ssid = "MMServer"; const char * password = "MMServer-Password"; // IP và cổng của máy chủ sẽ nhận dữ liệu const char * host = "149.160.251.3"; const int cổng = 12347; bool kết nối = false;

// Khởi tạo bộ dò chuyển động

Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);

Máy khách WiFiClient;

Tạo một hàm setup () sẽ chạy ngay khi bắt đầu chạy.

// Thiết lập kết nối WiFi và kết nối với servervoid setup () {Serial.begin (9600); chậm trễ (100);

Serial.println ();

Serial.println (); Serial.print ("Đang kết nối với"); Serial.println (ssid); // Khởi động WiFi WiFi.begin (ssid, password); // Đang kết nối… while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } // Đã kết nối thành công với WiFi Serial.println (""); Serial.println ("Đã kết nối WiFi"); Serial.println ("Địa chỉ IP:"); Serial.println (WiFi.localIP ());

#ifndef ESP8266

while (! nối tiếp); #endif Serial.begin (9600); Serial.println ("Kiểm tra cảm biến");

// Khởi tạo cảm biến

if (! lsm.begin ()) {// Đã xảy ra sự cố khi phát hiện LSM9DS0 Serial.print (F ("Rất tiếc, không phát hiện thấy LSM9DS0 nào… Hãy kiểm tra hệ thống dây điện hoặc I2C ADDR của bạn!")); trong khi (1); } Serial.println (F ("Tìm thấy LSM9DS0 9DOF")); // Bắt đầu kết nối với máy chủ Serial.print ("Đang kết nối với"); Serial.println (máy chủ);

// Kiểm tra kết nối thành công. Nếu không thành công thì hủy bỏ

if (! client.connect (host, port)) {Serial.println ("kết nối không thành công"); kết nối = sai; trở lại; } else {kết nối = true; }

// Thiết lập độ lợi cảm biến và thời gian tích hợp

configSensor (); }

Sau đó chúng ta cần một hàm lặp sẽ lặp lại nhiều lần. Trong trường hợp này, nó được sử dụng để gửi nhiều lần dữ liệu từ gia tốc kế đến máy chủ dưới dạng “[z_accel]: [y_mag]: [z_mag]”. Client.print (số); chức năng là những gì gửi dữ liệu đến máy chủ.

void loop () {delay (250); if (kết nối) {// Thao tác này sẽ gửi dữ liệu đến máy chủ sensor_event_t accel, mag, gyro, temp; lsm.getEvent (& accel, & mag, & gyro, & temp); Chuỗi số; số + = accel.acceleration.z; số + = ":"; số + = mag.magnetic.y; số + = ":"; số + = mag.magnetic.z; Serial.print (số); client.print (số); Serial.println (); } else {settingConnection (); }}

Đối với một số chức năng tiện ích, chúng tôi cần một chức năng để thiết lập kết nối giữa lông và máy chủ.

void settingConnection () {if (! client.connect (host, port)) {Serial.println ("kết nối không thành công"); kết nối = sai; trở lại; } else {kết nối = true; }}

Chúng ta cũng cần định cấu hình cảm biến và cung cấp cho nó phạm vi giá trị mà nó sẽ đọc. Ví dụ, tăng tốc có 5 tùy chọn cho phạm vi: 2g, 4g, 6g, 8g và 16g.

void configSensor (void) {// Đặt phạm vi gia tốc kế //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); // Đặt độ nhạy của từ kế //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);

// Thiết lập con quay hồi chuyển

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

Thiết lập Máy chủ:

Máy chủ sẽ là một tệp python sẽ chạy trên dòng lệnh của máy tính. Để bắt đầu, hãy nhập các lớp cần thiết.

import socketimport re import pyautogui

ổ cắm được sử dụng để kết nối mạng. re được sử dụng cho các thao tác regex hoặc chuỗi. pyautogui là một thư viện python sẽ cho phép việc vẽ diễn ra (sẽ thảo luận ở phần sau).

Tiếp theo, chúng ta nên xác định một số biến. Đây sẽ là các biến toàn cục, vì vậy chúng sẽ được truy cập trong nhiều hàm. Chúng sẽ được sử dụng sau này trong mã.

i = 0n = 0 dòng = 1

data_list =

mag_data =

mag_calib_y = 0 mag_offset_y = 0

z_calib = 0

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

keep_offset = Sai

first_data = True

Bây giờ chúng ta cần một chức năng để tạo một máy chủ và mở nó cho các kết nối đến.

def startServer (): global i global first_data # khởi tạo ổ cắm máy chủ serverocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serverocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # Địa chỉ IP máy chủ và máy chủ cổng = " 149.160.251.3 "port = 12347 server_address = (host, port) # Mở máy chủ và lắng nghe các kết nối đến in ('Máy chủ khởi động trên% s port% s'% server_address) serverocket.bind (server_address) serverocket.listen (5) # Chờ kết nối… trong khi True: print ('Đang chờ kết nối…') # Chấp nhận kết nối đến (clientsocket, address) = serverocket.accept () # Cố gắng phân tích cú pháp dữ liệu nhận được try: print ('Kết nối được thiết lập từ', địa chỉ) while True: # Nhận dữ liệu và gửi để xử lý dữ liệu = 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 = False cuối cùng: # Đóng socket để tránh rò rỉ dữ liệu không cần thiết clientsocket.close ()

Bây giờ chúng tôi yêu cầu các chức năng sẽ xử lý tất cả dữ liệu. Bước đầu tiên cần thực hiện và chức năng đầu tiên được gọi là hiệu chuẩn cảm biến cho các mục đích tính toán.

def calibData (list): global z_calib global z_offset global mag_data global mag_calib_y global mag_offset_y z_calib + = float (list [0]) mag_calib_y + = float (list [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)

Tiếp theo, chúng tôi tạo ra một phần bù gia tốc di chuyển. Điều này làm cho nó để chương trình nhận ra khi ai đó ngừng di chuyển ngón tay của họ vì tất cả các giá trị cho gia tốc được gửi đến máy chủ phải giống nhau tại thời điểm đó.

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 hoặc z_diff <-0.2): # chuyển động được phát hiện trong dữ liệu, khởi động lại keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = break if not keep_offset: # static in data, set new z_offset 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_list = 0 data_list] keep_offset = False keep_offset = False

Tiếp theo, chúng ta thực hiện phần toán học. Điều này liên quan đến việc dịch dữ liệu gia tốc thành dữ liệu vị trí sẽ cho phép chúng tôi cho biết hướng mà người dùng di chuyển ngón tay của họ.

def processData (list): # [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 (list [0]) - z_offset

mag_y = list [1] mag_z = list [2] left = False right = False # Không xử lý gia tốc cho đến khi hoàn toàn chắc chắn rằng nó đã tăng tốc # Ngăn tiếng ồn cơ học góp phần vào vị trí nếu (z_real -0,20): z_real = 0 #Begin tích hợp để tìm vị trí 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 (trái): chuyển động (-50, int (z_pos * 1000)) z_velo = 0 z_pos = 0

Bây giờ, cuối cùng, chúng ta di chuyển con trỏ! Để làm điều này, chúng tôi đã mở một cửa sổ sơn và để nó ở chế độ toàn màn hình. Thư viện pyautogui chứa một hàm được gọi là pyautogui.dragRel (x, y); mà chúng tôi sử dụng để kéo con trỏ chuột từ điểm này sang điểm tiếp theo. Nó sử dụng dữ liệu vị trí tương đối để chuyển động có liên quan đến vị trí cuối cùng của con trỏ.

chuyển động def (x, y): print ("chuyển tới", x, -y) pyautogui.dragRel (x, -y)

Cuối cùng, chúng ta cần gọi hàm chính để cho phép tất cả mã này chạy.

# Gọi hàm để bắt đầu serverstartServer ()

Đề xuất: