• Carlos Alquezar posted an update 10 years, 9 months ago


    Hi again!! I have used Muscle Sensor V3 from Advancer Technologies to control InMoov arm. For the moment the system works like this:
    The signal is sampled at 500Hz using a timer interrupt at arduino board, and a threshold is set in order to determine when the hand is closed (If the signal sample is greater than the threshold, the arduino close the hand and otherwise, the hand is opened). For the moment, the 500Hz sample frequency is not necessary, but I’m working in other script using EMG and the sampling frequency is important.

    @Gael : Here is my script to control InMoov arm using Muscle sensor v3 from Advancer Technologies 🙂

    //Sampling at 500 Hz analog input signal
    //by Carlos Alquezar
    //February 2014

    //Based on timer interrupts
    //by Amanda Ghassaei
    //June 2012
    //http://www.instructables.com/id/Arduino-Timer-Interrupts/

    /*
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 3 of the License, or
     * (at your option) any later version.
     *
    */

    //For arduino uno or any board with ATMEL 328/168.. diecimila, duemilanove, lilypad, nano, mini…

    //timer0 will interrupt at 500Hz

    #include <Servo.h>

    #define THRESHOLD 200 //In order to determine the state of the hand (opened/closed)
    #define EMGPIN 3 //Analog pin connected to Muscle Sensor V3 Board
    #define LITTLEPIN  3 //Digital pin used by Little servo
    #define RINGPIN    5 //Digital pin used by Ring servo
    #define MIDDLEPIN  6 //Digital pin used by Middle servo
    #define INDEXPIN   9 //Digital pin used by Index servo
    #define THUMBPIN  10 //Digital pin used by Thumb servo

    //Constants used to open and close the fingers
    #define LITTLE 1 
    #define RING   2
    #define MIDDLE 3
    #define INDEX  4
    #define THUMB  5

    Servo servoLittleFinger; // Define servo fingers
    Servo servoRingFinger; // Define servo fingers
    Servo servoMiddleFinger; // Define servo fingers
    Servo servoIndexFinger; // Define servo fingers
    Servo servoThumbFinger; // Define servo fingers

    int finger;

    // Motion routines for handopen and handclose
    void openhand(){for(finger = 1; finger < 6; finger++){openFinger(finger);}}
    void closehand(){for(finger = 1; finger < 6 ; finger++){closeFinger(finger);}}

    // You have to rewrite properly the functions to open and close the fingers 
    // according of your assembly

    void openFinger(int finger){
      if(finger==LITTLE){servoLittleFinger.write(0);} // Little finger
      else if(finger==RING){servoRingFinger.write(170);}// Ring finger
      else if(finger==MIDDLE){servoMiddleFinger.write(170);}// Middle finger
      else if(finger==INDEX){servoIndexFinger.write(170);}// Index finger
      else if(finger==THUMB){servoThumbFinger.write(0);}//Thumb finger
    }

    void closeFinger(int finger){
      if(finger==LITTLE){servoLittleFinger.write(170);} // Little finger
      else if(finger==RING){servoRingFinger.write(0);}// Ring finger
      else if(finger==MIDDLE){servoMiddleFinger.write(0);}// Middle finger
      else if(finger==INDEX){servoIndexFinger.write(0);}// Index finger
      else if(finger==THUMB){servoThumbFinger.write(170);}//Thumb finger
    }

    void setup(){
      
      Serial.begin(115200); //BAUDRATE set to 115200, remember it to set monitor serial properly
      
      cli();//stop interrupts
      //set timer0 interrupt at 500Hz
      TCCR0A = 0;// set entire TCCR0A register to 0
      TCCR0B = 0;// same for TCCR0B
      TCNT0  = 0;//initialize counter value to 0
      // set compare match register for 500hz increments
      OCR0A = 124;// = (16*10^6) / (500*256) – 1 (must be <256)
      // turn on CTC mode
      TCCR0A |= (1 << WGM01);
      // Set CS12 bit for 256 prescaler
      TCCR0B |= (1 << CS12);   
      // enable timer compare interrupt
      TIMSK0 |= (1 << OCIE0A);
      sei();//allow interrupts

      servoLittleFinger.attach(LITTLEPIN); // Set Little finger servo to digital pin 3
      servoRingFinger.attach(RINGPIN); // Set Ring finger servo to digital pin 5
      servoMiddleFinger.attach(MIDDLEPIN); // Set Middle finger servo to digital pin 6
      servoIndexFinger.attach(INDEXPIN); // Set Index finger servo to digital pin 9
      servoThumbFinger.attach(THUMBPIN); // Set Thumb finger servo to digital pin 10

    }//end setup

    //This function is executed every interrupt
    ISR(TIMER0_COMPA_vect){//timer0 interrupts at 500Hz
      
      int value = analogRead(EMGPIN); //Sampling analog signal
      if(value>THRESHOLD) //If the value of the sample is greater than THRESHOLD means that the hand has been closed
      {closehand();}
      else //Otherwise the hand is open
      {openhand();}
      Serial.println(value); //You can use serial monitor to set THRESHOLD properly, comparing the values shown when you open and close your hand
    }

    void loop() {// Nothing to do here, all is done in the interrupt function
    }