Actually got my soldering iron out at the weekend and soldered pins onto the Gadgeteer Extender module.
While rummaging around in my old electronics last week, I came across an old SP03 Text to Speech module:
Info on this device can be found here: SP03 Documentation
So with a breadboard the new soldered Extender module and some connector wires and pull up resistors; it was all connected together and powered on. No magic blue smoke meant that things may actually be working ;-).
The device uses either serial or I2C communication to communicate which is supported by the FEZ Spider. It took a lot of looking around and a couple of questions on the Tiny CLR forum but I managed to make a class that allowed the communication between the two and managed to make it speak for the first time. Below is that class:
using System; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; namespace FEZ_Speak { class SP03 { // initialse the device object private I2CDevice _sp03; // setup constants private const byte SP03ADDRESS = 0x62; private const int SP03CLOCKRATE = 100; // setup default speaking paramaters private byte _volume = 0x00; private byte _speed = 0x03; private byte _pitch = 0x05; // Initialise the hardware public SP03() { I2CDevice.Configuration config = new I2CDevice.Configuration(SP03ADDRESS, SP03CLOCKRATE); _sp03 = new I2CDevice(config); } // Speech properties public byte Volume { get { return _volume; } set { _volume = value; } } public byte Speed { get { return _speed; } set { _speed = value; } } public byte Pitch { get { return _pitch; } set { _pitch = value; } } // Methods // Say something public void Say(string speech) { WaitForSpeechFinish(); I2CDevice.I2CTransaction[] xActions = new I2CDevice.I2CTransaction[3]; xActions[0] = I2CDevice.CreateWriteTransaction(GetSettings()); xActions[1] = I2CDevice.CreateWriteTransaction(ConvertText(speech)); xActions[2] = I2CDevice.CreateWriteTransaction(SayIt()); if (_sp03.Execute(xActions, 1000) == 0) { Debug.Print("Failed to perform I2C transaction"); } } private byte[] ConvertText(string text) { System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); byte[] buffer = encoding.GetBytes(text); byte[] result = new byte[buffer.Length + 2]; result[0] = 0; result[1] = 0; buffer.CopyTo(result, 2); return result; } private byte[] GetSettings() { byte[] speechConfig = new byte[] { 0, 0, _volume, _pitch, _speed }; return speechConfig; } private byte[] SayIt() { return new byte[] { 0, 0x40 }; } private void WaitForSpeechFinish() { bool speaking = true; byte[] request = new byte[1] { 0 }; while (speaking) { byte[] response = new byte[1]; I2CDevice.I2CTransaction[] xActions = new I2CDevice.I2CTransaction[2]; xActions[0] = I2CDevice.CreateWriteTransaction(request); xActions[1] = I2CDevice.CreateReadTransaction(response); if (response[0] == 0) speaking = false; } } } }
And here is the code that consumed that class:
using System; using System.Collections; using System.Threading; using Microsoft.SPOT; using Microsoft.SPOT.Presentation; using Microsoft.SPOT.Presentation.Controls; using Microsoft.SPOT.Presentation.Media; using Microsoft.SPOT.Touch; using Microsoft.SPOT.Hardware; using Gadgeteer.Networking; using GT = Gadgeteer; using GTM = Gadgeteer.Modules; using Gadgeteer.Modules.GHIElectronics; namespace FEZ_Speak { public partial class Program { // This method is run when the mainboard is powered up or reset. void ProgramStarted() { SP03 speechUnit = new SP03(); speechUnit.Say("Hello Tiny C L R."); } } }
After running this a growly computer voice spoke the words. In case anyone doesn’t believe me, here is the evidence 😉
Jas