Paso 1: Código de Arduino
iniciar el temporizadorTCNT2 = 99; restablecer el temporizador ct a 99 de 255
TIFR2 = 0 X 00; TIMER2 int bandera reg: limpiar bandera de desbordamiento del temporizador
#include < Servo.h >
int ledPin = 13;
changeData Boolean; desactivar la interrupción timer2 si es falso
Servo servo0; crear objeto servo para controlar que un servo 0 es para pulgar
Servo1 servo; 1 es el índice de
Servo servo2; 2 es para el dedo
Servo servo3; 3 es para el anillo
Servo servo4; 4 es por el poco
int potpin_servo [5]; pin de entrada analógico conectado al sensor flex
int tmp; trabajo variable
int tiempo; retardo deseado en ms
int en [5]; memorizar la posición en las posiciones del vector donde escribimos el valor medido para cada servo
int a [5]; memorizar la posición en las posiciones del vector donde visualiza el valor medido para cada servo
int alta [7]; memorizar para cada dedo el mayor valor de resistencia (cuando se cierra la mano)
int baja [7]; memorizar para cada dedo el valor más bajo de la resistencia (cuando esta abierto)
posiciones de int [5] [100]; Retardo máximo = 1000ms e interrupción ocurren cada 10ms = > 100 posiciones max
int f; frecuencia de movimiento deseado en Hz
recuento de flotador;
posf int [5] ;// de trabajo variable de movimiento impuesta
int P; temporizador de prescaller
int lowerAngle; máximo de Valeur et min des servo: 30 et 160°
int upperAngle;
int a;
void setup()
{
pinMode(ledPin,OUTPUT);
Serial.Begin(9600);
servo1.Attach(3); se fija el servo en el pin 3 al objeto servo
servo2.Attach(5);
servo3.Attach(6);
servo4.Attach(9);
servo0.Attach(10);
lowerAngle = 70;
upperAngle = 100;
tiempo = 0; retraso inicial
f = 100; frecuencia en el cHz (1 Hz = 100)
count=(10000/f); de 1 Hz, cuenta = 100 (100 * 10 ms = 1 s = > temps d ' un mouvement!)
P = 99;
tendue principal:
alta [0] = 586;
alta [1] = 576;
alta [2] = 564;
alta [3] = 562;
alta [4] = 528;
Pressa principal
bajo [0] = 694;
baja [1] = 764;
baja [2] = 736;
baja [3] = 760;
bajo [4] = 738;
para (int i = 0; i < 5; i ++)
{
en [i] = 0; intitialization del vector que contiene la posición de fin y principio de
a [i] = 0;
potpin_servo [i] = i; programa inicial: el modo normal
posf [i] = cuenta;
}
ServoInit(); Establecer una posición inicial para servo
Interrupts();
Timer2init();
changeData = true; no comenzar hasta recibir la señal de matlab
} ;
void ServoInit()
{
servo0.Write(upperAngle);
servo1.Write(upperAngle);
servo2.Write(upperAngle);
servo3.Write(upperAngle);
servo4.Write(upperAngle);
}
void Timer2init()
{
Desbordamiento del Timer2 de configuración al fuego cada 8ms (125Hz)
período [s] = (1 / f_clock [s]) * prescaler * (255-cuenta)
(1/16000000) * 1024 * (255-99) =.00998 seg = 10ms
TCCR2B = 0 X 00; Desactivar el Timer2 mientras que hemos establecido
TCNT2 = P; Restablecer el temporizador de cuenta (255-99) = ejecutar reloj de ev 125-th T/C
TIFR2 = 0 X 00; TIMER2 INT bandera Reg: Bandera de desbordamiento claro temporizador
TIMSK2 = 0 X 01; Reg INT TIMER2: Timer2 desbordamiento interrupción habilitar
TCCR2A = 0 X 00; TIMER2 Control Reg A: Onda Gen modo normal
TCCR2B = 0X07; TIMER2 Control Reg B: Prescaler del temporizador se establece en 1024
};
ISR(TIMER2_OVF_vect)
{
SREG = SREG | B10000000; establecer el bit 7 a 1 (global interrupción deshabilitada)
write_position_from_finger(0,potpin_servo[0]);
write_position_from_finger(1,potpin_servo[1]);
write_position_from_finger(2,potpin_servo[2]);
write_position_from_finger(3,potpin_servo[3]);
write_position_from_finger(4,potpin_servo[4]);
if((in[0]-out[0]) > =(time/10) || (out[0]-in[0]) > =(99-(time/10)-1)) / / si esperamos bastante
{
write_position_on_servo (0, servo0);
write_position_on_servo 1, servo1;
write_position_on_servo (2, servo2);
write_position_on_servo (3, servo3);
write_position_on_servo (4, servo4);
}
if(changeData==true) / / changeData = true, reinicialización del posición de la escritura y la lectura en vector (en el tiempo es menor después de cambiar los datos por ejemplo)
{
para (int i = 0; i < 5; i ++)
{
en [i] = 0;
a [i] = 0;
}
}
Else / / si el usuario está cambiando variables, detener la interrupción (se iniciará a finales de la adquisición de datos de usuario)
{
TCNT2 = P; restablecer el temporizador ct a 99 de 255
TIFR2 = 0 X 00; TIMER2 int bandera reg: limpiar bandera de desbordamiento del temporizador
}
};
void write_position_on_servo (int number_of_servo, Servo servo)
{
tmp = posiciones [number_of_servo] [out [number_of_servo]]; Lee el primer valor de vector que contiene los datos del sensor flex
servo.Write(TMP);
hacia fuera [number_of_servo] = a [number_of_servo] + 1; incrementa número de memorizar donde debemos leer
Si (a [number_of_servo] > = 100) //if final de matriz, ir al principio
{
hacia fuera [number_of_servo] = 0;
}
};
void write_position_from_finger (int number_of_servo, int potpin_finger)
{
if(changeData)
{tmp = upperAngle;}
otra cosa
{
if(potpin_finger==9) / / si 9, servo está deshabilitado
{
tmp = upperAngle;
}
//If if(potpin_finger==8) 8, mover solo modo
{
Si (posf [number_of_servo] > ((count*5)/6)) / / este número depende de la velocidad del servo (es el número de 10 ms que el servo pasa "arriba" antes de que vuelve a bajar)
{tmp = upperAngle;}
else if (posf [number_of_servo] > ((count*2)/3))
{tmp = upperAngle-6;}
else if (posf [number_of_servo] >(count/2))
{tmp = upperAngle-12;}
else if (posf [number_of_servo] >(count/3))
{tmp = upperAngle-17;}
else if (posf [number_of_servo] >(count/6))
{tmp = upperAngle-12;}
otra cosa
{tmp = upperAngle-6;}
posf [number_of_servo] = posf [number_of_servo] -1;
if(posf[number_of_servo]==0)
{posf [number_of_servo] = cuenta;}
}
Si (potpin_finger == 0 || potpin_finger == 1 || potpin_finger == 2 || potpin_finger == 3 || potpin_finger == 4).
{
tmp=analogRead(potpin_finger); leer el valor de flex
tmp >> 1; Cambio poco a descuidar el último valor (error de medida)
Serial.println(TMP);
Si (potpin_finger == 0 || potpin_finger == 2 || potpin_finger == 6)
{tmp = mapa (tmp, bajo [potpin_finger], secundaria [potpin_finger], upperAngle, lowerAngle);
} / / invertir el movimiento del servo
otra cosa
{tmp = mapa (tmp, bajo [potpin_finger], secundaria [potpin_finger], lowerAngle, upperAngle);}
tmp = mapa (tmp, bajo [potpin_finger], secundaria [potpin_finger], lowerAngle, upperAngle);
}
}
Si (tmp < lowerAngle) / / protección de servo si analógica Entrada señal defectuosa
{tmp = lowerAngle;}
if(TMP>upperAngle)
{tmp = upperAngle;}
posiciones [number_of_servo] [[number_of_servo]] = tmp;
en [number_of_servo] = en [number_of_servo] + 1; incrementa número de memorizar donde debemos disponemos de datos
Si (en [number_of_servo] > = 100) //if final de matriz, ir al principio
{en [number_of_servo] = 0;}
}
void loop()
{
if(serial.Available() > 0) / / si hay datos para leer = > MATLAB envoie qqchose
{
a=serial.Read();
if(a==1) / / Inicio
{
changeData = false;
} / / pour relancer
if(a==2) / / STOP
{changeData = true;
} //va vartias les acciones en ne relancant pas le temporizador
if(a==3) / / cambio de datos
{
changeData = true;
while(serial.Available() < 7) / / atiende de recevoir les 7 valeurs
{}
Delay(2000);
Time=serial.Read();
tiempo = tiempo * 10;
f=serial.Read();
potpin_servo[0]=serial.Read();
potpin_servo[1]=serial.Read();
potpin_servo[2]=serial.Read();
potpin_servo[3]=serial.Read();
potpin_servo[4]=serial.Read();
count=(5000/f);
para (int i = 0; i < 5; i ++)
{posf [i] = cuenta;}
}
if(a==4) / / INIT???
{
//
}
}
}