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…“)
 
Keine Bearbeitungszusammenfassung
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
// Instanzen erzeugen
#define    JOYSTICK_EINGABE A4
AlphaBot Alf = AlphaBot();              // Instanz des AlphaBot erzeugen
#define    JOYSTICK_LINKS  A5
Servo AlfServo;                          // Servo Instanz
 
// KONSTANTEN deklarieren
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


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


void initUltraschall()
void setup(void) /* Einmalig ausgeführt */
{
{
   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
  float fSignalLaufzeit=0;                // Messwert der Signallaufzeit         
 
  digitalWrite(TRIG, LOW);                // setze Trigger auf LOW für 2μs
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);              // setze Trigger auf HIGH für mind. 10 us
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);                // setze Trigger auf LOW
  fSignalLaufzeit = pulseIn(ECHO, HIGH);  // Messung der Signallaufzeit des Impulses
 
  fUSAbstand = fSignalLaufzeit/58;        // Umrechnung Laufzeit in s in Abstand in cm           
  //Y m =(X s * 344)/ 2;
  //X s =( 2 * Y m)/ 344;
  //X s = 0.0058 * Y m;
  //cm = us /58
  return fUSAbstand;                      // Rückgabewert
 
void setup()                      // Einmalige Systeminitialisierung
{
{
  initUltraschall();              // US initialisieren
/* Abfrage des Joysticks */
  AlfServo.attach(nServoPort);    // Servo verbinden
   delay(1);
  Serial.begin(9600);            // Serieller Monitor mit 9600 Baud
  AlfServo.write(90);            // Der Servo soll sich an die Mitte drehen
   delay(15);                      // Drehung abwarten
  Alf.MotorRun(80,80);           // Alf fährt vorwärts; Leistung 100
}


void loop()                       // Main Schleife
  if((digitalRead(JOYSTICK_OBEN) == LOW) || (digitalRead(JOYSTICK_UNTEN) == LOW) || (digitalRead(JOYSTICK_LINKS) == LOW) || (digitalRead(JOYSTICK_RECHTS) == LOW) || (digitalRead(JOYSTICK_EINGABE) == LOW))
{
  { 
  float USAbstand =0;
    if(JoystickFreigabe_bit == true)
  USAbstand = messeUSAbstand();   // US Abstand messen
    {
  Serial.println(USAbstand);
      delay(10); //10 ms warten - Taster entprellen
  if (USAbstand<20){
      if((digitalRead(JOYSTICK_OBEN) == LOW) || (digitalRead(JOYSTICK_UNTEN) == LOW) || (digitalRead(JOYSTICK_LINKS) == LOW) || (digitalRead(JOYSTICK_RECHTS) == LOW) || (digitalRead(JOYSTICK_EINGABE) == LOW))
    Serial.println("Notbremse");
      {
    Alf.Brake();                 // Anhalten
        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
   }
}
}
</pre>
</pre>

Version vom 8. Mai 2022, 07:48 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 8. Termin

  • Suche mit dem Ultraschall den Bereich 0°-180° vor dem AlphaBot ab.
  • Fahre auf das nächstgelegene Ziel im Sichtbereich zu.
  • Stoppe 10 cm vor dem Ziel.

Musterlösung


→ zurück zum Hauptartikel: Projekt Alf