Hausaufgaben3 Lösung

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

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