Asuro (mit USB-Stick) - Bibliothek für wichtige Funktionen

Allgemeines
Funktionen

Allgemeines

Zur Programmierung des Asuro mit C gibt es vom Hersteller eine mitgelieferte Programmbibliothek. Hiermit wird die Erstellung von Steuerprogrammen für den Roboter vereinfacht.
Im Wesentlichen besteht die Bibliothek aus folgenden Dateien:

Einen vollständigen Überblick erhält man in der Asurowiki. In dieser wurden vorhandene Fehler ausgebessert und erweiterte Funktionalität angefügt.
Ich habe hier nur einen kleinen Teil der Funktionen wiedergegeben, die mir wichtig erschienen.

Funktionen

void BackLED (unsigned char left,unsigned char right)

Steuert die beiden hinteren Back-LED's. Wenn diese Funktion aufgerufen wird, funktioniert die Odometriemessung nicht mehr.
Parameter:
left: Schaltet die linke LED an bzw. aus. [ ON | OFF ]
right: Schaltet die rechte LED an bzw. aus. [ ON | OFF ]
Übergabeparameter: keine
Beispiel: BackLED (OFF, ON);

int Batterie (void)

Funktion: Batteriespannung - 0,8 V (wegen Diode D9), gibt diesen Wert zurück. (6 V Batterie → 520)
Übergabeparameter: keine
Beispiel: u = Batterie, wobei u eine Variable vom Typ "int" ist.

wichtige Datentypen für ASURO:

Typ Wertebereich Bemerkung
char (= int8_t) -128 .. +127 1 Byte-Wert; kann ein Zeichen aus dem Zeichensatz aufnehmen
unsigned char (= uint8_t) 0 .. 255 vorzeichenloser char
int (= int16_t) -32768 .. +32767 2 Byte Wert
unsigned int (= uint16_t) 0 ... 65535 vorzeichenloser int
long (= int32_t) –2147483648 .. +2147483647 4 Byte Wert
unsigned long (= uint32_t) 0 .. 4294967295 4 Byte Wert, vorzeichenloser long
float -3.4E-38 ... 3.4E+38 4 Byte, einfacher Gleitkommawert, 6 Dezimalstellen
Atmega8 hat kein Gleitkomma-Rechenwerk → lange Rechenzeiten!

do while-Schleife

Funktion: Wiederholt einen Programmabschnitt bis zur Abbruchbedingung (fußgesteuert).
Beispiel:
int i=10;
do {
  PrintInt(i);
  SerPrint("\r\n")   //neue Zeile
  i++;
} while (i<=100)

volatile int encoder [2]

Funktion: Odometriesensor - tic-Zähler bei Interrupt Betrieb, encoder[0]=links; encoder[1]=rechts.
Beispiel:
EncoderInit();
count = encoder[0];
// int-Wert der tics linke Segmentscheibe, max: 32767 tics (ca. 819 Radumdrehungen bei 8 Segmenten)!
EncoderStop();

void EncoderInit (void)

Funktion: Den Interrupt Betrieb der Odometriesensoren-Messung (beide Räder) initialisieren und starten, BackLEDs einschalten.
Übergabeparameter: keine
Beispiel: EncoderInit()

void EncoderStart(void)

Funktion: Den Interrupt Betrieb der Odometriesensoren-Messung starten.
Übergabeparameter: keine
Beispiel: EncoderStart().

void EncoderStop(void)

Funktion: Den Interrupt Betrieb der Odometriesensoren-Messung anhalten.
Übergabeparameter: keine
Beispiel: EncoderStop().

for-Schleife

Funktion: Wiederholt einen Programmabschnitt x-Mal.
Beispiel:
int i;
for (i=0; i<5; i++) {
  PrintInt(i);
  SerPrint("\r\n")   //neue Zeile
}

void FrontLED (unsigned char status)

Funktion: Steuert die vorne, nach unten zeigende, Front-LED.
Parameter: status Schaltet die LED an bzw. aus. [ ON | OFF ]
Übergabeparameter: keine
Beispiel: FrontLED (ON);

unsigned int Gettime (void)

Funktion: Gibt die aktuelle Zeit in Millisekunden zurück.
Übergabeparameter: keine
Beispiel: zeit = Gettime (), wobei zeit eine Variable vom Typ "unsigned int" bzw. "long" ist.

void Go (int distance, int speed)

Funktion: Mit Hilfe der Odometrie-Sensoren (an den Hinterrädern) wird eine Strecke (in mm) mit einer gewissen Geschwindigkeit zurückgelegt.
Vor dem ersten Aufruf muss deshalb EncoderInit() aufgerufen werden. Problem: Getriebeübersetzung!
Übergabeparameter: distance: Die Distanz(>800!!), wobei positive Werte vorwärts, negative Werte rückwärts bedeuten.
speed: Die Geschwindigkeit - im Wertebereich von 0 bis 255.
Beispiel: Go (1200,100)

void GoTurn (int distance, int degree, int speed)

Fährt eine bestimmte Strecke (in mm) mit einer bestimmten Geschwindigkeit, oder dreht um einen bestimmten Winkel mit einer bestimmten Geschwindigkeit.
Benutzt die Odometrie Sensoren im Interrupt Betrieb. Vor dem ersten Aufruf muss deshalb EncoderInit() aufgerufen werden. Problem: Getriebeübersetzung!
Parameter:
 distance Distanz in mm (- rueckwaerts, + = vorwaerts). Bei 0 wird degree fuer einen Turn benutzt.
 degree Winkel (- rechts, + links)
 speed Geschwindigkeit (Wertebereich 0...255)
Rückgabe: nichts
Beispiel:
// Laesst den Asuro ein Quadrat von 200 mm fahren, bei einer Geschwindigkeit von 150.
EncoderInit ();
int i;
for (i = 0; i < 4; i++) {
 GoTurn (200, 0, 150); // entspricht Go (200, 150)
 GoTurn ( 0, 90, 150); // entspricht Turn (90, 150)
}

if und else

Funktion: Wenn der Benutzer X eingibt, mache A sonst B
Beispiel:
int zahl=5;
if (zahl==5) {
  SerPrint("fuenf\n");
} else {
  SerPrint("sonst\n");
}

void Init (void)

Funktion: Initialisiert die Hardware: Ports, A/D Wandler, Serielle Schnittstelle, PWM.
Die Init Funktion muss von jeden Programm beim Start aufgerufen werden.
Übergabeparameter: keine
Beispiel: Init()

void LineData (unsigned int *data)

Funktion: Auslesen der Photosensoren (vorne) zur Linienverfolgung - unabhängig voneinander.
Übergabeparameter: data: Zeiger auf Daten für links (data[0]) und rechts (data[1]) die gelesen werden sollen. Wertebereich: 0 bis 1023.
Beispiel:
unsigned int data [2];
FrontLED (ON);
LineData (data);
Hinweis: data[0] ist der linke Sensor, data[1] der rechte

void Msleep (int dauer)

Funktion: Wartet eine bestimmte Zeit in Millisekunden
Übergabeparameter: dauer: Wartezeit in ms
Beispiel: Msleep (1000), wartet 1 s

void MotorDir (unsigned char left_dir, unsigned char right_dir)

Funktion: Steuert die Drehrichtung der Motoren (ohne Odometrie). Parameter:
  left_dir Richtung des linken Motors [ FWD | RWD | BREAK | FREE ]
  right_dir Richtung des rechten Motors [ FWD | RWD | BREAK | FREE ]
Rückgabe: nichts
Beispiel: MotorDir(FWD, RWD), linker Motor vorwärts, rechter rückwärts

void MotorSpeed (unsigned char left_speed, unsigned char right_speed)

Funktion: Steuert die Geschwindigkeit der Motoren. Initialisierung PWM erfolgt in Init()
Parameter:
  left_speed Geschwindigkeit linker Motor (Bereich 0..255)
  right_speed Geschwindigkeit rechter Motor (Bereich 0..255)
Rückgabe: nichts
Beispiel: MotorSpeed (150, 0); Geschwindigkeit linker Motor 150, rechter Motor stoppt

void OdometrieData (unsigned int *data)

Funktion: Auslesen der Odometrie-Daten via Polling - über Photosensoren links/rechts hinten.
Übergabeparameter: Parameter: data: Pointer auf die zu lesenden Daten: data[0] = links , data[1] = rechts. Wertebereich: 0 bis 1023.
Hinweis: OdometrieData oder auch OdometryData - beides korrekt
Beispiel:
unsigned int data [2];
OdometryData (data); data[0] = links , data[1] = rechts. Wertebereich: 0 bis 1023.

void PrintFloat (float wert, char vorkomma, char nachkomma)

Funktion: Gibt einen Floatwert (als String) über die Serielle Schnittstelle aus.
Übergabeparameter: wert: Wert der ausgegeben werden soll, Vorkommaanzahl, Nachkommaanzahl.
Beispiel: PrintFloat(1.234,6,2)

void PrintInt (int wert)

Funktion: Gibt einen Integerwert (als String) über die Serielle Schnittstelle aus.
Übergabeparameter: wert: Wert der ausgegeben werden soll.
Beispiel: PrinInt(1234)

void PrintLong (long wert)

Funktion: Gibt einen Integerwert (als String) über die Serielle Schnittstelle aus.
Übergabeparameter: wert: Wert der ausgegeben werden soll.
Beispiel: PrinInt(12345)

void SerPrint(unsigned char *data)

Funktion: Schreibt Daten auf die serielle Schnittstelle
Übergabeparameter: data: Pointer auf Daten die geschrieben werden sollen findet Anzahl der Zeichen selbst
Beispiel: SerPrint("Odometriedaten auslesen:\r\n");

void SerRead (unsigned char *data, unsigned char length, unsigned int timeout)

Funktion: Liest Daten von der seriellen Schnittstelle
Übergabeparameter: data: Pointer auf Daten die gelesen werden sollen length: Anzahl der Zeichen timeout
Beispiel:
 char empfangene_daten [10];
 SerRead (empfangene_daten, 5, 20); // 5 Daten empfangen, Abbruch nach 20 Zeiteinheiten (ausprobieren!)

void SerWrite (unsigned char *data, unsigned char length)

Funktion: Schreibt Daten auf die serielle Schnittstelle
Übergabeparameter: data: Pointer auf Daten die geschrieben werden sollen length: Anzahl der Zeichen
Beispiel: SerWrite("Asuro",5)

void Sound (uint16_t freq, uint16_t duration_msec, uint8_t amplitude)

Funktion: Soundausgabe über die Motoren
Übergabeparameter:
  freq: Frequenz in Hz
  duration_msec: Länge in Millisekunden
  amplitude: Amplitude
Rückgabe: nichts
Beispiel: Sound (1000, 500, 70); // Ton von 1 kHz für eine 1/2 Sekunde mit Amplitude 70. Hohe Amplituden funktionieren nicht.

void StatusLED (unsigned char color)

Funktion: Steuert die mehrfarbige Status-LED
Übergabeparameter: color: Zu setzende Farbe. [ OFF | GREEN | RED | YELLOW ] Bei einem nicht definierten Wert von 'color' ändert sich nichts an der LED.
Rückgabe: nichts
Beispiel: StatusLED (GREEN);

switch case

Funktion: viele Fälle unterscheiden und für jeden Fall unterschiedliche Aktionen ausführen
Beispiel:
switch(t1) {
  case 1: MotorSpeed(speed+20,speed-20); break;
  case 2: MotorSpeed(speed+10,speed-10); break;
  case 4: MotorSpeed(speed,speed); break;
  case 8: MotorSpeed(speed,speed); break;
  case 16: MotorSpeed(speed-10,speed+10); break;
  case 32: MotorSpeed(speed-20,speed+20); break;
  default: MotorSpeed(speed,speed); break;
}

unsigned char PollSwitch (void)

Funktion: Abfrage der Taster vorne via Polling
Übergabeparameter: keiner
Rückgabe: Bits:
Tipp: PollSwitch mehrmals aufrufen, oder StartSwitch().
Beispiel:
uint8_t t1;
t1 = PollSwitch ();
if (t1 && t1 == PollSwitch()){ // irgendeine Taste gedrückt
  PrintInt(t1);
}
Msleep (500); // 0,5 sek warten

Rahmenprogramm

Funktion: Mit diesem Rahmenprogramm beginne ich jedes neue Programm:

#include "asuro.h"

int main(void) {
  Init();

  while (1) {

  }
MotorSpeed(0,0);
return 0;
}

void StartSwitch (void)

Funktion: Start Interruptbetrieb der Taster.
Übergabeparameter: keiner
Beispiel:
  StartSwitch ();
  while (!switched) // wartet auf Tastendruck
  // an dieser Stelle kann mit PollSwitch() geprüft werden welche Taste gedrückt wurde.
  StopSwitch (); // Vorbereitung für neuen Aufruf von StartSwitch()

void StopSwitch (void)

Funktion: Stop Interruptbetrieb der Taster.
Übergabeparameter: keiner
Beispiel: StopSwitch();

void Turn (int degree, int speed)

Funktion: Der Roboter dreht sich einem bestimmten Winkel mit einer festgelegten Geschwindigkeit. Problem: Getriebeübersetzung!
Übergabeparameter: degree: Legt den Winkel fest (- rechts, + links) speed: Die Geschwindigkeit (Wertebereich 0...255)
Vor dem ersten Aufruf muss EncoderInit() aufgerufen werden.
Beispiel: Turn(90, 100)

while-Schleife

Funktion: Wiederholt einen Programmabschnitt bis zur Abbruchbedingung (kopfgesteuert).
Beispiel:
int i=10;
while (i<=100) {
  PrintInt(i);
  SerPrint("\r\n")   //neue Zeile
i++; }

Erstellt am 30. Dezember 2016
von mir höchst persönlich.