Hausaufgaben3 Lösung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 3: Zeile 3:
<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>
/* Bibliothek einbinden */
/*********************************************************************************************************
#include <Servo.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


Servo usServo; /* Erzeugt ein Servo Objekt, um den Servo des Ultraschall anzusteuern */
AlphaBot Alf = AlphaBot();   // Instanz des AlphaBot mit dem Handle WallE erzeugen
                /* Auf den meisten Boards können bis zu 12 Servo-Objekte erzeugt werden */


int ServoPosition_s16 = 0;   /* Variable, um die Servoposition anzusteuern */
// 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


void setup() {              /* Einmalige Systeminitialisierung */
// Globale Variablen
   usServo.attach(9);         /* Verbindung der Servo mit einem Digitalpin */
byte valEncL_u8 = 0;          // https://www.arduino.cc/reference/de/language/variables/data-types/byte/
                            /* Der Servo ist am Digitalpin D9 angeschlossen */  
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 loop() {               /* Main Schleife */
void updateEncoderL(){
   for (ServoPosition_s16 = 0; ServoPosition_s16 <= 180; ServoPosition_s16 += 1)
   valEncL_u8++;
   { /* Drehung von 0° bis 180° in +1° Schritten  */                          
   if (valEncL_u8 > ANZAHL_INCREMENTE) { // 40 Zustandswechsel = 1 Radumdrehung
     usServo.write(ServoPosition_s16);   /* Der Servo soll sich an die Position drehen */
     valEncL_u8 = 0;                     // Reset Inkrementzähler
     delay(15);                         /* Wir warten 15ms, bis der Servo seine Position erreich hat */
     RadumdrehungenL_s32++;             // Umdrehungen inkrementieren
   }
   }  
   for (ServoPosition_s16 = 180; ServoPosition_s16 >= 0; ServoPosition_s16 -= 1)  
}
  { /* Drehung von 180° bis 0° in -1° Schritten */  
 
     usServo.write(ServoPosition_s16);                 /* Der Servo soll sich an die Position drehen */  
void updateEncoderR(){
     delay(15);                                       /* Wir warten 15ms, bis der Servo seine Position erreich hat */
   valEncR_u8++;
   }
  if (valEncR_u8 > ANZAHL_INCREMENTE) { // 40 Zustandswechsel = 1 Radumdrehung
     valEncR_u8 = 0;                     // Reset Inkrementzähler
     RadumdrehungenR_s32++;             // Umdrehungen inkrementieren
   }  
}
}
</pre>
</pre>
Zeile 32: Zeile 93:


----
----
→ zurück zum Hauptartikel: [[AlphaBot:_Verzweigung|Termin 4]]
→ zurück zum Hauptartikel: [[AlphaBot:_Antriebsmotoren_ansteuern|Termin 3]]

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