Hausaufgaben3 Lösung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
(kein Unterschied)

Aktuelle Version vom 7. April 2022, 20:17 Uhr

Zwischenlösung: Alf muss mit beiden Räder 1,5 U fahren.

/*********************************************************************************************************
*        Hochschule Hamm-Lippstadt                                                                       *
**********************************************************************************************************
* Modul            : E14_Wheel_Encoders.ino                                                              *
*                                                                                                        *
* Datum            : 29. Juni 2021                                                                       *
*                                                                                                        *
* Funktion         : Auswertung der Encoderlichtschranke über Interrupts.                                *
*                                                                                                        *                  
* Implementation   : Arduino IDE 1.8.16                                                                  *                                                                                                        *                                                                         *
*                                                                                                        *
* Autoren          : Prof. Dr. Ulrich Schneider                                                          *                                                                                                      *                                                     *
*                                                                                                        *
* Bemerkung        : Beispielcode basierend auf https://www.waveshare.com/wiki/AlphaBot                  *                                                                                                   
*                                                                                                        *
* Letzte Änderung  : 18. Oktober 2021                                                                    *
*                                                                                                        *                                                  
*********************************************************************************************************/
#include "AlphaBot.h"          // Header hinzufügen

AlphaBot Alf = AlphaBot();   // Instanz des AlphaBot mit dem Handle WallE erzeugen

// KONSTANTEN deklarieren
const byte PORT_ENC_L=2;                 // Die linke Lichtschranke (CNTL) liegt an Arduino D2
const byte PORT_ENC_R=3;                 // Die rechte Lichtschranke (CNTR) liegt an Arduino D3
const byte ANZAHL_INCREMENTE=40;         // Die Encoderscheibe hat 20 Löcher und somit 40 Zustände

// Globale Variablen
byte valEncL_u8 = 0;           // https://www.arduino.cc/reference/de/language/variables/data-types/byte/
byte valEncR_u8 = 0;           // Inkrementzähler

long int RadumdrehungenL_s32 = 0; // https://www.arduino.cc/reference/de/language/variables/data-types/long/
long int RadumdrehungenR_s32 = 0; // Zähler für die kompletten Radumdrehungen

boolean StreckeErreicht_b = false; // true, wenn 30 cm gefahren

void setup()                      // Einmalige Systeminitialisierung
{
  Serial.begin(9600);             // Serieller Monitor mit 9600 Baud
  pinMode(PORT_ENC_L,INPUT);      // Eingangsport D2 definieren
  pinMode(PORT_ENC_R,INPUT);      // Eingangsport D3 definieren
  attachInterrupt(0, updateEncoderL, CHANGE);  // Auslösen des Interrupts bei Signalwechsel
  attachInterrupt(1, updateEncoderR, CHANGE);  // https://www.arduino.cc/reference/de/language/functions/external-interrupts/attachinterrupt/
  Alf.MotorRun(100,100);          // Alf fährt vorwärts; Leistung 100
 

}
void loop()                       // Main Schleife
{
  if (StreckeErreicht_b==false)
  { // Ausgaben im Seriellen Monitor
    Serial.print(valEncL_u8);
    Serial.print(" :-: ");
    Serial.print(valEncR_u8);
    Serial.print(" :-: ");
    Serial.print(RadumdrehungenL_s32);
    Serial.print(" :-: ");
    Serial.print(RadumdrehungenR_s32);
    Serial.print("\n"); 
    if (RadumdrehungenL_s32>0&&RadumdrehungenR_s32>0&&valEncL_u8>ANZAHL_INCREMENTE/2 && valEncR_u8>ANZAHL_INCREMENTE/2)
    {
      StreckeErreicht_b = true; // 30 cm erreicht.
      Serial.println("30 cm erreicht.");
      Alf.Brake(); // Anhalten: 30 cm erreicht.
    }
  }
}
/*----------------------------*/
/* Interrupt Service Routinen */
/*----------------------------*/

void updateEncoderL(){
  valEncL_u8++;
  if (valEncL_u8 > ANZAHL_INCREMENTE) { // 40 Zustandswechsel = 1 Radumdrehung
    valEncL_u8 = 0;                     // Reset Inkrementzähler
    RadumdrehungenL_s32++;              // Umdrehungen inkrementieren
  } 
}

void updateEncoderR(){
  valEncR_u8++;
  if (valEncR_u8 > ANZAHL_INCREMENTE) { // 40 Zustandswechsel = 1 Radumdrehung
    valEncR_u8 = 0;                     // Reset Inkrementzähler
    RadumdrehungenR_s32++;              // Umdrehungen inkrementieren
  } 
}

→ zurück zum Hauptartikel: Termin 3