Stap 1: Arduino code
de timer beginnenTCNT2 = 99; Reset timer ct tot en met 99 van 255
TIFR2 = 0X00; timer2 int vlag reg: timer overloop markering wissen
#include < Servo.h >
int ledPin = 13;
Booleaanse changeData; timer2 onderbreken uitschakelen als de waarde false
Servo servo0; servo-object om een servo 0 voor duim is controle maken
Servo servo1; 1 is voor de index
Servo servo2; 2 is voor de middelvinger
Servo servo3; 3 is voor de ring
Servo servo4; 4 is voor de kleine
int potpin_servo [5]; analoge ingang pin verbonden met de flex-sensor
int tmp; werkende variabele
int de tijd; wilde vertraging in ms
int in [5]; onthouden van de positie in vector posities waar we de gemeten waarde voor elke servo schrijven
int uit [5]; onthouden van de positie in vector standpunten waar wij het lezen van de gemeten waarde voor elke servo
int hoog [7]; onthouden voor elke vinger de hoogste waarde van weerstand (wanneer de hand wordt gesloten)
int lage [7]; onthouden voor elke vinger de laagste waarde van weerstand (wanneer de hand is open)
int posities [5] [100]; max vertragen 1000ms = en interrupt optreden elke 10ms = > 100 posities max
int f; frequentie van de gewenste beweging in Hz
float tellen;
int posf [5] ;// werken variabele voor opgelegde beweging
int P; prescaller timer
int lowerAngle; valeur max et min des servo: 30 et 160°
int upperAngle;
int;
VOID Setup
{
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
servo1.attach(3); de servo op pin 3 hecht aan de servo-object
servo2.attach(5);
servo3.attach(6);
servo4.attach(9);
servo0.attach(10);
lowerAngle = 70;
upperAngle = 100;
tijd = 0; vertraging
f = 100; frequentie in cHz (1 Hz = 100)
Count=(10000/f); voor 1 Hz, tellen = 100 (100 * 10 ms = 1 sec = > temps d'un mouvement!)
P = 99;
belangrijkste tendue:
hoge [0] = 586;
hoog [1] = 576;
hoge [2] = 564;
hoge [3] = 562;
hoge [4] = 528;
belangrijkste rapport
lage [0] = 694;
laag [1] = 764;
lage [2] = 736;
lage [3] = 760;
lage [4] = 738;
for (int i = 0; ik < 5; i ++)
{
in [i] = 0; intitialization van vector positie van einde en begin met
uit [i] = 0;
potpin_servo [i] = i; Startprogramma: normale modus
posf [i] = tellen;
}
ServoInit(); Stel een aanvankelijke positie van de servo
interrupts();
Timer2init();
changeData = true; geen start totdat het signaal ontvangen vanuit matlab
} ;
VOID ServoInit()
{
servo0.write(upperAngle);
servo1.write(upperAngle);
servo2.write(upperAngle);
servo3.write(upperAngle);
servo4.write(upperAngle);
}
VOID Timer2init()
{
Setup Timer2 overloop te vuren elke 8ms (125Hz)
periode [sec] = (1 / f_clock [sec]) * prescale * (255-telling)
(1/16000000) * 1024 * (255-99) =.00998 sec = 10ms
TCCR2B = 0X00; Uitschakelen van Timer2, terwijl we het instellen
TCNT2 = P; Opnieuw instellen van de Timer graaf (255-99) = ev 125-th T/C klok uitvoeren
TIFR2 = 0X00; Timer2 INT vlag Reg: Duidelijke Timer overloop vlag
TIMSK2 = 0X01; Timer2 INT Reg: Timer2 Overflow Interrupt Enable
TCCR2A = 0X00; Timer2 Control Reg A: Wave Gen modus normaal
TCCR2B = 0X07; Timer2 Control Reg B: Timer Prescaler ingesteld op 1024
};
ISR(TIMER2_OVF_vect)
{
SREG = SREG | B10000000; bit 7 tot en met 1 (global interrupt uitgeschakeld) instellen
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)) / / als we enougth wachten
{
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, reinitialisation van de positie van het schrijven en lezen in vector (tijdig is kleiner na bijvoorbeeld het wijzigen van gegevens)
{
for (int i = 0; ik < 5; i ++)
{
in [i] = 0;
uit [i] = 0;
}
}
anders / / als de gebruiker is het veranderen van variabelen, stop de interrupt (het zal worden gestart aan het einde van de overname van gegevens van de gebruiker)
{
TCNT2 = P; Reset timer ct tot en met 99 van 255
TIFR2 = 0X00; timer2 int vlag reg: timer overloop markering wissen
}
};
VOID write_position_on_servo (int number_of_servo, Servo servo)
{
tmp = posities [number_of_servo] [out [number_of_servo]]; lezen van de eerste waarde in de vector met gegevens uit flex sensor
Servo.write(tmp);
uit [number_of_servo] = uit [number_of_servo] + 1; _ / / verhogen getal dat onthouden waar wij moeten lezen
Als (uit [number_of_servo] > = 100) //if einde van array bereikt, gaat u naar het begin
{
uit [number_of_servo] = 0;
}
};
VOID write_position_from_finger (int number_of_servo, int potpin_finger)
{
if(changeData)
{tmp = upperAngle;}
anders
{
if(potpin_finger==9) / / als 9, servo is uitgeschakeld
{
tmp = upperAngle;
}
if(potpin_finger==8) //If 8, verplaatsen alleen modus
{
Als (posf [number_of_servo] > ((count*5)/6)) / / dit aantal hangt af van de snelheid van de servo (is weer daalt het aantal 10ms die de servo "up" voor het besteedt)
{tmp = upperAngle;}
anders als (posf [number_of_servo] > ((count*2)/3))
{tmp = upperAngle-6;}
anders als (posf [number_of_servo] >(count/2))
{tmp = upperAngle-12;}
anders als (posf [number_of_servo] >(count/3))
{tmp = upperAngle-17;}
anders als (posf [number_of_servo] >(count/6))
{tmp = upperAngle-12;}
anders
{tmp = upperAngle-6;}
posf [number_of_servo] = posf [number_of_servo] -1;
if(posf[number_of_servo]==0)
{posf [number_of_servo] = graaf;}
}
Als (potpin_finger == 0 || potpin_finger == 1 || potpin_finger == 2 || potpin_finger == 3 || potpin_finger == 4).
{
tmp=analogRead(potpin_finger); luiden naar de waarde van flex
tmp >> 1; Bits verschuiving naar de verwaarlozing van de laatste waarde (fout van maatregel)
Serial.println(tmp);
Als (potpin_finger == 0 || potpin_finger == 2 || potpin_finger == 6)
{tmp = kaart (tmp, laag [potpin_finger], hoge [potpin_finger], upperAngle, lowerAngle);
} / / verkeer van servo omkeren
anders
{tmp = kaart (tmp, laag [potpin_finger], hoge [potpin_finger], lowerAngle, upperAngle);}
tmp = kaart (tmp, laag [potpin_finger], hoge [potpin_finger], lowerAngle, upperAngle);
}
}
Als (tmp < lowerAngle) / / bescherming van de servo als analoge input signaal defect
{tmp = lowerAngle;}
if(tmp>upperAngle)
{tmp = upperAngle;}
posities [number_of_servo] [in [number_of_servo]] = tmp;
in [number_of_servo] = in [number_of_servo] + 1; _ / / verhogen getal dat onthouden waar wij gegevens moet voorraad
Als (in [number_of_servo] > = 100) //if einde van array bereikt, gaat u naar het begin
{in [number_of_servo] = 0;}
}
void loop
{
if(Serial.available() > 0) / / als er nog gegevens lezen = > MATLAB envoie qqchose
{
a=Serial.Read();
if(a==1) / / START
{
changeData = false;
} / / pour relancer
if(a==2) / / STOP
{changeData = true;
} //va Blokkeer les acties nl ne relancant pas le timer
if(a==3) / / gegevens wijzigen
{
changeData = true;
while(Serial.available() < 7) / / de recevoir les 7 valeurs woont
{}
delay(2000);
time=Serial.Read();
tijd = tijd * 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);
for (int i = 0; ik < 5; i ++)
{posf [i] = graaf;}
}
if(a==4) / / INIT???
{
//
}
}
}