Bij gebruik van servo.h vliegen de servo's naar positie

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 71
Geregistreerd: 05 Apr 2018, 00:44

Bij gebruik van servo.h vliegen de servo's naar positie

Berichtdoor Gompy » 08 Apr 2018, 14:47

Ik ben als gepensioeneerde een beginner in deze hobby, dus heb er (nog) weinig tot geen verstand van (mijn excuus als ik eea niet gelijk begrijp).
Ik ben na het vele lezen en proberen aan een simpele solartracker begonnen omdat ik daar veel van op internet kan terug vinden.


Ik heb twee vragen en de eerste is:
Ik gebruik servo.h in mijn code, maar als ik de Arduino reset "vliegen" de servo's in razende vaart naar de begin positie (90/90 graden).
Is er een manier om dit te voorkomen zodat ze langzamer naar "neutraal gaan ?
in de loop() werken de servo's goed, eea afhankelijk van de instelling van de potmeter.

De tweede vraag is:
Nadat de zon is onder gegaan blijven de servo's in de laatste bekende positie staan, stel 35 verticaal en 165 graden horizontaal (uiterste).
Graag zou ik 's nachts de servo's weer in de neutrale positie willen zetten, dus horizontaal 90 graden en verticaal 25 graden.
Als de zon op komt staat de solartracker gereed om naar de zon te draaien, maakt niet uit waar hij op komt of wanneer.
Eea heeft ook als rede dat als het regent het gebruikte "reiziger USB laad paneeltje" schoon zou kunnen spoelen.

De code welke ik gebruik werkt, maar bovenstaande puntjes gaan mijn kennis nog even te boven.


Code: Alles selecteren
#include <Servo.h> // include Servo library
#include <LiquidCrystal.h> // Include LCD library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo horizontal; // horizontal servo
int servoh = 90;  // position horizontal servo

Servo vertical;   // vertical servo
int servov = 90;  // position vertical servo
 

// LDR pin connections
//  name  = analogpin
int ldrlt = 0; //LDR top left (orange)
int ldrrt = 1; //LDR top rigt (brown)
int ldrld = 2; //LDR down left (yellow)
int ldrrd = 3; //LDR down rigt (green)

void setup()
{
  Serial.begin(9600);
// servo connections
  lcd.begin (16,2);
// name.attacht(pin)
  horizontal.attach(9);
  vertical.attach(10);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Gompy Solar V1.3") ;
  lcd.setCursor(0, 1);
  lcd.print("The Netherlands ");
  delay(2000);
  lcd.clear();
  delay(1000);
  lcd.setCursor(0,0); 
}

void loop()
{
  int lt = analogRead(ldrlt); // top left
  int rt = analogRead(ldrrt); // top right
  int ld = analogRead(ldrld); // down left
  int rd = analogRead(ldrrd); // down right
 
  int dtime = analogRead(4)/20; // read potentiometers 
  int tol = analogRead(5)/4;
 
  int avt = (lt + rt) / 2; // average value top
  int avd = (ld + rd) / 2; // average value down
  int avl = (lt + ld) / 2; // average value left
  int avr = (rt + rd) / 2; // average value right

  int dvert = avt - avd; // check the diffirence of up and down
  int dhoriz = avl - avr;// check the diffirence og left and right

  if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
  {
  if (avt > avd)
  {
    servov = ++servov;
     if (servov > 65)
     {
      servov = 65;
     }
  }
  else if (avt < avd)
  {
    servov= --servov;
    if (servov < 25)
  {
    servov = 25;
  }
  }
  vertical.write(servov);
  }
 
  if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
  {
  if (avl > avr)
  {
    servoh = --servoh;
    if (servoh < 35)
    {
    servoh = 35;
    }
  }
  else if (avl < avr)
  {
    servoh = ++servoh;
     if (servoh > 145)
     {
     servoh = 145;
     }
  }
  else if (avl = avr)
  {
       // nothing
  }
  horizontal.write(servoh);
  }
  delay(dtime);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Horizontal:");
  lcd.setCursor (12, 0);
  lcd.print(servoh);
  lcd.setCursor(15, 0);
  lcd.print((char)223);

  lcd.setCursor(0, 1);
  lcd.print("Vertical  :");
  lcd.setCursor(12, 1);
  lcd.print(servov);
  lcd.setCursor(15, 1);
  lcd.print((char)223);

     Serial.print(" Horizontal\t");
     Serial.print(servoh);
     Serial.print(" \t brown  ");
     Serial.print(ldrlt);
     Serial.print(" \t orange  ");
     Serial.print(ldrrt);
     Serial.print(" difference ");
     Serial.print(ldrlt - ldrrt);
     
     Serial.print(" Vertical\t");
     Serial.print(servov);
     Serial.print(" \t yellow ");
     Serial.print(ldrld);
     Serial.print(" \t green  ");
     Serial.print(ldrrd);
     Serial.print(" difference ");
     Serial.println(ldrld - ldrrd); 

}

Advertisement

Gebruikers-avatar
Berichten: 1859
Geregistreerd: 06 Aug 2016, 01:03

Re: Bij gebruik van servo.h vliegen de servo's naar positie

Berichtdoor Koepel » 08 Apr 2018, 17:25

Heb je wel eens een servo motor open gemaakt ? En weet je hoe de servo motor de positie krijgt doorgestuurd ?

Er zit een motor met vertraging in, en elektronica met een potmeter. Die interne potmeter zit op de as.
De aansturing gaat met PWM pulsen, en de breedte van puls geeft aan op hoeveel graden de servo motor moet gaan staan.

In de sketch weet je dus niet hoe de servo motor staat.
Met servo.attach() wordt het PWM signaal op die pin gezet. De Servo library heeft de beginstand op 90 graden. Hoe wou je dat anders doen ?
Dus gaat de servo met volle snelheid naar de middenstand. Het is niet anders.

Adafruit heeft een fabrikant zo ver gekregen dat ze een speciale servo motor hebben gemaakt, waarbij de aansluiting van de interne potmeter met een draadje naar buiten gaat: https://www.adafruit.com/product/1404.

Je tweede vraag weet ik eigenlijk niet. Ik loop een beetje vast op deze regel:
Code: Alles selecteren
servov= --servov;

Kun je vertellen wat je daar wilt doen ? De waarde met één verlagen ?
Wat dacht je van deze:
Code: Alles selecteren
servov--;
servov = servov - 1;
servov -= 1;

Berichten: 71
Geregistreerd: 05 Apr 2018, 00:44

Re: Bij gebruik van servo.h vliegen de servo's naar positie

Berichtdoor Gompy » 08 Apr 2018, 17:50

Ik heb dat stukje uit de manual gepikt welke ik op internet gevonden heb.
http://www.arduino.nu/download/Arduino% ... 0%20NL.pdf

x -- // is hetzelfde als as x = x - 1, of verlaag x met -1

Dus de servo loopt met -1 terug naar (in mijn geval) 25 graden.

Servo's (modelbouw) ken ik wel en weet hoe deze eraan de binnen-en buitenkant uitzien omdat ik deze al ruim 50 jaar gebruik in mijn modelbouwmodellen.
Het aanpassen met een pinnetje van de potmeter naar buiten kan wel eens een probleem worden omdat ik rechts een TIA heb gehad.
Ik heb nog A6 en A7 over en zou deze kunnen gebruiken, maar het ligt in mijn bedoeling om van deze opstelling te leren en eventueel later een echt zonnepaneel met besturing in de tuin te zetten.
De servo's zouden dan vervangen moeten worden door actuators omdat modelbouwservo's niet geschikt zijn, bij spanningsloosheid verliezen deze de instelling door het gewicht of wind van het paneel.

Ik zie wat ik nu aan het doen ben een begin van een nieuwe hobby omdat ik door mijn TIA de onderdeeltjes niet meer kan plaatsen of zelfs de gaatjes niet meer kan boren.
Nu is het een beetje typen met twee vingers en op een experimenteer bordje draadjes steken en dat gaat me tot zover nog wel goed af.

Mvg, Rob

Berichten: 2476
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Bij gebruik van servo.h vliegen de servo's naar positie

Berichtdoor shooter » 08 Apr 2018, 19:19

voor een solarpanel kun je ook een simpele potmeter of zelfs een joystick gebruiken, dan weet je de positie, de aandrijving is dan goedkoop te maken met een paar DC motoren op een stuk draadeind, of met een tandriem bijvoorbeeld.
dat is ook niet zo priegelig als een servo.
dat kan dan lekker langzaam want snelheid heb je toch niet nodig.
paul deelen
shooter@home.nl

Berichten: 71
Geregistreerd: 05 Apr 2018, 00:44

Re: Bij gebruik van servo.h vliegen de servo's naar positie

Berichtdoor Gompy » 08 Apr 2018, 19:27

Er zijn vele wegen die naar Rome leiden, maar bedenk dat dit een hobbyprojectje is op tafel als kennismaking met Arduino.
Ik kan ook alles aan de kant leggen en gewoon een Logo! van Siemens kopen of een kant en klare oplossing, maar dan is het geen hobby meer.

Berichten: 20
Geregistreerd: 20 Mrt 2018, 21:11

Re: Bij gebruik van servo.h vliegen de servo's naar positie

Berichtdoor Duckman » 25 Apr 2018, 23:20

Een servo heeft helaas geen terug koppeling van positie dit is een nadeel van de servo. Verder zijn het fijne motortjes. Twee nadelen bij start weet de servo zijn stand niet en zal zo snel mogelijk naar de opgegeven positie gaan. Als een servo vast zit zal het de servo toch proberen naar de opgegeven stand gaan uiteindelijk zal of een tandwiel in de servo breken of de motor brandvdoor
Oplossing kan zijn een pot meter aan je servo vast maken zodat deze mee draait dit geeft je een indicatie van de stand van de servo.
Je kan ook kort pulsjes geven. De bibliotheek Servo.h is heel handig elke 20 ms wordt er een pulsje van 1 ms tot 2 ms gegeven. 1ms = -90° (of 0°) 2 = 90° (of 180°) de neutraal stand is 1.5ms. Bij elk pulsje zal je servo een stukje verdraaien naar de juiste stand. Met Servo.h dus elke 20 ms. Maar je kan ook elke seconde een pulsje sturen. Dan zal je servo er langer overdoen om in de stand te komen.

puls op pin x hoog
wacht 1,5 ms
puls op pin x laag
wacht 1000 ms voor het mooi 1000-1.5 ms 8-)
herhaal een aantal keer. (zodat je zeker weet dat je servo in de juiste stand staat.

start je programma.

Om het nog mooier te krijgen zal je de voedingsspanning tijdens deze stap kunnen verlagen (als dit kan natuurlijk).

Probleem 2 is eenvoudiger op te lossen. Je hebt een aantal licht gevoelige weerstanden. Kijkt wat die zijn in de nacht. Als je dit weet kan je in de nacht je zonnepaneel terug laten draaien.

Mocht je je vervelen dan kan je ook een klokje inbouwen. Voordeel van de stand van de zon is dat deze redelijk goed te voorspellen is. Je kan dan een test in bouwen of de positie overeenkomt met de tijd en dan in de nacht terug draaien zonsopkomst.

Even ander vraagje. Ik heb een tijd PV panelen ontwikkeld en hebben we ook wel eens gekeken naar solartracker hier kwam uit dat dit niet rendabel is. Het kost natuurlijk ook energie om je arduino aan te hebben. Je servo blijft altijd stroom trekken (ook als deze in positie staat, een servo beweegt altijd een beetje). Verder zijn bewegende onderdelen onderdelen die stuk gaan. Als je het idee hebt echt hogere opbrengst te hebben over een jaar moet ik je teleurstellen. In de winter levert het niet genoeg op om het systeem te laten draaien en in de zomer zit je accu al vol voor dat het middag is.
Is het vooral ter lering en vermaak dan zal ik vooral doen.

PS zet eens een foto van je systeem hier neer ben wel nieuwsgierig geworden.
Ter Leeringe ende Vermaeck

Berichten: 71
Geregistreerd: 05 Apr 2018, 00:44

Re: Bij gebruik van servo.h vliegen de servo's naar positie

Berichtdoor Gompy » 26 Apr 2018, 00:07

Ik ben er al achter dat zowel servo's als steppers niet geschikt zijn om zo te gebruiken.
Als de spanning weg valt om wat voor rede ook dan "vallen" de panelen uit hun positie.
Nu ben ik met draadeinden aan het experimenteren en dat gaat goed, eenmaal in positie blijft het paneel staan wat er ook gebeurd.
Als de spanning weg valt dan maakt het niets meer uit waar het paneel staat, het draadeind is de uitkomst.
Inderdaad moeten servo's en steppers onder spanning blijven staan om hun positie vast te houden met als gevolg stroomverbruik.
Nu blijft alleen de Arduino (en LCD) onder spanning staan en dat in minimaal stroom verbruik tov de stepper en servo's.
Met 4 eindschakelaartjes blijft de draaihoek beperkt en ook het in positie "vliegen" is van de baan omdat het allemaal wat langzamer gaat.
Zelfs bij spanning uitval kan ik toch het paneel naar de door mij gewenste positie laten d raaien bij opstarten wat bij servo.h niet kan.
Start je de Arduino met servo.h op dan gaan de servo's op volle snelheid naar "neutraal" of te wel 90/90 graden.

Ik heb van de nieuwe opstelling nog geen echte uitvoering, alles ligt gewoon los op de werkbank (lees tafel).
Ik moet een draaischijf zien te maken van ~50 cm doorsnede waarbij ik denk aan twee (kunststof) schijven met knikkers er tussen (enorm traatslager dus)
Voor op en neer kan de montage gewoon aan de constructie gemaakt worden, de grootste uitdaging is voorlopig de draaischijf.

Ik wacht nog op mijn relaisbordje en een LM293 bordjes, want nu gebruik ik een easydrive bordje maar dat kan te weinig stroom verwerken.
Bij blokkeren gebruiken de motoren 1,5 Ampere en dat kunnen die easydrive bordjes niet aan.
Er zouden 2 motoren op zo'n bordje aan gesloten moeten worden en dat gaat niet lukken, vandaar de keuze van LM293 of de relais.

BTW, met deze motoren is de verplaatsing ~60 omw/min x 0,75 mm (spoed M6) = 45 mm/min met 25 kg duw- of trekkracht.

De oplossing van zon op komst en zon ondergang heb ik verholpen door de LDR's onder een hoek te zetten ten opzichte van elkaar, zeg maar een piramide met op elke kant een LDR.
Als het paneel naar west gericht staat (zon ondergang) dan pakt de LDR die op het oosten gericht zou moeten staan toch 's morgens genoeg licht op om het paneel die kant op te draaien.
Helaas heb ik nog niet uitgevonden hoe ik het eventueel 's nachts zou kunnen laten doen, maar dat komt ook wel nog wel.......het is natuurlijk een hobby.

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast