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:
#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!
}
#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(" ");
}
