⚠️ WARNING: This page is obsolete
Articles typically receive this designation when the technology they describe is no longer relevant, code
provided is later deemed to be of poor quality, or the topics discussed are better presented in future
articles. Articles like this are retained for the sake of preservation, but their content should be
critically assessed.
Sometimes it’s tempting to re-invent the wheel to make a device function exactly the way you want. I am re-visiting the field of homemade electrophysiology equipment, and although I’ve already published a home made electocardiograph (ECG), I wish to revisit that project and make it much more elegant, while also planning for a pulse oximeter, an electroencephalograph (EEG), and an electrogastrogram (EGG). This project is divided into 3 major components: the low-noise microvoltage amplifier, a digital analog to digital converter with PC connectivity, and software to display and analyze the traces. My first challenge is to create that middle step, a device to read voltage (from 0-5V) and send this data to a computer.
This project demonstrates a simple solution for the frustrating problem of sending data from a microcontroller to a PC with a USB connection. My solution utilizes a USB FTDI serial-to-usb cable, allowing me to simply put header pins on my device which I can plug into providing the microcontroller-computer link. This avoids the need for soldering surface-mount FTDI chips (which gets expensive if you put one in every project). FTDI cables are inexpensive (about $11 shipped on eBay) and I’ve gotten a lot of mileage out of mine and know I will continue to use it for future projects. If you are interested in MCU/PC communication, consider one of these cables as a rapid development prototyping tool. I’m certainly enjoying mine!
It is important to me that my design is minimalistic, inexpensive, and functions natively on Linux and Windows without installing special driver-related software, and can be visualized in real-time using native Python libraries, such that the same code can be executed identically on all operating systems with minimal computer-side configuration. I’d say I succeeded in this effort, and while the project could use some small touches to polish it up, it’s already solid and proven in its usefulness and functionality.
This is my final device. It’s reading voltage on a single pin, sending this data to a computer through a USB connection, and custom software (written entirely in Python, designed to be a cross-platform solution) displays the signal in real time. Although it’s capable of recording and displaying 5 channels at the same time, it’s demonstrated displaying only one. Let’s check-out a video of it in action:
This 5-channel realtime USB analog sensor, coupled with custom cross-platform open-source software, will serve as the foundation for a slew of electrophysiological experiments, but can also be easily expanded to serve as an inexpensive multichannel digital oscilloscope. While more advanced solutions exist, this has the advantage of being minimally complex (consisting of a single microchip), inexpensive, and easy to build.
Below is a simplified description of the circuit that is employed in this project. Note that there are 6 ADC (analog to digital converter) inputs on the ATMega48 IC, but for whatever reason I ended-up only hard-coding 5 into the software. Eventually I’ll go back and re-declare this project a 6-channel sensor, but since I don’t have six things to measure at the moment I’m fine keeping it the way it is. RST, SCK, MISO, and MOSI are used to program the microcontroller and do not need to be connected to anything for operation. The max232 was initially used as a level converter to allow the micro-controller to communicate with a PC via the serial port. However, shortly after this project was devised an upgrade was used to allow it to connect via USB.
Below you can see the circuit breadboarded. The potentiometer (small blue box) simulated an analog input signal.
The lower board is my AVR programmer, and is connected to RST, SCK, MISO, MOSI, and GND to allow me to write code on my laptop and program the board. It’s a Fun4DIY.com AVR programmer which can be yours for $11 shipped! I’m not affiliated with their company, but I love that little board. It’s a clone of the AVR ISP MK-II.
As you can see, the USB AVR programmer I'm using is supported in Linux. I did all of my development in Ubuntu Linux, writing AVR-GCC (C) code in my favorite Linux code editor Geany, then loaded the code onto the chip with AVRDude.
I found a simple way to add USB functionality in a standard, reproducible way that works without requiring the soldering of a SMT FTDI chip, and avoids custom libraries like V-USB which don't easily have drivers that are supported by major operating systems (Windows) without special software. I understand that the simplest long-term and commercially-logical solution would be to use that SMT chip, but I didn't feel like dealing with it. Instead, I added header pins which allow me to snap-on a pre-made FTDI USB cable. They're a bit expensive ($12 on ebay) but all I need is 1 and I can use it in all my projects since it's a sinch to connect and disconnect. Beside, it supplies power to the target board! It's supported in Linux and in Windows with established drivers that are shipped with the operating system. It's a bit of a shortcut, but I like this solution. It also eliminates the need for the max232 chip, since it can sense the voltages outputted by the microcontroller directly.
The system works by individually reading the 10-bit ADC pins on the microcontroller (providing values from 0-1024 to represent voltage from 0-5V or 0-1.1V depending on how the code is written), converting these values to text, and sending them as a string via the serial protocol. The FTDI cable reads these values and transmits them to the PC through a USB connection, which looks like "COM5" on my Windows computer. Values can be seen in any serial terminal program (i.e., hyperterminal), or accessed through Python with the PySerial module.
As you can see, I’m getting quite good at home-brewn PCBs. While it would be fantastic to design a board and have it made professionally, this is expensive and takes some time. In my case, I only have a few hours here or there to work on projects. If I have time to design a board, I want it made immediately! I can make this start to finish in about an hour. I use a classic toner transfer method with ferric chloride, and a dremel drill press to create the holes. I haven’t attacked single-layer SMT designs yet, but I can see its convenience, and look forward to giving it a shot before too long.
Here’s the final board ready for digitally reporting analog voltages. You can see 3 small headers on the far left and 2 at the top of the chip. These are for RST, SCK, MISO, MOSI, and GND for programming the chip. Once it’s programmed, it doesn’t need to be programmed again. Although I wrote the code for an ATMega48, it works fine on a pin-compatible ATMega8 which is pictured here. The connector at the top is that FTDI USB cable, and it supplies power and USB serial connectivity to the board.
If you look closely, you can see that modified code has been loaded on this board with a Linux laptop. This thing is an exciting little board, because it has so many possibilities. It could read voltages of a single channel in extremely high speed and send that data continuously, or it could read from many channels and send it at any rate, or even cooler would be to add some bidirectional serial communication capabilities to allow the computer to tell the microcontroller which channels to read and how often to report the values back. There is a lot of potential for this little design, and I'm glad I have it working.
Unfortunately I lost the schematics to this device because I formatted the computer that had the Eagle files on it. It should be simple and intuitive enough to be able to design again. The code for the microcontroller and code for the real-time visualization software will be posted below shortly. Below are some videos of this board in use in one form or another:
Here is the code that is loaded onto the microcontroller:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void readADC(char adcn){
//ADMUX = 0b0100000+adcn; // AVCC ref on ADCn
ADMUX = 0b1100000+adcn; // AVCC ref on ADCn
ADCSRA |= (1<<ADSC); // reset value
while (ADCSRA & (1<<ADSC)) {}; // wait for measurement
}
int main (void){
DDRD=255;
init_usart();
ADCSRA = 0b10000111; //ADC Enable, Manual Trigger, Prescaler
ADCSRB = 0;
int adcs[8]={0,0,0,0,0,0,0,0};
char i=0;
for(;;){
for (i=0;i<8;i++){readADC(i);adcs[i]=ADC>>6;}
for (i=0;i<5;i++){sendNum(adcs[i]);send(44);}
readADC(0);
send(10);// LINE BREAK
send(13); //return
_delay_ms(3);_delay_ms(5);
}
}
void sendNum(unsigned int num){
char theIntAsString[7];
int i;
sprintf(theIntAsString, "%u", num);
for (i=0; i < strlen(theIntAsString); i++){
send(theIntAsString[i]);
}
}
void send (unsigned char c){
while((UCSR0A & (1<<UDRE0)) == 0) {}
UDR0 = c;
}
void init_usart () {
// ATMEGA48 SETTINGS
int BAUD_PRESCALE = 12;
UBRR0L = BAUD_PRESCALE; // Load lower 8-bits
UBRR0H = (BAUD_PRESCALE >> 8); // Load upper 8-bits
UCSR0A = 0;
UCSR0B = (1<<RXEN0)|(1<<TXEN0); //rx and tx
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); //We want 8 data bits
}
Here is the code that runs on the computer, allowing reading and real-time graphing of the serial data. It’s written in Python and has been tested in both Linux and Windows. It requires NO non-standard python libraries, making it very easy to distribute. Graphs are drawn (somewhat inefficiently) using lines in TK. Subsequent development went into improving the visualization, and drastic improvements have been made since this code was written, and updated code will be shared shortly. This is functional, so it’s worth sharing.
import Tkinter, random, time
import socket, sys, serial
class App:
def white(self):
self.lines=[]
self.lastpos=0
self.c.create_rectangle(0, 0, 800, 512, fill="black")
for y in range(0,512,50):
self.c.create_line(0, y, 800, y, fill="#333333",dash=(4, 4))
self.c.create_text(5, y-10, fill="#999999", text=str(y*2), anchor="w")
for x in range(100,800,100):
self.c.create_line(x, 0, x, 512, fill="#333333",dash=(4, 4))
self.c.create_text(x+3, 500-10, fill="#999999", text=str(x/100)+"s", anchor="w")
self.lineRedraw=self.c.create_line(0, 800, 0, 0, fill="red")
self.lines1text=self.c.create_text(800-3, 10, fill="#00FF00", text=str("TEST"), anchor="e")
for x in range(800):
self.lines.append(self.c.create_line(x, 0, x, 0, fill="#00FF00"))
def addPoint(self,val):
self.data[self.xpos]=val
self.line1avg+=val
if self.xpos%10==0:
self.c.itemconfig(self.lines1text,text=str(self.line1avg/10.0))
self.line1avg=0
if self.xpos>0:self.c.coords(self.lines[self.xpos],(self.xpos-1,self.lastpos,self.xpos,val))
if self.xpos<800:self.c.coords(self.lineRedraw,(self.xpos+1,0,self.xpos+1,800))
self.lastpos=val
self.xpos+=1
if self.xpos==800:
self.xpos=0
self.totalPoints+=800
print "FPS:",self.totalPoints/(time.time()-self.timeStart)
t.update()
def __init__(self, t):
self.xpos=0
self.line1avg=0
self.data=[0]*800
self.c = Tkinter.Canvas(t, width=800, height=512)
self.c.pack()
self.totalPoints=0
self.white()
self.timeStart=time.time()
t = Tkinter.Tk()
a = App(t)
#ser = serial.Serial('COM1', 19200, timeout=1)
ser = serial.Serial('/dev/ttyUSB0', 38400, timeout=1)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
while True:
while True: #try to get a reading
#print "LISTENING"
raw=str(ser.readline())
#print raw
raw=raw.replace("n","").replace("r","")
raw=raw.split(",")
#print raw
try:
point=(int(raw[0])-200)*2
break
except:
print "FAIL"
pass
point=point/2
a.addPoint(point)
If you re-create this device of a portion of it, let me know! I’d love to share it on my website. Good luck!
I’m staring deeply into a large, ominous, empty white text box on my screen as a small vertical text cursor blinks, staring back at me. I faintly remember writing my first blog entry eleven years ago (to the week), as a 15 year old kid typing on a keyboard in the middle of the night. Every time I log-in to write on my website, I see the same cursor, monotonous in its dependable, unvarying appearance. What does the cursor see in me? Definitely not the same person it saw the last time I logged-in. What collection of words can even begin to describe the jumble that’s in my head? My name is Scott Harden, my future is changing before my eyes, and I’ve chosen to use this website to continue to document my life as it unfolds.
It’s been 298 days since I’ve last written. For anyone who’s been through a hard time, part of getting better is acting like ones self again. For me, that’s doing the things that I used to do: designing circuits, writing code, building radios, and documenting my projects on my website. Me, starting to write again - forcing myself to write again - is a step in a positive direction, and an indication that I am starting to be okay. My intention is to resume building and sharing projects on this website like I used to.
I feel it is important to address some of the recent changes in my life in a clear manner. I don’t want to just resume posting code and pictures of circuits all the sudden without acknowledging the serious issues that I’ve dealt with and am continuing to deal with. It’s important that it’s obvious that (a) these things happened, (b) I’m working to be okay with them, and (c) I’m not ignoring them. I have noticed that ignoring serious issues by pretending that they do not exist is one of the most dangerous and destructive coping mechanisms a person can exhibit. People behave this way around me often, but I, in an effort to improve my situation, refuse to ignore my challenges. I will attempt to describe a few of the highlights of the last several months of my life. It’s certainly not an exhaustive list, but it touches on a few of the significant experiences I have gone through, changes which have affected me, and a few of the events that made me happy since I last wrote here.
I began a new Ph.D. program in Neuroscience through the Interdisciplinary Program in Biomedical Science through the College of Medicine at the University of Florida. I am currently in my 4th year of dental school (in my 10th year of college currently), and I’m considering starting a new program from scratch. Rather than throw-away my dental degree (which I’ve been working on for several years and spent quite a lot of money to pursue), I am seeking a combined D.M.D/Ph.D. degree. This will allow me to graduate with a degree in dental medicine (D.M.D.) through the UF College of Dentistry about the same time I get my Ph.D. in Neuroscience through the UF College of Medicine. I begin this August, and I couldn’t be more excited. As my Google Scholar author page reports, I’ve had excellent research experience in the past, and I’m eager to begin life again as a biomolecular graduate student. I have yet to decide the specific direction of my research, but if I could do anything in the world, I would try to find a project which lets me dip into bioinformatics.
It looks like I’m kind of sick. To make a long story short, I’m in a strange diagnostic limbo where it’s looking like I may have a pretty serious, rare, and somewhat difficult to diagnose form of cancer (stage 4 peripheral T-cell lymphoma), but at the same time it seems there is a chance it could be a weird, rare ailment that’s not as serious (an obscure autoimmune condition or abnormal presentation of chronic infection). The type of cancer it is currently proposed to be is pretty bad, and people usually don’t live too long after their diagnosis. Intriguingly, my symptoms and clinical presentation don’t reflect the rapidly destructive nature commonly associated with this disease, leaving open the possibility that it might not be that form of cancer after all. I have hard, enlarged lymph nodes (with abnormal histology demonstrated by 1 needle biopsy and 2 separate surgeries) in all quadrants of my body, and have a lot of fatigue (which I combat with large volumes of coffee). Other than that, I’m relatively normal (physically, at least). The picture to the right is me on the first visit to the oncologist. I didn’t take it too seriously. I kept thinking (and still do to some degree) there’s no way it could be that bad. I mean, who my age gets sick like this? And right on the heels of losing my wife? It’s too coincidental, it can’t be that serious! Realistically we still don’t know for sure exactly what it is, and it’s too early to tell how this will affect my life. It’s a strange experience grappling with the idea that I might only live a few more years, knowing at the same time that my cancer might not be that bad and I may have a long, relatively normal life. I will know more a few months from now. In the mean time, I’m content planning my life as if I will be completely fine (which is certainly may be the case), and if I get sick along the way I’ll re-evaluate my situation if the need arises. For now, I’m quite positive. If anyone were to get a one in a million disease and get through it unscathed, it would be me!
I’ve had some interesting medical experiences over the last few months. The left image is my PET CT, which depicts active metabolism. I was injected with radioactive glucose, and the tissues that work hard absorb it and appear as “hot” on the image. I was lying down (for about 30 minutes), so the only active organs should be my heart and brain. The kidneys/bladder are illuminated because it filtered some of the material from the blood. Actively growing tumors also uptake glucose, and are labeled on this image. While the majority of my tumors are benign and slow growing, this image shows a few rapidly growing tumors: one on my upper right leg (which was removed with surgery #1, second picture), one small one at the base of my neck (which was removed with surgery #2, third picture), and a few scattered ones under each of my arms. The active ones were removed to aid in diagnosis, and it’s not feasible to remove all of the affected lymph nodes. The last picture shows me after my most recent surgery coming out of anesthesia. I don’t even remember it being taken - I was pretty out of it at the time, as you can infer from the photo :)
Many people have asked how I have been doing since Angelina died. Unexpectedly losing a spouse at any age is difficult, but at such a young age (I was 25, she was 24, we were married for 4 years) it’s even harder to rationalize sometimes. No words I write can even begin to describe the complex array of emotions I carry. Although I wish things had turned-out differently, I still feel fortunate to have had Angelina in my life, and I know unquestionably that I am a better person for having known her, and am thankful we got to share as much as we did. The picture on the right is the last one I have of us together. (I’m in the blue shirt, she’s in the black shirt). It was taken about two weekends before she died. We went with a group of my dental school classmates to Islands of Adventure (part of Universal Studios) in Orlando. If you had told me then that I would be a widower in a couple weeks, I couldn’t have even begun to comprehend it. I will always miss her, but I know that she would not want me to destroy my life because she is gone. In a note she wrote for me the day she died, she said “I love you, Scott, more than you will ever know.” It’s a phrase I remember and repeat in my mind every day, and it’s given me comfort over the last several months. I know that I will always carry part of her with me.
Several people have e-mailed me in concern due to the fact that I had stopped posting over the last few months. Again, I was surprised and honored the unexpected support I’ve been getting over the internet from people I don’t really even know. The following quote is one that came in this morning, “It has been a while since I have last visited and I really hope you’re doing OK since your last post. I can’t pretend to remotely know how you feel, even with the time that has passed since then. Just wanted to say I wish you well and miss your posts. All I can say is that I know that there have been periods of time in my life where I put down the soldering iron due to life… even for a couple of years. But, I always come back around because its part of who I am… and I hope it will be for you as well. –Jeremy”
The truth is, when Angelina died, life stopped. I stopped answering email, I stopped adding to my website, I stopped making phone calls, I even distanced myself from my own family for a while. Slowly, one by one, I’m resuming these activities. A few months ago, I unpacked my electronics workstation in my new apartment. It was a little premature, as I only worked at my station 1 day and took a few more months before I came back to it, but now it’s a weekly process. For a long time I felt guilty even thinking about picking-up my silly projects again. I felt that, after everything she and I had gone through, it seemed fickle. With a little time and some self-reflection, I realized that Angelina encouraged me to do these things throughout our marriage. I remember her telling me that she went to college and bragged “my husband is on Hackaday”. I told her that my academic publications on PubMed are more impressive, and I’ll always remember her response: “Yeah, but you get more excited every time you make it on hack-a-day”. I remember this and remind myself that, if she were here, I think she’d still continue to encourage me to do what I enjoy. While silly little projects might not seem significant, they do make me happy, and I think she would be proud of me for working on them.
Angelina left a few special reminders on my workbench. A few months after she died, and as I would unpacking my workstation again, I noticed a carving she made in my workbench. I almost threw away this table when I moved, and I’m so glad I didn’t. I think Angelina carved it with a car key, probably on the day this post was made, when I left her unattended for a while soldering at my station. I also found a message she wrote on my roll of solder. I didn’t remember seeing it before, so I imagine it was something she wrote the last few days she was alive. It is really special to me.
One of the things I’ve done that’s really helped me a lot is to get out of my comfort zone a little bit and go places and do things I’ve never done before, often on a whim. This has led me to have a lot of a lot of fantastic experiences, and give me some new things to occupy myself with and remind me that there’s still a lot of life out there left to live. Over the last several months, I tried to minimize the amount of time I spent doing things I’d done before. I noticed that the more time I spent doing the same old things, the more I felt like a part of me was missing, and the worse I felt. Changing scenery and being in new places, it felt less like something was missing, and began letting me establish the feeling of being okay on my own. I stayed away from Gainesville as much as I could, stayed away from family as much as I could (sorry mom and dad if you read this one day), and kept the amount of time I spent interacting with my old friends from dental school to a minimum. For some reason, nothing made me feel worse inside than being around my old environment, and avoiding it for a while was my way of trying to heal. For several months, this behavior was the only thing that made me feel better. Luckily, within the last few weeks, things have started to settle down, and I’m a little more comfortable settling-back into some of my old environments. I’m going to toss-in a collection of random photos from the last several months. I’m not going to describe them in detail - it’s more an indication that yes, I’m alive, and yes, I’m getting out there a little. A few days after my wife died, I got a new apartment and moved in with a dental school classmate. His name is Ray, and he’s a pretty cool guy. I’m very lucky to have him. He moved out of his old apartment and into my apartment in less than a week’s notice.
I marched in the UF homecoming parade with the University of Florida Gator Amateur Radio Club.
I participated in the “out of the darkness” walk for suicide awareness sponsored by the Suicide Survivors of Northeast Florida group.
I operated as net control for Gator Amateur Radio Society during the 5 points of life “relay for life” marathon (official site).
I practiced advanced suturing techniques utilizing a pig jaw. I actually messed it up pretty badly… oops? Next time I’ll do it on a person. Scary, right?
Here’s a picture with me beside my friend Bill, W4HBK. He and his wife were wonderfully kind in offering me a place to stay over a portion of the Christmas break. Bill is a fellow QRSS’er (who mans the Pensacola Snapper) and we had a great time working with antennas, looking at QRP equipment, and testing 160M WSPR. It seemed like a random thing for me to do (drive 6 hours to spend several days with a family I hadn’t met before), but was a wonderful experience and I am thankful to both of them.
I started getting into electronics again a couple months ago. I learned how to etch PCBs at home (using the toner transfer method with hot ferric chloride) and am making digital QRSS transmitter designs. My signal is the one that looks drunk, swerving all over the QRSS road. The picture of me by a fence was in Ocala at a gokart racetrack. It was the week I found out I was sick. Also pictured is my QRSS transmitter, a somewhat novel design using no potentiometers. The oscillator is a 74HC240 with a varactor diode, allowing frequency adjustment via a potentiometer, and a lowpass-filtered PWM line from the microcontroller to provide modulation. The degree of modulation is adjustable via the second potentiometer.
I get my hair cut in my friend’s kitchen. His name is Don and he is a dental student too. My hair cuts are $5.
I operated the W4DFU radio station during the CQWW contest.
I also visited a museum. Can you believe I went my entire life without ever actually seeing a dinosaur skeleton in person?
The photo from space is the result of a a successful retrieval of a camera that was launched back in August. It was placed on a high altitude balloon launched the same day Angelina and I drove to Orlando for the weekend (the next day the photo of us above was taken). It took photos as it ascended, then landed, and it was lost for several months. Some boys playing in the woods found it and gave it to their mom, who contacted us. The photos are pretty impressive, and I’ll post details in a future entry.
This picture of me sitting on the couch is from Christmas at a big family get-together. That was an experience. Like I mentioned above, my wife’s death hurts the most when I’m in a place where I feel she should be. When I do “old things”, and go to the places we used to go together, and be in situations where we always were together, her absence is unignorably overwhelming and painful. I imagine holidays will continue to hurt for a while. I don’t know how I got this photo, did my sister take it? Anyhow, that’s how that goes.
Transitioning back into internet productivity, I will share some code which I utilized to create today’s entry. I wanted to rapidly browse through numerous high resolution images to choose which ones to share, but pressing the left and right arrows was too slow (some of the large images took 5+ seconds to load). I therefore copied all of the images (*.jpg) created within the last 6 months and copied them into a single folder. I whipped-up a script to use ImageMagick’s convert feature (which is available for linux and windows) to create 300px wide thumbnails and place them on a static HTML page for viewing in a browser. Each thumbnail was clickable, revealing the original, large image. Below is the script I used to do this.
import os
out="<html><body>"
fnames=os.listdir("./")
fnames.sort() # alphabetize them
for fname in fnames:
if ".jpg" in fname or ".JPG" in fname:
if "sml_" in fname: continue
cmd="convert -resize 300 %s sml_%s"%(fname,fname)
print cmd #note that this requires ImageMagik installed
os.system(cmd)
out+='<a href="https://swharden.com/static/2012/06/13/%s">'%(fname)
out+='<img src="https://swharden.com/static/2012/06/13/sml_%s"></a><br>'%(fname)
out+='%s<br><br><br>n'%(os.path.split(fname)[1])
out+="</body></html>"
f=open("pics.html",'w')
f.write(out)
f.close()
print "DONE"
What do I plan to do from here? I’m starting my PhD program in August, and I plan to hit it hard. I feel lucky that I have the opportunity to study biomedical science again. I’m holding my breath for it to start, and am looking forward to having something academically and intellectually challenging to devote myself to. I plan to continue making my electronics and programming projects, and publishing them here on my website. If my health changes, it all might change, but I’m holding out that I’ll be okay. All in all, I’ve lived through an unbelievably rough year, but I look forward to getting back into the game.
⚠️ WARNING: This page is obsolete
Articles typically receive this designation when the technology they describe is no longer relevant, code
provided is later deemed to be of poor quality, or the topics discussed are better presented in future
articles. Articles like this are retained for the sake of preservation, but their content should be
critically assessed.
It’s been my goal for quite some time to design a simple, easy-to-replicate transmitter for high altitude balloon telemetry transmission. I’m quite satisfied by what I came up with because it’s very simple, cheap, easy to code for, and easy to change frequency. I’d say the most common alternative is a handheld amateur radio transmitter which starts around $60, requires an amateur radio license, and typically output 5W of FM on 144MHz (2m) or 440MHz (70cm). Fancier handheld radios are capable of transmitting APRS packets, and use established base station repeaters to listen to these frequencies, decode the packets, and update an internet database about current location information. Although it’s quite fancy, elegant, and technical (and expensive), I desire a much simpler, cheaper, disposable option! If my balloon lands in the Atlantic ocean, I don’t want to be out $100+ of radio equipment! This alternative is about $7.
Here’s my solution. I don’t normally build things on perf-board (I prefer sloppy Manhattan construction), but since this might go near the edge of space and be jerked around in turbulent winds, I figured it would be a nice and strong way to assemble it. Anyhow, it uses a can crystal oscillator as the frequency source. These things are pretty cool, because they’re very frequency stable, even with changing temperatures.
The can oscillator (28.704MHz, selected to be in a rarely-used region of the 10m amatuer radio allocation which I’m licensed to use, call sign AJ4VD) outputs 5V square waves which I use to drive two successive class C amplifiers. The signal can be shunted to ground between the two stages by a third “control” transistor, which allows micro-controller control over the final amplifier. Although it may have seemed logical to simply supply/cut power from the oscillator to key the transmitter, I decided against it because that can oscillator takes 20ms to stabilize, and I didn’t think that was fast enough for some encoding methods I wish to employ!
Although during my tests I power the device from my bench-top power supply (just a few LM3805 and LM3812 regulators in a fancy case), it’s designed to be run off 3xAAA batteries (for logic) and a 9V battery (for the transmitter). I could have probably used a regulator to drop the 9V to 5V for the MCU and eliminated some extra weight, but I wonder how low the 9V will dip when I draw a heavy RF load? The 3xAAAs seemed like a sure bet, but quite at the expense of weight. I should consider the regulator option further… [ponders]
There’s the device in action while it was in a breadboard. I’ve since wired it up in a perf board (pictured) and left it to transmit into a small string of wire inside my apartment as an antenna as I went to the UF Gator Amateur Radio Club (a few miles away) and tried to tune into it. It produced a stunningly beautiful signal! I can’t wait for its first test on a high altitude balloon! Here it’s transmitting CW Morse code the words “scott rocks”, separated by appropriate call sign identification every 10 minutes, AJ4VD, my amateur radio license… of course!
Above is what the audio sounded like with a narrow CW filter (awesome, right?), and a 3KHz wide USB configuration. I think this should be more than enough to carry us through a mission, and aid in direction finding of a landed payload!
Notes about filtering: The output of this transmitter is quite harmonic-rich. The oscillator produces square waves for goodness’ sake! The class C amplifier smooths a bit of that out, but you still need some low-pass filtering, not shown on the schematic. I think for my purposes a 3-pole Chebyshev filter will suffice, but just keep this in mind in case you replicate my design. You certainly don’t want to be transmitting out of band! Below is the output of the transmitter viewed on my scope. It’s suspiciously smooth, which leads me to wonder about the accuracy of my scope! I really should get a spectrum analyzer.