Waarden in LCD laten zien van positie servo's

IDE gerelateerde berichten
Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor baco1978 » 09 Apr 2018, 13:37

dat is het belangrijkste dat je er wat van leert.


Code: Alles selecteren
Servo horizontal; // horizontal servo
int servoh = 0;  // position horizontal servo
Servo vertical;   // vertical servo
int servov = 0;  // position vertical servo


er even vanuitgaande dat 0 de rustpositie is.

in de setup 2x een for loop gebruiken.

https://www.arduino.cc/reference/en/language/structure/control-structure/for/
Met vriendelijke groet Arjan

Advertisement

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 09 Apr 2018, 14:06

Ik heb er dit staan:

Code: Alles selecteren
Servo horizontal; // horizontal servo
int servoh = 90;  // position horizontal servo

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


Omdat ik niet weet waar de servo's staan in begin positie.
Echter met deze of andere instelling "vliegen" nog steeds de servo's naar enige andere waarde.
Ik wil juist dat "vliegen" voorkomen en dat de servo's gecontroleerd met een vertraging naar de neutrale positie gaan.

Eea gebeurd alleen na een reset van de Arduino, in het programma zelf gaat het goed.

De gehele code

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);
  if (servoh <100) lcd.print(" "); // test variable if <100 print space.
  lcd.print(servoh);
  lcd.setCursor(15, 0);
  lcd.print((char)223);

  lcd.setCursor(0, 1);
  lcd.print("Vertical  :");
  lcd.setCursor(13, 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); 

}


Mvg, Rob

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor baco1978 » 09 Apr 2018, 16:03

Ik snap nu wat je bedoeld


Maar dat zal helaas niet gaan lukken.

Aangezien je alleen maar een positie kan sturen naar een servo.

bij uitschakeling of reset, zal de servo teruggaan naar de door jouw voorgestelde 0 positie.
het is verder niet mogelijk om bij aanschakelen de laatst bekende positie uit te lezen.
Met vriendelijke groet Arjan

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 09 Apr 2018, 22:59

Ik heb iets gelezen van een soft reset waarbij de waarden van het register worden behouden.....is zo iets mogelijk ?
E'n maal een sjees naar 90/90 is tot daar aan toe, maar telkens is wat overdreven.
Ik ben beter bekent met PLC's en daarbij kan je gewoon waarden in een stukje eeprom schrijven van de processor.

Mvg, Rob

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor shooter » 13 Apr 2018, 10:28

het probleem is de servo zelf, die komt in een positie te staan die je niet weet, en alleen maar kunt instellen, en dus niet kunt lezen. Door het tijdsfactor kun je ook niet simpel restten. Als je dat niet wilt is het slimmer om alle elektronika uit de servo te slopen, (of zelf een DC motor te maken met een potmeter terugkoppeling.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 13 Apr 2018, 11:26

OK, maar is de de servo.h ook geen oplossing te vinden want "ergens" moet de snelheid van het sturen geregend worden.

Als ik de servo's zou vervangen voor steppers gaan die dan ook met turbosnelheid naar bv het eind(startpunt)contact ?
Want ook die moeten natuurlijk weten waar ze moeten beginnen als je ze aan zet.

Een motor met externe potmeter bouwen zie ik niet direct zitten gezien als het goed gaat ik een groter zonnepaneel in de tuin wil zetten om mee te spelen.
Steppes zijn nog te betalen, maar lineaire actuators zijn iets te duur voor wat hobbyen al zeggen ze dat een hobby geld mag kosten is mijn budget beperkt als AOW'er.

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor shooter » 16 Apr 2018, 22:47

Als je spanning op een servozet dan vliegt deze inderdaad een kant op, meestal naar de 0 graden.
Als je dan de arduino aanzet, vliegt de servo weer een andere kant op.

In je programma kun je echter wel de snelheid regelen door telkens een aandere stand te geven met een beetje tijd ertussen.

Ik heb een robot draaien die met steppermotoren een draadeind bedient, en dus lineair werkt. wordt heel veel gebruikt voor zonnepanelen, want snelheid is niet nodig.
Er zitten zelfs geen eindschakelaars op, De moer heeft een pinnetje dat tegen de draadeind loopt, dat heb ik uit een oude diskdrive. (8 inch.)
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 16 Apr 2018, 23:26

OK, dan ga ik eens shoppen naar steppers als deze niet naar neutraal "vliegen" als je de Arduino reset of aan zet.
Maar dan heb ik een nieuwe vraag.....hoe weet die stepper waar hij is want daar zit geen potmetertje in.
Als de Arduino aan gezet wordt dan moet het programma toch weten waar hij moet beginnen.
Wordt dit bv gedaan door de stepper eerst naar positie X (schakelaartje oid) te laten stappen en dan naar het startpunt ?
Ik snap dat je dan vanaf positie X de stappen kan tellen die de stepper moet gaan maken.
Bv 200 stappen voor 1 omwenteling, bij metrisch M10x1 draad zou dat dan 1 mm zijn zonder tandwielen.
Voor 10 mm moet ik dus 10 omwentelingen maken en dus 2000 stappen als ik het goed begrijp (?)
Wordt nog een heel gereken en vooral veel meten omdat ik nog niet weet waar ik naar toe wil met mijn "project".
Maar ja, het is een hobby en mag tijd kosten.....geld wat minder als dat mogelijk is :D

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

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Koepel » 17 Apr 2018, 02:07

Dat is inderdaad hoe het gaat.

De stappenmotor gaat naar een beginpositie waar een schakelaartje of lichtsluis zit en weet dan wat de beginpositie is.
Vandaar is het stappen tellen. Dat is niet moeilijk, een beetje wiskunde en misschien gebruik van bibliotheken.

Stel je tekent op de weg de afstand in meters van hier tot Parijs. Als je vervolgens 200km vooruit gaat, en dan 50km terug, dan zit je op positie 150km. Dat is alles, ingewikkelder is het niet.

De basis is altijd het aantal stappen. Dus de sketch werkt met het aantal stappen. Het omrekenen naar millimeters is bijzaak.

Weet je hoe een printer met een printkop werkt ? Het naar links en naar rechts bewegen van de kop is een stappenmotor.
Wanneer de printkop halverwege is, en je zet de printer uit, dan weet de printer dus niet waar de printkop staat.
Bij het aanzetten gaat de printkop eerst naar de beginpositie. Sommige printers doen dat heel erg langzaam, andere printers te snel en knallen tegen de zijkant, en weer andere printers blijven een tijdje doorgaan terwijl ze al niet meer verder kunnen.

Bij een stappenmotor hoort een "driver", dat is een printje of module die de stappenmotor van stroom voorziet. Die "driver" kan duurder zijn dan de stappenmotor zelf. Sommigen kopen een stappenmotor van 5A met daarbij een "driver" van 0.5A. Dat gaat natuurlijk niet werken. Een stappenmotor is in principe stroomgestuurd, maar zulke drivers zijn duurder.

Ik begrijp nog steeds niet waarom het zo lastig is dat bij het aanzetten van de Arduino de servo motors naar de middenstand gaan. Dat kan niet anders dan op volle snelheid, maar is dat nu zo erg ?

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Waarden in LCD laten zien van positie servo's

Berichtdoor Gompy » 17 Apr 2018, 11:50

Bedankt voor de uitleg.
Toen er nog geen USB-laadpaneeltje op de servo's zat was het geen enkel probleem, maar nu dat paneeltje (30x15cm) erop zit knalt het paneeltje er telkens af of valt de opstelling om door de centrifugale kracht.
Ik kan me voorstellen als er een echt paneel (60x140cm ?) op zit dat het een nog veel groter probleem gaat worden.
De servo's zijn er sterk genoeg voor want die zijn 25Nm, maar verdraaien ook als de spanning eraf gaat, vandaar dat ik steppers wil die een draadeind bedienen.
Met een 24 uurs timertje zou ik 's nachts al het paneel naar het oosten kunnen richten, dan heb ik tijd zat als het zo traag gaat om het paneel al klaar te zetten voor de volgende dag.
Ideeën zat, nu nog de uitvoering.....maar dat is de hobby :D

Ik heb al eea gevonden een 15Nm stepper (1,8 graden) met een L293D kant en klaar printje wat volgens de leverancier goed moet zijn.
Bij het setje (Arduino en nog wat spul) wat ik had kocht zaten ook twee EasyDriver 4.4 printjes, ook stepperprintjes maar heb geen idee wat die doen......zitten heel veel pennetjes aan die ik niet thuis kan brengen (zover ben ik nog niet).

Eerst maar eens kijken als de spullen binnen zijn of ik de steppers kan laten draaien, dat zou al een hele stap vooruit zijn.

VorigeVolgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten