Got a fire lit under our butts and we have been wiring like crazy! First, we are now over 100 twitter posts and 300 twitter followers.. Buzz and Facebook, you guys are way behind!
Second, we have finally gotten a stable 300 baud transmission test working with a simple opamp comparator to shift 1.2v logic to 4.5v logic!!!!!!!!!!

So lets start off with the sketch. This code just decodes serial ‘r’ and turns on the red portion of our tri color LED etc.
void setup() {
Serial.begin(300);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
}
void loop() {
byte val;
if(Serial.available())
{
val=Serial.read();
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
if(val==’r'){digitalWrite(2,LOW);}
if(val==’g'){digitalWrite(3,LOW);}
if(val==’b'){digitalWrite(4,LOW);}
}
}
Our circuit uses an LM324 opamp configured as a comparator (diagram coming soon).
I’m using C# to generate WAV files at 44100 Khz. 44100 is standard PCM/WAV sampling frequency. The only baud that divides evenly is 300bps. We will going for 9600, but we may have to actually write an android program to do that as any interval of 9600 seems to cause the music player to crash.
![IMG_1242[5] IMG_1242[5]](http://www.flakelabs.com/wp-content/uploads/2010/08/IMG_12425_thumb.jpg)
Below is the main WAV generation program. We are using an open source library to generate the actual WAV file. As you can see I generate a WAV file for just about anything. Some of this code was actually ported from the software serial library on the arduino!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using WaveLibrary;
namespace WavGenerator
{
class Program
{
static void Main(string[] args)
{
int rate = 44100;
int baudrate = 300;
int samples = rate / baudrate;
WaveFile f = new WaveFile(1, 8, rate);
List<byte> data = new List<byte>();
for (int i = 0; i < 10; i++)
{
data.AddRange(BuildString("*****************\r\n", samples));
data.AddRange(BuildString("*****************\r\n", samples));
data.AddRange(BuildString("www.flakelabs.com\r\n", samples));
data.AddRange(BuildString("*****************\r\n", samples));
data.AddRange(BuildString("*****************\r\n", samples));
data.AddRange(BuildString("www.sparkfun.com\r\n", samples));
data.AddRange(BuildString("www.hackaday.com\r\n", samples));
data.AddRange(BuildString("www.makezine.com\r\n", samples));
data.AddRange(BuildString("www.xkcd.com\r\n", samples));
}
f.SetData(data.ToArray());
f.WriteFile("FLAKELABS.wav");
f = new WaveFile(1, 8, rate);
data = new List<byte>();
data.AddRange(BuildBit(true, samples*100));
for (byte i = 0; i < 255; i++)
{
data.AddRange(BuildByte(i, samples));
}
data.AddRange(BuildBit(true, samples*100));
f.SetData(data.ToArray());
f.WriteFile("count.wav");
List<byte> cdata = new List<byte>();
f = new WaveFile(1, 8, rate);
cdata.AddRange(BuildBit(true, samples * 100));
for (int i = 0; i < 100; i++)
{
cdata.AddRange(BuildChar('r', samples));
cdata.AddRange(BuildBit(true, samples * 5));
}
cdata.AddRange(BuildBit(true, samples * 100));
f.SetData(cdata.ToArray());
f.WriteFile("red.wav");
cdata.Clear();
f = new WaveFile(1, 8, rate);
cdata.AddRange(BuildBit(true, samples * 100));
for(int i=0;i<100;i++)
{
cdata.AddRange(BuildChar('g',samples));
cdata.AddRange(BuildBit(true, samples * 5));
}
cdata.AddRange(BuildBit(true, samples * 100));
f.SetData(cdata.ToArray());
f.WriteFile("green.wav");
cdata.Clear();
f = new WaveFile(1, 8, rate);
cdata.AddRange(BuildBit(true, samples * 100));
for(int i=0;i<100;i++)
{
cdata.AddRange(BuildChar('b',samples));
cdata.AddRange(BuildBit(true, samples * 5));
}
f.SetData(cdata.ToArray());
cdata.AddRange(BuildBit(true, samples * 100));
f.WriteFile("blue.wav");
cdata.Clear();
}
static byte[] BuildString(string s,int samples)
{
List<byte> data = new List<byte>();
data.AddRange(BuildBit(true,samples));
data.AddRange(BuildBit(true, samples));
data.AddRange(BuildBit(true, samples));
foreach (char c in s)
{
data.AddRange(BuildChar(c,samples));
}
data.AddRange(BuildBit(true, samples));
data.AddRange(BuildBit(true, samples));
data.AddRange(BuildBit(true, samples));
return data.ToArray();
}
static byte[] BuildChar(char c, int samples)
{
return BuildByte((byte)c, samples);
}
static byte[] BuildByte(byte b, int samples)
{
Console.Write("Printing {0} {1} ", b, (int)b);
List<byte> data = new List<byte>();
data.AddRange(BuildBit(false, samples));//start bit
byte mask = 0;
for (byte i = 0; i < 8; i++)
{
mask = (byte)Math.Pow(2, i);
if ((b & mask) == mask)
{
Console.Write("1");
data.AddRange(BuildBit(true, samples));
}
else
{
Console.Write("0");
data.AddRange(BuildBit(false, samples));
}
}
data.AddRange(BuildBit(true, samples));//stop bit
Console.WriteLine();
return data.ToArray();
}
static byte[] BuildBit(bool bit, int samples)
{
byte[] bitdata = new byte[samples];
for (int i = 0; i < samples; i++)
{
if (bit)
{
bitdata[i] = 0;//since the opamp inverts our signal!!!
}
else
{
bitdata[i] = 255;
}
}
return bitdata;
}
}
}
All that’s left if the video and the future. We will be playing with using optoisolators to level shift and are hoping to get greater than 9600 baud out of this thing. Then we will look at what it takes to receive data from arduino. Can anyone tell where we are going? Worlds greatest arduino shield!