Doel:€250.00
Donaties:€0.00

Per saldo:€-250.00

Steun ons nu!

Laatst bijgewerkt
op 03-12-2025

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

De bouw van mijn modelbaan in Thailand door Thai-Bundesbahn
Vandaag om 05:04:00
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Thai-Bundesbahn
Vandaag om 04:38:00
Mijn eerste H0-modeltreinbaan in aanbouw door Lobomotion69
Vandaag om 02:59:09
Vijfhuis (v.h. Frotterdam) door Te 2/2
Vandaag om 02:40:41
Ontraxs 2026 door Sven
Vandaag om 00:31:56
21 pin 21MTC Adapter Aansluitschema Lais door Rico [momfer]
Vandaag om 00:17:27
Camp 3 door sdz1976
24 April 2026, 23:38:34
Toon hier je pas gereed gekomen (model-)spoorbouwsels ... door Oosterspoor
24 April 2026, 23:07:21
Raadplaatje door Hatsune Miku
24 April 2026, 23:03:30
Modellbundesbahn in Brakel sluit in mei 2026 door Martin Welberg
24 April 2026, 22:43:41
probleem met communicatie tussen Intellibox en spoorbaan door R.C.Grootveld
24 April 2026, 22:38:33
Halma ladies gaan bouwen voor....... OntraXS 2027! door wob
24 April 2026, 22:24:24
Line-up foto's van modellen door Robkop
24 April 2026, 22:08:06
Toon hier je nieuwe (model-) spooraanwinst(en)... door Koen/264
24 April 2026, 21:46:38
motor problemen roco 72263 door rjr
24 April 2026, 21:07:39
Piko 55922 stoomlocomotief BR 003, sound, rook, digitale koppeling door LJ
24 April 2026, 20:58:28
Mooi weer om buiten te spelen door FritsT
24 April 2026, 20:31:13
Baanplan NL-BRD-DDR door Arjan6511
24 April 2026, 19:21:47
Don Sibley's Rotbach Stadt (H0m) door Sven
24 April 2026, 19:18:15
US diorama in H0 door puntenglijder
24 April 2026, 19:08:29
BMB-Module: “Corfe Castle Station” door Hans van de Burgt
24 April 2026, 18:38:10
NCS-72 / NS-3600 door FritsT
24 April 2026, 17:52:45
Aanpassen CV locs PIKO weinig effect door Dave.......
24 April 2026, 17:49:16
Peterstein - KPEV -H0 Fleischmann door spoorijzer
24 April 2026, 16:58:23
Serre bergbaan, knutselproject van mijn zoon Jamie en mij door a.moonen
24 April 2026, 16:25:07
Stilstand schoonmaken lok gelocked door 1200blauw
24 April 2026, 16:19:02
Palisade Canyon door RobVille
24 April 2026, 16:07:44
Treinnummer ADE set Flughafen-Express door Ferdinand Bogman
24 April 2026, 15:33:07
Reactiveren van de 0N30 Mumby Lumber baan (ex-JD) by Ronald door Ronald Halma
24 April 2026, 15:28:52
Ombouw/Pimpen Bolle neuzen door bollen neus
24 April 2026, 15:10:00
  

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

wimk

  • Offline Offline
  • Berichten: 836
    • 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: 7877
  • 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: 836
    • 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: 3602
  • 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: 1045
    • 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: 836
    • 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: 1045
    • 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: 4655
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