PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] SpeakJet Ansteuerung in C



basteluwe
01.02.2016, 11:18
Hallo RP6 Freunde,
immer mal wieder (in größeren Abständen) krame ich meinen RP6 vor und versuche mich an Verbesserungen. Mein Projekt, die Sprachausgabe über SpeakJet einzubinden, steckt leider aber fest. Es hapert bei mir einfach am Programmieren in C.
In Bascom geht es gerade noch so aber mit C habe ich gerade einen Grundkurs angefangen und bekomme zurzeit mal gerade eine LED zum Blinken :(
Vielleicht kann mir jemand eine Starthilfe geben.

Hier unten ist mein kleiner Bascom Test-Code zu sehen. Gesteuert wird erst mal nur zum Test ein Mega8, an dessen Pin3 (TXD) der SpeakJet hängt. Die Baudrate sollte wirklich 9600 sein, sonst klappt es nicht.


$regfile "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 9600

Wait 1

Printbin 20 ; 96 ; 21 ; 114 ; 22 ; 88 ; 23 ; 5 ; 191 ; 131 ; 8 ; 187 ; 191 ; 255 'Phrase "Test"

Waitms 500

End

Die Geschichte funktioniert prima, ca. eine Sekunde nach dem Programmstart sagt der SpeakJet brav "Test".

Frage: "Wie muß dieser Code in C (nicht Arduino-Processing) aussehen. Das würde mir zum Verständnis ein Ende weiterhelfen. Das Einbinden in's RP6 Programm wird dann wohl noch schwierig genug, aber ich brauch erst mal einen Anfang.
Danke im Voraus,
Uwe

Dirk
05.02.2016, 17:47
Mit der RP6 Library kann man die einzelnen Zeichen, die du in Bascom mit Printbin ausgibst, mit der Funktion writeChar() ausgeben:
ch = 20;
writeChar(ch);
usw.

Der Wartebefehl Wait 1 lautet:
mSleep(1000);

... und Waitms(500):
mSleep(500);

basteluwe
05.02.2016, 21:08
Danke für die Antwort.
Ich schau mir das in der Library mal an, denke das hilft mir weiter.

Gruß Uwe

basteluwe
06.02.2016, 14:49
Mit der RP6 Library kann man die einzelnen Zeichen, die du in Bascom mit Printbin ausgibst, mit der Funktion writeChar() ausgeben:
ch = 20;
writeChar(ch);
usw.

Auf dem M256 WiFi Modul finde ich 3 UART Schnittstellen.
Frage: Wie (mit welchem Befehl/Syntax) lege ich fest, auf welcher von den dreien die Ausgabe passiert?

Gruß Uwe

Dirk
06.02.2016, 21:10
Auf dem M256 WiFi Modul finde ich 3 UART Schnittstellen. Frage: Wie (mit welchem Befehl/Syntax) lege ich fest, auf welcher von den dreien die Ausgabe passiert?
Die vorhandene RP6M256uart Library stellt ja die Befehle für UART0 zur Verfügung.
Hier (http://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter#RP6M256uart1_Library) habe ich die RP6M256uart1 Library eingestellt für UART1.
Für UART2 kann man die Library genauso anpassen.

basteluwe
07.02.2016, 07:57
Die vorhandene RP6M256uart Library stellt ja die Befehle für UART0 zur Verfügung.
Hier (http://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter#RP6M256uart1_Library) habe ich die RP6M256uart1 Library eingestellt für UART1.
Für UART2 kann man die Library genauso anpassen.

Prima, Danke!

Gruß Uwe

basteluwe
15.02.2016, 12:27
Mit der Hilfe von Dirks Hinweisen habe ich die Ansteuerung des SpeakJet aus einem beliebigen Masterprogramm auf der M256 hinbekommen.
Wie so oft war es am Ende gar nicht so schwierig, wenn man weiß, wie's geht ;)
Ziel war für mich den UART1 zu nutzen, da der UART0 schon benutzt wird und auch mechanisch ungünstiger angeordnet ist.
Hier die nötigen Schritte:


1. Nach der Anleitung (Link von Dirk weiter oben (http://rn-wissen.de/wiki/index.php?title=RP6v2_USB-RS232-Adapter#RP6M256uart1_Library)) eine RP6M256uart1.c und eine RP6M256uart1.h erstellen.
2. Diese Dateien da abspeichern, wo auch die RP6M256uart.c und RP6M256uart.h liegen.
3. Die neue RP6M256uart1.h entweder in die RP6M256lib.h oder in's eigene Hauptprogramm eintragen, je nachdem ob sie immer oder nur für diesen speziellen Fall eingebunden werden soll.
4. Die neue RP6M256uart1.c in das makefile eintragen.
5. Die UART1 im eigenen Programm initialisieren:

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
(_WIFI ist wichtig, weil damit die Baudrate von 38400 auf 9600 umgestellt wird, das braucht der SpeakJet)

6. Mit writeChar1(252) den Steuercode 252 auf die UART1 schicken. 252 steht als Beispiel und erzeugt einen Sonar-Ping.

Hier noch ein Bild vom Aufbau des SpeakJet auf dem RP6:

31314
Das war's. Wer Interesse an Details hat, findet sie hier (http://www.galepp.com/basteln/speakjet/speakjet-rp6.htm).


Gruß Uwe

basteluwe
17.02.2016, 07:36
Die erste echte Einbindung in ein Programm ist denkbar einfach.
Im Beispielprogramm "Example_10_Move2" für die M256_WiFi findet sich ab Zeile 324 das Modul "ACS Event Handler". Es scheint, als wäre das Programm ursprünglich für die M32 Platine geschrieben, denn es sind drei "Sound-Anweisungen" da drin, die auskommentiert sind. Siehe hier:

/**
* ACS Event Handler
*/
void acsStateChanged(void)
{
if(obstacle_left && obstacle_right)
statusLEDs.byte = 0b100100;
else
statusLEDs.byte = 0b000000;
statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);
updateStatusLEDs();
if(obstacle_left && obstacle_right)
{
// sound(160,20,0);
}
else
{
// if(obstacle_left)
// sound(120,10,0);
// if(obstacle_right)
// sound(140,10,0);
}
}
Diese Sound Anweisungen kann man einfach durch writeChar1(xxx) ersetzen und fertig ist die Laube!

/**
* ACS Event Handler
*/
void acsStateChanged(void)
{
if(obstacle_left && obstacle_right)
statusLEDs.byte = 0b100100;
else
statusLEDs.byte = 0b000000;
statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);
updateStatusLEDs();
if(obstacle_left && obstacle_right)
{
writeChar1(254); // Wow sound
}
else
{
if(obstacle_left)
writeChar1(221); // Beep left
if(obstacle_right)
writeChar1(222); // Beep right
}
}
Im Ergebnis ist der RP6 nun ziemlich "redselig", während er durch die Gegend kurvt. Das erinnert schon sehr an R2D2 (die Gattin nervt es schon!) ;)

Statt der Töne könnte er natürlich Wörter oder Sätze von sich geben, aber dann wäre das ständige Gequassel wohl gar nicht zu ertragen :)

Gruß Uwe

Dirk
17.02.2016, 19:22
Das erinnert schon sehr an R2D2 ...
Ok, vielleicht kann man dem RP6 ja die R2D2 Sprache beibringen: Übersetzer (http://www.r2d2translator.com/)
:) :) :)

basteluwe
18.02.2016, 07:03
Ok, vielleicht kann man dem RP6 ja die R2D2 Sprache beibringen: Übersetzer (http://www.r2d2translator.com/)
:) :) :)
Ist ja witzig! :)

Uwe