-         

Ergebnis 1 bis 10 von 10

Thema: SpeakJet Ansteuerung in C

  1. #1
    Benutzer Stammmitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    79

    SpeakJet Ansteuerung in C

    Anzeige

    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.

    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
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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

  3. #3
    Benutzer Stammmitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    79
    Danke für die Antwort.
    Ich schau mir das in der Library mal an, denke das hilft mir weiter.

    Gruß Uwe

  4. #4
    Benutzer Stammmitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    79

    Wie wähle ich den richtigen UART?

    Zitat Zitat von Dirk Beitrag anzeigen
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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 habe ich die RP6M256uart1 Library eingestellt für UART1.
    Für UART2 kann man die Library genauso anpassen.
    Gruß
    Dirk

  6. #6
    Benutzer Stammmitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    79
    Zitat Zitat von Dirk Beitrag anzeigen
    Die vorhandene RP6M256uart Library stellt ja die Befehle für UART0 zur Verfügung.
    Hier habe ich die RP6M256uart1 Library eingestellt für UART1.
    Für UART2 kann man die Library genauso anpassen.
    Prima, Danke!

    Gruß Uwe

  7. #7
    Benutzer Stammmitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    79

    Cool Erfolg zu vermelden

    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:
    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
    (_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:
    Klicke auf die Grafik für eine größere Ansicht

Name:	12.jpg
Hits:	1
Größe:	82,2 KB
ID:	31314
    Das war's. Wer Interesse an Details hat, findet sie hier.


    Gruß Uwe
    Geändert von basteluwe (17.02.2016 um 08:44 Uhr)

  8. #8
    Benutzer Stammmitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    79

    Einbindung in Beispielprogramm Move2

    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:
    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);
    	}
    }
    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)
    	{
    		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

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Das erinnert schon sehr an R2D2 ...
    Ok, vielleicht kann man dem RP6 ja die R2D2 Sprache beibringen: Übersetzer
    Gruß
    Dirk

  10. #10
    Benutzer Stammmitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    79
    Zitat Zitat von Dirk Beitrag anzeigen
    Ok, vielleicht kann man dem RP6 ja die R2D2 Sprache beibringen: Übersetzer
    Ist ja witzig!

    Uwe

Ähnliche Themen

  1. Sprachmodul für den RP6 mit SpeakJet
    Von basteluwe im Forum Robby RP6
    Antworten: 6
    Letzter Beitrag: 01.04.2014, 20:11
  2. RP6 mit TTS256 und Speakjet
    Von Roandl im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 9
    Letzter Beitrag: 25.04.2013, 19:03
  3. SpeakJet ausverkauft?
    Von Rio im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 08.06.2006, 12:16
  4. PIC LCD Ansteuerung
    Von Elo-Azubi im Forum PIC Controller
    Antworten: 23
    Letzter Beitrag: 26.04.2006, 13:59
  5. sprechendes IC - Speakjet
    Von avatar im Forum Elektronik
    Antworten: 30
    Letzter Beitrag: 05.09.2005, 14:53

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •