AlphaBot: Joystick einlesen: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „'''Autor:''' Prof. Dr.-Ing. Schneider == Inhalt des siebten Termins == * Wir haben die Servoansteuerung wiederholt. * Wir haben…“)
 
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]


== Inhalt des siebten Termins ==
== Inhalt des 8. Termins ==
* Wir haben die Servoansteuerung wiederholt.
* Wir lese den Joystick ein.
* Wir haben den Ultraschall-Sensor mittig ausgerichtet.
* Wir entprellen die Joystick-Eingabe.
* Wir haben Abstandswerte gemessen.
* Wir geben den Werte im sereiellen Monitor aus.
* Wir sind vorwärts gefahren und haben 20 cm eine Notbremsung gemacht.
 
[[Datei:Notbremse.jpg|right|200px|Abb. 1: Programmablaufplan]]<br/>


== Quelltext ==
== Quelltext ==
<div style="width:1200px; height:300px; overflow:auto; border: 2px solid #088">
<div style="width:1200px; height:300px; overflow:auto; border: 2px solid #088">
<pre>
<pre>
// Bibliotheken einbinden
/* Deklaration der Joystick Ports in Fahrtrichtung */
#include "AlphaBot.h"       
#define    JOYSTICK_RECHTS  A1
#include <Servo.h>
#define    JOYSTICK_UNTEN  A2
#define    JOYSTICK_OBEN    A3
#define    JOYSTICK_EINGABE A4
#define    JOYSTICK_LINKS  A5


// Instanzen erzeugen
boolean JoystickFreigabe_bit = 1; /* Entprellen des Joysticks */
AlphaBot Alf = AlphaBot();               // Instanz des AlphaBot erzeugen
Servo AlfServo;                          // Servo Instanz


// KONSTANTEN deklarieren
void setup(void) /* Einmalig ausgeführt */
const int TRIG = 11;                    // US Trigger an D11
const int ECHO = 12;                    // US Echo an D12
const int nServoPort = 9;                // Der Servo liegt auf D9
 
 
void initUltraschall()
{
{
   pinMode(TRIG, OUTPUT);                 // Ultraschall Trigger als Ausgang deklarieren
  /* Der Joystick wird initialisiert */
   pinMode(ECHO, INPUT);                   // Ultraschall Echo als Eingang deklarieren  
  pinMode(JOYSTICK_OBEN, INPUT);
  digitalWrite(JOYSTICK_OBEN, HIGH);
  pinMode(JOYSTICK_UNTEN, INPUT);
  digitalWrite(JOYSTICK_UNTEN, HIGH);
  pinMode(JOYSTICK_LINKS, INPUT);
  digitalWrite(JOYSTICK_LINKS, HIGH);
   pinMode(JOYSTICK_RECHTS, INPUT);
  digitalWrite(JOYSTICK_RECHTS, HIGH);
   pinMode(JOYSTICK_EINGABE, INPUT);
  digitalWrite(JOYSTICK_EINGABE, HIGH);
  Serial.begin(9600);  // Start des Seriellen Monitors mit 9600 Baude  
}
}


float messeUSAbstand()                   // Abstand in cm
void loop(void) /* Zyklische Abfrage */
{
{
  float fUSAbstand = 0;                  // Rückgabewert initialisieren
/* Abfrage des Joysticks */
   float fSignalLaufzeit=0;               // Messwert der Signallaufzeit         
   delay(1);


   digitalWrite(TRIG, LOW);                // setze Trigger auf LOW für 2μs
   if((digitalRead(JOYSTICK_OBEN) == LOW) || (digitalRead(JOYSTICK_UNTEN) == LOW) || (digitalRead(JOYSTICK_LINKS) == LOW) || (digitalRead(JOYSTICK_RECHTS) == LOW) || (digitalRead(JOYSTICK_EINGABE) == LOW))
   delayMicroseconds(2);
  
  digitalWrite(TRIG, HIGH);               // setze Trigger auf HIGH für mind. 10 us
    if(JoystickFreigabe_bit == true)
  delayMicroseconds(10);
    {
  digitalWrite(TRIG, LOW);                // setze Trigger auf LOW
      delay(10); //10 ms warten - Taster entprellen
  fSignalLaufzeit = pulseIn(ECHO, HIGH);  // Messung der Signallaufzeit des Impulses
      if((digitalRead(JOYSTICK_OBEN) == LOW) || (digitalRead(JOYSTICK_UNTEN) == LOW) || (digitalRead(JOYSTICK_LINKS) == LOW) || (digitalRead(JOYSTICK_RECHTS) == LOW) || (digitalRead(JOYSTICK_EINGABE) == LOW))
 
      {
  fUSAbstand = fSignalLaufzeit/58;       // Umrechnung Laufzeit in s in Abstand in cm           
        JoystickFreigabe_bit = false;
  //Y m =(X s * 344)/ 2;
        if(digitalRead(JOYSTICK_OBEN) == LOW){
  //X s =( 2 * Y m)/ 344;
          Serial.println("Joystick: OBEN gedrückt");
  //X s = 0.0058 * Y m;
        }
  //cm = us /58
        else if(digitalRead(JOYSTICK_UNTEN) == LOW){
  return fUSAbstand;                      // Rückgabewert
          Serial.println("Joystick: UNTEN gedrückt");
}
        }
 
        else if(digitalRead(JOYSTICK_LINKS) == LOW){
void setup()                      // Einmalige Systeminitialisierung
          Serial.println("Joystick: LINKS gedrückt");  
{
        }
  initUltraschall();              // US initialisieren
        else if(digitalRead(JOYSTICK_RECHTS) == LOW){
  AlfServo.attach(nServoPort);    // Servo verbinden
          Serial.println("Joystick: RECHTS gedrückt");
  Serial.begin(9600);             // Serieller Monitor mit 9600 Baud
        }
  AlfServo.write(90);            // Der Servo soll sich an die Mitte drehen
        else if(digitalRead(JOYSTICK_EINGABE) == LOW){
  delay(15);                      // Drehung abwarten
          Serial.println("Joystick: EINGABE gedrückt");
  Alf.MotorRun(80,80);           // Alf fährt vorwärts; Leistung 100
        }
}
      }
 
     }
void loop()                       // Main Schleife
  }
{
  else {
  float USAbstand =0;
    JoystickFreigabe_bit = true; // Taster wieder freigeben
  USAbstand = messeUSAbstand();  // US Abstand messen
   }
  Serial.println(USAbstand);
  if (USAbstand<20){
    Serial.println("Notbremse");
     Alf.Brake();                 // Anhalten
   }  
}
}
</pre>
</pre>
</div>
</div>


== Hausaufgaben bis zum 8. Termin ==
== Hausaufgaben bis zum 9. Termin ==
* Suche mit dem Ultraschall den Bereich 0°-180° vor dem AlphaBot ab.
* Steuert den US-Servo mit dem Joystick im Bereich 0°-180° an.
* Fahre auf das nächstgelegene Ziel im Sichtbereich zu.
* LINKS: Drehung nach Links (180°).
* Stoppe 10&thinsp;cm vor dem Ziel.
* RECHTS: Drehung nach Rechts (0°).
* EINGABE: Grehung auf die Mitte (90°).
 
'''Hinweis:''' Ursprünglich war die Aufgabe die Antriebsmotoren zu steuern. Leider habe ich festgestellt, dass diese dieselben analogen IO-Pins nutzen (A1-A5). Das kann leider nicht zusammen funktionieren.


== Musterlösung ==
== Musterlösung ==
* [[Hausaufgaben7_Tipp_1|Tipp 1]]
* [[Hausaufgaben8_Tipp_1|Tipp 1]]
* [[Hausaufgaben7_Tipp_2|Tipp 2]]
* [[Hausaufgaben8_Tipp_2|Tipp 2]]
* [[Hausaufgaben7_Lösung|Lösung]]
* [[Hausaufgaben8_Lösung|Lösung]]


----
----
→ zurück zum Hauptartikel: [[Projekt_Alf_–_Mobile_Robotik|Projekt Alf]]
→ zurück zum Hauptartikel: [[Projekt_Alf_–_Mobile_Robotik|Projekt Alf]]

Aktuelle Version vom 8. Mai 2022, 08:24 Uhr

Autor: Prof. Dr.-Ing. Schneider

Inhalt des 8. Termins

  • Wir lese den Joystick ein.
  • Wir entprellen die Joystick-Eingabe.
  • Wir geben den Werte im sereiellen Monitor aus.

Quelltext

/* Deklaration der Joystick Ports in Fahrtrichtung */
#define    JOYSTICK_RECHTS  A1
#define    JOYSTICK_UNTEN   A2
#define    JOYSTICK_OBEN    A3
#define    JOYSTICK_EINGABE A4
#define    JOYSTICK_LINKS   A5

boolean JoystickFreigabe_bit = 1; /* Entprellen des Joysticks */

void setup(void) /* Einmalig ausgeführt */
{
  /* Der Joystick wird initialisiert */
  pinMode(JOYSTICK_OBEN, INPUT);
  digitalWrite(JOYSTICK_OBEN, HIGH);
  pinMode(JOYSTICK_UNTEN, INPUT);
  digitalWrite(JOYSTICK_UNTEN, HIGH);
  pinMode(JOYSTICK_LINKS, INPUT);
  digitalWrite(JOYSTICK_LINKS, HIGH);
  pinMode(JOYSTICK_RECHTS, INPUT);
  digitalWrite(JOYSTICK_RECHTS, HIGH);
  pinMode(JOYSTICK_EINGABE, INPUT);
  digitalWrite(JOYSTICK_EINGABE, HIGH);
 
  Serial.begin(9600);   // Start des Seriellen Monitors mit 9600 Baude  
}

void loop(void) /* Zyklische Abfrage */
{
/* Abfrage des Joysticks */
  delay(1);

  if((digitalRead(JOYSTICK_OBEN) == LOW) || (digitalRead(JOYSTICK_UNTEN) == LOW) || (digitalRead(JOYSTICK_LINKS) == LOW) || (digitalRead(JOYSTICK_RECHTS) == LOW) || (digitalRead(JOYSTICK_EINGABE) == LOW))
  {  
    if(JoystickFreigabe_bit == true)
    {
      delay(10); //10 ms warten - Taster entprellen
      if((digitalRead(JOYSTICK_OBEN) == LOW) || (digitalRead(JOYSTICK_UNTEN) == LOW) || (digitalRead(JOYSTICK_LINKS) == LOW) || (digitalRead(JOYSTICK_RECHTS) == LOW) || (digitalRead(JOYSTICK_EINGABE) == LOW))
      {
        JoystickFreigabe_bit = false;
        if(digitalRead(JOYSTICK_OBEN) == LOW){
          Serial.println("Joystick: OBEN gedrückt");
        }
        else if(digitalRead(JOYSTICK_UNTEN) == LOW){
          Serial.println("Joystick: UNTEN gedrückt");
        }
        else if(digitalRead(JOYSTICK_LINKS) == LOW){
          Serial.println("Joystick: LINKS gedrückt"); 
        }
        else if(digitalRead(JOYSTICK_RECHTS) == LOW){
          Serial.println("Joystick: RECHTS gedrückt");
        }
        else if(digitalRead(JOYSTICK_EINGABE) == LOW){
          Serial.println("Joystick: EINGABE gedrückt");
        }
      }
    }
  }
  else {
    JoystickFreigabe_bit = true; // Taster wieder freigeben
  }
}

Hausaufgaben bis zum 9. Termin

  • Steuert den US-Servo mit dem Joystick im Bereich 0°-180° an.
  • LINKS: Drehung nach Links (180°).
  • RECHTS: Drehung nach Rechts (0°).
  • EINGABE: Grehung auf die Mitte (90°).

Hinweis: Ursprünglich war die Aufgabe die Antriebsmotoren zu steuern. Leider habe ich festgestellt, dass diese dieselben analogen IO-Pins nutzen (A1-A5). Das kann leider nicht zusammen funktionieren.

Musterlösung


→ zurück zum Hauptartikel: Projekt Alf