Servomotor instabiel bij opstarten Arduino

Hallo,

Ben bezig om de deuren van een lokloods (modelbaan) te open te sluiten met een servomotor en een Arduino en dat gaat erg goed.

Het probleem is echter dat bij het opstarten van de Arduino de motor een snelle voor mij ongecontroleerde beweging maakt.

Is er een oplossing dat de servomotor de oude stand vasthoudt bij het opstarten.

Groet, Chris

Hoi acburger, Chris, welkom.

Servomotor kan verschillende betekenissen hebben, dus is het van belang te weten waar we het precies over hebben.
Ik vermoed dat je het over een servo hebt zoals die gangbaar zijn bij RC modelbouw.

Tijdens het opstarten van je Arduino worden er allerlei zaken geregeld.
Daar heb jij invloed op, want je hebt in de setup staan waar er allemaal rekening mee gehouden moet worden.
Tot dat dat voor mekaar is, zijn er dus dingen die ongedefinieerd zijn.
Hierdoor kunnen er dan ook ongewenste effecten ontstaan.
Het is goed mogelijk dat je dat opstarten iets efficiënter kunt laten verlopen, moet het doel deze ongewenste effecten zo kort mogelijk te laten duren.
En gezien je vakgebied kun je vast ook wel een heel kleine hardwarematige aanpassing bedenken waardoor een uitgang niet meer zweeft (en dus onbekende niveaus kan (dus zal, Schrödinger's kat (klik !)) hebben) voor ie gedefinieerd is.

Om te zien of daar wat te verbeteren is, zou je de code voor je Arduino het beste hier laten zien (tussen tags a.u.b.) te plaatsen.
Dan kunnen anderen daar hun licht over laten schijnen.

En dus graag toelichten over de servomotor.

Hallo,

Dank voor je reactie.

Mijn servo: HS40 micro servo (zie plaatje bijlage) van Conrad (1081925)

Het programma moet uiteindelijk drie schakelaars lezen en drie servo’s aansturen.

De deuren gaan goed open en dicht. Ik stuur iets extra naar de servo bij zodat de deuren echt dicht of open is en stuur dan een nieuwe waarde naar de servo zodat deze in rust komt.

Ik heb een pullup weerstand van 4k7 tussen de data en +5V van de servo.

Het probleem is dat bij het opstarten de servo snel van positie verandert en ook buiten het gewenste bereik van 10 en 50 graden gaat staan.

Hoe los ik dit opstart probleem op?

vr groet,
Chris

Servo_HS40.jpg

Lokloods-1Lok.ino (1.62 KB)

Volgens mij wordt de positie van de servo bij het initialiseren van het servo-object gereset met DEFAULT_PULSE_WIDTH (=1500). Verklaart dat wat je ziet?

Je zou kunnen proberen in de setup() eerst de schakelaar uit te lezen, aan de hand daarvan de gewenste positie van de servo in te stellen, en hem dan pas te attach-en.

Geen garanties :slight_smile: .

Hoi.

Dit is jouw code:

/* Sweep the one servos

Chris Burger/****** NL, augustus 2020

De servo (op pin10) draait heen en weer op basis van schakelaar 6

En de draai (het aantal graden) van de servo wordt bepaald
door variabelen Pos_1 en Pos_2.
*/

#include <Servo.h>
Servo myservo_2;  // geef servo een naam

byte pos;    // variabele van de positie
const int delay_1 = 120;
boolean PIN_6;   // Schakelaar met interne pullup
boolean Pos_PIN_6;   // Stand van Schakelaar_6
const byte Pos_1 =  7; // Positie 1 van servo motor
const byte Pos_2 =  55; // Positie 2 van servo motor

void setup() {
  myservo_2.attach(10);  // verbind datalijn servo met pin 10
  pinMode (6, INPUT_PULLUP);
  pinMode (13, OUTPUT); // Led on Arduino board
  Pos_PIN_6 = digitalRead(6);

}
void loop() {

  // check if switch-6 has changed position
  PIN_6 = digitalRead(6);
  if ( PIN_6 != Pos_PIN_6)
  {
    if ( PIN_6 == LOW) // is switch-5 closed
    {
      digitalWrite(13, HIGH); // LED aan
      for (pos = Pos_1; pos <= Pos_2; pos++)
      { myservo_2.write(pos);
        delay(delay_1);
      }
      Pos_PIN_6 = LOW;
      delay(500);
      myservo_2.write(47);
      digitalWrite(13, LOW); // LED uit
    }
    else
    {
      digitalWrite(13, HIGH); // LED aan
      for (pos = Pos_2; pos >= Pos_1; pos--)
      { myservo_2.write(pos);
        delay(delay_1);
      }
      Pos_PIN_6 = HIGH;
      delay(500);
      myservo_2.write(20);
      digitalWrite(13, LOW); // LED uit
    }
  }
}

Je hebt er voor gekozen de servo op pin 10 aan te sluiten.
Is dat een bewuste keuze, of heb je dat van een voorbeeld servo sweep sketch over genomen ?

Pin 10 is ook onderdeel van de hardware SPI bus, en dient daar dan als SlaveSelect.
Dit kan betekenen dat er wat niveaus op die pin terecht komen tijdens opstarten en eventueel tijdens de uitvoering van de bootloader.
Het opstarten en de bootloader worden altijd uitgevoerd na een reset, en nog voor regel 0 van jouw sketches.

Je kunt controleren of dit de oorzaak is, door bijvoorbeeld de standaard “blink” sketch (die bedient alleen pin13) in je Arduino te zetten, en dan te kijken of je hetzelfde gedrag van je servo ziet.
(Ik weet het zelf echt niet)
Wanneer dit zo blijkt te zijn, probeer het dan eens met pin 9 (die word gebruikt in de servo sweep sketch die ik hier in mijn IDE vind), want pin 9 is ook geschikt om servo’s mee aan te sturen, en heeft geen andere functie.

Ik ben benieuwd wat het resultaat hiervan is.

Ik heb ooit eens de tip gekregen om in setup() pin 10 eerst LOW te maken en daarna pinMode(10, OUTPUT) te geven (ja, in die volgorde, en voordat je myservo_2.attach(10) doet!). Dat hielp in een vergelijkbare opzet om een vreemd opstartverschijnsel te onderdrukken. Wie weet...

servos reageren heel snel en dus bij het opstarten klapperen ze een keer.
maak er eerst een ingang van en dan pas een servo, is een deel, wat ook kan is de spanning op de servo zetten als de arduino draait. je moet met veertjes of zo toch beveiligen want een servo doet soms rare dingen.

Dank voor de reacties, ik ga er volgende week mee aan de slag en laat weer van me horen!!

groet, Chris

Hallo,

Weer zitten stoeien met de Arduino en ben uiteindelijk tot een goed resultaat gekomen.

Ik zorg er voor dat bij het opstarten en afsluiten van de Arduino dat de drie schakelaars op “1” staan.

In de setup geef ik de servo meteen het juiste datasignaal met de opdracht myservo_1.write(20); en ook de variabele Pos_PIN_10 wordt “1” gemaakt.

De servo maakt nu aan het begin geen onrustige bewegingen.

Nogmaals dank voor het meedenken!

groet, Chris B

Lokloods-1Lok-test.ino (2.48 KB)