Hausaufgaben3 Lösung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
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>
/* Deklaration */
/*********************************************************************************************************
#include "AlphaBot.h"                   // Arduino Bibliothek einbinden     
*        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


AlphaBot Alf = AlphaBot();             // Instanz des AphaBot wird erzeugt
boolean StreckeErreicht_b = false; // true, wenn 30 cm gefahren


const byte GESCHWINDIGKEIT_u8 = 90;     // Geschw. wählbar: 0 - 255; Min: 80
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 setup()
}
void loop()                       // Main Schleife
{
{
   // Wird einmalig beim Start ausgeführt
   if (StreckeErreicht_b==false)
  Alf.SetSpeed(GESCHWINDIGKEIT_u8);     // Geschw. setzen: 0 - 255
  { // 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 loop()
void updateEncoderR(){
{  
   valEncR_u8++;
   // Wird zyklisch ausgeführt
  if (valEncR_u8 > ANZAHL_INCREMENTE) { // 40 Zustandswechsel = 1 Radumdrehung
  for (int i=0; 4; i++) {
     valEncR_u8 = 0;                     // Reset Inkrementzähler
    Alf.Forward(1000);         // Geradeausfahrt
     RadumdrehungenR_s32++;             // Umdrehungen inkrementieren
    Alf.Brake();                // STOP
   }  
    delay(1000);                // Für 1 s
      
    Alf.RightCircle(400);       // AlphaBot dreht sich 90° nach rechts
     Alf.Brake();
    delay(1000);               // Für 1 s
   }
 
}
}
</pre>
</pre>

Version vom 31. März 2022, 13: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