Servo regelen met reed schakelaar

Arduino specifieke Software
Berichten: 3189
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Servo regelen met reed schakelaar

Berichtdoor shooter » 14 Mrt 2020, 10:39

je moet onthouden wat de oude stand is en dan dus met je for loop naar een nieuwe stand gaan.
paul deelen
shooter@home.nl

Advertisement

Berichten: 25
Geregistreerd: 24 Jan 2020, 22:48

Re: Servo regelen met reed schakelaar

Berichtdoor PeterC » 14 Mrt 2020, 13:00

Shooter, bedankt voor je reactie, maar zou je mij een duwtje in de goede richting willen geven. Ik dacht met:

" if (RightbuttonState == LOW) {
for (pos = 70; pos >= 15; pos -= 1) //hier verspringt de servo iets en
// gaat dan naar eindstand(15).
{
myservo.write(pos)
delay(70)"

naar zijn laatste stand ging maar blijkbaar is mijn gedachte dus verkeerd. Het lijkt erop dat nu de stand van de vorige lus wordt gekozen.
Dit is de 2e lus, de eerste lus gaat wel helemaal goed.

PeterC

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

Re: Servo regelen met reed schakelaar

Berichtdoor shooter » 14 Mrt 2020, 15:50

Ik zie ook de bomen niet meer, maar dat komt vooral door de grote hoeveelheid if statements, en dan alle else er ook nog tussen.
Je hebt een aantal statussen zoals schakelaar standen en bewegingen die geef je allemaal een status mee

zoals knop1gedrukt is status 10
beweging van links naar rechts is status 30
etc.
dat is een heel ander programma weliswaar, maar dan leer je programmeren.
als dan een beweging klaar is dan is de situatie ook anders en dus een ander cijfer.
dat is een manier.
ook al die delays veranderen met een timer zodat de loop heel snel alles scant en als er dan een tijd gedaan is even naar een andere status wordt gesprongen.
de servo standen benoemen dus 50 is midden etc dat is handig want dan hoef je ze niet meer te zoeken wat welke is.

en jouw begin positie is schijnbaar niet juist want verspringen is van 70 naar ik vermoed 60 maar dat kan ik niet goed vinden
en nee het is 1 grote lus.
zet je programma eens netjes in de IDE en zet dan voor elke else en { een enter
en dan een Ctrl T
dan staat de structuur weer goed zichtbaar en die is compleet anders als 3 lussen.
paul deelen
shooter@home.nl

Berichten: 25
Geregistreerd: 24 Jan 2020, 22:48

Re: Servo regelen met reed schakelaar

Berichtdoor PeterC » 20 Mrt 2020, 21:45

Een wat late reactie maar de computer had even wat problemen met opstarten.
Als ik jouw reactie goed begrijp zou ik met een soort van case programma moeten gaan werken of heb ik dat verkeerd. Het is in ieder geval de bedoeling om met een standen schakelaar te gaan werken, had ik vergeten erbij te vermelden. Ik heb wel het programma netter in de IDE gezet, hopelijk is het nu wat duidelijker. En inderdaad het verspringen is naar de eerste stand bij het terug gaan. Kun/wil je mij toch nog verder helpen?
Het is mij nu duidelijk dat het 1 grote lus is.

PeterC

Code: Alles selecteren


#include <Servo.h>

const int LeftbuttonPin = 2;
const int RightbuttonPin = 4;

int KeuzePin1 = 5;
int KeuzePin2 = 6;
int KeuzePin3 = 7;
int KeuzePin1State = 0;
int KeuzePin2State = 0;
int KeuzePin3State = 0;

int LeftbuttonState = 0;
int RightbuttonState = 0;
int pos = 15; // Staat normaal op 0, dit geeft een rustiger start.

Servo myservo;

void setup() {
  Serial.begin(9600);

  myservo.attach(9);
  pinMode(KeuzePin1, INPUT);
  pinMode(KeuzePin2, INPUT);
  pinMode(KeuzePin3, INPUT);

  pinMode(LeftbuttonPin, INPUT_PULLUP);
  pinMode(RightbuttonPin, INPUT_PULLUP);
  myservo.write(pos); // Neemt de int pos positie aan.
}

void loop() {

  LeftbuttonState = digitalRead(LeftbuttonPin);
  //Serial.println(LeftbuttonState);
  RightbuttonState = digitalRead(RightbuttonPin);
  //Serial.println(RightbuttonState);
  KeuzePin1State = digitalRead(KeuzePin1);
  //Serial.println(KeuzePin1State);
  KeuzePin2State = digitalRead(KeuzePin2);
  //Serial.println(KeuzePin2State);
  KeuzePin3State = digitalRead(KeuzePin3);
  //Serial.println(KeuzePin3State);

  if ((KeuzePin1State == HIGH) && (LeftbuttonState == LOW))
  {
    for (pos = 15; pos <= 60; pos += 1) // is gelijk aan de int pos bij setup
    {
      myservo.write(pos);
      delay(100);
    }
  }
  else
  {
    if (RightbuttonState == LOW)  {
      for (pos = 60; pos >= 15; pos -= 1) //Dit gaat goed.
      {
        myservo.write(pos);
        delay(70);
      }
    }
    else
    {
      if ((KeuzePin2State == HIGH) && (LeftbuttonState == LOW)) // dit gaat ook goed
      {
        for (pos = 15; pos <= 70; pos += 1)
        {
          myservo.write(pos);
          delay(100);
        }
      }
      else
      {

        if (RightbuttonState == LOW)  {
          for (pos = 70; pos >= 15; pos -= 1) //hier verspringt de servo iets en
            // gaat dan naar eindstand(15).
          {
            myservo.write(pos);
            delay(70);
          }
        }
        else
        {

          if (KeuzePin3State == HIGH and LeftbuttonState == LOW)
            //if (LeftbuttonState == LOW)
          {
            for (pos = 15; pos <= 51; pos += 1)
            {
              myservo.write(pos);
              delay(100);
            }
          }
          else
          {

            if (RightbuttonState == LOW) // hier verspringt de servo iets en
              // gaat dan naar eindstand(15).
            {
              for (pos = 51; pos >= 15; pos -= 1)
              {
                myservo.write(pos);
                delay(70);
              }
            }
          }
        }
      }
    }
  }
}

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

Re: Servo regelen met reed schakelaar

Berichtdoor shooter » 21 Mrt 2020, 17:13

haal eerstal die ifs uit elkaar en geef elke situatie een status
paul deelen
shooter@home.nl

Berichten: 25
Geregistreerd: 24 Jan 2020, 22:48

Re: Servo regelen met reed schakelaar

Berichtdoor PeterC » 20 Apr 2020, 21:26

Heren,

Ondanks dat het lang stil was hier ben ik toch verder gegaan met zoeken, lezen en proberen. Het is mij gelukt om het programma werkend te krijgen zoals door mij gewenst. Het zal ongetwijfeld voor verbetering vatbaar zijn wat programmeren betreft maar ik ben tevreden zoals het nu werkt. Ik vond toch dat ik dat even moest melden hier. Nogmaals bedankt voor de reacties, deze hebben toch ook wel mee geholpen om tot een goed einde te komen.

PeterC

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

Re: Servo regelen met reed schakelaar

Berichtdoor shooter » 21 Apr 2020, 09:59

als het werkt is het prima, zet het dan op het forum, want dan kunnen anderen er ook van leren.
paul deelen
shooter@home.nl

Berichten: 25
Geregistreerd: 24 Jan 2020, 22:48

Re: Servo regelen met reed schakelaar

Berichtdoor PeterC » 28 Apr 2020, 22:05

Het vinden van een geschikte standenschakelaar is toch niet zo eenvoudig als dat ik dacht. Om het toch voor de gebruiker wat eenvoudig te houden heb ik nu ook een andere variant kunnen maken, nu met 1 drukknop. Ik zal eerst de code plaatsen om het met een standenschakelaar te kunnen doen.

Code: Alles selecteren

#include <Servo.h>

const int LeftbuttonPin = 3;
const int RightbuttonPin = 4;

int KeuzePin1 = 5;
int KeuzePin2 = 6;
int KeuzePin3 = 7;
int KeuzePin1State = 0;
int KeuzePin2State = 0;
int KeuzePin3State = 0;

int LeftbuttonState = 0;
int RightbuttonState = 0;
int pos = 15; // Staat normaal op 0, dit geeft een rustiger start.
int lastLeftbuttonState = 0;
Servo myservo;

void setup() {
  Serial.begin(9600);

  myservo.attach(9);
  pinMode(KeuzePin1, INPUT);
  pinMode(KeuzePin2, INPUT);
  pinMode(KeuzePin3, INPUT);

  pinMode(LeftbuttonPin, INPUT_PULLUP);
  pinMode(RightbuttonPin, INPUT_PULLUP);
  myservo.write(pos); // Neemt de int pos positie aan.
}

void loop() {
  LeftbuttonState = digitalRead(LeftbuttonPin);
  //Serial.println(LeftbuttonState);
  RightbuttonState = digitalRead(RightbuttonPin);
  //Serial.println(RightbuttonState);
  KeuzePin1State = digitalRead(KeuzePin1);
  //Serial.println(KeuzePin1State);
  KeuzePin2State = digitalRead(KeuzePin2);
  //Serial.println(KeuzePin2State);
  KeuzePin3State = digitalRead(KeuzePin3);
  Serial.println(KeuzePin3State);

  if (LeftbuttonState != lastLeftbuttonState) {
    lastLeftbuttonState = LeftbuttonState;
  }

  if ((KeuzePin1State == HIGH) && (LeftbuttonState == LOW))
  {
    for (pos = 15; pos <= 60; pos += 1)
    {
      myservo.write(pos);
      delay(100);
    }
  }   else  {

    if ((KeuzePin1State == HIGH) && (RightbuttonState == LOW))
    {
      for (pos = 60; pos >= 15; pos -= 1)
      {
        myservo.write(pos);
        delay(70);
      }
    } else {

      if (LeftbuttonState != lastLeftbuttonState) {
        lastLeftbuttonState = LeftbuttonState;
      }
      if ((KeuzePin2State == HIGH) && (LeftbuttonState == LOW))
      {
        for (pos = 15; pos <= 70; pos += 1)
        {
          myservo.write(pos);
          delay(100);
        }
      }  else {

        if ((KeuzePin2State == HIGH) && (RightbuttonState == LOW))
        {
          for (pos = 70; pos >= 15; pos -= 1) //hier verspringt de servo iets en
            // gaat dan naar eindstand(15).
          {
            myservo.write(pos);
            delay(70);
          }
        } else {

          if (LeftbuttonState != lastLeftbuttonState) {
            lastLeftbuttonState = LeftbuttonState;
          }
          if ((KeuzePin3State == HIGH) && (LeftbuttonState == LOW))
          {
            for (pos = 15; pos <= 80; pos += 1)
            {
              myservo.write(pos);
              delay(100);
            }
          }  else {

            if ((KeuzePin3State == HIGH) && (RightbuttonState == LOW))
            {
              for (pos = 80; pos >= 15; pos -= 1) //hier verspringt de servo iets en
                // gaat dan naar eindstand(15).
              {
                myservo.write(pos);
                delay(70);
              }
            } else {

              if (LeftbuttonState == LOW) 
              {

                for (pos = 15; pos <= 50; pos += 1) // is gelijk aan de int pos bij setup
                {
                  myservo.write(pos);
                  delay(100);
                }
              } else {
                if (RightbuttonState == LOW)  {
                  for (pos = 50; pos >= 15; pos -= 1) //is nu gelijk aan setup
                  {
                    myservo.write(pos);
                    delay(70);
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Berichten: 25
Geregistreerd: 24 Jan 2020, 22:48

Re: Servo regelen met reed schakelaar

Berichtdoor PeterC » 28 Apr 2020, 22:08

Hier de code om het met een drukschakelaar te doen. Dit is nog wel een proef opstelling maar het werkt wel zoals door mij gewenst.

Code: Alles selecteren
/*Programma voor het aansturen van een servo waarbij de hoogste
   stand kan worden gewijzigd d.m.v. een drukknop.
   Bedacht door P.Croese
   27-4-2020

*/

#include <Servo.h>

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin1 = 7;
const int ledPin2 = 8;
const int LeftbuttonPin = 3;
const int RightbuttonPin = 4;




// Variables will change:
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
int ledPin1State = 0;
int LeftbuttonState = 0;
int RightbuttonState = 0;
int pos = 15;
Servo myservo;

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);

  myservo.attach(9);
  pinMode(LeftbuttonPin, INPUT_PULLUP);
  pinMode(RightbuttonPin, INPUT_PULLUP);
  myservo.write(pos);
}


void loop() {
  LeftbuttonState = digitalRead(LeftbuttonPin);
  RightbuttonState = digitalRead(RightbuttonPin);
  //Serial.println(LeftbuttonState);


  // 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(1000);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;

  if (buttonPushCounter == 1) {
    digitalWrite(ledPin1, HIGH);
  }
  if ((buttonPushCounter == 1) && (LeftbuttonState == LOW)) {
    //digitalWrite(ledPin1, HIGH);

    for (pos = 15; pos <= 50; pos += 1) // is gelijk aan de int pos bij setup
    {
      myservo.write(pos);
      delay(100);
    }
  } else {

    if ((buttonPushCounter == HIGH) && (RightbuttonState == LOW))  {
      for (pos = 50; pos >= 15; pos -= 1) //is nu gelijk aan setup
      {
        myservo.write(pos);
        delay(70);
      }

    } else  {

      if (buttonPushCounter == 2) {
        digitalWrite(ledPin1, LOW);

        digitalWrite(ledPin2, HIGH);
      }
      if ((buttonPushCounter == 2) && (LeftbuttonState == LOW)) {

        for (pos = 15; pos <= 60; pos += 1) // is gelijk aan de int pos bij setup
        {
          myservo.write(pos);
          delay(100);
        }
      } else {

        if ((buttonPushCounter == 2) && (RightbuttonState == LOW))  {
          for (pos = 60; pos >= 15; pos -= 1) //is nu gelijk aan setup
          {
            myservo.write(pos);
            delay(70);
          }

        } else  {

          if (buttonPushCounter >= 3){
            digitalWrite(ledPin2, LOW);
         
            buttonPushCounter = 0;
          }
        }
      }
    }
  }
}


PeterC

Berichten: 25
Geregistreerd: 24 Jan 2020, 22:48

Re: Servo regelen met reed schakelaar

Berichtdoor PeterC » 28 Apr 2020, 22:10

Nog even vergeten te vermelden, de laatste code is afgeleid van "State change detection" uit het voorbeelden programma van Arduino.

PeterC

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten