servo probleem

Arduino specifieke Software
Berichten: 2
Geregistreerd: 11 Sep 2012, 12:35

servo probleem

Berichtdoor oiseau » 11 Sep 2012, 13:21

Hallo,

Ik ben bezig met een geluidsinstallatie, waarbij er 5 servo's al ritme-instrument worden gebruikt:
ze draaien afzonderlijk, simultaan aan verschillende snelheden, met lange pauzes, enz.
Ik heb ze nu geprogrammeerd met de example: servo: sweep van de arduinolibrary en dit in een tijdschema geplaatst, wanneer welke moet draaien en hoe lang.
(zie code)
maar ik heb een probleempje:
Ik kan ze enkel lang laten pauzeren door ze een lange tijd links of rechts te laten open staan,
maar wat er dan gebeurt is dat de motors blijven aan staan (stroom blijven sturen) en heel hard zoemen(brommen), wat ik net wil vermijden.
Wat er aanvankelijk zou moeten gebeuren is dat het signaal wordt onderbroken (en ze geen lawaai maken) en dat terug aan gaan wanneer ze iets moeten doen.

Kan er iemand mij helpen? Ik geraak er niet uit.
Als er nog onduidelijkheden zijn, laat maar weten.

Bedankt
Hans

[code][/code]

unsigned long time;
long previousMillis = 0;
long one_millis_interval = 1;

//TOTALE TIJD
unsigned long timeA;
long previousMillisA = 0;
long one_millis_intervalA = 1;

//DEEL EEN
unsigned long timeB;
long previousMillisB = 0;
long one_millis_intervalB = 1;

#include <Servo.h>
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
int pos = 0; // variable to store the servo position

void setup()
{myservo1.attach(14);
myservo2.attach(15);
myservo3.attach(16);
myservo4.attach(17);
myservo5.attach(18);}



//servo1 een
void servoeenlinks (){
for(pos = 0; pos < 60; pos += 1) //de hoek dat ie draait
{myservo1.write(pos); delay(29);}} //de snelheid van het draaien

void servoeenrechts (){
for(pos = 60; pos>=1; pos-=1)
{myservo1.write(pos); delay(29);}}

//servo2 twee
void servotweelinks (){
for(pos = 0; pos < 60; pos += 1)
{myservo2.write(pos); delay(29);}}

void servotweerechts (){
for(pos = 60; pos>=1; pos-=1)
{myservo2.write(pos); delay(29);}}

//servo3 drie
void servodrielinks (){
for(pos = 0; pos < 60; pos += 1)
{myservo3.write(pos); delay(29);}}

void servodrierechts (){
for(pos = 60; pos>=1; pos-=1)
{myservo3.write(pos); delay(29);}}

//servo4 vier
void servovierlinks (){
for(pos = 0; pos < 60; pos += 1)
{myservo4.write(pos); delay(29);}}

void servovierrechts (){
for(pos = 60; pos>=1; pos-=1)
{myservo4.write(pos); delay(29);}}

//servo5 vijf
void servovijflinks (){
for(pos = 0; pos < 60; pos += 1)
{myservo5.write(pos); delay(29);}}

void servovijfrechts (){
for(pos = 60; pos>=1; pos-=1)
{myservo5.write(pos); delay(29);}}

void LOOPB() {
switch (timeB){
case 1: servoeenlinks(); break;
case 10: servoeenrechts(); break;
case 20: servoeenlinks(); break;
case 30: servoeenrechts(); break;

case 15: servotweelinks(); break;
case 35: servotweerechts(); break;

case 50: servodrielinks(); break;
case 60: servodrierechts(); break;
case 70: servodrielinks(); break;
case 79: servodrierechts(); break;

case 100: servovierlinks(); break;
case 110: servovierrechts(); break;
case 141: servoeenlinks(); break;
case 151: servoeenrechts(); break;

case 200: servovijflinks(); break;
case 210: servovijfrechts(); break;
case 241: servovijflinks(); break;
case 251: servovijfrechts(); break;
}}

void loop()

//TOTALE TIJD
{unsigned long currentMillisA = millis(); // sample the time
if (currentMillisA - previousMillisA >= one_millis_intervalA)

//DEEL EEN
{unsigned long currentMillisB = millis();
if (currentMillisB - previousMillisB >= one_millis_intervalB)

//TOTALE TIJD
//timeA = totale tijd van de compositie
{previousMillisA = currentMillisA;
timeA = timeA+1;

if (timeA == 10000)// hier lengte timeA
timeA = 0;}


//DEEL EEN
//timeB = tijd van een afzonderlijke loop
{previousMillisB = currentMillisB;
timeB = timeB+1;
if (timeB == 10000)
timeB = 0;}


//_________________________________________________________________________

//COMPOSITIE


if (timeA >=1 && timeA<=10000) {LOOPB();}
}}

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: servo probleem

Berichtdoor pjh » 11 Sep 2012, 23:34

Ik heb hier niet veel ervaring mee, maar volgens mij heb je last van SERVO CHATTERING.
Een korte zoektocht leidde naar een idee die aansluit bij wat je zelf al dacht:
Wat er aanvankelijk zou moeten gebeuren is dat het signaal wordt onderbroken (en ze geen lawaai maken) en dat terug aan gaan wanneer ze iets moeten doen.

==> Ze verplaatsen de servo.attach van de setup naar de loop, en eindigen een servo-opdracht direct met een detach.

myservo.attach(10);
myservo.write(90);
myservo.detach();

Misschien werkt het. Succes.
Hier de link: http://engineerzero.wordpress.com/2012/02/15/servo-chatter/

Berichten: 2
Geregistreerd: 11 Sep 2012, 12:35

Re: servo probleem

Berichtdoor oiseau » 12 Sep 2012, 20:16

Dag pjh,

Merci voor de tip, ik heb het toegepast en het werkt formidabel wel!
fantastisch!! merci om me uit de nood te helpen.

Groeten,
Hans

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: servo probleem

Berichtdoor pjh » 13 Sep 2012, 00:13

Graag gedaan. Wordt ik ook blij van als het werkt.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten