Lustigt fel på Arduino-krets (Video och kod included)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
teljemo
Inlägg: 1622
Blev medlem: 5 februari 2011, 12:08:13
Ort: Getinge
Kontakt:

Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av teljemo »

Hej,

Sitter och labbar ihop ett system som ska vrida 2 plattor i utsuget i verkstan hemma. Ventiler helt enkelt...
Jag har inte hållit på så mycket med Arduino men man har väl kopierat en och annan färdig kod och editerat lite..

Stötte på ett oväntat resultat precis när jag monterat servo nummer 2.

Funktionen
Tanken är att när man trycker på en knapp så ska servon den är ansluten till rotera ca 90°.
När man trycker på samma knapp igen så roterar den tillbaka lika mycket.
Det fungerar fint.. Dock inte optimalt efter att jag kopplat in den andra motorn med dess knapp.

Felet
När ja kör ena motorn gör den sin rörelse. När jag kör den andra motorn gör den en kortare rörelse och går direkt tillbaka men bara en gång.
Nästa gång jag trycker på samma knapp gör den det den ska. När man sedan kör den första servon igen har den detta beteendet.
Med den förklaringen ser man symptomen klart och tydligti klippet nedan. (Under klippet är hela koden)

Koppling (Arduino UNO)
Jag använder ~3 och ~5 till servo signal samt 2 och 4 till knapparna.
Extern försörjning på breadboard.
GND sammanlänkad mellan UNO's POWER rad och breadboard.
På knapparnas ena sida sitter jord, på andra sidan går tråd till 2 eller 4 samt till 5v. Ett 10K motstånd sitter mellan 5v och signalen.

Min tanke är att10K motstånden inte räcker för att hålla tillbaka en spik när man skiftar knapp och att man skulle behöva en diod.
Men.. Eftersom jag läst att man brukar ha en resistor tänker jag att det finns en anledning så.. Jag frågar här innan jag hittar på nåt onödigt.

Vad kan felet vara? :)




Koden
b = button
s = servo

Kod: Markera allt

   /*
Program made by Emanuel Teljemo in 2020.

The purpose of the program is to control 2 servo motors that are installed in a ventilation system.
The servos turn airvalves on and off to focus the air flow from the chosen path.

TO DO LIST:
* Shut down servos after 5 sec as a saftey measure against overheating
* Add a function to control a relay based on both servos angle state
* Add LED's to indicate open or closed valve


  *WARNING!
  *When this code was made I was experimenting so USE AT OWN RISK!


 */

#include <Servo.h>  // Includes a servo file that is already installed with Arduino IDE

Servo s1, s2;  // Creates a servo object
#define s1Pin 3  // Signal to s1
#define s2Pin 5  // Signal to s2
#define b1Pin 2 // Signal from pushbutton1
#define b2Pin 4 // Signal from pushbutton2

int angle = 7;  // Creates and defines initial angle of servomotor on startup
int speed = 10; // The speed ov the servo movement
const int minAngle = 7;  // The angle of the motor arm when vent is closed
const int maxAngle = 85; // The angle of the motor arm when vent is open
int b1Pushed = 0;  // pushbutton variable set to 0 before setup
int b2Pushed = 0;  // pushbutton variable set to 0 before setup

void setup() {
  Serial.begin(9600); // setup serial must match buad rate. See buad rate in serial monitor
  s1.attach(s1Pin); // attaches the servo on pin 3 to the servo object
  s2.attach(s2Pin); // attaches the servo on pin 5 to the servo object
   Serial.println("*Teljemo's servo controller initiated*"); // Adds (prints) text in serial monitor
   s1.write(angle); // Set the initial motor position
   s1.write(angle); // Set the initial motor position
      Serial.print("Starting angle is: "); // Prints text
      Serial.print(angle); // Prints angle after write
      Serial.println(" degrees"); // Prints text
      Serial.println("***********************************"); // Prints text
}

void loop() {
  if(digitalRead(b1Pin) == LOW){  // Checks if button 1 is pushed down
    b1Pushed = 1; //  Set value to 1 if above is true
  }
   if( b1Pushed){ // Asks if button 1 is true
  angle = angle + speed;  // Changes the value of the angle variable

    if (angle <= minAngle || angle >= maxAngle) { // Checks where the servomotor 1 angle is to drive it the opposite direction
      speed = -speed;
       b1Pushed = 0; // Tells the program that the 1st button os no longer pushed
    }
    s1.write(angle); // Moving the 1st servo to the defined value of angle
      Serial.print("Moved servo 1: "); // Printing text
      Serial.print(angle);   // Shows the angle value in print
      Serial.println(" degrees"); // Printing text
  delay(50); // Creates a delay to wait for servo 1 to get in place before looping on
   }

    if(digitalRead(b2Pin) == LOW){  // Checks if button 2 is pushed down
    b2Pushed = 1; //  Set value to 1 if above is true
  }
   if( b2Pushed){ // Asks if button 2 is true
  angle = angle + speed;  // Changes the value of the angle variable

    if (angle <= minAngle || angle >= maxAngle) { // Checks where the servomotor 2 angle is to drive it the opposite direction
      speed = -speed;
       b2Pushed = 0; // Tells the program that the 2nd button os no longer pushed
    }
    s2.write(angle); // Moving the 2nd servo to the defined value of angle
      Serial.print("Moved servo 2: "); // Printing text
      Serial.print(angle);   // Shows the angle value in print
      Serial.println(" degrees"); // Printing text
  delay(50); // Creates a delay to wait for servo 2 to get in place before looping on
   }
   
}
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av pfyra »

Känns som att det sätts fel startvinkel (i koden) för servona när knappen trycks.

Du använder samma variabel för nuvarande vinkel ("angle") för båda servona. Något av en gissning, men det kanske kan ha något med problemet att göra...
Garmen
Inlägg: 422
Blev medlem: 9 september 2020, 13:10:36
Ort: Norr om Stockholm

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av Garmen »

Liten fråga om detta fast jag inte alls är hemma på detta (heller :) )
s1.write(angle); // Set the initial motor position
s1.write(angle); // Set the initial motor position
Ser inte att s2 tilldelas initialläge på det sätt som s1 tilldelas detsamma.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av mankan »

Förutom missarna nämnda ovan: Har du extern avstudsning på knapparna? Nu vet jag inte hur troligt det är att en knapp ger studsar som varar längre än 100ms vilket skulle göra att du trycker en gång men ditt program hanterar det som flera knapptryckningar.

Ett sista tips, fixa till ordentligt indentering av koden. Nu är det svårläst och kan enkelt dölja något fel.
Användarvisningsbild
teljemo
Inlägg: 1622
Blev medlem: 5 februari 2011, 12:08:13
Ort: Getinge
Kontakt:

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av teljemo »

Tack!!
Initial positionen. En miss när jag kopierade rader för att skapa koden till den andra servon...

Jag tänkte mig att angle borde fungera som en variabel för båda då de bara ska agera öppen och stängd, men det gör set såklart int vid närmare eftertanke eftersom det är en variabel som ändrar värdet när man kör den ena motorn och de värdet kan ju då bli lite lustigt när man kör motor 2 koden.

Jag har ändrat och delat på alla variabler nu med s1 respektive s2 framför bara så varje motor får dedikerade värden och det fungerar :)
Dock är motorernas vinklar motsatta?. När motor 1 står på 7 grader är armen parallell med motorkroppen. När motor 2 står i sina 7 grader är den perpendikulär mot motorkroppen. Dom är anslutna på samma sätt och är av samma tillverkare. skumt?

Om någon undrar varför jag har satt 7° och 85° som värden är det för att jag trixade med att få till en bra startpunkt och slutpunkt och det bara blidde så... började med 0 som start men servon morrade som att den låg och tryckte mot ett ändläge så löste det såhär..

Ang indentering... autoformateringen i Arduino IDE verkar inte göra så mycket mer än att jämna till lite instick.. Tar gärna emot tips på om det finns någon standard man kan följa i detta :)
När jag programmerar i processing brukar jag få till det ganska bra med ordning och reda och den autoformateringen känns som att den gör lite mer nytta. (känsla)
Nu är den här Arduino koden ett virrvarr för att jag fått ändra så mycket fram och tillbaka pga min bristfälliga kunskap. Så som sagt... Lär mig gärna rätt ifrån början..

Här är koden igen med ändringarna och ett försök att städa lite. (överdrev dock med *** som jag egentligen inte gillar att använda på de sättet men det blir tydliga gränser)

Kod: Markera allt

/*
  Program made by Emanuel Teljemo in 2020.

  The purpose of the program is to control 2 servo motors that are installed in a ventilation system.
  The servos turn airvalves on and off to focus the air flow from the chosen path.

  TO DO LIST:
  Shut down servos after 5 sec as a saftey measure against overheating
  Add a function to control a relay based on both servos angle state
  Add LED's to indicate open or closed valve


  WARNING!
  When this code was made I was experimenting so USE AT OWN RISK!


*/
// SETTING UP SERVO'S ********************
#include <Servo.h>  // Includes a servo file that is already installed with Arduino IDE
Servo s1, s2;  // Creates servo object's

// DEFINE'S PINS ON THE ARDUINO BOARD ********************
#define s1Pin 3  // Signal from servo 1
#define s2Pin 5  // Signal from servo 2
#define b1Pin 2 // Signal from pushbutton1
#define b2Pin 4 // Signal from pushbutton2

//DEFINES VARIABLES FOR SERVO 1 ********************
int s1angle = 7;  // Initial angle for servo 1
int s1speed = 10; // Speed for servo 1 movement
const int s1minAngle = 7;  // Angle of servo 1 arm when vent is closed
const int s1maxAngle = 85; // Angle of servo 1 arm when vent is open

// DEFINES VARIABLES FOR SERVO 2 ********************
int s2angle = 7;  // Initial angle for servo 2
int s2speed = 10; // Speed for servo 2 movement
const int s2minAngle = 7;  // Angle of servo 2 arm when vent is closed
const int s2maxAngle = 85; // Angle of servo 2 arm when vent is open

// CREATES VARIABLES FOR BUTTONS ********************
int b1Pushed = 0;  // Button variable set to 0 before setup
int b2Pushed = 0;  // Button variable set to 0 before setup

// SETUP ********************
void setup() {
  // CONNECTION ********************
  Serial.begin(9600); // Serial need to match buad rate. See buad rate in serial monitor

  s1.attach(s1Pin); // Attaches servo 1 on pin 3
  s2.attach(s2Pin); // Attaches servo 2 on pin 5

  Serial.println("*Teljemo's servo controller initiated*"); // Print text in serial monitor

  // INITIAL MOVEMENT ********************
  s1.write(s1angle); // Set the initial position for servo 1
  s2.write(s2angle); // Set the initial position for servo 2

  // PRINT FOR SERIAL MONITOR ********************
  Serial.println("Starting angles are: "); // Print text in serial monitor
  Serial.print(s1angle); // Prints angle of servo 1
  Serial.println(" degrees for servo 1"); // Print text in serial monitor
  Serial.print(s2angle); // Prints angle of servo 2
  Serial.println(" degrees for servo 2"); // Print text in serial monitor
  Serial.println("***********************************"); // Print text in serial monitor
}

// LOOP ********************
void loop() {
  // BUTTON 1 ********************
  if (digitalRead(b1Pin) == LOW) { // Checks if button 1 is pushed down
    b1Pushed = 1; //  Set value to 1 if above is true
  }
  if ( b1Pushed) { // Asks if button 1 is pushed
    s1angle = s1angle + s1speed;  // Changes the value of the 1st angle variable

    if (s1angle <= s1minAngle || s1angle >= s1maxAngle) { // Checks where the 1st servomotor's angle is to drive it the opposite direction
      s1speed = -s1speed;
      b1Pushed = 0; // Tells the program that the 1st button is no longer pushed
    }
    s1.write(s1angle); // Moving the 1st servo to the defined value of s1angle

    Serial.print("Moved servo 1: "); //  Print text in serial monitor
    Serial.print(s1angle);   // Prints angle of servo 1
    Serial.println(" degrees"); //  Print text in serial monitor

    delay(50); // Creates a delay to wait for servo 1 to get in place before looping on
  }

  // BUTTON 2 ********************
  if (digitalRead(b2Pin) == LOW) { // Checks if button 2 is pushed down
    b2Pushed = 1; //  Set value to 1 if above is true
  }
  if ( b2Pushed) { // Asks if button 2 is true
    s2angle = s2angle + s2speed;  // Changes the value of the angle variable

    if (s2angle <= s2minAngle || s2angle >= s2maxAngle) { // Checks where the 2nd servomotor's angle is to drive it the opposite direction
      s2speed = -s2speed;
      b2Pushed = 0; // Tells the program that the 2nd button os no longer pushed
    }
    s2.write(s2angle); // Moving the 2nd servo to the defined value of angle

    Serial.print("Moved servo 2: "); // Print text in serial monitor
    Serial.print(s2angle);   // Prints angle of servo 2
    Serial.println(" degrees"); // Print text in serial monitor

    delay(50); // Creates a delay to wait for servo 2 to get in place before looping on
  }
  //END OF LOOP ********************
}
//  END OF PROGRAM ********************
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av pfyra »

Härligt! Kul att det löste sig :)
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av mankan »

Det är minst 2 buggar kvar i vardera ifsats som ska vända håll.
Användarvisningsbild
teljemo
Inlägg: 1622
Blev medlem: 5 februari 2011, 12:08:13
Ort: Getinge
Kontakt:

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av teljemo »

mankan skrev: 29 december 2020, 03:33:41 Det är minst 2 buggar kvar i vardera ifsats som ska vända håll.
Jag ser dom inte? Ett felaktigt mellanslag i "if ( b1Pushed)" som såklart inte ska vara där men räknas det som bugg då det inte påverkat programmet?

Angående indentering, jag sökte på det och Arduino IDE just och det verkar vara många som vill ändra autoformateringen så att det ska passa deras tycke och smak.
Det finns ju alltså ett antal olika standarder men man ska väl använda rätt format för rätt kod och då jag fått fram att Arduino är antingen C eller C++ i grunden verkar "K&R style" vara den vanligaste formaterings stilen.
Det passar mig bra då det även är den vanliga för Java som jag hållit på mer med.

Jag hittade formatter.conf filen man kan editera så jag ska kika lite på de idag tänkte jag, samtidigt som jag läser på och gör rätt även utan autoformateringen.

formatter.conf (no edit)

Kod: Markera allt

# This configuration file contains a selection of the available options provided by the formatting tool "Artistic Style"
# http://astyle.sourceforge.net/astyle.html
#
# If you wish to change them, don't edit this file.
# Instead, copy it in the same folder of file "preferences.txt" and modify the copy. This way, you won't lose your custom formatter settings when upgrading the IDE
# If you don't know where file preferences.txt is stored, open the IDE, File -> Preferences and you'll find a link

mode=c

# 2 spaces indentation
indent=spaces=2

# also indent macros
indent-preprocessor

# indent classes, switches (and cases), comments starting at column 1
indent-classes
indent-switches
indent-cases
indent-col1-comments

# put a space around operators
pad-oper

# put a space after if/for/while
pad-header

# if you like one-liners, keep them
keep-one-line-statements

remove-comment-prefix
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av mankan »

Du är på fel ifsatser, "if (s1angle = s1maxAngle)" gör inte det du vill.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av Icecap »

Jag ser en del problem med programmet.
1: När en växling kör stoppas pulsande direkt att pulsen för ändläge har givits. Den bör skickas ett antal gångar (t.ex. 10) mer efter detta för att säkerställa att servon är i mål.

2: Stegningen av positionen sker utan någon kontroll av om stegna totalt över eller understiger slutmålet. Alltså om position += steg överstiger slutpositionen justeras detta inte. Det KAN vara så att stegen passar precis - men det är dålig stil att inte säkra att det inte kan skita sig.

3: Vad händer om en knapp lämnas i nertryckt läge?

4: Delay på 50ms är teknisk OK men den kommer enbart när det finns en ändring som ska köras. Den bör vara där konstant så att loopen kör nära nog samma hastighet alltid. Men det kan influera på avkänningen av knapptryckningar (bör avkännas 10gg/sekund iaf.) så ett grunsläggande omtänk kan behövas.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av mankan »

Indentering, andra omgången kod ser bra ut. Det var inte meningen att du skulle grotta ned dig i formatteringen. Där finns det lika många åsikter som programmerare, minst.

Nr 2 som Icecap nämner är den andra buggen jag tänkte på (och tredje som jag hittat sen senast). Ledning, det är jämförelse du vill göra, inte tilldelning. Samt borde inte s{1,2}minAngle vara med i uttrycken också?
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av Icecap »

Just det: if(a = b) {} tilldelar a med b's värde och ger alltid sann om a är icke-noll.
If(a == b){} jämför de två data.
Användarvisningsbild
teljemo
Inlägg: 1622
Blev medlem: 5 februari 2011, 12:08:13
Ort: Getinge
Kontakt:

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av teljemo »

Jag satt och funderade på säkerheten faktiskt men testade att hålla emot en servo en aning för att se om den märker det..
Jag visar ju vinkeln i terminalen och även fast jag håll emot motorn så sa programmet att den nått till 87° (som är de värdet den hamnar på).
Tänkte då att det är "good enaugh" för syftet..

Jag ser inte felen i if loopen??

Jag vara annars inne på att gör en "for loop" till rörelsen men vet inte om det är bättre?
Det skulle isåfall ersätta alla "angle" variabler.. Det skulle kanske bli mera som pulsar som Icecap nämnde?

Kod: Markera allt

  for (int i = 7 ; i <= 87 ; i++)
  {
    s1.write (i) ;
  }
Om man håller en knapp nedtryckt länge kör loopen om och om igen.. Det vill jag såklart inte.. Det borde väl inte vara så eftersom att i första raden i void loop kollar av så att knappen är LOW?
Borde inte en nedtryckt knapp göra att digitalRead visar HIGH och inte kör den loopen?

Delay.. Jag använde det mest som ett verktyg för att trimma hastigheten.. Med delay på 1000 rör sig ju motorn 1 steg i sekunden. Vad rekommenderas?

Jag vill passa på att påminna om att jag är novis i den här typen av programmering. Jag är glad att det fungerar så pass så att motorerna rör sig och nu har jag även monterat LED's som visar öppen eller stängd.
Jag är samtidigt super intresserad av er feedback och tacksam för all hjälp! Dock har jag dålig kolla på stegning och pulser och om det är någon speciell metod man egentligen bör använda i den här typen av applikation?..


Senaste revisionen av programmet: (bara lagt till LED och putsat lite. Servo motorerna går och dioderna lyser där dom ska.. Bara resten kvar :shock: )

Kod: Markera allt

/*
  Program made by Emanuel Teljemo in 2020.

  The purpose of the program is to control 2 servo motors that are installed in a ventilation system.
  The servos turn airvalves on and off to focus the air flow from the chosen path.

  TO DO LIST:
  Shut down servos after 5 sec as a saftey measure against overheating
  Add a function to control a relay based on both servos angle state
  Add LED's to indicate open or closed valve


  WARNING!
  When this code was made I was experimenting so USE AT OWN RISK!


*/
// Setting up servo's
#include <Servo.h>  // Includes a servo file that is already installed with Arduino IDE
Servo s1, s2;  // Creates servo object's

// Defines pins on the arduino board
#define s1Pin 3  // Signal from servo 1
#define s2Pin 5  // Signal from servo 2
#define b1Pin 2 // Signal from pushbutton1
#define b2Pin 4 // Signal from pushbutton2

#define s1LedOpen 8
#define s1LedClosed 9
#define s2LedOpen 10
#define s2LedClosed 11

// Defines variables for servo 1
int s1angle = 7;  // Initial angle for servo 1
int s1speed = 10; // Speed for servo 1 movement
const int s1minAngle = 7;  // Angle of servo 1 arm when vent is closed
const int s1maxAngle = 87; // Angle of servo 1 arm when vent is open

// Defines variables for servo 2
int s2angle = 7;  // Initial angle for servo 2
int s2speed = 10; // Speed for servo 2 movement
const int s2minAngle = 7;  // Angle of servo 2 arm when vent is closed
const int s2maxAngle = 87; // Angle of servo 2 arm when vent is open

// Creates variables for buttons
int b1Pushed = 0;  // Button variable set to 0 before setup
int b2Pushed = 0;  // Button variable set to 0 before setup


// Setup
void setup() {
  // Connections
  Serial.begin(9600); // Serial need to match buad rate. See buad rate in serial monitor

  //Attaching/activating servos
  s1.attach(s1Pin); // Attaches servo 1 on pin 3
  s2.attach(s2Pin); // Attaches servo 2 on pin 5

  // Pinout for LED's
  pinMode(s1LedOpen, OUTPUT);
  pinMode(s1LedClosed, OUTPUT);
  pinMode(s2LedOpen, OUTPUT);
  pinMode(s2LedClosed, OUTPUT);

  Serial.println("*Teljemo's servo controller initiated*"); // Print text in serial monitor

  // Initial movement
  s1.write(s1angle); // Set the initial position for servo 1
  s2.write(s2angle); // Set the initial position for servo 2

  // Print for serial monitor
  Serial.println("Starting angles are: "); // Print text in serial monitor
  Serial.print(s1angle); // Prints angle of servo 1
  Serial.println(" degrees for servo 1"); // Print text in serial monitor
  Serial.print(s2angle); // Prints angle of servo 2
  Serial.println(" degrees for servo 2"); // Print text in serial monitor
  Serial.println("***********************************"); // Print text in serial monitor
}
// End of setup

// Loop
void loop() {
  // Button 1
  if (digitalRead(b1Pin) == LOW) { // Checks if button 1 is pushed down
    b1Pushed = 1; //  Set value to 1 if above is true
  }
  if (b1Pushed) { // Asks if button 1 is pushed
    s1angle = s1angle + s1speed;  // Changes the value of the 1st angle variable

    if (s1angle <= s1minAngle || s1angle >= s1maxAngle) { // Checks where the 1st servomotor's angle is to drive it the opposite direction
      s1speed = -s1speed;
      b1Pushed = 0; // Tells the program that the 1st button is no longer pushed
    }
    s1.write(s1angle); // Moving the 1st servo to the defined value of s1angle

    Serial.print("Moved servo 1: "); //  Print text in serial monitor
    Serial.print(s1angle);   // Prints angle of servo 1
    Serial.println(" degrees"); //  Print text in serial monitor

    delay(1); // Creates a delay to wait for servo 1 to get in place before looping on
  }

  // Button 2
  if (digitalRead(b2Pin) == LOW) { // Checks if button 2 is pushed down
    b2Pushed = 1; //  Set value to 1 if above is true
  }
  if (b2Pushed) { // Asks if button 2 is true
    s2angle = s2angle + s2speed;  // Changes the value of the angle variable

    if (s2angle <= s2minAngle || s2angle >= s2maxAngle) { // Checks where the 2nd servomotor's angle is to drive it the opposite direction
      s2speed = -s2speed;
      b2Pushed = 0; // Tells the program that the 2nd button os no longer pushed
    }
    s2.write(s2angle); // Moving the 2nd servo to the defined value of angle

    Serial.print("Moved servo 2: "); // Print text in serial monitor
    Serial.print(s2angle);   // Prints angle of servo 2
    Serial.println(" degrees"); // Print text in serial monitor

    delay(1); // Creates a delay to wait for servo 2 to get in place before looping on
  }

  // LED check
  //Servo 1 LED's
  if (s1angle >= 80) {
    digitalWrite(s1LedClosed, LOW);
    digitalWrite(s1LedOpen, HIGH);
  }
  if (s1angle <= 10) {
    digitalWrite(s1LedOpen, LOW);
    digitalWrite(s1LedClosed, HIGH);
  }

// Servo 2 LED's
  if (s2angle >= 80) {
    digitalWrite(s2LedClosed, LOW);
    digitalWrite(s2LedOpen, HIGH);
  }
  if (s2angle <= 10) {
    digitalWrite(s2LedOpen, LOW);
    digitalWrite(s2LedClosed, HIGH);
  }

  //End of loop
}
//  End of program
Ny video när programmet ovan körs

:D
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av Icecap »

Felet i if()-satsen är:
if(A = B) {} TILLDELAS A värdet som B har(kopierar värdet i B till A). Du jämför sedan bara med B kontra noll: om B är icke-noll är resultatet SANT, annars FALSK.

if(A == B) {} jämförs A mot B och den utförs om de är lika.

Skillnaden är '=' kontra '=='.
Och nej, den har jag ju ALDRIG klantat mig med... :vissla: :wall: :doh:

Din knapp-koll gör ju delvist rätt:
Du har en mellan-variabel som aktiveras när knappen aktiveras. Den fortsätter vara aktiv till sekvensen är genomförd. Den bit är helt rätt.
Men du har bara 2 stadier! Passiv och Aktiv.

Vad om den har 3 stadier?
0: Passiv, trycker du på en knapp sätts den till Aktiv. Är den INTE Passiv kan en knapptryckning inte göra en skit.
1: Aktiv, do the shit! Och när den är klar sätts den till Done.
2: Done. Här SKA knappen släppas/vara släppt, är det så återställs den till Passiv.

Det kan vara så enkelt som:

Kod: Markera allt

if(Button_Pressed)
  {
  if(!Activity) Activity = 1; // Set to start sequence
  }
else if(Activity == 2) Activity = 0;
Alltså kan den bara starta aktiviteten om sekvensen är inaktiv och den kan bara ta en NY knapptryckning om knappen är släppt EFTER att sekvensen är stoppat.
pfyra
Inlägg: 345
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Lustigt fel på Arduino-krets (Video och kod included)

Inlägg av pfyra »

Jag hittar inga = i ifsatserna (och faktiskt inte ens if-satsen som man kan pekade ut) i nån av kodsnuttarna. Läser jag illa eller spökar kodningen av < och > för er och tar bort delar av koden :humm:?
Skriv svar