Hausaufgaben3 Lösung: Unterschied zwischen den Versionen
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