Roboterhand

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