Hausaufgaben3 Lösung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
'''Zwischenlösung''': Alf muss mit beiden Räder 1,5 U fahren. | |||
<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> | ||
/* | /********************************************************************************************************* | ||
#include "AlphaBot.h" | * 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 | } | ||
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 | void updateEncoderR(){ | ||
{ | valEncR_u8++; | ||
if (valEncR_u8 > ANZAHL_INCREMENTE) { // 40 Zustandswechsel = 1 Radumdrehung | |||
valEncR_u8 = 0; // Reset Inkrementzähler | |||
RadumdrehungenR_s32++; // Umdrehungen inkrementieren | |||
} | |||
} | |||
} | } | ||
</pre> | </pre> |
Version vom 31. März 2022, 14:15 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