servo verplaatsen van a naar b

Arduino specifieke Software
Berichten: 7
Geregistreerd: 13 Aug 2019, 08:58

servo verplaatsen van a naar b

Berichtdoor erve » 13 Aug 2019, 09:08

Hallo allen,
ik ben nieuw op dit forum en ook nieuw met arduino.

Ik wil een rc servomotor verplaatsen van punt a naar punt b aan de hand van de status van een ldr.
Ik heb al een beetje opgezocht op het www maar kom er voorlopig niet uit.

Bij mijn code werkt de ldr maar de servo blijft steeds over en weer gaan.
Kan er iemand helpen aub?

Alvast bedankt,
Eric


code:


// LDR_and_servo_test

// define variables for servo use
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position

// define variables for LDR
#define LDRpin 8 // pin where we connect LDR and resistor
int LDRValue = 0; // result of reading the digital pin
int ledR = 13; // rode led
int ledG = 12; // groene led


void setup() {
myservo.attach(2); // attaches the servo on pin 2 to the servo object
pinMode(ledR, OUTPUT); // initialiseer de pin als digitale uitgang
pinMode(ledG, OUTPUT); // initialiseer de pin als digitale uitgang
Serial.begin(9600); // zet de seriele poort voor communicatie - sets serial port for communication
}

void loop() {
LDRValue = digitalRead(LDRpin);// read the value from the LDR
Serial.println(LDRValue); // print the value to the serial port
delay(100); // wait a little
digitalWrite(ledR, LOW);
if (LDRValue > 0)
digitalWrite(ledR, LOW), digitalWrite(ledG, HIGH), CloseDoor();

if (LDRValue <1)
digitalWrite(ledR, HIGH), digitalWrite(ledG, LOW), OpenDoor();
}

void CloseDoor()
{
for ( pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}



void OpenDoor()
{
for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}

Advertisement

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

Re: servo verplaatsen van a naar b

Berichtdoor Koepel » 13 Aug 2019, 13:35

Hallo, en welkom op dit forum.

Heb je al programmeer-ervaring ?
Je gaat creatief om met komma's. Ik stel voor om de code veel strakker en netter op te schrijven.
Wil je de volgende keer "code-tags" gebruiken ? Die zet je om de code heen zodat het er beter uit ziet. Je kun de knop "Code" gebruiken of anders "Select a Syntax" en dan "C++".

Als een pin nummer iets met "pin" in de naam heeft, dan voorkom je problemen.
De 'LDRValue' mag een lokale variabele zijn.
Zou je de LDR misschien aan een analoge ingang kunnen zetten ? En dan met "analogRead()". Nu heb je 0 of 1, dan kun je geen variatie van licht zien en weet je niet goed of de LDR werkt.
Een if-statement liever met '{' en '}' en met ';' achter elk statement en elk statement op een eigen regel.
In de functies CloseDoor() en OpenDoor() wil je misschien de delay() binnen de for-loop. Dan heb je daar ook de '{' en '}' nodig.

Als je code deze richting uit gaat, dan zit je op de goede weg:
Code: Alles selecteren
if (LDRValue > 500)
{
  digitalWrite(ledRpin, LOW);
  digitalWrite(ledGpin, HIGH);
  CloseDoor();
}


Probeer er maar iets moois van te maken en laat de hele sketch weer zien (tussen code tags).

Wij weten al wat onze volgende reacties zijn: "Je hebt hysterese nodig" en "Krijgt die servo motor wel genoeg stroom ?".
Hysterese is een verschil aanbrengen tussen de analoge waarden. Dus bijvoorbeeld een zonnescherm pas open doen bij driekwart zonlicht en pas dicht doen bij een kwart zonlicht.
Een servo motor vraag meer stroom dan de 5V pin van een Arduino board kan leveren. De voorbeelden van Arduino doen dat soms, maar het gaat ook heel vaak verkeerd.

Berichten: 7
Geregistreerd: 13 Aug 2019, 08:58

Re: servo verplaatsen van a naar b

Berichtdoor erve » 13 Aug 2019, 15:32

Koepel schreef:Hallo, en welkom op dit forum.

Heb je al programmeer-ervaring ?
Je gaat creatief om met komma's. Ik stel voor om de code veel strakker en netter op te schrijven.
Wil je de volgende keer "code-tags" gebruiken ? Die zet je om de code heen zodat het er beter uit ziet. Je kun de knop "Code" gebruiken of anders "Select a Syntax" en dan "C++".

Ik heb geen programmeer-ervaring, ik zal een poging doen om de code netter te schrijven maar geef geen garantie dat het gaat lukken.

Als een pin nummer iets met "pin" in de naam heeft, dan voorkom je problemen.
De 'LDRValue' mag een lokale variabele zijn.
Zou je de LDR misschien aan een analoge ingang kunnen zetten ? En dan met "analogRead()". Nu heb je 0 of 1, dan kun je geen variatie van licht zien en weet je niet goed of de LDR werkt.

Ik heb de LDR op een digitale ingang gezet samen met een 10k potmeter zodat ik kan regelen bij welke lichtsterkte de servo in werking treed.
Is dit niet goed dan?

Een if-statement liever met '{' en '}' en met ';' achter elk statement en elk statement op een eigen regel.
In de functies CloseDoor() en OpenDoor() wil je misschien de delay() binnen de for-loop. Dan heb je daar ook de '{' en '}' nodig.

Als je code deze richting uit gaat, dan zit je op de goede weg:
Code: Alles selecteren
if (LDRValue > 500)
{
  digitalWrite(ledRpin, LOW);
  digitalWrite(ledGpin, HIGH);
  CloseDoor();
}


Probeer er maar iets moois van te maken en laat de hele sketch weer zien (tussen code tags).

Ik zal een poging wagen. ;)

Wij weten al wat onze volgende reacties zijn: "Je hebt hysterese nodig" en "Krijgt die servo motor wel genoeg stroom ?".
Hysterese is een verschil aanbrengen tussen de analoge waarden. Dus bijvoorbeeld een zonnescherm pas open doen bij driekwart zonlicht en pas dicht doen bij een kwart zonlicht.
Een servo motor vraag meer stroom dan de 5V pin van een Arduino board kan leveren. De voorbeelden van Arduino doen dat soms, maar het gaat ook heel vaak verkeerd.

Stroom is geen probleem, er is een externe voeding aangesloten.

Tot later, kan wel een paar dagen duren....
Eric

Berichten: 7
Geregistreerd: 13 Aug 2019, 08:58

Re: servo verplaatsen van a naar b

Berichtdoor erve » 13 Aug 2019, 16:49

Toch nog een beetje tijd gevonden...

Bij deze de aangepaste code.
Het probleem is dat de functie OpenDoor() of CloseDoor() telkens opnieuw gerund wordt terwijl dit maar 1 keer mag zolang LDRValue dezelfde waarde heeft.
Hoe kan ik dat oplossen?

Code: Alles selecteren
// LDR_and_servo_test

// define variables for servo use
#include <Servo.h>
Servo myservo;  // create servo object to control a servo
int pos = 0;    // variable to store the servo position

// define variables for LDR
#define LDRpin 8  // pin where we connect LDR and potentiometer
int LDRValue = 0; // result of reading the digital pin
int ledRpin = 13; // rode led
int ledGpin = 12; // groene led


void setup() {
  myservo.attach(2);  // attaches the servo on pin 2 to the servo object
  pinMode(ledRpin, OUTPUT); // initialiseer de pin als digitale uitgang
  pinMode(ledGpin, OUTPUT); // initialiseer de pin als digitale uitgang
  Serial.begin(9600); // zet de seriele poort voor communicatie  - sets serial port for communication
}

void loop() {
  LDRValue = digitalRead(LDRpin);// read the value from the LDR
  Serial.println(LDRValue);      // print the value to the serial port
  delay(100);                    // wait a little
  digitalWrite(ledRpin, LOW);
  digitalWrite(ledGpin, LOW);
 
  if (LDRValue > 0)
    {
    digitalWrite(ledRpin, LOW);
    digitalWrite(ledGpin, HIGH);
    CloseDoor();
    }
  else
    {
    digitalWrite(ledRpin, HIGH);
    digitalWrite(ledGpin, LOW);
    OpenDoor();
  }
}

void CloseDoor()
 {
   for ( pos = 0; pos <= 180; pos += 1)  // goes from 0 degrees to 180 degrees in steps of 1 degree
    {
   myservo.write(pos);              // tell servo to go to position in variable 'pos'
     delay(15);                       // waits 15ms for the servo to reach the position
  }
   }

void OpenDoor()
 {
   for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees
   {
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
   }
  }

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

Re: servo verplaatsen van a naar b

Berichtdoor Koepel » 13 Aug 2019, 19:22

Goed op weg :D
Je header is maar één regel commentaar, je kunt daar de datum, de versie van de Arduino software, en het Arduino board dat je gebruikt nog toevoegen. Als je later meerdere Arduino boards hebt, dan is het handig als je kunt lezen waarmee je die sketch hebt gedaan.

erve schreef:Ik heb de LDR op een digitale ingang gezet samen met een 10k potmeter zodat ik kan regelen bij welke lichtsterkte de servo in werking treed.
Is dit niet goed dan?

Ja, dat is wel goed, maar het is veel leuker om dat in software in de sketch te doen :geek:
Met een vaste weerstand krijg je een waarde ergens tussen 0...1023. Dan kun je in de sketch het kantelpunt aanbrengen. Dan kun je in de sketch hysteresis aanbrengen. Of een filter in software zodat het maar eens per 5 minuten wordt gedaan.

Je wilt iets doen op het moment dat het licht veranderd.
Het gaat je dus niet om de 'state', maar om het 'event', dat ene moment dat iets veranderd.

Dat is eenvoudig, onthoudt de vorige waarde en kijk of de nieuwe waarde anders is.
Daar is een standaard voorbeeld van, de StateChangeDetection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.

Berichten: 7
Geregistreerd: 13 Aug 2019, 08:58

Re: servo verplaatsen van a naar b

Berichtdoor erve » 13 Aug 2019, 20:17

Ik vind het wel fijn en tof van je dat je me een beetje uitlegt hoe alles zou moeten zijn maar ik zou ook wel graag weten of je een oplossing hebt voor mijn probleem en heel belangrijk, dat je me die oplossing wilt meegeven?
Ik ben wel bereid om bij te leren maar ik zou toch graag op korte termijn mijn probleem willen opgelost zien.
Alvast bedankt voor uw hulp


Koepel schreef:Goed op weg :D
Je header is maar één regel commentaar, je kunt daar de datum, de versie van de Arduino software, en het Arduino board dat je gebruikt nog toevoegen. Als je later meerdere Arduino boards hebt, dan is het handig als je kunt lezen waarmee je die sketch hebt gedaan.

erve schreef:Ik heb de LDR op een digitale ingang gezet samen met een 10k potmeter zodat ik kan regelen bij welke lichtsterkte de servo in werking treed.
Is dit niet goed dan?

Ja, dat is wel goed, maar het is veel leuker om dat in software in de sketch te doen :geek:
Met een vaste weerstand krijg je een waarde ergens tussen 0...1023. Dan kun je in de sketch het kantelpunt aanbrengen. Dan kun je in de sketch hysteresis aanbrengen. Of een filter in software zodat het maar eens per 5 minuten wordt gedaan.

Je wilt iets doen op het moment dat het licht veranderd.
Het gaat je dus niet om de 'state', maar om het 'event', dat ene moment dat iets veranderd.

Dat is eenvoudig, onthoudt de vorige waarde en kijk of de nieuwe waarde anders is.
Daar is een standaard voorbeeld van, de StateChangeDetection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.

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

Re: servo verplaatsen van a naar b

Berichtdoor Koepel » 13 Aug 2019, 20:47

Begrijp je die StateChangeDetection niet ?

Berichten: 7
Geregistreerd: 13 Aug 2019, 08:58

Re: servo verplaatsen van a naar b

Berichtdoor erve » 13 Aug 2019, 21:12

Koepel schreef:Begrijp je die StateChangeDetection niet ?


In een vorige post heb je gezegd dat de digitale uitlezing van de LDR ook goed was dus zou ik het nu graag op die manier opgelost zien, ik heb dit project een paar weken geleden al een keer werkend gehad maar heb per ongeluk die code overschreven en ik weet niet meer hoe ik het toen gedaan had.

Ik heb nu echt geen tijd om dagelijks uren aan een stuk bezig te zijn met arduino en zal het later wel op de 'betere manier' herdoen.

grtz
Eric

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

Re: servo verplaatsen van a naar b

Berichtdoor shooter » 13 Aug 2019, 22:23

dat kan met de statechange, je kunt ook (is hetzelfde eigenlijk vragen of de LDRValue verandert if (LDRValue != oldldrvalue )(oldldrvalue=ldrvalue}
is en dan naar de functie springen.
je zult overigens gemerkt hebben dat in het laatste programma de servo langzamer draait.
wen je ook aan om spekhaken {} te gebruiken dan kan je meerdere regels bij elkaar houden.
paul deelen
shooter@home.nl

Berichten: 7
Geregistreerd: 13 Aug 2019, 08:58

Re: servo verplaatsen van a naar b

Berichtdoor erve » 14 Aug 2019, 08:40

shooter schreef:dat kan met de statechange, je kunt ook (is hetzelfde eigenlijk vragen of de LDRValue verandert if (LDRValue != oldldrvalue )(oldldrvalue=ldrvalue}
is en dan naar de functie springen.

Ik zal het eens proberen maar dit zal waarschijnlijk niet meer voor deze week zijn. Bedankt voor de info.

je zult overigens gemerkt hebben dat in het laatste programma de servo langzamer draait.
wen je ook aan om spekhaken {} te gebruiken dan kan je meerdere regels bij elkaar houden.

Er was idd een verschil in snelheid met het vorige programma.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ahuteexmiw, effisuveo, ivabofaf en 19 gasten