Go Down

Topic: SpeakJet /TTS Serial Question (Read 10101 times) previous topic - next topic

MobileWill

I got it to work! Thanks for all the help. Here is the new code if anyone ever needs it.

As part of testing I switched to Newsoftserial, but both work. Not sure which I should stay with. I read something about it and servos which i will be using.

Code: [Select]
/*
Testing Sketch for Robot
*/

//Soft serial library used to send serial commands on pin 2 instead of regular serial pin.
#include <NewSoftSerial.h>

//Define the Pin Numbers of the Voicebox shield for the sketch.
#define E0  5
#define E1  6
#define E2  7
#define E3  8
#define E4  9
#define E5  10
#define E6  11
#define E7  12

#define RDY  13
#define RES  3
#define SPK  4

//Pin 2 of the shield should be wired to the TTS256 chip.
#define txPin  2

//Create a SoftSerial Object to send strings to the TTS256 chip.
NewSoftSerial speakjet(0, txPin);

//Create a message buffer to hold the ascii message to be converted to sound
char message[128]="";
char cmd[3]="";
int cmdCode;

void setup()  
{
 //Configure the pins for the SpeakJet module
 pinMode(txPin, OUTPUT);
 pinMode(SPK, INPUT);
 
 //Set up a serial port to talk from Arduino to the SpeakJet module on pin 3.
 speakjet.begin(9600);    
 
 //Set up a serial port to get the ascii message from the host
 Serial.begin(9600);
 
 //Configure the Ready pin as an input
 pinMode(RDY, INPUT);
 
 //Configure Reset line as an output
 pinMode(RES, OUTPUT);
     
 //Configure all of the Event pins as outputs from Arduino, and set them Low.
 for(int i=E0; i<=E7; i++)
 {
   pinMode(i, OUTPUT);
   digitalWrite(i, LOW);
 }
 
 //All I/O pins are configured. Reset the SpeakJet module
 digitalWrite(RES, LOW);
 delay(100);
 digitalWrite(RES, HIGH);
 delay(1000);
 char sounds[] = {200, 201, 202, 203, 220, 221, 222};
 speakjet.println(sounds);

 


 
}

void loop()
{  
 //Get a message from the serial port
 getMessage(message, cmd);
 
 //Convert cmd from char to int
 cmdCode = atoi(cmd);
   
 //Send the message to the TTS256
 speakjet.println(message);
 delay(1000);
 while(digitalRead(RDY)==0);
 speakjet.println(cmdCode, BYTE);
 Serial.println(message);

 
 
 //Wait 12ms before checking the ready line (specified in TTS256 datasheet)
 delay(12);
 //Wait for the Speakjet to become 'ready' before sending more text.
 while(digitalRead(RDY)==0);
 
}

//Function: getMessage(char *)
//Description: Retrieves a string from the Serial port. Doesn't return the string until a carriage return character is detected.
//Inputs: None
//Outputs: char * message - The message received on the serial port.
//Returns: Nothing
//usage: getMessage(english_sentance);
void getMessage(char * message, char * cmd)
{
   char in_char=0;    //Create a character to store the incoming byte from the serial port.
   //Wait for a character to come into the serial port
   while(Serial.available() <=0);
   //Copy the incoming character to our variable.
   in_char=Serial.read();
   //Keep retreiving characters until the 'end of sentance(0x0D)' character is received.
   while(in_char != 0x0D){
       if (in_char == 0x5C)
       {
         while (in_char != 0x0D){
         while(Serial.available() <=0);    //Now wait for the next character...
         in_char = Serial.read();    
         *cmd++=in_char;
         }
       }
       else {
       *message++=in_char;    //Every time we receive a character we should add the character to the message string.
       while(Serial.available() <=0);    //Now wait for the next character...
       in_char = Serial.read();            //and copy it to the variable again.
   }
   }
  *message='\0';    //Strings must end with a Null terminator so we need to add this to our message.
  *cmd='\0';
 
 
 
   return;
}

Current Projects:                    Arduinos:
Security Robot Tank               Uno
Security Robot II 4WD            Mega2560

http://mobilewill.blogspot.com

MobileWill

#16
Jan 24, 2011, 06:07 am Last Edit: Jan 24, 2011, 06:59 am by wgarrido Reason: 1
I thought I would take it step further and try to handle multiple codes. So much for that. I changed the while loop to a for loop since all codes are 3 digits.

Is it possible to convert the code to a BYTE and insert it into the message char array so that it is sent inline? So that it is all sent at once and not to prints to serial?

EDIT: I figured it out, now I can read codes and insert then into the message array as a int, therefore having multiples codes and they are inline when it speaks back.

Here is the fine code
Code: [Select]
/*
Testing Sketch for Robot
*/

//Soft serial library used to send serial commands on pin 2 instead of regular serial pin.
#include <NewSoftSerial.h>

//Define the Pin Numbers of the Voicebox shield for the sketch.
#define E0  5
#define E1  6
#define E2  7
#define E3  8
#define E4  9
#define E5  10
#define E6  11
#define E7  12

#define RDY  13
#define RES  3
#define SPK  4

//Pin 2 of the shield should be wired to the TTS256 chip.
#define txPin  2

//Create a SoftSerial Object to send strings to the TTS256 chip.
NewSoftSerial speakjet(0, txPin);

//Create a message buffer to hold the ascii message to be converted to sound
char message[128]="";
char message2[128]="";

void setup()  
{
 //Configure the pins for the SpeakJet module
 pinMode(txPin, OUTPUT);
 pinMode(SPK, INPUT);
 
 //Set up a serial port to talk from Arduino to the SpeakJet module on pin 3.
 speakjet.begin(9600);    
 
 //Set up a serial port to get the ascii message from the host
 Serial.begin(9600);
 
 //Configure the Ready pin as an input
 pinMode(RDY, INPUT);
 
 //Configure Reset line as an output
 pinMode(RES, OUTPUT);
     
 //Configure all of the Event pins as outputs from Arduino, and set them Low.
 for(int i=E0; i<=E7; i++)
 {
   pinMode(i, OUTPUT);
   digitalWrite(i, LOW);
 }
 
 //All I/O pins are configured. Reset the SpeakJet module
 digitalWrite(RES, LOW);
 delay(100);
 digitalWrite(RES, HIGH);
 delay(1000);
 char sounds[] = {200, 201, 202, 203, 220, 221, 222};
 speakjet.println(sounds);

 


 
}

void loop()
{  
 //Get a message from the serial port
 getMessage(message, message2);
 
 //Send the message to the TTS256
 speakjet.println(message);
 Serial.println(message2);
 print(message2);
 print(" ");
 
 
 //Wait 12ms before checking the ready line (specified in TTS256 datasheet)
 delay(12);
 //Wait for the Speakjet to become 'ready' before sending more text.
 while(digitalRead(RDY)==0);
 
}

//Function: getMessage(char *)
//Description: Retrieves a string from the Serial port. Doesn't return the string until a carriage return character is detected.
//Inputs: None
//Outputs: char * message - The message received on the serial port.
//Returns: Nothing
//usage: getMessage(english_sentance);
void getMessage(char * message, char * message2)
{
   char cmd[4]="";
   char in_char=0;    //Create a character to store the incoming byte from the serial port.
   //Wait for a character to come into the serial port
   while(Serial.available() <=0);
   //Copy the incoming character to our variable.
   in_char=Serial.read();
   //Keep retreiving characters until the 'end of sentance(0x0D)' character is received.
   while(in_char != 0x0D){
       if (in_char == 0x5C)
       {
         for(int i = 0; i <= 2; i++){
         while(Serial.available() <=0);    //Now wait for the next character...
         in_char = Serial.read();    
         cmd[i]=in_char;
         }
       
        int code = atoi(cmd);
        Serial.println(code);
        *message++=code;
         while(Serial.available() <=0);
         in_char = Serial.read();
       }
       else {
       *message++=in_char;    //Every time we receive a character we should add the character to the message string.
       *message2++=in_char;
       while(Serial.available() <=0);    //Now wait for the next character...
       in_char = Serial.read();            //and copy it to the variable again.
   }
   }
  *message='\0';    //Strings must end with a Null terminator so we need to add this to our message.
  *message2='\0';

 
 
 
   return;
}






The 2nd message array is so I can display the text to the serial and lcd without the codes.
Current Projects:                    Arduinos:
Security Robot Tank               Uno
Security Robot II 4WD            Mega2560

http://mobilewill.blogspot.com

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy