INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Servo im Programm über einen Taster betätigen
08.12.2020, 09:20 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2020 11:23 von CB2311.)
Beitrag #1
Servo im Programm über einen Taster betätigen
Guten Morgen zusammen.
Ich bräuchte mal euer Wissen .
Bin absoluter Anfänger und beiße mir gerade die Zähne aus .
Ich habe einen fertigen Sketch in dem ein Servo nach einer Spiel Reihenfolge kurz angesteuert wird .
Ich möchte den Servo aber separat noch über einen Taster oder reedkontakt ansteuern können.
Vielleicht könnt ihr mir helfen


Code:
#include <Servo.h>

/*************************************************
* Public Constants
*************************************************/

// NOTE FREQUENCIES
#define    C3    130.81
#define    Db3    138.59
#define    D3    146.83
#define    Eb3    155.56
#define    E3    164.81
#define    F3    174.61
#define    Gb3    185.00
#define    G3    196.00
#define    Ab3    207.65
#define    LA3    220.00
#define    Bb3    233.08
#define    B3    246.94
#define    C4    261.63
#define    Db4    277.18
#define    D4    293.66
#define    Eb4    311.13
#define    E4    329.63
#define    F4    349.23
#define    Gb4    369.99
#define    G4    392.00
#define    Ab4    415.30
#define    LA4    440.00
#define    Bb4    466.16
#define    B4    493.88
#define    C5    523.25
#define    Db5    554.37
#define    D5    587.33
#define    Eb5    622.25
#define    E5    659.26
#define    F5    698.46
#define    Gb5    739.99
#define    G5    783.99
#define    Ab5    830.61
#define    LA5    880.00
#define    Bb5    932.33
#define    B5    987.77

// DURATION OF THE NOTES
#define BPM 240     //you can change this value changing all the others
#define Q 60000/BPM //quarter 1/4
#define H 2*Q       //half 2/4
#define T 3*Q       //three quarter 3/4
#define E Q/2       //eighth 1/8
#define S Q/4       // sixteenth 1/16
#define W 4*Q       // whole 4/4

// CHECKS FOR BUTTON AND LIGHT POSITIONS
#define CHOICE_OFF    0 //Used to control LEDs
#define CHOICE_NONE   0 //Used to check buttons
#define CHOICE_RED    (1 << 0)
#define CHOICE_GREEN  (1 << 1)
#define CHOICE_BLUE   (1 << 2)
#define CHOICE_YELLOW (1 << 3)

// DEFINE PIN LOCATIONS
#define LED_RED       8
#define LED_GREEN     10
#define LED_BLUE      12
#define LED_YELLOW    6
#define BUTTON_RED    7
#define BUTTON_GREEN  9
#define BUTTON_BLUE   11
#define BUTTON_YELLOW 5
#define BUZZER        4
#define SERVOPIN      13

// GAME PARAMETERS
#define ENTRY_TIME_LIMIT 3000 //Amount of time to press a button before game times out. 3000 ms = 3 sec
int ROUNDS_TO_WIN = 10; //Number of rounds to succeasfully remember before you win.

// GAME STATE
byte gameBoard[32]; //Contains the combination of buttons as we advance
byte gameRound = 0; //Counts the number of succesful rounds the player has made it through

Servo servo;
int pos = 0;

void setup() // Run once when power is connected
{    
  servo.attach(SERVOPIN);
  servo.write(0); // Degree position

  pinMode(BUTTON_RED, INPUT_PULLUP);
  pinMode(BUTTON_GREEN, INPUT_PULLUP);
  pinMode(BUTTON_BLUE, INPUT_PULLUP);
  pinMode(BUTTON_YELLOW, INPUT_PULLUP);

  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
}


void loop()
{
  attractMode(); // Blink lights while waiting for user to press a button

  // Indicate the start of game play
  setLEDs(CHOICE_RED | CHOICE_GREEN | CHOICE_BLUE | CHOICE_YELLOW); // Turn all LEDs on
  delay(1000);
  setLEDs(CHOICE_OFF); // Turn off LEDs
  delay(250);

  // Play memory game and handle result
  if (play_memory() == true)
    play_winner(); // Player won, play winner tones
  else
    play_loser(); // Player lost, play loser tones

}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//THE FOLLOWING FUNCTIONS CONTROL GAME PLAY

// Play the memory game
// Returns 0 if player loses, or 1 if player wins
boolean play_memory(void)
{
  randomSeed(millis()); // Seed the random generator with random amount of millis()
  gameRound = 0; // Reset the game to the beginning

  while (gameRound < ROUNDS_TO_WIN)
  {
    add_to_moves(); // Add a button to the current moves, then play them back
    playMoves(); // Play back the current game board

    // Then require the player to repeat the sequence.
    for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++)
    {
      byte choice = wait_for_button(); // See what button the user presses
      if (choice == 0) return false; // If wait timed out, player loses
      if (choice != gameBoard[currentMove]) return false; // If the choice is incorect, player loses
    }

    delay(1000); // Player was correct, delay before playing moves
  }

  return true; // Player made it through all the rounds to win!
}


// Plays the current contents of the game moves
void playMoves(void)
{
  for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++)
  {
    toner(gameBoard[currentMove]);

    // Wait some amount of time between button playback
    // Shorten this to make game harder
    delay(150); // 150 works well. 75 gets fast.
  }
}

// Adds a new random button to the game sequence, by sampling the timer
void add_to_moves(void)
{
  byte newButton = random(0, 4); //min (included), max (exluded)

  // We have to convert this number, 0 to 3, to CHOICEs
  if(newButton == 0)      newButton = CHOICE_RED;
  else if(newButton == 1) newButton = CHOICE_GREEN;
  else if(newButton == 2) newButton = CHOICE_BLUE;
  else if(newButton == 3) newButton = CHOICE_YELLOW;

  gameBoard[gameRound++] = newButton; // Add this new button to the game array
}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//THE FOLLOWING FUNCTIONS CONTROL THE HARDWARE

// Lights a given LEDs
// Pass in a byte that is made up from CHOICE_RED, CHOICE_YELLOW, etc
void setLEDs(byte leds)
{
  if ((leds & CHOICE_RED) != 0)
    digitalWrite(LED_RED, HIGH);
  else
    digitalWrite(LED_RED, LOW);

  if ((leds & CHOICE_GREEN) != 0)
    digitalWrite(LED_GREEN, HIGH);
  else
    digitalWrite(LED_GREEN, LOW);

  if ((leds & CHOICE_BLUE) != 0)
    digitalWrite(LED_BLUE, HIGH);
  else
    digitalWrite(LED_BLUE, LOW);

  if ((leds & CHOICE_YELLOW) != 0)
    digitalWrite(LED_YELLOW, HIGH);
  else
    digitalWrite(LED_YELLOW, LOW);
}

// Wait for a button to be pressed.
// Returns one of LED colors (LED_RED, etc.) if successful, 0 if timed out
byte wait_for_button(void)
{
  long startTime = millis(); // Remember the time we started the this loop

  while ( (millis() - startTime) < ENTRY_TIME_LIMIT) // Loop until too much time has passed
  {
    byte button = checkButton();

    if (button != CHOICE_NONE)
    {
      toner(button); // Play the button the user just pressed
      while(checkButton() != CHOICE_NONE) ;  // Now let's wait for user to release button
      delay(10); // This helps with debouncing and accidental double taps
      return button;
    }

  }
  return CHOICE_NONE; // If we get here, we've timed out!
}

// Returns a '1' bit in the position corresponding to CHOICE_RED, CHOICE_GREEN, etc.
byte checkButton(void)
{
  if (digitalRead(BUTTON_RED) == 0) return(CHOICE_RED);
  else if (digitalRead(BUTTON_GREEN) == 0) return(CHOICE_GREEN);
  else if (digitalRead(BUTTON_BLUE) == 0) return(CHOICE_BLUE);
  else if (digitalRead(BUTTON_YELLOW) == 0) return(CHOICE_YELLOW);

  return(CHOICE_NONE); // If no button is pressed, return none
}

// Light an LED and play tone
// Red, upper left:     440Hz - A4
// Green, upper right:  880Hz - A5
// Blue, lower left:    587.33Hz - D5
// Yellow, lower right: 784Hz - G5
void toner(byte which)
{
  setLEDs(which); //Turn on a given LED

  //Play the sound associated with the given LED
  switch(which)
  {
  case CHOICE_RED:
    play(LA4, Q);
    break;
  case CHOICE_GREEN:
    play(LA5, Q);
    break;
  case CHOICE_BLUE:
    play(D5, Q);
    break;
  case CHOICE_YELLOW:
    play(G5, Q);
    break;
  }

  setLEDs(CHOICE_OFF); // Turn off all LEDs
}


// Play the winner sound and lights
void play_winner(void)
{  

  winner_sound();
  
  //Move servo 90 degrees to pull on latch
  for(pos = 0; pos < 90; pos += 2)  
  {                                  
    servo.write(pos);              
    delay(10);                      
  }
  
// wait 1/2 second for door to open
  delay(500);                      
  
  // Move servo back to initial position
  for(pos = 90; pos>=1; pos-=2)    
  {                                
    servo.write(pos);            
    delay(10);
  }
  
  attractMode();  
}


// Play the winner sound
// We are the Champions!
void winner_sound(void)
{
  play(F5,  W);
  play(E5,  Q);
  play(F5,  Q);
  play(E5,  Q);
  play(C5,  T);
  play(LA4, Q);
  play(D5,  H);
  play(LA4,  W);
}

// Play the loser sound/lights
void play_loser(void)
{
  setLEDs(CHOICE_RED | CHOICE_GREEN);
  play(B3,Q);

  setLEDs(CHOICE_BLUE | CHOICE_YELLOW);
  play(B3,Q);

  setLEDs(CHOICE_RED | CHOICE_GREEN);
  play(B3,Q);

  setLEDs(CHOICE_BLUE | CHOICE_YELLOW);
  play(B3,Q);
}

// Show an "attract mode" display while waiting for user to press button.
void attractMode(void)
{
  while(1)
  {
    setLEDs(CHOICE_RED);
    delay(100);
    if (checkButton() != CHOICE_NONE) return;

    setLEDs(CHOICE_BLUE);
    delay(100);
    if (checkButton() != CHOICE_NONE) return;

    setLEDs(CHOICE_GREEN);
    delay(100);
    if (checkButton() != CHOICE_NONE) return;

    setLEDs(CHOICE_YELLOW);
    delay(100);
    if (checkButton() != CHOICE_NONE) return;
  }
}




void play(long note, int duration) {
    tone(BUZZER,note,duration);
    delay(1+duration);
}


Angehängte Datei(en)
.ino  SIMON.ino (Größe: 9,31 KB / Downloads: 28)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 09:48
Beitrag #2
RE: Servo im Programm über einen Taster betätigen
Stelle Deinen Sketch bitte in Codetags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Bitte formatiere ihn auch ordentlich (<Strg>+T in der IDE hilft Dir dabei)

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 10:37
Beitrag #3
RE: Servo im Programm über einen Taster betätigen
Und evtl. könntest du dein Problem etwas genauer beschreiben.
Weißt du nicht, wie ein taster abgefragt wird ?
Oder findest du nicht die genaue Position, wo die Abfrage statt finden muss ?

Du könntest es etwas spezifizieren, wenn du deine Versuche uns mitteilst.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 11:32
Beitrag #4
RE: Servo im Programm über einen Taster betätigen
So hab den Sketch jetzt in Codetags gestellt.

Der Sketch ist ein Spiel in dem man verschiedenen Farben nach vorgabe drücken muss.
Wenn das spiel gewonnen ist ( 13 Richtige wiederholungen ) wird ein Winner Sound abgespielt und ein Servo aktiviert .
Dieser Servo öffnet eine kleine klappe.
Ich möchte mit einen Reedkontakt und einen magnetten den Servo ansteuern wie beim gewinnen , möchte für wartungsarbeiten die klappe öffnen können ohne das spiel zu spielen.
Habe schon einiges versucht aber egal wie ich es anstelle fährt der Servo ständig oder er wird garnicht angesteuert.
Einen Taster zu Programmieren bekomme ich schon hin aber ihn so in die vorhandene Programmierung einzufügen das er nur den Servo kurz auf und zu fährt gelingt mir leider nicht .

Gruss Carsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 12:32 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2020 12:33 von Tommy56.)
Beitrag #5
RE: Servo im Programm über einen Taster betätigen
Durch Deine Schleifen und das delay(1000) blockierst Du Dir die Abläufe. Dadurch kann der Taster nicht zu jeder Zeit erkannt werden.
Schau Dir nochmal BlinkWithoutDelay in der IDE ab, wie das richtig funktioniert. Soll der Wartungstaster ein extra Taster sein?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 12:53
Beitrag #6
RE: Servo im Programm über einen Taster betätigen
Bedingt durch die zahlreichen Schleifen im Sketch ist es tatsächlich nicht ganz trivial. Solltest du das nicht ändern können, dann versuche einfach am Anfang der Loop() die Tasterabfrage einzubinden. Dann wenn der Taster gedrückt wird, den Servo entsprechend deinen Vorgaben zu bewegen.
Du solltest allerdings während dieser Aktion verhindern, dass er in der loop weiter läuft, damit nur die Funktion manuelle Servosteuerung aktiv ist.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 17:02
Beitrag #7
RE: Servo im Programm über einen Taster betätigen
Ja es soll ein extra Taster sein .
Ich hatte es am Anfang von Loop schon mal versucht , aber da war es so das halt der Servo durch weg auf und zu gemacht hat .
Und an anderer Stelle hat der Taster überhaupt nicht reagiert.
Schon mal vielen Dank für eure Antworten!
Bin schon seit Tagen am ausprobieren wie ich es hinbekomme .
Aber komme da leider zu keiner Lösung .
Ich schaue mir mal BlinkwhithoutDelay an .
Habe den Sketch leider nicht selber geschrieben
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2020, 17:13 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2020 17:15 von Tommy56.)
Beitrag #8
RE: Servo im Programm über einen Taster betätigen
(08.12.2020 17:02)CB2311 schrieb:  Habe den Sketch leider nicht selber geschrieben
Um einen fremden Code zu ändern, muss man ihn verstanden haben und der Code ist nicht sehr gut verstandlich.

Deshalb würde ich Dir empfehlen, von vorn anzufangen und erst mal die Grundfunktionalitäten zu schreiben und auszutesten.

a) Tastereingabe mit entprellen
b) Servo auf, Servo zu
c) Wartungstaster mit Funktion

Das alles ohne eigene Schleifen! Du hast doch loop.

Wenn Du das hast, fannst Du die Spielfunktionalität hinzu bauen.

Evtl. Kannst Du Dir auch mal die MoBaTools anschauen, die bieten Einiges Deiner Grundfunktionen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Gamepad Programm verstehen Benni84 44 749 Gestern 13:00
Letzter Beitrag: N1d45
Information Hilfe ich bin ein dummy! Arduino 433mhz + servo russruss87 14 340 15.04.2021 07:49
Letzter Beitrag: hotsystems
  Programm startet bei Neustart nicht Moritzzz 18 689 02.04.2021 14:06
Letzter Beitrag: Tommy56
  Arduino Ampelschaltung Taster funktioniert nicht fatihakan36 9 703 13.03.2021 22:06
Letzter Beitrag: N1d45
  Denkanstoß/Hilfestellung für einen Feuerzugregler Peterle 38 3.308 07.03.2021 17:36
Letzter Beitrag: Peterle
  Programm bleibt hängen Tellen 10 1.146 04.03.2021 23:46
Letzter Beitrag: Tellen
  von delay auf millis umgestellt, klappt nur nicht. Servo Geschwindigkeit einstellen. gutschy 8 722 21.02.2021 15:22
Letzter Beitrag: gutschy
  n Bytes über UDP empfangen Igom 5 385 21.02.2021 10:30
Letzter Beitrag: Tommy56
  Drehscheibe mit 270° Servo aldidilein 4 499 20.02.2021 11:20
Letzter Beitrag: aldidilein
  Zähler mit Taster und Serial Monitor LK2567 16 1.195 16.02.2021 22:37
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste