Zur Startseite

SpeakJet im Roboter RP6

Application für Magnevition Speakjet

Nachdem ich auf dieser Seite den Chip und eine allgemeine Anwendung vorgestellt habe, soll nun die praktische Umsetzung in meinem AREXX RP6 gezeigt werden. Neben der Basisplatine trägt der Roboter im Moment das M256-WiFi Erweiterungsmodul, eine Experimentierplatine und eine 2x16 Zeichen LCD-Anzeige. Soviel zur Grundaustattung.

Zuerst die leichtere Aufgabe. Der mechanische Aufbau sollte gegenüber dem Testmodul etwas abgeändert werden. Für Versuche ist der Würfel zwar recht gut zu gebrauchen, aber zum Einsatz im RP6 ist er zu sperrig und der Lautsprecher ist doch etwas klein und dadurch der Sound ziemlich "quäkig".

Die Elektronik ist jetzt auf zwei Module verteilt. Links der SpeakJet mit seiner Basisschaltung. Oben im Dreieck die drei Status-LEDs. Unten die Reset-Taste für schnelle Funktionsprüfung. Links von der Taste der Eingangs-Pin für das Signal vom UART. Etwas rechts oberhalb vom Taster der NF-Ausgangs-Pin. Die Steckkontakte unten an den Modulen sind jeweils Links der -5V und rechts der +5V Anschluß. Gleichzeitig ist das die mechanische Befestigung. Die Module stehen darauf senktecht auf der Experimentierplatine. Die rechte Platine trägt nur den NF-Verstärker. Links oben die Pins für Ein- und Ausgang. Es werden nur je einer benötigt, weil sowohl Eingang als auch Lautsprecher einseitig auf Masse (-5V) liegen.

Hier die fertige Installation. Ganz links hinter dem Trimmer zur Einstellung des LCD-Displays befindet sich der Steckverbinder des UART1. Sein Pin 6 ist der TXD1, von dem ein Verbinder (gelb) zum Eingang des SpeakJet geht. Vorn ist der Kurze, ebenfalls gelbe NF-Verbinder zu sehen. Das grüne Kabel darunter geht zwischen den Platinen auf die untere Etage zum Lautsprecher.

Hier ist der gesamte obere Aufbau entfernt und nur die Basisplatine zu sehen. Der rote Kreis markiert eine Fläche ohne Bauelemente. Hier ist Platz für den Magneten des Lautsprechers. Er sitzt zwischen den Platinen und strahlt nach oben ab.

Unten auf den Magnet habe ich einen Filz-Möbelgleiter und oben auf den Metallrand des Korbs einen Ring aus Schaumstoff geklebt.

Man sieht auf dem Foto, wie der Lautsprecher zwischen den Platinen klemmt. Er hängt da wirklich sicher und servicefreundlich. Soweit, so gut!

Nun zum für mich schwierigeren Teil. Wie bindet man den SpeakJet in die Programme des RP6 ein? Die Ansteuerung mit Hilfe von Bascom und dessen PRINTBIN Befehl war einfach, aber der RP6 wird in C programmiert! Was C angeht bin ich immer noch Fred Feuerstein, der auf Steintafeln meißelt. Ich brauchte also Hilfe, die ich zum Glück im Forum hier gefunden habe.

Die Ausgangslage ist wie folgt:

Die Frage war also: Wie lassen sich UART1 und UART2 ansprechen und wie sieht der Code dafür aus?
In den Libraries für den RP6 gibt es eigentlich nur die Dateien uart.c und uart.h. Diese befassen sich nur mit den Codes für die UART0. Im oben verlinkten Forum wurde ich vom Autor auf diese Seite hingewiesen, auf der die Scripte für die UART1 zu finden sind. Durch Copy & Paste habe ich daraus die nötigen uart1.c und uart1.h Dateien erstellt und in das selbe Verzeichnis kopiert, in dem die anderen uart-Dateien liegen. Mit der Anleitung für UART1 lässt sich übrigens ebenso eine Datei für UART2 erstellen.

Wichtig ist, die uart1.h auch einzubinden. Ich habe sie dazu in die RP6M256lib.h eingetragen:

// Includes:
#include "RP6M256.h" // General RP6 M256 definitions
#include "RP6M256uart.h" // M256 UART function lib
#include "RP6M256uart1.h" // M256 UART1 function lib (neu eingefügt)
#include "RP6M256_WIFIlib.h" // WIFI UART function lib

Der Nachteil mit dieser Art der Einbindung ist, daß die Datei nun immer von allen Programmen, die die RP6M256lib nutzen mit eingebunden wird. Vermutlich ist es besser die Einbindung im eigenen Programm zu machen, wenn die UART1 denn wirklich benutzt wird.
Die neue Datei muß auch noch im makefile eingetragen werden:

SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256uart.c
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256uart1.c
SRC += $(RP6_LIB_PATH)/RP6control_M256_WIFI/RP6M256_WIFIlib.c

Nun muß im eigenen Hauptprogramm noch die UART1 initialisiert werden. Die Routine entstammt wieder der oben genannten Quelle und sah bei mir so aus:

cli();          // Disable global interrupts
// UART1:
UBRR1H = UBRR_BAUD_LOW_WIFI >> 8; // Setup UART1: Baud is Low Speed
UBRR1L = (uint8_t) UBRR_BAUD_LOW_WIFI;
UCSR1A = 0x00;
UCSR1C = (0<<UMSEL10) | (0<<UMSEL11) | (1<<UCSZ11) | (1<<UCSZ10);
UCSR1B = (1 << TXEN1) | (1 << RXEN1) | (1 << RXCIE1);
clearReceptionBuffer1();
sei();        // Enable Global Interrupts

Wichtig ist hier der Zusatz _WIFI, damit wird die Baudrate auf 9600 gesetzt, die der RP6 auch für die WLAN Verbindung nutzt. Auch der SpeakJet braucht 9600!
Abschließend kann im Hauptprogramm mit "writeChar1(xxx)" der gewünschte Code über den UART1 an den SpeakJet gesendet werden.

Als erste praktische Nutzung habe ich das Beispielprogramm "RP6M256_10_Move2" mit folgenden akustischen Ausgaben versehen:

- Bei Programmstart = Ansage "RP6 is ready to go"
- Hindernismeldung durch ACS = "Sonar Ping"
- Hindernismeldung durch Bumper = Ansage "Autsch"
- Bei Druck auf Taster 1 = Ansage der Akkuspannung im Schema "battery status is 7 point 5 volt"
- Bei Absinken der Akkuspannung um jeweils 0,1 V = automatisch Ansage der neuen Akkuspannung (wie oben)
- Bei Erreichen der Entladeschlußspannung = Ansage "my battery is empty, please charge!"

Für die Übertragungsfunktionen der mehrfach wiederkehrenden Phrasen, Worte & Ziffern habe ich eine kleine Library geschrieben. Wen es interessiert, der findet eine Urfassung hier.

Wenn diese Library in das eigene Programm eingebunden ist, reicht zum Beispiel der Aufruf: "speak_volt();" und der RP6 spricht das Wort "Volt".

Hier noch ein kurzes Video zur Demo der konkreten Ausgabe. Die Bewegungsfunktion ist deaktiviert. Bitte die Lautstärke aufziehen, der Ton ist etwas leise (Handyaufnahme).

 

nach oben