arduino programming via soundcard

with lots of study of the AudioBoot_V2_0 java code by chris at roboterclub-freiburg.de, i managed to write supercollider code for uploading sketches to an arduino via the soundcard. no ftdi chip needed!
it's a very cheap solution for programming barebone arduinos (well, atmega168 microcontrollers really). you only need a few resistors, a capacitor and a mega168. the only difficult part is to 'initialize' this microcontroller by burning the special bootloader on to it. this requires an avr programmer of some sort (STK500, USBtinyISP etc).

the preparation steps are as follows...
1. burn the bootloader on to a mega168
2. build the barebone circuit
3. prepare the arduino ide
4. install the RedArduino class

after that one can compile hex files in the arduino ide and upload them using supercollider and a standard audio cable.

1. burn the bootloader on to a mega168

the trick behind all this is the special 'sound enabled' bootloader that i found here... http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=127. i downloaded the AudioBoot_V2_0.zip file and used my stk500 avr programmer together with the great avr crosspack. the terminal command i used for burning the bootloader was the following...

avrdude -v -p m168 -b 115200 -P /dev/tty.PL2303-000013FA -c stk500v2 -U flash:w:/Users/asdf/arbeten/sc/scAudioino/AudioBoot_V2_0/Atmega_Source/chAudioBoot_ATMEGA168_IN_PD1_LED_PB5.hex -U lfuse:w:0xE2:m -U hfuse:w:0xDF:m -U efuse:w:0xFA:m

2. build the barebone circuit

then i built a minimal and barebone arduino circuit after the schematics found here... http://www.hobby-roboter.de/forum/viewtopic.php?f=4&t=128&p=531. again credit to chris.

this is the schematics i drew...

and here the resulting circuit...

i run it off 4,5v (3 batteries) but it could also be powered from the usb port.

3. prepare the arduino ide

to compile hex files for this barebone arduino, i needed to set up a custom board in the arduino ide. one way to do this is to create a new text file called boards.txt and put it inside a new folder in the arduino/hardware folder. on mac osx that could be something like ~/Documents/Arduino/hardware/BareBones/boards.txt. the boards.txt should contain the following...

minimal168.name=ATmega168 bare bone (internal 8 MHz clock)

then restart the arduino ide and under boards there should be a new option with mega168 and 8mhz internal clock. i make sure this board is selected every time before compiling hex files for sound uploading.
another thing that needs to be done is to enable 'verbose compile' in the arduino ide preferences. that will print out the file path of the hex file each time you compile a sketch.

4. install the RedArduino class

i wrote a couple of classes for supercollider to help with the encoding and signal generation of hex files. they're found in my redSys quark (under redTools) and are most easily installed from within supercollider itself with these commands...

Quarks.install("redSys");       //install. recompile after this

there are two helper classes and one main class. the RedIntelHex class parses hex files and RedDifferentialManchesterCodeNegative helps to encode the signal as differential manchester code. the main class RedArduino figures out the paging of data and generates a bit stream that is played back using demand rate ugens.


i upload sketches by compiling them in arduino ide (click verify - not upload) and copy&paste the file path of the resulting hex file into supercollider and the RedArduino's read method. i connect the left sound output channel to the barebone arduino, put my mac volume to ~80%. last i press the reset button on the circuit and quickly (within seconds) call the upload method in sc. the led should blink slowly directly after a reset, and fast when receiving data.

here's a video demonstrating how to do it. i'm just uploading the simple Blink example. near the end you will also hear how that sounds.

audioino from redFrik on Vimeo.

there's also some sc code i wrote here that will do the same thing but without the need of the redSys quark classes.

trash or treasure

some weeks ago i found a canon pixma MP510 on the street. a "Photo All-in-One with economical single inks that prints, copies or scans in colour". someone had thrown it away regarding it as a piece of junk. i saw a pile of gold.

taking it apart i got...
* four really nice motors: two steppers and two dc motors
* a 33x25 cm piece of glass
* boxed and reusable 220v powersupply
* a small lcd colour display
* a scanner head
* some leds
* five infrared sensors (paper sensors)
* lots of screws and springs
* wire and cog belts
* some switch buttons
* two usb jacks
* various other components

alike http://makezine.com/projects/dont-waste-ewaste-unmaking-a-canon-printerscannerfax-into-parts/

usb soundcards mod

to save a bit of power (and annoyance), i de-soldered the leds on two usb soundcards. i use these soundcards for battery driven projects (beaglebone black) and every milliamp i can save counts.
the logilink soundcard had two easily removable leds. the red one indicated that the soundcard was connected and had power, and the green one started to blink when the card was in use (driver activated). both functions i can easily live without.
the blue '3d-sound' card had a very tiny surfacemount led that i removed using two soldering irons.

here some before and after photos...

btw, i'd stay away from the logilink. it has a problem with audible noise coming from the pwm signal of the green blinking led. if you connect a mic like i'm doing, a beep beep beep kind of sound leaks into the mic. and removing the led doesn't help. maybe there's something in the software driver to control it, but i doubt it.


a tiny circuit i designed and built in five copies for dancer Raffaella Galdi. with the help of a small magnetic sensor this circuit makes it possible to start and stop sound coming from a mp3 player. because the five circuit boards, speakers and mp3players are mounted inside pointy hats, the electronics had to be light and draw very little current from the battery.
for the sound volume control i used a vactrol (ldr+led) and the timing and fade in/out logic are encoded in the firmware of a little microcontroller (ATtiny45). to save battery, the tiny45 is put to sleep and is only active when the magnetic reed sensor is triggered. i used the great JeeLib.h for controlling the sleep cycles of the microcontroller.

schematics, firmware and partslist attached below.

Package icon hats.zip29.15 KB


wireless sensor for embroidery.

the sensor is a tilt compensated compass i.e. a 3d accelerometer in combo with a 3d magnetometer. compared to my other wireless boxes, this one runs on 3.0V (two AAA batteries) and not 3.6V. this due to the LSM303DLH sensor's lack of onboard voltage regulators and 1.8V i2c data lines.
the mega168 has an arduino sketch loaded as firmware and is using the internal 8mhz oscillator. so the circuit is pretty minimal.

as part of the project knyppel with ann rosén. also see this post.

schematics, arduino firmware, partslist, maxpatches, supercollider class attached.

Package icon broderi.zip57.14 KB

soft modem

this summer i build 8 small circuits that can control a bunch of leds (6 channels pwm) from basically any idevice or android phone. the circuit connects to the audio jack of the phone and uses the right channel to send data commands (in the form of a modem signal).

we use rjdj (and pdlib, supercollider, etc) to generate the data signal on the phone in realtime. and it's relatively easy to connect for example the built-in accelerometer in the phone to control some leds, or to run amplitude/pitch tracking on the microphone and let that flash some leds.

the circuits will be used in the rhyme research project as well as in the upcoming e-textile workshop in oslo (oct 2011).

the design is based on SoftModem by arms22. attached below are my schematics, pd fsk abstraction and arduino firmware.

the modem signal is generated using frequency-shift keying and here's how to do that in supercollider...

c= "how are you?";
{var t= 1/1225; var m= Duty.ar(Dseq([t*100]++t.dup(11*c.size)), 0, Dseq([1]++c.ascii.collect{|cc| [0]++(cc.asBinaryString.ascii-48).reverse++[1, 1]}.flat), 2); SinOsc.ar(m*(7350-4900)+4900)!2}.play(fadeTime:0);

this will send the characters "how are you?" at a baudrate of 1225. this is of course not a valid command for the circuit above, just something to demonstrate how it sounds. below is an mp3...

Package icon softModem.zip61.64 KB


things to do with an ipod case... instead of throwing it away, i took some spare parts and built a new synth based on my monijonsyn2. the new synth has a push-button and one can now step through a few different programs. and the 2-way switch set different 'modes'. in this 1.0 version there is only 3 programs and 2 modes.
the programs basically just maps the 3 analog inputs differently, and the modes switches left/right output channels.

it's very cheap and easy to build. 2 aa-batteris provide power, the inputs are 3 touch points, 2 potentiometers, 1 button and a combined on/off/mode switch. all the sound generation (2 pwm pins) and program logic happens inside the 8bit avr mega8 chip and the code is easy to hack (see main.c in the zip below).

todo: add more fun programs to the firmware

monijonsyn3 from redFrik on Vimeo.

Package icon monijonsyn3.zip13.97 KB


Subscribe to RSS - electronics