Doel:€250.00
Donaties:€88.00

Per saldo:€-162.00

Steun ons nu!

Laatst bijgewerkt
op 03-06-2025

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

BNLS Rijweekend 19 en 20 juli 2025 door Hans van de Burgt
Vandaag om 17:39:28
Br 38 Piko Superen. door Silvolde
Vandaag om 17:32:46
Spoor- en tramweg parafernalia door Eric B
Vandaag om 17:32:02
Mooi weer om buiten te spelen door sncf231e
Vandaag om 17:23:06
Gezocht: foto's NS Ks/Us (nu Klmos) door marco
Vandaag om 17:15:33
Da's Daz 2 door BartvD
Vandaag om 17:06:02
NS 1700 transfers door Roy van Dijk
Vandaag om 17:03:17
Stationsplein Baden Baden door Dion
Vandaag om 17:00:00
Raadplaatje door Klaas Zondervan
Vandaag om 16:56:23
Overstap naar HTM door Jan Bennink
Vandaag om 16:42:59
Gezocht info en foto's van standaard dwarsliggerwagen door marco
Vandaag om 16:39:58
Sfeer op je modelbaan door puntenglijder
Vandaag om 16:39:32
Länderbahn en Reichsbahn locomotieven. door puntenglijder
Vandaag om 16:24:09
Dat overkomt mij niet. door Benelux795
Vandaag om 16:07:49
Het einde van de RhB- Chiavenna Stazione Merci door Hollandserhbfan
Vandaag om 15:38:11
Wèhnich - Eén onbeduidend baantje op 1200 bij 1200mm door tothebeach
Vandaag om 15:29:18
lampjes in huizen willekeurig schakelen door Bert55
Vandaag om 15:24:49
De bouw van mijn modelbaan in Thailand door Thai-Bundesbahn
Vandaag om 14:40:06
Mijn eerste H0-modeltreinbaan in aanbouw door Thai-Bundesbahn
Vandaag om 14:28:28
Bentheimer Eisenbahn Stations gebouwen "Laarwald" door Hans Reints
Vandaag om 14:10:16
Alt-Wutachtalbahn 2025 door Hans Grasmaijer
Vandaag om 14:06:48
BR-18.6 Schaal-0. door FritsT
Vandaag om 13:24:11
Toon hier je nieuwe (model-) spooraanwinst(en)... door Niels64
Vandaag om 13:16:43
Toon hier je (model)TRAM foto's. door R1954
Vandaag om 12:07:17
Onlangs gespot - gefotografeerd, de foto's door thevandijks
Vandaag om 11:46:46
Verlichting feller, Roco zimo door Klaas Zondervan
Vandaag om 11:46:21
Bezetmelder brug in rolbrug blijft actief als rolbrug gestopt is door Roelof Hartholt
Vandaag om 11:44:44
Centraal Zwitserland: Trein, tram, kabelbaan en gondels. door Hans van de Burgt
Vandaag om 10:52:53
Bentheimer Eisenbahn, gisteren, vandaag en morgen. door Bertholdowitsch
Vandaag om 10:41:20
reserve onderdeel gezocht voor Minitrix 12593 BR132 door joespoor
Vandaag om 10:33:18
  

Auteur Topic: Servo's en Arduino  (gelezen 2596 keer)

wimk

  • Offline Offline
  • Berichten: 827
    • kusee.nl
Servo's en Arduino
« Gepost op: 13 June 2016, 10:55:18 »
Beste mensen,

Ik wil wat doen met een Arduino en meerdere servo's. Servo's aansturen vanuit de Arduino. Van de servo’s hoeft er slechts één tegelijk te draaien.

Hoe doe ik het? Zie onderstaande tekening.


De Arduino heeft een eigen 5-volt voeding (4x diode + lm7805 + condensator). De servo's hebben gezamelijk één andere voeding (idem 4xdiode + lm785 + condensator). Voor alle servo's samen is er dezelfde voeding. De min van beide stroomcircuits zijn met elkaar verbonden.

Omdat servo's in de ruststand ook stroom trekken (en dat wil ik niet), heb ik in  het 5-volt-voedingcircuit voor de servo een transistor opgenomen, die door een poort van de Arduino (links op de tekening) wordt aangestuurd (die poort krijgt 5 volt als ik wat met die desbetreffende servo ga doen waarbij de transistor geleidend wordt; na het omzetten van de servo zet ik die poort op 0 volt; transistor is dan niet geleidend, servo krijgt dan geen voeding). Op een tweede poort van de Arduino (rechts in de tekening) genereer ik een puls (tussen 1 en 2 milliseconden hoog, bij 20 msec pulsduur). Daarmee stuur ik dus de servo aan.

Zolang ik e-e-n servo op deze manier aansluit gaat het prima. Maar als ik meerdere servo’s parralel vanuit de Arduino aanstuur (steeds 2 poorten, één voor de servo-voeding aan/uit te zetten via de transistor, en één voor het digitale signaal) gaat het mis. Er is steeds maar één servo tegelijk in werking. Bij opstarten gaat het goed, servo -1 draait, servo-2 draait, enzovoort. Maar na enkele tientallen seconden draaien de servo’s steeds slechter, soms doen ze niets meer, en bij het aanzetten van de servo-voeding (dus als de transistor geleidend wordt), ook al is het digitale signaal hetzelfde als waarmee ik eerder ben gestopt, dan draait de servo even snel heen en weer.

Wie heeft er een idee hoe ik dit probleem kan tackelen?

Wim K


Reinout van Rees

  • Team forummoderators
  • Offline Offline
  • Berichten: 7751
  • Forummoderator
    • Persoonlijke website + weblog
Re: Servo's en Arduino
« Reactie #1 Gepost op: 13 June 2016, 11:14:07 »
Mijn eerste gedachte: kan het een programmeerfout zijn? Variabelen die elkaar overschrijven? Een loop die niet goed gaat en steeds "trager" gaat werken waardoor de aansturing niet meer goed werkt?

Reinout
Bouw v/d EifelBurgenBahn (h0, zijlijn in de Eifel)
Eifelgeschiedenis (verhalen en video's over de Eifelburgenbahn)

wimk

  • Offline Offline
  • Berichten: 827
    • kusee.nl
Re: Servo's en Arduino
« Reactie #2 Gepost op: 13 June 2016, 11:20:16 »
Nee, een programmafout is het niet.
Het programma is (nu) nog heel simpel.
- poort 1 hoog (stroomcircuit voor eerste arduino geleidend)
- poort 2 puls langzaam (in 2 seconden) oplopend van 1.2 tot 1.8 mSec (bij puls 20 mSec)
- poort 1 laag (stroomcircuit voor eerste arduino niet-geleidend)

- poort 3 hoog (voor tweede arduino)
- poort 4 puls idem oplopend van 1.2 tot 1.8
- poort 3 laag

- poort 1 hoog
- poort 2 puls idem langzaam aflopend van 1.8 tot 1.2mSec
- poort 1 laag

- poort 3 hoog
- poort 4 puls idem aflopend van 1.8 tot 1.2
- poort 3 laag

En dat eeuwig doorgaand in mijn testprogramma. Verder nog geen poespas, gewoon een testprogramma.

De eerste tien tot twintig seconden gaat het perfect, maar dan wordt het steeds stroperiger, met heftige bewegingen van de servo's bij het aanzetten van het stroomcircuit voor de desbetreffende servo.

gvandersel

  • HCC!m maar toch Selectrix (RMX)
  • Offline Offline
  • Berichten: 3603
  • Als het maar elektrisch is.
    • Homepage Gerard van der Sel
Re: Servo's en Arduino
« Reactie #3 Gepost op: 13 June 2016, 11:40:58 »
Wim,

Als je van een servo de ingang continue op 0V houd, zal de stroomverbruik van de servo sterk reduceren (niet 0 zoals bij jouw), maar dat maakt het simpeler. Voor je probleem zou je een weerstand van 4k7 tussen de 5V (servo) en de ingang van de servo op kunnen nemen. Dit is een probate oplossing gebleken bij jitteren.
Verder zou ik liever in de plus schakelen ipv in de min. Dus gebruik een BC557 ipv een BC547 met de emitter aan de plus en de collector aan de plus van de servo.

Verder zou een listing van je sketch een oplossing kunnen zijn (verwacht het niet, omdat het geheel opstart).

Groet,

Gerard van der Sel.
Holzburg (IIIb/IVa) schaal N.
Kijk ook eens bij de bouw en lees de avonturen.

NTeering

  • Offline Offline
  • Berichten: 1037
    • ARduino Controlled MOdel RAilway
Re: Servo's en Arduino
« Reactie #4 Gepost op: 13 June 2016, 11:49:52 »
Hallo Wim,

Je maakt het jezelf nogal moeilijk.
Kennelijk gebruik je niet de servo library die je standaard al hebt.
Waarom zou je de stroom naar de servo willen afschakelen?
Het verbruik in rust is marginaal.
Het kost je een extra pin per servo.
Door de servo te detachen maak je hem monddood.
En waarom zou je zelf pulsjes gaan sturen?

Basisprincipe is als volgt:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup()
{
}

void loop()
{
    RotateServo(9,120);  // Rotate servo on pin 9 to angle of 120 degrees
}

void RotateServo (byte pin, byte angle)
{
    myservo.attach(pin)
    myservo.write(angle);   
    myservo.detach;
}

De verdraaiing kun je ook doen in stapjes van 1 graad met een delay ertussen
Kijk eens naar het 'Sweep' voorbeeld.

Overigens kun je de library  ook toepassen bij gebruik van je uitschakeltruc.

Vraag 1:
Op welke aansluiting voedt je de Arduino met 5 Volt?
Dat is namelijk niet gebruikelijk.
Vraag 2:
Gebruik je de delay functie voor het 'op tijd' versturen van de pulsen?
Zo ja, dan ga je inderdaad de mist in met meerdere servo's tegelijk.

Kijk ook eens naar het hieronder genoemde MARDEC draadje.

Mvg
Nico

wimk

  • Offline Offline
  • Berichten: 827
    • kusee.nl
Re: Servo's en Arduino
« Reactie #5 Gepost op: 13 June 2016, 12:15:54 »
@gvandersel: Ik snap niet wat je bedoelt met het op 0 houden van de servo ingang. Als je geen spanning op de servo zet, dan doet hij toch niets???

@gvandersel: <citaat: een weerstand van 4k7 tussen de 5V (servo) en de ingang van de servo op kunnen nemen>
Bedoel je een weerstand in de voeding van de servo??? Lijkt me niet zinvol. Een weerstand in het puls-stuur-signaal tussen Arduino en Servo heb ik al geprobeerd, dat hielp niets.

@NTeering: vraag 1 (welke aansluiting op de Arduino) : Zie tekening. 5 Volt en Gnd in de onderstse rij pinnen. Een voeding van de Arduino die ik bij eerdere projecten ook heb gebruikt, werkt daar goed.


@NTeering: vraag 2 (delay-functie) : Ik gebruik de functie delayMicroseconds. Zie de listing hieronder (het exacte programma heb ik hier niet bij de hand, maar het ziet er vrijwel uit als hieronder vermeld:


void setup() {
  pinMode(40, OUTPUT);  // aan/uit servo 1
  pinMode(41, OUTPUT);  // puls servo 1
  pinMode(42, OUTPUT);  // aan/uit servo 2
  pinMode(43, OUTPUT);  // puls servo 2

  digitalWrite(40, LOW);
  digitalWrite(41, LOW);
  digitalWrite(42, LOW);
  digitalWrite(43, LOW);

  int rest = 0;
}

// ===================================================

void loop() {
  // servo 1 naar links
  digitalWrite(40, HIGH);
  for (int i=1200; i<1800; i=i+10) {
    rest = 20000 - i;
    digitalWrite(41, HIGH);
    delayMicroseconds(i);
    digitalWrite(41, LOW);
    delayMicroseconds(rest);
  }
  digitalWrite(40, LOW);

  // servo 2 naar links
  digitalWrite(42, HIGH);
  for (int i=1200; i<1800; i=i+10) {
    rest = 20000 - i;
    digitalWrite(43, HIGH);
    delayMicroseconds(i);
    digitalWrite(43, LOW);
    delayMicroseconds(rest);
  }
  digitalWrite(42, LOW);


  // servo 1 naar rechts
  digitalWrite(40, HIGH);
  for (int i=1800; i>1200; i=i-10) {
    rest = 20000 - i;
    digitalWrite(41, HIGH);
    delayMicroseconds(i);
    digitalWrite(41, LOW);
    delayMicroseconds(rest);
  }
  digitalWrite(40, LOW);

  // servo 2 naar rechts
  digitalWrite(42, HIGH);
  for (int i=1800; i>12000; i=i-10) {
    rest = 20000 - i;
    digitalWrite(43, HIGH);
    delayMicroseconds(i);
    digitalWrite(43, LOW);
    delayMicroseconds(rest);
  }
  digitalWrite(42, LOW);
}

En in plaats van 2, had ik 3 servo's in mijn test-opstelling op poort 44 en 45, is zelfde principe, alleen meer van hetzelfde.
« Laatst bewerkt op: 13 June 2016, 23:31:42 door Bert van Gelder »

NTeering

  • Offline Offline
  • Berichten: 1037
    • ARduino Controlled MOdel RAilway
Re: Servo's en Arduino
« Reactie #6 Gepost op: 13 June 2016, 12:49:16 »
Hallo Wim,

Ondanks dat je servo's inderdaad na elkaar draaien lijkt me toch dat het gebruik van delayMicroseconds roet in het eten gooit.
Probeer eens de micros() functie te gebruiken. Je kunt ze dan ook tegelijk laten draaien.

digitalWrite(pinX, HIGH);
LastMicro[servoX]=micros();
// process next servo
if (micros()>LastMicro[servoX]+interval[servoX])  // i of rest
{digitalWrite(pinX, LOW);
LastMicro[servoX]=micros();

De code is wellicht erg kort door de bocht, maar ik hoop dat het idee duidelijk is.

Maar waarom gebruik je de Servolibrary eigenlijk niet?

Nico

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: Servo's en Arduino
« Reactie #7 Gepost op: 13 June 2016, 17:20:55 »
Ik zie een paar "fouten".

Allereerst zie ik een transistor zonder base weerstand. Dit gaat gegarandeerd fout, de stroom door de base is nu niet beperkt.

Daarnaast schakel je de GND van de servo. Maar vaak heeft elektronica intern poorten met clamping diodes aan de voeding liggen. Is je servo signaal dus naar de 0V getrokken zal dit een Ground vormen voor de servo. In rust moet je servo signaal dus zweven of 5V zijn om de hele servo in afgeschakelde toestand allemaal op 5V te houden. Of je moet high side gaan switchen en juist het servo signaal LOW houden.

MAAAARRRRRRR, dit alles is niet nodig. ;D Allereerste zou ik gewoon de servo library (of een afgeleide daarvan) gebruiken om de servo aan te sturen. Het gebruik van delay() of delayMicroseconds() is gewoon vragen om problemen later in je code.

En een servo die niet meer aangestuurd wordt zal nog amper stroom vragen. Dus wanneer je het stuursignaal continue laag of hoog maakt zal de servo al niets meer doen en geen stroom meer vragen. In de servo library doe je dit door servo.detach() aan te roepen.


Timo
Verzonden vanaf mijn desktop met Firefox