Go Down

Topic: SpeakJet /TTS Serial Question (Read 9456 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