Πίνακας περιεχομένων:
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Εισαγωγή
Το Μαγικό Χέρι επιτρέπει σε άτομα με αναπηρίες και κινητικά προβλήματα να απολαμβάνουν τη δημιουργικότητα του σχεδίου και της γραφής σε προσομοιωμένο περιβάλλον. Το Μαγικό Χέρι είναι ένα φορετό γάντι που αισθάνεται την κίνηση του δείκτη σας και το μεταφράζει στο σχέδιο γραμμών στην οθόνη του υπολογιστή.
Χρειαζονται ΥΛΙΚΑ
LSM9DOF Breakout Board --- 24,95 $ ---
Φτερό Adafruit με Wifi --- 18,95 $ ---
Γυναικεία/θηλυκά καλώδια --- 1,95 $ ---
Ταινίες/λωρίδες Velcro --- 3 $
Δύο μαγνήτες ίσης ισχύος --- Οι τιμές ποικίλλουν
Πως δουλεύει
Χρησιμοποιώντας ένα επιταχυνσιόμετρο, μπορούμε να συλλέξουμε δεδομένα επιτάχυνσης για τον άξονα y, τα οποία θα μας βοηθήσουν να καθορίσουμε πότε το δάχτυλο του χρήστη κινείται πάνω και κάτω. Λόγω του γεγονότος ότι το επιταχυνσιόμετρο μας μετρά την επιτάχυνση σε σχέση με το κέντρο της γης, δεν μπορούμε να καθορίσουμε την επιτάχυνση του άξονα x (αριστερά ή δεξιά). Ευτυχώς, ο πίνακας ανάρτησης LSM9DOF περιέχει επίσης ένα μαγνητόμετρο που μας επιτρέπει να συλλέγουμε δεδομένα για μαγνητικά πεδία. Τοποθετούμε δύο μαγνήτες σε απόσταση 30 εκατοστών και έχουμε το γάντι ανάμεσα. Εάν τα μαγνητικά δεδομένα διαβάζονται θετικά, τότε γνωρίζουμε ότι το γάντι κινείται δεξιά και αντίστροφα. Αφού συλλεχθούν όλα τα δεδομένα στο επιταχυνσιόμετρο/μαγνητόμετρο, στέλνει τα δεδομένα μέσω καλωδίου στο φτερό που είναι συνδεδεμένο σε υπολογιστή wifi και στη συνέχεια προωθεί τα δεδομένα στον υπολογιστή τα οποία στη συνέχεια μπορούμε να χρησιμοποιήσουμε στον κωδικό μας.
Βήμα 1: Φυσικό πρωτότυπο 1
Αυτό το πρωτότυπο προορίζεται να είναι ραμμένο γάντι χαλαρά στο χέρι για να γλιστρήσει πάνω από τις ηλεκτρονικές συσκευές. Η ηλεκτρονική συσκευή στη συνέχεια θα προσαρτηθεί με velcro στη βάση του μανικιού κάτω από πανοπλία σε συνδυασμό με ένα βασικό γάντι στο χέρι. Στη συνέχεια, το πράσινο γάντι θα γλιστρήσει πάνω από τη βάση και τις ηλεκτρονικές συσκευές….
Βήματα για την κατασκευή του πρωτότυπου γαντιού:
- Πάρτε δύο κομμάτια υφάσματος αρκετά μεγάλα για να εντοπίσετε το χέρι
- Τραβήξτε το χέρι και στα δύο κομμάτια υφάσματος και κόψτε τα
- Βάλτε τα δύο κομμάτια χειρός μαζί ώστε να είναι τέλεια ευθυγραμμισμένα
- Στη συνέχεια, για να προετοιμάσετε τη ραπτομηχανή, περάστε το νήμα μέσα από τα υποδεικνυόμενα σημεία στο μηχάνημα
- Όταν ρυθμιστεί η ραπτομηχανή, σηκώστε τη βελόνα και τοποθετήστε τα δύο συνδυασμένα κομμάτια υφάσματος κάτω από τη βελόνα
- Βεβαιωθείτε ότι η βελόνα είναι ευθυγραμμισμένη στην άκρη του υφάσματος, ξεκινήστε το μηχάνημα και ράψτε κατά μήκος των άκρων του υφάσματος, αφήνοντας τα δύο κομμάτια άψυχα στον καρπό, ώστε να χωρέσει ένα χέρι.
Βήμα 2: Φυσικό πρωτότυπο 2
Το τελευταίο μας πρωτότυπο είναι ένα κανονικό γάντι σε συνδυασμό με ιμάντα Velcro που ρυθμίζεται σε κάθε καρπό. Το γάντι και ο ιμάντας είναι ραμμένα μεταξύ τους και οι ηλεκτρονικές συσκευές είναι προσαρτημένες στο γάντι μέσω Velcro.
Βήματα για την κατασκευή του 2ου πρωτοτύπου του γαντιού:
- Αγοράστε ένα γάντι, το υλικό του γαντιού δεν έχει σημασία.
- Αγοράστε ένα λουράκι καρπού velcro
- Αγορά φορητής μπαταρίας
- Αγορά Sticky Velcro
- Με μια βελόνα ραψίματος, στερεώστε τον ιμάντα καρπού velcro στη βάση του γαντιού
- Ο ιμάντας καρπού πρέπει να μπορεί να προσαρμόζεται σε διαφορετικά μεγέθη καρπού.
- Συνδέστε την κολλητική ταινία στη βάση του επιταχυνσιόμετρου και στερεώστε την στο δείκτη του γαντιού
- Συνδέστε κολλητική ταινία στο φτερό και στερεώστε την στο πάνω μέρος του γαντιού.
- Χρησιμοποιώντας καλώδια συνδέστε τον πείρο 3V3 στο φτερό με τον πείρο VIN στο επιταχυνσιόμετρο
- Χρησιμοποιώντας καλώδια συνδέστε τον πείρο GND στο φτερό με τον πείρο GND του επιταχυνσιόμετρου.
- Χρησιμοποιώντας καλώδια συνδέστε τον πείρο SCL στο φτερό με τον ακροδέκτη SCL του επιταχυνσιόμετρου.
- Χρησιμοποιώντας καλώδια συνδέστε τον πείρο SDA στο φτερό με τον ακροδέκτη SDA του επιταχυνσιόμετρου.
- Συνδέστε τουλάχιστον μια μπαταρία 5 volt μέσω usb στο φτερό για να τροφοδοτήσετε.
Βήμα 3: Μαγνήτες
Βήμα 1: Βάλτε τους δύο μαγνήτες ίσης δύναμης ο ένας απέναντι από τον άλλο.
Βήμα 2: Μετρήστε το διάκενο 30 εκατοστών μεταξύ των δύο μαγνητών
Βήμα 3: Τοποθετήστε το Μαγνητόμετρο ακριβώς στη μέση των δύο μαγνητών. Θα πρέπει να λαμβάνετε δεδομένα γύρω στο 0 ενώ είναι στη μέση. Εάν λάβετε ένδειξη μηδέν, μεταβείτε στο βήμα 5.
Βήμα 4: Εάν η ένδειξη δεν είναι μηδέν ή κοντά στο μηδέν, πρέπει να ρυθμίσετε την απόσταση των μαγνητών. Εάν η ένδειξη είναι αρνητική, μετακινήστε τον αριστερό μαγνήτη cm ή 2 προς τα αριστερά ή έως ότου η ένδειξη είναι μηδενική. Εάν είναι θετικό, κάντε το ίδιο πράγμα, εκτός από το σωστό μαγνήτη.
Βήμα 5: Γράψτε κώδικα που δέχεται τα δεδομένα από το μαγνητόμετρο και διαβάζει εάν είναι θετικός ή αρνητικός. Εάν είναι θετικός, ο κώδικας τραβήξτε μια γραμμή προς τα δεξιά και εάν αρνητικός τραβήξτε μια γραμμή προς τα αριστερά.
Βήμα 4: Κωδικός
github.iu.edu/ise-e101-F17/MuscleMemory-Sw…
Εισαγωγή:
Για την επεξεργασία δεδομένων από το επιταχυνσιόμετρο, πρέπει να δημιουργηθεί μια σχέση πελάτη/διακομιστή μεταξύ του φτερού Adafruit και του διακομιστή που επεξεργάζεται τα δεδομένα (τρέχει σε φορητό υπολογιστή/επιτραπέζιο υπολογιστή). Θα χρειαστεί να δημιουργηθούν δύο αρχεία κώδικα: το ένα για τον πελάτη (το φτερό του Adafruit) και το άλλο για τον διακομιστή (στην περίπτωση αυτή, ο φορητός υπολογιστής του Jarod). Ο πελάτης είναι γραμμένος σε C ++ και ο διακομιστής είναι γραμμένος σε python. Η γλώσσα που χρησιμοποιείται για τον πελάτη έχει σημασία καθώς το Arduino είναι κυρίως γλώσσα C ++ και η αλλαγή της με διαφορετική γλώσσα είναι δύσκολη. Ο διακομιστής μπορεί να γραφτεί σε οποιαδήποτε γλώσσα, αρκεί να διαθέτει χαρακτηριστικά δικτύου.
Ρύθμιση του Πελάτη:
Αρχικά, θα ρυθμίσουμε τον κωδικό πελάτη. Ο περισσότερος κωδικός σύνδεσης WiFi είναι άμεσα διαθέσιμος μέσω των βιβλιοθηκών Adafruit. Ξεκινάμε συμπεριλαμβάνοντας σχετικά μαθήματα.
#Include #include #include #include #include
Ορίστε ορισμένες μεταβλητές που θα χρησιμοποιηθούν σε ολόκληρο τον κώδικα.
// Σύνδεση σε δίκτυο const char* ssid = "Διακομιστής MMS"; const char* password = "MMS-server-Password"; // IP και θύρα του διακομιστή που θα λάβει δεδομένα const char* host = "149.160.251.3"; const int port = 12347; bool συνδεδεμένο = false?
// Αρχικοποίηση ανιχνευτή κίνησης
Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0 (1000);
Πελάτης WiFiClient.
Δημιουργήστε μια λειτουργία εγκατάστασης () η οποία θα εκτελεστεί μόλις ξεκινήσει το φτερό.
// Ρύθμιση σύνδεσης WiFi και σύνδεση με το servervoid setup () {Serial.begin (9600); καθυστέρηση (100)?
Serial.println ();
Serial.println (); Serial.print ("Σύνδεση σε"); Serial.println (ssid); // Έναρξη WiFi WiFi.begin (ssid, κωδικός πρόσβασης). // Σύνδεση… ενώ (WiFi.status ()! = WL_CONNECTED) {καθυστέρηση (500); Serial.print ("."); } // Επιτυχής σύνδεση στο WiFi Serial.println (""); Serial.println ("WiFi συνδεδεμένο"); Serial.println ("Διεύθυνση IP:"); Serial.println (WiFi.localIP ());
#ifndef ESP8266
ενώ (! Σειριακό)? #endif Serial.begin (9600); Serial.println ("Δοκιμή αισθητήρα");
// Αρχικοποιήστε τον αισθητήρα
εάν (! lsm.begin ()) {// Παρουσιάστηκε πρόβλημα κατά τον εντοπισμό του LSM9DS0 Serial.print (F ("Ωχ, δεν εντοπίστηκε LSM9DS0 … Ελέγξτε την καλωδίωση ή το I2C ADDR!")); ενώ (1)? } Serial.println (F ("Found LSM9DS0 9DOF")); // Έναρξη σύνδεσης με διακομιστή Serial.print ("Σύνδεση σε"); Serial.println (οικοδεσπότης);
// Ελέγξτε για επιτυχή σύνδεση. Εάν αποτύχει, τότε ακυρώστε
if (! client.connect (host, port)) {Serial.println ("σύνδεση απέτυχε"); συνδεδεμένο = ψευδές? ΕΠΙΣΤΡΟΦΗ; } else {συνδεδεμένο = true; }
// Ρυθμίστε το κέρδος και τον χρόνο ενσωμάτωσης του αισθητήρα
configureSensor (); }
Στη συνέχεια χρειαζόμαστε μια λειτουργία βρόχου που θα επαναλαμβάνεται επανειλημμένα. Σε αυτήν την περίπτωση, χρησιμοποιείται για την επανειλημμένη αποστολή δεδομένων από το επιταχυνσιόμετρο στον διακομιστή με τη μορφή "[z_accel]: [y_mag]: [z_mag]". Το client.print (αριθμοί)? η λειτουργία είναι αυτή που στέλνει δεδομένα στον διακομιστή.
void loop () {καθυστέρηση (250); εάν (συνδεδεμένο) {// Αυτό θα στείλει δεδομένα στον διακομιστή sensors_event_t accel, mag, gyro, temp? lsm.getEvent (& accel, & mag, & gyro, & temp); Αριθμοί συμβολοσειρών. αριθμοί += accel.acceleration.z; αριθμοί += ":"; αριθμοί += mag.magnetic.y; αριθμοί += ":"; αριθμοί += mag.magnetic.z; Serial.print (αριθμοί); client.print (αριθμοί)? Serial.println (); } else {installConnection (); }}
Για ορισμένες λειτουργίες χρησιμότητας, χρειαζόμαστε μία για να δημιουργήσουμε τη σύνδεση μεταξύ του φτερού και του διακομιστή.
void installConnection () {if (! client.connect (host, port)) {Serial.println ("σύνδεση απέτυχε"); συνδεδεμένο = ψευδές? ΕΠΙΣΤΡΟΦΗ; } else {συνδεδεμένο = true; }}
Πρέπει επίσης να διαμορφώσουμε τον αισθητήρα και να του δώσουμε το εύρος τιμών που θα διαβάσει. Για παράδειγμα, η επιτάχυνση έχει 5 επιλογές για το εύρος: 2g, 4g, 6g, 8g και 16g.
void configureSensor (void) {// Ορίστε το εύρος επιταχυνσιόμετρου //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); // Ρυθμίστε την ευαισθησία του μαγνητόμετρου //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_2GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_4GAUSS); //lsm.setupMag(lsm. LSM9DS0_MAGGAIN_8GAUSS); lsm.setupMag (lsm. LSM9DS0_MAGGAIN_12GAUSS);
// Ρυθμίστε το γυροσκόπιο
lsm.setupGyro (lsm. LSM9DS0_GYROSCALE_245DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_500DPS); //lsm.setupGyro(lsm. LSM9DS0_GYROSCALE_2000DPS); }
Ρύθμιση του διακομιστή:
Ο διακομιστής θα είναι ένα αρχείο python που θα εκτελείται στη γραμμή εντολών ενός υπολογιστή. Για να ξεκινήσετε, εισαγάγετε τις απαιτούμενες κλάσεις.
εισαγωγή socketimport εκ νέου εισαγωγή pyautogui
η πρίζα χρησιμοποιείται για τη δικτύωση. Το re χρησιμοποιείται για χειρισμούς regex ή συμβολοσειράς. Το pyautogui είναι μια βιβλιοθήκη python που θα επιτρέψει στο σχέδιο να συμβεί (θα συζητηθεί αργότερα).
Στη συνέχεια, πρέπει να ορίσουμε ορισμένες μεταβλητές. Αυτές θα είναι καθολικές μεταβλητές, επομένως θα έχουν πρόσβαση σε πολλαπλές συναρτήσεις. Θα χρησιμοποιηθούν αργότερα στον κώδικα.
i = 0n = 0 γραμμή = 1
λίστα_ δεδομένων =
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 = Λάθος
first_data = True
Χρειαζόμαστε τώρα μια συνάρτηση για να δημιουργήσουμε έναν διακομιστή και να τον ανοίξουμε για εισερχόμενες συνδέσεις.
def startServer (): global i global first_data # initialize server socket serversocket = socket.socket (socket. AF_INET, socket. SOCK_STREAM) serversocket.setsockopt (socket. SOL_SOCKET, socket. SO_REUSEADDR, 1) # διεύθυνση IP διακομιστή και κεντρικός υπολογιστής θύρας = " 149.160.251.3 "port = 12347 server_address = (host, port) # Άνοιγμα του διακομιστή και ακρόαση για εισερχόμενες συνδέσεις εκτύπωση ('Εκκίνηση διακομιστή σε %s θύρα %s' %server_address) serversocket.bind (server_address) serversocket.listen (5) # Περιμένετε για συνδέσεις… ενώ True: print ('Περιμένετε για σύνδεση…')) while True: # Λάβετε τα δεδομένα και στείλτε τα για επεξεργασία δεδομένων = 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] εκτύπωση (accel_data) i+= 1 εάν (i <51): calibData (accel_data) else: moveAcce l (accel_data [0]) processData (accel_data) first_data = Λάθος τέλος: # Κλείστε την πρίζα για να αποφύγετε άσκοπη διαρροή δεδομένων clientocket.close ()
Τώρα απαιτούμε τις συναρτήσεις που θα επεξεργάζονται όλα τα δεδομένα. Το πρώτο βήμα που πρέπει να γίνει, και η πρώτη συνάρτηση που ονομάζεται, είναι η βαθμονόμηση του αισθητήρα για σκοπούς υπολογισμού.
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 = mag_calib_y / 50 z_calib = 0 mag_calib_y = 0 mag_data.append (mag_offset_y)
Στη συνέχεια, δημιουργούμε μια κινούμενη μετατόπιση επιτάχυνσης. Αυτό το καθιστά έτσι ώστε το πρόγραμμα να αναγνωρίζει πότε κάποιος σταματά να κινεί το δάχτυλό του επειδή όλες οι τιμές επιτάχυνσης που αποστέλλονται στον διακομιστή θα πρέπει να είναι ίδιες εκείνη τη στιγμή.
def moveAccel (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 ή z_diff <-0.2): # κίνηση εντοπίστηκε στα δεδομένα, επανεκκίνηση keep_offset = True n = 0 z_calib = 0 z_moving_offset = 0 z_diff = 0 data_list = break if not keep_offset: # στάσιμο στα δεδομένα, ορίστε νέα 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 = keep_offset = Λάθος keep_offset = Λάθος
Στη συνέχεια, κάνουμε το μεγαλύτερο βάρος των μαθηματικών. Αυτό περιλαμβάνει τη μετάφραση των δεδομένων επιτάχυνσης σε δεδομένα θέσης που θα μας επιτρέψουν να πούμε την κατεύθυνση προς την οποία ο χρήστης κινεί το δάχτυλό του.
def processData (λίστα): #[accel.z, mag.y] παγκόσμια z_offset παγκόσμια z_real παγκόσμια z_velo παγκόσμια z_pos global παγκόσμια first_data παγκόσμια mag_data
z_real = float (λίστα [0]) - z_offset
mag_y = λίστα [1] mag_z = λίστα [2] αριστερά = Λάθος δεξιά = Λάθος # Μην επεξεργαστείτε την επιτάχυνση μέχρι να βεβαιωθείτε ότι έχει επιταχυνθεί # Αποτρέπει τη συμβολή του μηχανικού θορύβου στη θέση εάν (z_real -0.20): z_real = 0 #Begin ενσωματώσεις για εύρεση θέσης εάν (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) αλλιώς: 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): δεξιά = True elif (float (mag_data [1]) - float (mag_data [0]) <-0.03): left = True if (right): κίνηση (50, int (z_pos* 1000)) elif (αριστερά): κίνηση (-50, int (z_pos*1000)) z_velo = 0 z_pos = 0
Τώρα, επιτέλους, μετακινούμε τον κέρσορα! Για να γίνει αυτό, ανοίξαμε ένα παράθυρο βαφής και το κάναμε σε πλήρη οθόνη. Η βιβλιοθήκη pyautogui περιέχει μια συνάρτηση που ονομάζεται pyautogui.dragRel (x, y). που χρησιμοποιούμε για να σύρουμε τον κέρσορα του ποντικιού από το ένα σημείο στο άλλο. Χρησιμοποιεί δεδομένα σχετικής θέσης, οπότε η κίνηση είναι σχετική με την τελευταία θέση του δρομέα.
def κίνηση (x, y): εκτύπωση ("μετακίνηση σε", x, -y) pyautogui.dragRel (x, -y)
Τέλος, πρέπει να καλέσουμε την κύρια συνάρτηση για να επιτρέψουμε ακόμη και σε αυτόν τον κώδικα να τρέξει.
# Καλεί τη λειτουργία για να ξεκινήσει το serverstartServer ()