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);
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.
Die Geschichte funktioniert prima, ca. eine Sekunde nach dem Programmstart sagt der SpeakJet brav "Test".Code:$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
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
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);
Gruß
Dirk
Danke für die Antwort.
Ich schau mir das in der Library mal an, denke das hilft mir weiter.
Gruß Uwe
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
Die vorhandene RP6M256uart Library stellt ja die Befehle für UART0 zur Verfügung.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?
Hier habe ich die RP6M256uart1 Library eingestellt für UART1.
Für UART2 kann man die Library genauso anpassen.
Gruß
Dirk
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) 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:
(_WIFI ist wichtig, weil damit die Baudrate von 38400 auf 9600 umgestellt wird, das braucht der SpeakJet)Code: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
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:
Das war's. Wer Interesse an Details hat, findet sie hier.
Gruß Uwe
Geändert von basteluwe (17.02.2016 um 08:44 Uhr)
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:
Diese Sound Anweisungen kann man einfach durch writeChar1(xxx) ersetzen und fertig ist die Laube!Code:/** * 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); } }
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!)Code:/** * 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 } }
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
Ok, vielleicht kann man dem RP6 ja die R2D2 Sprache beibringen: ÜbersetzerDas erinnert schon sehr an R2D2 ...
Gruß
Dirk
Lesezeichen