Hausaufgaben3 Lösung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
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 */
*        Hochschule Hamm-Lippstadt                                                                      *
#include <Servo.h>
**********************************************************************************************************
* 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
Servo usServo; /* Erzeugt ein Servo Objekt, um den Servo des Ultraschall anzusteuern */
                /* Auf den meisten Boards können bis zu 12 Servo-Objekte erzeugt werden */


// KONSTANTEN deklarieren
int ServoPosition_s16 = 0;   /* Variable, um die Servoposition anzusteuern */
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
void setup() {              /* Einmalige Systeminitialisierung */
byte valEncL_u8 = 0;           // https://www.arduino.cc/reference/de/language/variables/data-types/byte/
  usServo.attach(9);         /* Verbindung der Servo mit einem Digitalpin */
byte valEncR_u8 = 0;          // Inkrementzähler
                            /* Der Servo ist am Digitalpin D9 angeschlossen */  
}


long int RadumdrehungenL_s32 = 0; // https://www.arduino.cc/reference/de/language/variables/data-types/long/
void loop() {                /* Main Schleife */
long int RadumdrehungenR_s32 = 0; // Zähler für die kompletten Radumdrehungen
  for (ServoPosition_s16 = 0; ServoPosition_s16 <= 180; ServoPosition_s16 += 1)  
 
  { /* Drehung von 0° bis 180° in +1° Schritten   */                          
boolean StreckeErreicht_b = false; // true, wenn 30 cm gefahren
    usServo.write(ServoPosition_s16);  /* Der Servo soll sich an die Position drehen */
 
    delay(15);                         /* Wir warten 15ms, bis der Servo seine Position erreich hat */
void setup()                     // Einmalige Systeminitialisierung
   }
{
   for (ServoPosition_s16 = 180; ServoPosition_s16 >= 0; ServoPosition_s16 -= 1)  
   Serial.begin(9600);            // Serieller Monitor mit 9600 Baud
   { /* Drehung von 180° bis 0° in -1° Schritten */  
  pinMode(PORT_ENC_L,INPUT);     // Eingangsport D2 definieren
     usServo.write(ServoPosition_s16);                 /* Der Servo soll sich an die Position drehen */  
   pinMode(PORT_ENC_R,INPUT);      // Eingangsport D3 definieren
     delay(15);                                       /* Wir warten 15ms, bis der Servo seine Position erreich hat */
  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
  }
}
}
</pre>
</pre>
Zeile 93: Zeile 32:


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

Version vom 7. April 2022, 13:30 Uhr

Zwischenlösung: Alf muss mit beiden Räder 1,5 U fahren.

/* Bibliothek einbinden */
#include <Servo.h>

Servo usServo;  /* Erzeugt ein Servo Objekt, um den Servo des Ultraschall anzusteuern */
                /* Auf den meisten Boards können bis zu 12 Servo-Objekte erzeugt werden */

int ServoPosition_s16 = 0;    /* Variable, um die Servoposition anzusteuern */

void setup() {               /* Einmalige Systeminitialisierung */
  usServo.attach(9);         /* Verbindung der Servo mit einem Digitalpin */
                             /* Der Servo ist am Digitalpin D9 angeschlossen */ 
}

void loop() {                /* Main Schleife */
  for (ServoPosition_s16 = 0; ServoPosition_s16 <= 180; ServoPosition_s16 += 1) 
  { /* Drehung von 0° bis 180° in +1° Schritten   */                            
    usServo.write(ServoPosition_s16);   /* Der Servo soll sich an die Position drehen */
    delay(15);                          /* Wir warten 15ms, bis der Servo seine Position erreich hat */
  }
  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 */ 
    delay(15);                                        /* Wir warten 15ms, bis der Servo seine Position erreich hat */
  }
}

→ zurück zum Hauptartikel: Termin 4