-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Probleme mit einfacher Tasterschaltung

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    126

    Probleme mit einfacher Tasterschaltung

    Anzeige

    Hallo,
    mal wieder komme ich nicht weiter.
    Ein kleiner 4 Kanal Fernsteuer Roboter. 1 DC Motor. L293D, proMini, 9Volt Block, Festspannungsregler 5 Volt und ein Servo.
    Die 4 Emfängerkanäle liefern HIGH und sind mit 10K auf GND.
    Vor, Rück, Links, Rechts
    Mit diesem Sketch geht es noch nicht. Es geht nur eine Funktion zur Zeit. Aber z.B. Vor und Links oder Rechts zugleich geht nicht.
    Was kann ich machen um das zu erreichen?

    Code:
    const int ledPin_1    = 8;
    const int ledPin    = 13;
    const int Pin = 6; // Taster
    const int Pin_1 = 7; // Taster
    
    void setup()
    {
      pinMode(6, INPUT);//Taster
      pinMode(7, INPUT);//Taster
      pinMode(13, OUTPUT);//LED
      pinMode(8, OUTPUT);//LED
    }
    
    void loop()
    {
      int pulsador = digitalRead(6);//Taster A
      while (pulsador == 1)//while the button is pressed
      {
        digitalWrite(13, HIGH);
        delay(10);
        digitalWrite(13, LOW);
    
        pulsador = digitalRead(6); //refresh value of variable
      }
    
    
    
      {
        int pulsador_1 = digitalRead(7);//Taster B
        while (pulsador_1 == 1)//while the button is pressed
        {
          digitalWrite(8, HIGH);
          delay(10);
          digitalWrite(8, LOW);
    
          pulsador_1 = digitalRead(7); //refresh value of variable
        }
      }
    }
    Gerne würde ich einen Tipp bekommen
    Achim

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.979
    Blog-Einträge
    15
    Hallo,

    kann auch nicht funktionieren, mit dem gleichzeitigen Drücken:

    Code:
      while (pulsador == 1)//while the button is pressed
      {
        digitalWrite(13, HIGH);
        delay(10);
        digitalWrite(13, LOW);
    
        pulsador = digitalRead(6); //refresh value of variable
      }
    Wenn Du einen Button drückst und in der Schleife so lange wartest, bis der nicht mehr gedrückt ist, wie fragst Du dann in der Zeit ab, ob ein anderer Button gedrückt ist?

    Dann musst Du zuerst immer alle Button-Zustände einlesen und dann entsprechend darauf reagieren, mit Verzweigungen, wie switch.


    MfG

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    126
    Danke,
    ja klar, ist logisch.
    Aber ich weiß vorher doch garnicht welcher Taster gedrückt wird. Switch sagt mir nur Schalter?
    Ich überlege gerade lieber die Prominis wieder auszulöten und duch 2 Attiny zu ersetzen. Dann wäre das Problem weg.
    Weihnachten ist immer so Öde. Das muß ich jedesmal Auflockern. Deshalb habe ich 6 von diesen dösigen Teilen schon montiert.
    Nun habe ich schon ca. 80 Std mit dem Sketch zugebracht. Fast schon deprimert aufgegeben.
    Ärgerlicherweise wird die Zeit knapp.
    Für Heute ist erstmal Schluß.
    Dankeschön
    Achim

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.082
    Ich würde das auch so machen wie Moppi das vorschlägt.
    Also den kompletten Port an dem die Taster hängen einlesen und dann alle sinnvollen Zustände mit Switch Befehlen abarbeiten.
    Dabei muss natürlich auch die Rückschaltung auf die Neutrallagen, also Geradeaus und Stopp berücksichtigt werden.
    Ich mach in C da immer Zuweisungen wie z.B.
    #define rechts 0b00000001
    #define links 0b00000010
    #define gerade 0b00000000
    #define vorwärts 0b00000100
    ...
    Die kann man dann mit dem aktuellen Zustand der Tasten UND verknüpfen und die entsprechende Reaktion auslösen.
    Nicht sinnvolle Eingaben wie z.B. Links und Rechts gleichzeitig, oder Vor und Zurück gleichzeitig müssen natürlich geblockt werden.
    Diese Switch sequenz kann dann in einer Endlosschleife durchlaufen werden.
    Da die Befehle anscheinend direkt umgesetzt werden kann man eventuell auch auf eine Entprellung der Tasten verzichten.

    Switch sagt mir nur Schalter?
    switch ist auch ein C - Befehl.
    Damit kann innerhalb der Anweisung abhängig von einer Variable ein anderer Programmteil ausgeführt werden

    switch(richtung){
    case 1:
    tu was;
    break;

    case 2:
    tu was anderes;
    break;

    case 3:
    tu was ganz andres;
    break;

    default:
    wenn gar nichts passt;
    }
    Abhängig von der Variable richtung wird case 1,2, oder 3 ausgeführt.
    Wenn keine der Bedingungen zutrifft wird default ausgeführt.
    Ich denka mal das Moppi das meinte.
    Geändert von wkrug (17.12.2019 um 20:11 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.979
    Blog-Einträge
    15
    Zitat Zitat von achso Beitrag anzeigen
    Switch sagt mir nur Schalter?
    wkrug hat es richtig erklärt, was ich meinte. Entschuldige! Bin nicht davon ausgegangen, dass Du switch nicht kennst. Kenne Deinen Kenntnisstand noch nicht.

    Zitat Zitat von achso Beitrag anzeigen
    Danke,
    Nun habe ich schon ca. 80 Std mit dem Sketch zugebracht. Fast schon deprimert aufgegeben.
    Ärgerlicherweise wird die Zeit knapp.
    Dein Problem ist nicht so schwer zu lösen. Der Code, den Du hier gezeigt hast, ist das alles? Also alles zu den Tastern oder hast Du noch mehr Code zu den Tastern?
    Wenn, dann stell den mal vollständig hier rein, vielleicht kann man ihn direkt verändern, dass er so funktioniert, wie Du denkst. Dann sparst Du Zeit.

    Weihnachten rückt immer näher. Und merkwürdiger Weise geht das jetzt von Tag zu Tag auch immer schneller.

    MfG


    PS: Ein Beispiel, wie man eine Tastenabfrage und die Reaktion darauf auch umsetzen kann.
    Es gibt, je nach Anforderung, immer mehrere Lösungen oder eine Lösung, die besser geeignet ist.
    Deshalb ist das in erster Linie nur ein Denkanstoß.

    Code:
    //Pin-Zuordnungen
    #define Taster1 11
    #define Taster2 12
    #define Taster3 13
    
    
    void setup()
    {
      //Eingänge für Taster konfigurieren
      pinMode(Taster1, INPUT_PULLUP);  
      pinMode(Taster2, INPUT_PULLUP);  
      pinMode(Taster3, INPUT_PULLUP);  
    }
    
    
    //Status-Variable ist ein Byte, also 8 Bit
    byte Status; 
    
    
    
    
    void loop()
    {
    
    
      //Taster Zustände abfragen, bei INPUT_PULLUP ist Taster geschlossen, wenn der Eingang = LOW ist
      Status = 0;
      if(!digitalRead(Taster1))Status += 1;  //Bit#0 für Taster1 setzen
      if(!digitalRead(Taster2))Status += 2;  //Bit#1 für Taster2 setzen
      if(!digitalRead(Taster3))Status += 4;  //Bit#2 für Taster3 setzen
      //Status hat jetzt alle Zustände der Taster gespeichert.
      //Ist ein Taster geschlossen, dann ist das zugehörige Bit in "Status" = 1, sonst 0
       
    
    
      //Hier die Auswertung
      switch (Status)
      {
        case 1:
            //Wenn 1, dann ist Taster1 geschlossen und alle anderen offen
            break;
        case 2:
            //Wenn 2, dann ist Taster2 geschlossen und alle anderen offen
            break;
        case 4:
            //Wenn 4, dann ist Taster3 geschlossen und alle anderen offen
            break;
        case 3:
            //Wenn 3, dann ist Taster1 und Taster2 geschlossen und alle anderen offen
            break;
        case 5:
            //Wenn 5, dann ist Taster1 und Taster3 geschlossen und alle anderen offen
            break;
        case 7:
            //Wenn 7, dann ist Taster1 und Taster2 und Taster3 geschlossen
            break;
        case 6:
            //Wenn 6, dann ist Taster2 und Taster3 geschlossen und alle anderen offen
            break;
    
    
        default:
            //Wenn kein Zustand von oben zutreffend ist, dann wird der Code ausgeführt, der hier steht
      }
    
    
    }
    Geändert von Moppi (18.12.2019 um 19:20 Uhr) Grund: Fehler im Code korrigiert

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    126
    Super,
    dankeschön!
    Im Januar hatte ich mit dem Bauen begonnen. Nun kam mir das ganze Jahr was dazwischen. Leider stelle ich mich mit dem Lernen immer so kompliziert an.
    Die Hindernis IR Module baue ich wieder raus. Die Einfache Version reicht.
    Einen Sketch hatte ich natürlich schon fertig. Da ging aber gar nichts. Das ist das Erste Mal, das weder delay, noch Millis gingen.
    Heute Abend probiere ich weiter.
    Fast hätte ich mich schon aus der Situation gezogen und mit je 2 ATTiny das Problem locker umschifft.
    Aber die Prominis auslöten ist wenig spaßig.

    Immerhin 6 Stück davon.


    Klicke auf die Grafik für eine größere Ansicht

Name:	Weihn.jpg
Hits:	9
Größe:	58,8 KB
ID:	34566

    Nochmals Danke.
    Wenigstens nur noch 3 Tage bis zur Sonnenwende!
    Dann gehts Bergauf
    Achim

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    51
    Beiträge
    1.666
    Tip zu denen: ich löt denen meistens die mitgelieferten Steckleisten ein.
    Wenn ich das Ganze dann irgendwo einbauen will, kommen dort-passend dazu- Buchsenleisten auf Lochrasterplatine.
    Schon kann man die Dinger einfach runter nehmen, wie IC's mit Fassungen.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    126
    Danke für die nette Info!

    Mit dem switch!
    Woher weiß der code dieses?
    case '3':
    //Wenn 3, dann ist Taster1 und Taster2 geschlossen und alle anderen offen
    Wie ändert man das?
    Wie mache ich weiter?
    Beziehe ich mich dann auf z.B.
    case`3`:

    Hier mal der Stromlaufplan in reduzierter Zeichnung:

    Klicke auf die Grafik für eine größere Ansicht

Name:	Weihnachtsquatsch.jpg
Hits:	2
Größe:	39,3 KB
ID:	34571

    So hatte ich es naiv zuerst versucht. Irgendwann gemerkt, das 12 kein PWM kann. Die IR Sache baue ich aus.
    Eigentlich war das gar nicht so schlecht. Nur das der Promini nicht auf die `Drückzeit` der Tasten reagiert hat.

    Code:
    #include <Servo.h>
    Servo myservo;  // create servo object to control a servo
    
    const int L = 2; // Links Fern
    const int R = 3; // Rechts Fern
    const int Vor = 4; // Vor Fern
    const int Rueck = 5; // Rückwärts Fern
    const int IRL = 6; //Hinderniss Rechts
    const int IRR = 7; // Hinderniss Links
    const int FERNON = 13; //Fernsteuerung Spannung
    int PWM = 10; // PWM Motor
    const int Motor_1 = 11; //Motor vor rück
    const int Motor_2 = 12; //Motor vor rück
    int val = 0;
    
    void setup() {
      myservo.attach(9);  // Servo auf DigitalPin 9
      pinMode(2, INPUT);
      pinMode(3, INPUT);
      pinMode(4, INPUT);
      pinMode(5, INPUT);
      pinMode(6, INPUT);
      pinMode(7, INPUT);
      pinMode(10, OUTPUT); //PWM
      pinMode(11, OUTPUT);
      pinMode(12, OUTPUT);
      pinMode(13, OUTPUT);
    }
    void loop() {
      int val = 0;
    
      val = digitalRead(IRL); //Ir Links lesen
      if (digitalRead(IRL) == HIGH)
      {
        digitalWrite(FERNON, LOW);
        analogWrite(PWM, 170);
        myservo.write(60);
        digitalWrite(Motor_1, LOW);
        digitalWrite(Motor_2, HIGH);
        delay(2000);
      }
      else
      {
        digitalWrite(FERNON, HIGH);
        digitalWrite(PWM, LOW);
        myservo.write(90);
        digitalWrite(Motor_1, LOW);
        digitalWrite(Motor_2, LOW);
      }
      {
        val = digitalRead(IRR); //Ir Rechts lesen
        if (digitalRead(IRR) == HIGH)
        {
          digitalWrite(FERNON, LOW);
          analogWrite(PWM, 170);
          myservo.write(120);
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, HIGH);
          delay(2000);
        }
        else
        {
          digitalWrite(FERNON, HIGH);
          digitalWrite(PWM, LOW);
          myservo.write(90);
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, LOW);
          delay(50);//Pause, damit das Servo drehen kann
        }
        val = digitalRead(2); //Links Fernsteuerung
        if (digitalRead(2) == HIGH)
        {
          myservo.write(60);
          delay(50);//Pause, damit das Servo drehen kann
        }
        else
        {
          myservo.write(90);
          delay(50);//Pause, damit das Servo drehen kann
        }
        {
          val = digitalRead(3); //Rechts Fernsteuerung
          if (digitalRead(3) == HIGH)
          {
            myservo.write(120);
            delay(50);//Pause, damit das Servo drehen kann
          }
          else
          { 
            myservo.write(90);
          }
            delay(50);//Pause, damit das Servo drehen kann
          }
          {
            val = digitalRead(4);//Fernsteuerung vor
            if (digitalRead(4)==HIGH)
            {
              analogWrite(PWM, 170);
          digitalWrite(Motor_1, HIGH);
          digitalWrite(Motor_2, LOW);
            }
            else
            {
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, LOW);
            }
               {
            val = digitalRead(5);//Fernsteuerung vor
            if (digitalRead(5)==HIGH)
            {
              analogWrite(PWM, 170);
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, HIGH);
            }
            else
            {
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, LOW);
            }
            
            }
          }
        }}
    Geändert von radbruch (18.12.2019 um 21:57 Uhr)

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.979
    Blog-Einträge
    15
    Woher weiß der Code das?

    switch (nummer)
    {
    case 3:

    default:

    }

    die Nummer, angegeben bei switch in Klammern, ist die Variable, auf die sich das bezieht.

    case 3: bedeutet, dass switch in einem Fall die Variable auf den Wert 3 prüft. Wenn das erfolgreich war, wird der Code ausgeführt, der nach case 3: steht. Und zwar bis zu einem break. Wenn kein break steht, mach switch mit der nächsten Fallprüfung (case) weiter.

    Verstehe jetzt nur nicht, wie Du nichts weißt, wie Du da den Wert ändern sollst.

    Die 3 bei case 3 ergibt sich aus 1 + 2. Die 1 steht für Bit#0 der Variablen, die 2 steht für Bit#1 der Variablen, die 4 steht für Bit#2 der Variablen, die 8 steht für Bit#3 der Variablen usw.
    Warum? Weil:

    01 Dezimal = 00001 Binär
    02 Dezimal = 00010 Binär
    04 Dezimal = 00100 Binär
    08 Dezimal = 01000 Binär
    16 Dezimal = 10000 Binär
    usw.

    Vorteil der Variante: Du kannst mit einer Zahl mehrere Taster abfragen, also Tastenkombinationen.

    Wenn alle 5 Taster gedrückt wären, ergäbe sich hier: 1+2+4+8+16 = 31
    Der Wert '31' stünde also dafür, dass alle Taster gedrückt wären.

    Wenn Taster 3 und 5 gedrückt wären, dann ergäbe sich: 4+16 = 20
    etc.



    MfG
    Geändert von Moppi (18.12.2019 um 19:19 Uhr)

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.082
    Ich weiss jetzt nicht wie die Arduino IDE das handelt, aber '3' bedeutet in C das der Character 3, also die ASCII Ziffer 3 erwartet wird, das ist dann der dezimale Wert 51.

    Ich würde wie oben schon geschrieben 2 Switch abfragen einbauen.
    Die erste für die Richtung, die zweite für vor / zurück und Stopp.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Fehleranalyse PWM-Tasterschaltung
    Von hansesel im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 09.01.2014, 13:51
  2. Probleme mit Tasterschaltung
    Von Tuxist im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 13.05.2012, 06:48
  3. Probleme mit einfacher Linenverfolgung!
    Von RuKi000 im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 17.04.2009, 20:47
  4. einfacher Getränkemixer
    Von Feli im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 9
    Letzter Beitrag: 23.03.2008, 20:54
  5. Einfacher Pegelwandler
    Von Coalminer im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 22.11.2004, 06:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •