Hausaufgaben3 Lösung
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