bewegingen van servo's niet goed te coderen

IDE gerelateerde berichten
Berichten: 4
Geregistreerd: 04 Apr 2018, 18:31

bewegingen van servo's niet goed te coderen

Berichtdoor goodmen999 » 04 Apr 2018, 19:01

IMG_20180404_153019 (1).jpg
beveiligingscamera
IMG_20180404_153019 (1).jpg (33.23 KiB) 6477 keer bekeken


Hallo iedereen,

Voor een projectje ben ik bezig met het maken van een namaak beveiligingscamera. Ik heb een arm gemaakt waar een namaak camera aan vast zit, met twee servo's om de arm aan te sturen. een horizontale as, en een verticale.

Nu lukt het me vervolgens niet om de arm op de juiste manier aan te sturen.

* het idee is dat de camera naar beneden kijkt, richting een persoon in een stoel.

* Wanneer de arduino een input krijgt van een schakelaar die opgezet wordt, moet de camera snel omhoog kijken, en op die positie in een loop, naar links en rechts kijken tot de schakelaar weer teruggezet is, en de camera weer langzaam naar de persoon in de stoel gaat kijken.

Ik gebruik een arduino uno, met de servo's aangesloten op pin 10 en 9. En de schakelaar op pin 8.

Ik heb al wat code geschreven, maar hij schiet tussen opdrachten af en toe opeens omlaag.
Dit is wat ik heb tot nu toe, als je me kunt helpen hoor ik het graag!

alvast bedankt :)


const int buttonPin = 8; // the number of the pushbutton pin

#include <Servo.h>
Servo servotop; // create servo object to control a servo
Servo servobelow; // a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position
int buttonState = 0; // variable for reading the pushbutton status

void setup()
{
pinMode(buttonPin, INPUT);
servotop.attach(9);
servobelow.attach(10);
// attaches the servotop on pin 9 and servobelow on pin 10 to the servo object
}


void loop(){

// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH)
{
// turn servotop on (look away):
for(pos = 30; pos < 150; pos += 1) // goes from 30 degrees to 150 degrees
{ // in steps of 1 degree
servotop.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 50ms for the servo to reach the position
}
for(pos = 150; pos < 30; pos += 1) // goes from 150 degrees to 30 degrees
{ // in steps of 1 degree
servotop.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 50ms for the servo to reach the position
}

// turn servobelow on (look away):
for(pos = 111; pos < 180; pos += 1) // goes from 111 degrees to 180 degrees
{ // in steps of 1 degree
servobelow.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 50ms for the servo to reach the position
}
}


// return to start position (he will never know):
else {
{ // in steps of 1 degree
servotop.write(100); // tell servo to go to position in variable 'pos'
delay(50); // waits ...ms for the servo to reach the position
}


{ // in steps of 1 degree
servobelow.write(111); // tell servo to go to position in variable 'pos'
delay(50); // waits ...ms for the servo to reach the position
}
}
}

Advertisement

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

Re: bewegingen van servo's niet goed te coderen

Berichtdoor shooter » 04 Apr 2018, 22:22

doe een keer Ctrl T dan springt het netjes in en dat geeft overzicht.
in de tweede for loop staat van 150 naar 30 dat moet een min zijn en geen plus

home mag je tegelijk doen dus zowel de top als de bottom en daar staat geen vertraging in.
paul deelen
shooter@home.nl

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

Re: bewegingen van servo's niet goed te coderen

Berichtdoor Koepel » 04 Apr 2018, 22:49

Hij doet wat je hebt geprogrammeerd.

Wanneer de knop wordt ingedrukt, dan gaat de camera omhoog vanaf 30 naar 150. Maar zolang de knop ingedrukt is, doet hij dat steeds, dus hij gaat iedere keer terug naar 30 om die beweging van 30 naar 150 te kunnen doen.

Je hebt dus eigenlijk twee verschillende dingen nodig. Wanneer de knop wordt ingedrukt, dan eenmalig omhoog gaan, en daarna de andere blijven bewegen.

Iets eenmalig doen kan met een variabele die bijhoudt of je dat al hebt gedaan.
Het kan ook met de State Change Detection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
Het kan ook met de Bounce2 library: https://github.com/thomasfredericks/Bounce2.
Bijlagen
servos.png
servos.png (17.25 KiB) 6457 keer bekeken

Berichten: 4
Geregistreerd: 04 Apr 2018, 18:31

Re: bewegingen van servo's niet goed te coderen

Berichtdoor goodmen999 » 05 Apr 2018, 12:29

bedankt voor de tip, m'n code is inderdaad best onoverzichtelijk. wat bedoel je met home tegelijkertijd doen?

Berichten: 4
Geregistreerd: 04 Apr 2018, 18:31

Re: bewegingen van servo's niet goed te coderen

Berichtdoor goodmen999 » 05 Apr 2018, 12:31

Koepel schreef:Hij doet wat je hebt geprogrammeerd.

Wanneer de knop wordt ingedrukt, dan gaat de camera omhoog vanaf 30 naar 150. Maar zolang de knop ingedrukt is, doet hij dat steeds, dus hij gaat iedere keer terug naar 30 om die beweging van 30 naar 150 te kunnen doen.

Je hebt dus eigenlijk twee verschillende dingen nodig. Wanneer de knop wordt ingedrukt, dan eenmalig omhoog gaan, en daarna de andere blijven bewegen.

Iets eenmalig doen kan met een variabele die bijhoudt of je dat al hebt gedaan.
Het kan ook met de State Change Detection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
Het kan ook met de Bounce2 library: https://github.com/thomasfredericks/Bounce2.




ik heb m'n code samengevoegd met de state change detection, maar het gaat nog steeds niet goed. Zie je toevallig iets in m'n code wat nogsteeds niet klopt?
cpp code
// this constant won't change:
const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 13; // the pin that the LED is attached to

#include <Servo.h>
Servo servotop; // create servo object to control a servo
Servo servobelow; // a maximum of eight servo objects can be created

// Variables will change:
int pos = 0; // variable to store the servo position
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button

void setup() {
// initialize the button pin as a input:
pinMode(buttonPin, INPUT);
// attaches the servotop on pin 9 and servobelow on pin 10 to the servo object
servotop.attach(9);
servobelow.attach(10);
// initialize serial communication:
Serial.begin(9600);
}


void loop() {
// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button went from off to on:
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
} else {
// if the current state is LOW then the button went from on to off:
Serial.println("off");
}
// Delay a little bit to avoid bouncing
delay(50);
}
// save the current state as the last state, for next time through the loop
lastButtonState = buttonState;


// turns on the LED every four button pushes by checking the modulo of the
// button push counter. the modulo function gives you the remainder of the
// division of two numbers:
if (buttonPushCounter % 1 == 0) {
// turn servotop on (look away):
for(pos = 100; pos < 150; pos += 1) { // goes from 30 degrees to 150 degrees
// in steps of 1 degree
servotop.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 50ms for the servo to reach the position
}
for(pos = 150; pos < 30; pos += 1) { // goes from 150 degrees to 30 degrees
// in steps of 1 degree
servotop.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 50ms for the servo to reach the position
}

// turn servobelow on (look away):
for(pos = 111; pos < 180; pos += 1) { // goes from 111 degrees to 180 degrees
// in steps of 1 degree
servobelow.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 50ms for the servo to reach the position
}


} else {
{ // in steps of 1 degree
servotop.write(100); // tell servo to go to position in variable 'pos'
delay(50); } // waits ...ms for the servo to reach the position
{ // in steps of 1 degree
servobelow.write(111); // tell servo to go to position in variable 'pos'
delay(50); // waits ...ms for the servo to reach the position
}
}
}

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

Re: bewegingen van servo's niet goed te coderen

Berichtdoor shooter » 05 Apr 2018, 20:08

er staat nog steeds += in regel 60 en dat moet -= zijn.
paul deelen
shooter@home.nl

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

Re: bewegingen van servo's niet goed te coderen

Berichtdoor Koepel » 06 Apr 2018, 02:34

Met beide servo's doen om naar de home positie te gaan bedoeld shooter dat je beide servo's kunt aansturen, en daarna eventueel een delay.

Is 100 voor servotop en 111 voor servobottom the normale positie in rust ? Laten we dat de 'home' positie noemen.

Code: Alles selecteren
servotop.write(100);
servobottom.write(110);
delay(500);


Is er iets veranderd ? Het was toch omhoog en heen en weer bewegen zolang de schakelaar is ingedrukt ? Of wil je nu de schakelaar kort indrukken ? en weer kort indrukken om naar de home positie te gaan ?

Het lijkt me beter om eerst de logica er in te zetten. Met de State Change Detection kun je onderscheid maken of de schakelaar zojuist is ingedrukt, of dat de schakelaar ingedrukt gehouden wordt.

Kun je dit eens proberen:
cpp code
// this constant won't change:
const int buttonPin = 2; // the pin that the pushbutton is attached to

int lastButtonState = LOW; // previous state of the button


void setup()
{
// initialize the button pin as a input:
pinMode(buttonPin, INPUT);

Serial.begin( 9600);

Serial.println( "Servo's naar home position");
delay( 500);
}


void loop()
{
// read the pushbutton input pin:
int buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
if (buttonState != lastButtonState)
{
// save the current state as the last state, for next time through the loop
lastButtonState = buttonState;

if (buttonState == HIGH)
{
// if the current state is HIGH then the button went from off to on:
Serial.println( "Naar boven, maar nog niet heen en weer");
delay( 500);
}
else
{
// if the current state is LOW then the button went from on to off:
Serial.println( "Terug naar home position");
delay( 500);
}
}
else
{
// The button did not change.
// Test if the button is on.
if( buttonState == HIGH)
{
Serial.println( "Beweeg heen en weer");
delay( 500);
}
}
}


Als dat is wat je wilt, dan kun bij de teksten de for-loops voor de echte servo motors gaan toevoegen.

Begrijp je wat shooter zei over "+=" en "-=" ?
Als een for-loop omlaag gaat, dan is het nodig om af te tellen.

Kijk hier eens naar:
Code: Alles selecteren
// for(pos = 150; pos < 30; pos += 1)
for(pos = 150; pos > 30; pos -= 1)

Je wilt van 150 naar 30. Die for-loop is actief zolang pos groter dan 30 is, en bij iedere iteratie wordt pos eentje kleiner.

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten