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

Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 15:51:31
Pfarrerwinkel bahn door Paul1969
Vandaag om 15:42:49
De Projecten van RetroJack door RetroJack
Vandaag om 15:39:15
Rondom Charlois door Gert Arkema
Vandaag om 15:37:45
Bauarbeiten im gange door Paul1969
Vandaag om 15:36:57
Lodewickshaven door Ronald Halma
Vandaag om 15:36:25
Overweg aanrijding Meteren donderdag 30 okt door Rick
Vandaag om 15:01:07
Hulp gezocht omgeving Drachten door rjr
Vandaag om 14:53:42
Mijn minitrix 2051 hobbelt door spoorijzer
Vandaag om 14:51:44
Piko NS 5/600 Hippel 2025 door spoorijzer
Vandaag om 14:23:31
Station Roodeschool door Montanbahn
Vandaag om 13:45:29
Toon hier je nieuwe (model-) spooraanwinst(en)... door Lambert
Vandaag om 13:39:40
ByPass Junction, een Amerikaanse modelbaan in N door RobVille
Vandaag om 13:30:27
Mijn eerste H0-modeltreinbaan in aanbouw door Jelmer
Vandaag om 13:29:35
Bumper voor de LH-101 handregelaar door robstuart
Vandaag om 13:24:34
Noordelijke Spoor en Modelbouwdagen in VEENDAM door thijs
Vandaag om 13:18:03
ICR-rijtuigen, voor welk merk ga je? LSmodels, PBmodels, Exact Train of Piko? door Ferdinand Bogman
Vandaag om 13:00:09
BNLS-Module: "Rvbr-Btk, Ringvaartbrug Haarlemmermeer nabij Buitenkaag" NS H0 door nighttrain1
Vandaag om 12:59:21
De bouw van mijn modelbaan in Thailand door Thai-Bundesbahn
Vandaag om 12:46:57
Ermehuizen, dienstregelingsjaar 1973/1974 door spoorijzer
Vandaag om 12:40:05
Stalen D 4 deurs spoor 0 door FritsT
Vandaag om 12:37:46
0-spoor smalspoor Lynton & Barnstaple door GD
Vandaag om 12:23:09
De bouw van 'Ommelanden' (H0) door Jan Pieter
Vandaag om 12:10:07
PB Models, ICR-rijtuigen door kar
Vandaag om 12:09:15
Koppelingskamer Jägerndorfer te dichtbij door Montanbahn
Vandaag om 11:53:45
Polderbaan(tje) 0,3m2 door GD
Vandaag om 11:51:46
TRAX3D - kan geen account aanmaken door Pauldg
Vandaag om 11:42:27
Märklin 2025 door Railpassie
Vandaag om 11:36:35
Roco 1200 DCC Sound ratelende aandrijving. door Herb73
Vandaag om 11:23:12
Wat spoor 1 brouwsels door Kees-Jan
Vandaag om 09:40:15
  

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

wimk

  • Offline Offline
  • Berichten: 826
    • 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: 7761
  • 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: 826
    • 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: 1039
    • 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: 826
    • 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: 1039
    • 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