Dieses Projekt kommt bei meinen Schülern immer sehr gut an. Die Roboterhand würde sich auch sehr gut mit meiner Elektromyographie (EMG) kombinieren lassen (https://stoppi-homemade-physics.de/emg/).
Benötigt werden neben zwei Arduino noch 5 Servomotoren, ein stärkeres 5V-Netzteil, 5 Stück Flexsensoren (diese ändern ihren Widerstand je nach Biegung) und zwei NRF24L01 Funkmodule zur Kommunikation zwischen Sender und Empfänger.
Arduino-Codes für Sender und Empfänger:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
#include <SPI.h> #include "RF24.h" #include "Wire.h" #include "I2Cdev.h" // I2Cdev and MPU6050 must be installed as libraries #include <math.h> int Finger_0; int Finger_1; int Finger_2; int Finger_3; int Finger_4; const int analogInPin_0 = A0; // Analog input pins that the fingers are attached to const int analogInPin_1 = A1; const int analogInPin_2 = A2; const int analogInPin_3 = A3; const int analogInPin_4 = A4; int data[5]; // per Funk übertragenes Datenarray für alle Finger // Funkmodul NRF24L01 mit Arduino-Pins verbinden: // SCK -> 13 // MISO -> 12 // MOSI -> 11 // CSN -> 10 // CE -> 9 // SPI-Bus Pins 9 und 10 // ============================================================== const uint64_t pipe = 0xE8E8F0F0E1LL; // Adresse des Übertragungskanals des NRF24L01 RF24 radio(9,10); // ****************************************** // **************** SETUP ******************* // ****************************************** void setup() { radio.begin(); radio.openWritingPipe(pipe); // Sende-Kanal öffnen // join I2C bus (I2Cdev library doesn't do this automatically) Wire.begin(); Serial.begin(57600); } // ************************************************** // **************** HAUPTSCHLEIFE ******************* // ************************************************** void loop() { Finger_0 = analogRead(analogInPin_0); Finger_1 = analogRead(analogInPin_1); Finger_2 = analogRead(analogInPin_2); Finger_3 = analogRead(analogInPin_3); Finger_4 = analogRead(analogInPin_4); // Anzeige des Poti-Werts im serial monitor Serial.print(Finger_0); Serial.print(" "); Serial.print(Finger_1); Serial.print(" "); Serial.print(Finger_2); Serial.print(" "); Serial.print(Finger_3); Serial.print(" "); Serial.println(Finger_4); Finger_0 = map(Finger_0, 470, 680, 0, 180); // map it to the range of the servo Finger_1 = map(Finger_1, 390, 590, 0, 180); // map it to the range of the servo Finger_2 = map(Finger_2, 290, 460, 0, 180); // map it to the range of the servo Finger_3 = map(Finger_3, 300, 450, 0, 180); // map it to the range of the servo Finger_4 = map(Finger_4, 600, 810, 0, 180); // map it to the range of the servo if (Finger_0 < 0) Finger_0 = 0; if (Finger_0 > 180) Finger_0 = 180; if (Finger_1 < 0) Finger_1 = 0; if (Finger_1 > 180) Finger_1 = 180; if (Finger_2 < 0) Finger_2 = 0; if (Finger_2 > 180) Finger_2 = 180; if (Finger_3 < 0) Finger_3 = 0; if (Finger_3 > 180) Finger_3 = 180; if (Finger_4 < 0) Finger_4 = 0; if (Finger_4 > 180) Finger_4 = 180; /* Serial.print(Finger_0); Serial.print(" "); Serial.print(Finger_1); Serial.print(" "); Serial.print(Finger_2); Serial.print(" "); Serial.print(Finger_3); Serial.print(" "); Serial.println(Finger_4); */ data[0] = Finger_0; data[1] = Finger_1; data[2] = Finger_2; data[3] = Finger_3; data[4] = Finger_4; radio.write(data, 10); // ACHTUNG: Adresse (data) und Länge (pro int 2 byte, d.h. für 5 Zahlen 10 eintragen) der zu sendenden Daten! } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#include <Servo.h> #include <SPI.h> #include "RF24.h" #include <Wire.h> Servo servo_0; // Servobezeichnungen Servo servo_1; // Servobezeichnungen Servo servo_2; // Servobezeichnungen Servo servo_3; // Servobezeichnungen Servo servo_4; // Servobezeichnungen const uint64_t pipe = 0xE8E8F0F0E1LL; bool done; int Wert_erhalten[5]; // Werte-array welches die 5 übermittelten Werte enthält. Achtung: Der Index beginnt mit 0! // Funkmodul NRF24L01 mit Arduino-Pins verbinden: // SCK -> 13 // MISO -> 12 // MOSI -> 11 // CSN -> 10 // CE -> 9 // SPI-Bus Pins 9 und 10 // ============================================================== RF24 radio(9,10); // ****************************************** // **************** SETUP ******************* // ****************************************** void setup() { Serial.begin(57600); Serial.println("ankommende Signale:"); servo_0.attach(4); // Set horizontalen servo to digital pin 3 servo_1.attach(5); // Set horizontalen servo to digital pin 4 servo_2.attach(6); // Set horizontalen servo to digital pin 5 servo_3.attach(7); // Set horizontalen servo to digital pin 6 servo_4.attach(8); // Set horizontalen servo to digital pin 7 // Werte-array wird zu Beginn auf 0 gesetzt! for (int i = 0; i <= 4; i++) { Wert_erhalten[i] = 0; } radio.begin(); radio.openReadingPipe(1, pipe); radio.startListening(); } // ************************************************** // **************** HAUPTSCHLEIFE ******************* // ************************************************** void loop() { if (radio.available()) { done = false; while (!done) { done = radio.read(Wert_erhalten, 10); // ACHTUNG: Für jeden übertragenen Integerwert 4 Byte! } } servo_0.write(Wert_erhalten[0]); // Ausgabe des erhaltenen Werts (Index 0) an den Servo 0! servo_1.write(Wert_erhalten[1]); // Ausgabe des erhaltenen Werts (Index 1) an den Servo 1! servo_2.write(Wert_erhalten[2]); // Ausgabe des erhaltenen Werts (Index 2) an den Servo 2! servo_3.write(Wert_erhalten[3]); // Ausgabe des erhaltenen Werts (Index 3) an den Servo 3! servo_4.write(Wert_erhalten[4]); // Ausgabe des erhaltenen Werts (Index 4) an den Servo 4! // Ausgabe der aktuellen übermittelten Zahlenwerte for (int i = 0; i <= 4; i++) { Serial.print(Wert_erhalten[i]); Serial.print(" "); } Serial.println(" "); } |