PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : speakjet mit mega 2560



inka
16.04.2016, 14:30
halloallerseits,

angeregt durch basteluwes projekt (http://www.galepp.com/basteln/speakjet/speakjet.htm) für den RP6 baute ich auch etwas:
31514

das modul funktioniert im demo modus (https://youtu.be/tF0Lz_aWjjY),bei der verwendung eines sketches mit der arduino speakjet lib gab aber es beim kompilieren fehlermeldungen, die ich nicht verstanden habe,deshalb probierte ich diesen code, der ohne die lib auskommt




//set up a new software serial port
#include<SoftwareSerial.h>
//rxPin:the pin on which to receive serial data
//txPin:the pin on which to transmit serial data
//SpeakJet shield versions 1.0 thru 1.2 uses these pins
#definetxPin 2
#definerxPin 3
//SpeakJet shield version 1.3 or later uses these pins
//#definerxPin 5
//#definetxPin 6
//set up the SoftwareSerial port to connect to theSpeakJet
SoftwareSerialspeakJet = SoftwareSerial(rxPin, txPin);

voidsetup()
{
//define pin modes for tx, rx pins:
//pinMode(rxPin, INPUT); //not needed for this simpledemo
pinMode(txPin,OUTPUT);
speakJet.begin(9600);
delay(1000);// wait a second for the Arduino resets to finish (says"ready")


/*HELLO WORLD SpeakJet MSA phonemes (see page 16 of SpeakJet UserManual)
20,96, 21, 114, 22, 88, 23, 5, 183, 7, 159, 146, 164, 147, 151, 145,176
*/
//byte array holding speech data
bytesayThis[] = {20, 96, 21, 114, 22, 88, 23, 5, 183, 7, 159, 146, 164,147, 151, 145, 176}; //say "hello world"
//send it to the SpeakJet
for(int i=0; i<sizeof(sayThis); i++)
{
speakJet.write(sayThis[i]);
}
}

voidloop()
{}


das hört sich leider nicht wie "hello world" an (https://www.youtube.com/watch?v=dlniCKJHxgc)...

Ich verstehe das so, dass die zu den codes zuhörigen phoneme aus dem speakjet chip mit dem sketch herausgelesen werden und nach der verstärkung wiedergegeben werde. Nur kommt da ganz was anderes an...

Ich habe verschiedene dinge an dem sketch ausprobiert, z.b. mit einer schleife verschiedene codes direkt zu senden:
void setup()
{
// define pin modes for tx, rx pins:
// pinMode(rxPin, INPUT); //not needed for this simple demo
pinMode(txPin, OUTPUT);
speakJet.begin(9600);
delay(1000); // wait a second for the Arduino resets to finish (says "ready")
}


void loop()
{
for (uint8_t i = 128; i <= 164; i++)
{
speakJet.write(i);
delay(500);
}


}


oder per direkte write anweisungen nur einzelne phoneme geschickt:
speakJet.write("147");
speakJet.write("191");
speakJet.write("156");

irgendwelche töne kamen immer an, nur nicht die, die ich erwartet habe :-(



Wo sollte ich nach der ursache suchen?

Rabenauge
16.04.2016, 20:15
Erstens: wozu softSerial beim Mega?
Lass das weg-der Mega hat vier serielle Schnittstellen. Sind auch beschriftet, nimm eine davon, das schliesst schon mal Fehler mit der Bibliothek aus.

Serial1.begin(9600)- startet die Kommunikation auf Serial1.

Zweitens, (hier bin ich aber nicht _ganz_ sicher):
Versuch mal, nur Werte unterhalb 128 zu senden.
Könnte sein, dass unsigned int mit write nich klappt.

Guck mal hier, wie man Strings sendet:
https://www.arduino.cc/en/Serial/Write

inka
17.04.2016, 13:25
Lass das weg-der Mega hat vier serielle Schnittstellen. Sind auch beschriftet, nimm eine davon, das schliesst schon mal Fehler mit der Bibliothek aus.
hast natürlich recht, das progrämmchen war für den uno, die änderung brachte diese änderung (https://youtu.be/VnLV52WXWkk)

ausgabeschleife zum video:

for (int i = 128; i <= 199; i++)
{
Serial1.write(i);
}
delay(5000);


Zweitens, (hier bin ich aber nicht _ganz_ sicher):
Versuch mal, nur Werte unterhalb 128 zu senden.
Könnte sein, dass unsigned int mit write nich klappt.

eine ausgabe von 1 bis 127 gibt nichts aus, weil der speakjet keine codes für phoneme unterhalb von 128 kennt (nach manual) :-(

könnte der fehler bereits hier passiert sein?

der sketch ist ja schon älter:

void setup()
{
// define pin modes for tx, rx pins:
// pinMode(rxPin, INPUT); //not needed for this simple demo
pinMode(txPin, OUTPUT);
speakJet.begin(9600);
delay(1000); // wait a second for the Arduino resets to finish (says "ready")


/* HELLO WORLD SpeakJet MSA phonemes (see page 16 of SpeakJet User Manual)
20, 96, 21, 114, 22, 88, 23, 5, 183, 7, 159, 146, 164, 147, 151, 145, 176
v s p b H f E L O W A L E
o p i e E a H O W W X E D
l e t n s L W R
e c d t L W R
d h
*/
// byte array holding speech data
byte sayThis[] = {20, 96, 21, 114, 22, 88, 23, 5, 183, 7, 159, 146, 164, 147, 151, 145, 176}; //say "hello world"
// send it to the SpeakJet
for (int i=0; i<sizeof(sayThis); i++)
{
speakJet.print(sayThis[i], BYTE);
}
}


void loop()
{}

da gab es wegen BYTE fehlermeldungen beim compilieren. geändert habe ich das:


// byte array holding speech data
byte sayThis[] = {20, 96, 21, 114, 22, 88, 23, 5, 183, 7, 159, 146, 164, 147, 151, 145, 176}; //say "hello world"
// send it to the SpeakJet
for (int i = 0; i < sizeof(sayThis); i++)
{
// speakJet.write(sayThis[i]);
Serial1.write(sayThis[i]);
}

Rabenauge
17.04.2016, 13:36
Ja, das rumgebastele an der IDE nervt mitunter.
Arrays sind leider ne ganz schwache Seite von mir (im allgemeinen kann ich eigentlich fast alles ohne lösen ;) ), eventuell mal einfach die entsprechenden Bytes einzeln nacheinander senden?
Mach ich beim Midi-Keyboard auch:

Serial1.write(eventMsg);
Serial1.write(pitchBendRechts&0x00);
Serial1.write(pitchBendRechts>>7);

basteluwe
18.04.2016, 10:56
Hallo Inka,
ich würde gern helfen, bin aber was Arduino angeht selbst Anfänger und auch nur, weil ich mein Spracherkennungsmodul nicht anders zum Laufen kriegen konnte.
Was den SpeakJet angeht, zeigt der Link (http://www.galepp.com/basteln/speakjet/speakjet.htm), den du oben angegeben hast, wie es mit einem Mega8 unter Bascom sehr leicht geht.
Und unter diesem Link (http://www.galepp.com/basteln/speakjet/speakjet-rp6.htm) hab ich meine Lösung für den RP6 mit C-programmierung gezeigt. Auch das funktioniert, allerdings aufwändiger. Vielleicht gibt dir das ja einen Schubs.

Zu den Codes (Seite 15 des Manuals):
000-031 sind Steuercodes, die die Ausgabe der Allophone beeinflussen, selbst aber keinen Sound erzeugen.
032-127 sind reservierte Codes (wohl nicht nutzbar für User)
128-254 sind echte Sound-Codes (Allophone)
255 Rücksetzbefehl

Gruß Uwe

Rabenauge
18.04.2016, 12:05
http://airspayce.com/mikem/arduino/SpeakJet/ guck mal-damit wird es bestimmt einfacher.

inka
18.04.2016, 15:36
hängt das evtl. mit der verbindung des speakjet mit dem arduino zusammen?

bei mir ist (außer +5V und GND) nur der pin RCX(10) des speakjet mit dem serial ausgang 1 des mega (TX1) verbunden. Mancherorts ist aber auch die rede von CHIPREADY PIN? Was wäre denn das für ein pin?

btw: beim üben mit den anweisungs-codes und pause-codes merkt man, dass sich was verändert. Das herumprobieren ist aber recht zeitaufwändig...

basteluwe
18.04.2016, 18:48
Die drei Anschlüsse reichen für erste Versuche auf jeden Fall.
CTS (clear to send) wird nur benötigt, wenn lange Code-Reihen in einem Rutsch übertragen werden. Dann stoppt dieser Pin die Übertragung wenn der Buffer des Speakjet voll ist und gibt die Übertragung erst wieder frei, wenn Platz vorhanden ist. Ansonsten würde der Rest der langen Mitteilung einfach verloren gehen. Er spricht praktisch den Satz nicht zu Ende und verschluckt den Rest.
Wie gesagt für einfache Sätze oder sogar nur Wörter spielt CTS keine Rolle.
Auf meinem RP6 ist der SpeakJet auch nur 3-polig angeschlossen. Das reicht für ganze Sätze!

Gruß Uwe

- - - Aktualisiert - - -

Noch ein Gedanke: Stimmt die Baudrate?
Ich hatte damit anfänglich Probleme als ich mit Bascom und Mega 8 getestet hab.
Ich musste erst lernen, das auch die richtige Taktfrequenz am Mega eingestellt sein musste, damit der Befehl "$baud = 9600" wirklich 9600 bedeutet!

Gruß Uwe

inka
18.04.2016, 18:56
hallo Uwe,

die frequenz ist es m.e. nach nicht, am mega kann ich ja relativ einfach die baudrate in der er den speakjet anspricht einstellen, es sind die 9600 baud. Es sei denn ich hätte unbewusst beim übertragen von irgendwelchem mist die baudrate des speakjet verstellt. Kann man die dort irgendwie auslesen wie sie ist? Aber eigentlich glaube ich es nicht, weill ja die kommunikation nur bei 9600 klappt...

Rabenauge
18.04.2016, 20:35
Denk ich auch nicht-das Ding funktioniert ja. Wobei: dass man RX und TX grundsätzlich über Kreuz anschliesst, hast du bedacht?
Also: TX von dem Chip muss an RX vom Arduino und umgedreht...

inka
19.04.2016, 14:43
das ding geht nun, ich denke ich muss aber die ganze geschichte erzählen:

- bestellt habe ich den speakjet bei sparkfun bereits am 10.3.
- am 6.4. bekam ich statt eines speakjet einen attiny85
- reklamiert, ersatzlieferung angefordert
- am 13.4. kam der speakjet
31516
- reklamation und die frage von sparkfun was ich will: kaufpreis zurück oder noch einen speakjet
- habe also noch ein ersatz geordert, das verbogene beinchen gerichtet und damit die tests durchgeführt
- am 19.4. kam der ersatz und es funktioniert

ich mein, es ist schon ärgelich, wenn die zwei mal nacheinander so'n bockmist bauen...

inka
19.04.2016, 18:05
übrigens Uwe, Deine Sätze für den RP6 (z.b. "RP6 is ready to go") klingen einfach super. Wie hast Du es genau gemacht?

basteluwe
20.04.2016, 07:49
übrigens Uwe, Deine Sätze für den RP6 (z.b. "RP6 is ready to go") klingen einfach super. Wie hast Du es genau gemacht?
Das ist recht einfach und macht sogar Spaß (mir zumindest). Das Geheimnis lautet: Phrase-A-Lator
Es ist eine Software, die von Magnevition kostenlos hier (https://www.sparkfun.com/products/9578) angeboten wird. Unten auf der Seite unter Dokumente gucken. Dann klemmst du den Speakjet über USB an den Computer.
Nach dem Start der Software hast du dieses Fenster:
31522
Du wählst den richtigen Com Port und drückst auf Test. Der Speakjet sagt nun das übliche "ready" und das Port-Fenster wird grün, wenn alles OK ist.
Nun hast du jede Menge Möglichkeiten. Starte einfach mal den "Dictionary Editor":
31523
Er zeigt alle Wörter, die schon vorab von jemandem definiert wurden, du also nicht mehr selbst "erfinden" musst. Hier werden auch die Wörter oder Phrasen abgelegt, die du selbst programmierst. Zum Test merke dir einfach ein Wort, das hier in der Liste schon drin ist und starte den Phrase editor:
31524
In "Say Data" kannst du ein Wort, das es in der Liste schon gibt eintippen. dann auf "Say it" klicken und das Wort wird gesprochen.
Viel interessanter ist aber das selbst gestalten von neuen Wörtern. Einfach mal auf die buttons klicken und du hörst, was der Chip jeweils sagt. Bei Doppelklick auf einen button wird das Kommando in das Say Data Fenster übernommen. So kannst du die einzelnen Allophone aneinander reihen und auch Pausen usw. einfügen. Zwischendurch immer mal auf "Say it" klicken, um zu hören wie's klingt. Wenn du meinst es ist OK, kannst du die neue Phrase im Dictionary abspeichern. Bei Klick auf "View Codes" werden die Werte angezeigt, die eigentlich wichtig sind:
31525
Das sind die Codes, die du per Programm übertragen musst, um dein neues Wort sprechen zu lassen. Die vier 20er Codes am Anfang (gelb) sind übrigens für die Funktion nicht unbedingt wichtig. Wenn sie fehlen benutzt der SpeakJet seine Default Werte dafür. Ich lass sie immer weg im Programm.

Abschließend noch einige Wörter, die ich selbst im Dictionary zugefügt habe und auch teilweise im RP6 nutze:
31526

Na dann viel Spaß beim "Spielen" ;)

Gruß Uwe

P.S. Leider ist in der Software kein Simulator für die Wiedergabe eingebaut, man muß also tatsächlich den Speakjet immer an den Computer anschließen, um mit der Software arbeiten zu können. Ich finde das nachteilig, aber so ist es einfach.