FB

DMV

How To? – Wissels aandrijven met een servo, gebruik Arduino!

Onder het motto Keep it simple, stupid

Een servo schakelen zonder PC of DCC apparatuur. Enkel afhankelijk van je voeding die aan of uit staat. Weg met crashende PC’s en stuurprogramma’s die niet goed geconfigureerd zijn!

Wat heb je nodig?

1. Een Arduino Nano – Kosten; ongeveer 1.75 euro (per 4 tot 5 wissels).

im120411003_8.jpg

2. Een Nano shield – Kosten; ongeveer 1.75 euro (per 4 tot 5 wissels).

1380902-1.jpg

3. Een digitale servo – Emax ES08DE of ES9051 – Kosten; ongeveer 3 euro per wissel .

download.jpg

4. Een tuimelschakelaar of relais – Kosten; ongeveer 0,5 tot 3 euro per wissel.

Uiteindelijk bij 4 wissels dus 4 a 5 euro voor de aandrijving excl. montage beugeltje, schroeven en 0,5mm verenstaal.

Hoe werkt het?

1. Installeer de Arduino software op je pc om de code in te laden met USB. http://arduino.cc/en/main/software en installeer ook de VarSpeedServo.h library via link of op aanvraag https://github.com/netlabtoolkit/VarSpeedServo.
[sketch=>bibliotheek importeren=>etc]

Voorbeeld:

 

 

arduino.png

2. Verbind de juiste nummer digitale ingang met de common van het relais of tuimelschakelaar. Dus pin 1 naar relais 1 voor servo 1 etc.

3. Verbind de GND, oftewel 0 Volt met de NC of één van buitenste pinnen van de schakelaar. Je kunt later nog de NC of NO omwisselen indien gewenst.

4. Verbind de 5V met 10kOhm naar de signaal draad op de Common poot van de schakelaar of relais. (zonder weerstand loopt er te veel stroom door de arduino, je maakt dan sluiting)

5. Laad de code in op de aruino. Code volgt, of op aanvraag.

6. Steek de servo in op 8/tm12. Voor servo 2 gebruik je pin 8 etc [dus servo n= pin n+6]. Het beste is om pin 1 en 2 niet te gebruiken.

7. Stel de middenstand van de servo goed af. Standaard staat de code op Low= 85 graden High is 95 graden. Dit kun je aanpassen maar hou 90 graden altijd in het bereik omdat dit de 0 stand is bij opstart, doe je dit niet heb je kans op schade.

8. Ga nu de High en Low fine tunen zodat de servo ver genoeg komt maar niet blijft brommen. Zie ** 85 en 95 graden. Beide grenzen kun je dus fine tunen per servo. Het advies is om een servo tester te gebruiken om met de potentiometer de grenzen op te zoeken en die dan in het arduino programma aan te passen. 1500hz is 90 graden, 800hz is 0 en 2200hz is 180 graden.

9. Klaar!

Belangrijk! Bij uploaden van de software kun je het beste de Arduino even uit de shield trekken of alle servo’s ontkoppelen om gekke sweeps te voorkomen. Dit gebeurd niet altijd, maar kan voorkomen en dan buigt je pen krom.

Code, (aan de nieuwe code wordt nog gewerkt) hier onder de oude.. niet pin 13 gebruiken!

let op, Copy paste uit sommige browsers naar arduino levert foutmeldingen door tekenfouten, stuur even een email via de contact pagina en we sturen je de adruino file door.

#include
// Copyright2016 – SERVO SWITCH CONTROL – SSC – PaulDMV
// a maximum of seven servo objects can be installed on the nano
// a maximum of eight servo objects can be created
// only change ** lines (speedx, range_x_low and range_x_high)
// install the VarSpeedServo.h Library before use!
//See below to convert from hz from servo tester to degree
//2200hz = 180
//2100hz = 167
//2000hz = 155
//1900hz = 142
//1800hz = 129
//1700hz = 116
//1600hz = 103
//1500hz = 90
//1400hz = 77
//1300hz = 64
//1200hz = 51
//1100hz = 38
//1000hz = 26
//900hz = 13
//800hz = 0

VarSpeedServo myservo1; // W** // create servo object to control a servo, connected to pin 8
int pos1 = 0; // variable to store the servo position
int button1 = 4; // The button will be on Pin 2
int speed1= 10; // **variable to store the servo speed
int delay1= 50; // sets the delay time to reach position
int range_1_low= 52; // **sets the lower limit in deg
int range_1_high= 149; //**sets the uper limit in deg
int range_1_diff= range_1_high – range_1_low; //diffence to go to position

VarSpeedServo myservo2; // W** // create servo object to control a servo, connected to pin 9
int pos2 = 0; // variable to store the servo position
int button2 = 5; // The input will be on Pin 5
int speed2= 10; // **variable to store the servo speed
int delay2= 50; // **sets the delay time to reach position
int range_2_low= 39; // **sets the lower limit in deg
int range_2_high= 141; //**sets the uper limit in deg
int range_2_diff= range_2_high – range_2_low; //diffence to go to position

VarSpeedServo myservo3; // W** // create servo object to control a servo, connected to pin 10
int pos3 = 0; // variable to store the servo position
int button3 = 6; // The input will be on Pin 6
int speed3= 10; // **variable to store the servo speed
int delay3= 50; // sets the delay time to reach position
int range_3_low= 25; // **sets the lower limit in deg
int range_3_high= 129; //**sets the uper limit in deg
int range_3_diff= range_3_high – range_3_low; //diffence to go to position

VarSpeedServo myservo4; // W** // create servo object to control a servo, connected to pin 11
int pos4 = 0; // variable to store the servo position
int button4 = 7; // The input will be on Pin 7
int speed4= 10; // **variable to store the servo speed
int delay4= 50; // sets the delay time to reach position
int range_4_low= 30; // **sets the lower limit in deg
int range_4_high= 141; //**sets the uper limit in deg
int range_4_diff= range_4_high – range_4_low; //diffence to go to position

VarSpeedServo myservo5; // W** // create servo object to control a servo, connected to pin 11
int pos5 = 0; // variable to store the servo position
int button5 = 3; // The input will be on Pin 7
int speed5= 10; // **variable to store the servo speed
int delay5= 50; // sets the delay time to reach position
int range_5_low= 30; // **sets the lower limit in deg
int range_5_high= 141; //**sets the uper limit in deg
int range_5_diff= range_5_high – range_5_low; //diffence to go to position

void setup()
{
myservo1.attach(8); // attaches the servo on pin 7 to the servo object
pinMode(pos1, OUTPUT);
pinMode(button1, INPUT);
digitalWrite (button1, LOW);

myservo2.attach(9); // attaches the servo on pin 8 to the servo object
pinMode(pos2, OUTPUT);
pinMode(button2, INPUT);
digitalWrite (button2, LOW);

myservo3.attach(10); // attaches the servo on pin 9 to the servo object
pinMode(pos3, OUTPUT);
pinMode(button3, INPUT);
digitalWrite (button3, LOW);

myservo4.attach(11); // attaches the servo on pin 10 to the servo object
pinMode(pos4, OUTPUT);
pinMode(button4, INPUT);
digitalWrite (button4, LOW);

myservo5.attach(12); // attaches the servo on pin 11 to the servo object
pinMode(pos5, OUTPUT);
pinMode(button5, INPUT);
digitalWrite (button5, LOW);

}
void loop()

{
if (digitalRead(button1) == LOW)
for(pos1 = range_1_low; pos1 < range_1_high; pos1 += range_1_diff) // goes from upper limit to lower limit in steps of 1 degree { myservo1.slowmove(pos1,speed1); // tell servo to go to position in variable 'pos' delay(delay1); // waits x ms for the servo to reach the position } if (digitalRead(button1) == HIGH) for(pos1 = range_1_high; pos1>=range_1_high; pos1-=range_1_diff) // goes from upper limit to lower limit in steps of 1 degree
{
myservo1.slowmove(pos1,speed1); // tell servo to go to position in variable ‘pos’
delay(delay1); // waits x ms for the servo to reach the position
}
{
if (digitalRead(button2) == LOW)
for(pos2 = range_2_low; pos2 < range_2_high; pos2 += range_2_diff) // goes from upper limit to lower limit in steps of 1 degree { myservo2.slowmove(pos2,speed2); // tell servo to go to position in variable 'pos' delay(delay2); // waits x ms for the servo to reach the position } if (digitalRead(button2) == HIGH) for(pos2 = range_2_high; pos2>=range_2_high; pos2-=range_2_diff) // goes from upper limit to lower limit in steps of 1 degree
{
myservo2.slowmove(pos2,speed2); // tell servo to go to position in variable ‘pos’
delay(delay2); // waits x ms for the servo to reach the position
}
{
if (digitalRead(button3) == LOW)
for(pos3 = range_3_low; pos3 < range_3_high; pos3 += range_3_diff) // goes from upper to lower limit in steps of 1 degree { myservo3.slowmove(pos3,speed3); // tell servo to go to position in variable 'pos' delay(delay3); // waits x ms for the servo to reach the position } if (digitalRead(button3) == HIGH) for(pos3 = range_3_high; pos3>=range_3_high; pos3-=range_3_diff) //
{
myservo3.slowmove(pos3,speed3); // tell servo to go to position in variable ‘pos’
delay(delay3); // waits x ms for the servo to reach the position
}
{
if (digitalRead(button4) == LOW)
for(pos4 = range_4_low; pos4 < range_4_high; pos4 += range_4_diff) // goes from upper limit to lower limit in steps of 1 degree { myservo4.slowmove(pos4,speed4); // tell servo to go to position in variable 'pos' delay(delay4); // waits x ms for the servo to reach the position } if (digitalRead(button4) == HIGH) for(pos4 = range_4_high; pos4>=range_4_high; pos4-=range_4_diff) // goes from upper limit to lower limit in steps of 1 degree
{
myservo4.slowmove(pos4,speed4); // tell servo to go to position in variable ‘pos’
delay(delay4); // waits x ms for the servo to reach the position
}
{
if (digitalRead(button5) == LOW)
for(pos5 = range_5_low; pos5 < range_5_high; pos5 += range_5_diff) // goes from 85 degrees to 95 degrees in steps of 1 degree { myservo5.slowmove(pos5,speed5); // tell servo to go to position in variable 'pos' delay(delay5); // waits x ms for the servo to reach the position } if (digitalRead(button5) == HIGH) for(pos5 = range_5_high; pos5>=range_5_high; pos5-=range_5_diff) // goes from 95 degrees to 85 degrees in steps of 1 degree
{
myservo5.slowmove(pos5,speed5); // tell servo to go to position in variable ‘pos’
delay(delay5); // waits x ms for the servo to reach the position
}

}}}} // Nx close bracket, one for each servo

}