250A Lab4 2013
Lab 3: Firmware Programming
- 1 Accelerometer
- 2 Firmware Programming On Arduino
- 3 Custom Communication
- 4 Low-latency sensing
- 5 Make A Musical Interaction
- 6 Optional: Programming Linux
Before we get into changing the arduino code, lets keep using Firmata, and play around with the arduino. To do this, you will first need to solder the header pins onto the accelerometer board. You can do that in the Max Lab so if you are sitting in the computer cluster, get up and go into the Max Lab and get that header soldered. Ask for help if you are new to soldering.
The accelerometer doesn't work using a voltage divider, but it does produce an output voltage that can be connected directly to an analog input of the Arduino. Accelerometers can report on both static and dynamic acceleration -- think of static acceleration as the angle the accelerometer is held with respect to the ground (the acceleration measured here is due to gravity). Dynamic acceleration occurs when you shake the sensor.
The accelerometer in your kit is a 3-axis, +/- 1.5-6g accelerometer sensor (1g is the acceleration due to gravity). You will have to solder on 0.1" header pins to fit this into the breadboard. The connections you need to make are Vin to 5V power from the Arduino , G to ground, and Xo, Yo & Zo to the first three analog input pins on the Arduino board. By default, the acceleration range is set to +/- 1.5g; you could solder on the gsel jumpers if you want less sensitive/greater range with +/- 6g.
Now, get a feel for the data the accelerometer provides. Use the Light Dimmer presets, which will track analog values on A0 and A1. Then pick up the Arduino+accelerometer board and tilt it in various directions. Start by holding it so that the accelerometer board is parallel to the ground. Find in which direction the X reading increases and decreases; do the same for the Y reading.
Next, change the PD patch so that you can also read the Z axis of the accelerometer.
Firmware Programming On Arduino
Compiling and uploading firmware code in the Arduino Program
For this lab, we assume that you will be adapting existing working code for your own applications. While this is certainly easier than writing firmware from scratch, it does require understanding how existing code functions.
- Use the usual procedure (see described before) to power up Satellite CCRMA and login as the user ccrma with the password temppwd.
- Make an empty directory for lab3 using
- Enter the lab3 directory by typing
- Download the first files for the lab using
- Unzip lab3 three with
- Start the Arduino software by typing the command arduino & in the XTerminal to your Satellite. Please upload the following firmware programs from your Arduino program's Examples folders to your Arduino controller and see how they function. Do attach LEDs, buttons, as is appropriate:
* Examples->Digital->Blink * Examples->Digital->BlinkWithoutDelay * Examples->Digital->Button
One reason that you might want to program the Arduino microcontroller is to enable greater control over the communications from the Arduino. In this segment of the laboratory, we learn a wider variety of ways to send data from the Arduino hardware to the computer than we have previously used.
Serial communication with the Arduino Serial Monitor
You might have noticed in the previous lab segment that it can be very hard to know what is going wrong when the Arduino hardware is in autonomous mode. Here, we send serial communications between the Arduino hardware and the Arduino IDE.
- Examples->Analog->Smoothing: Use the Serial Monitor (icon on the far left on the Arduino IDE toolbar) to get data back from the Arduino. When you do this, you'll notice the TX light on the Arduino lights up and stays lit.
The high datarate on the Serial monitor can make the Xwindow for the program freeze. If the Arduino IDE crashes, go to the main terminal and type 'fg' to bring the arduino to the foreground, and then type 'cntl-x, cntl-c' to kill the program. Now add a delay to the loop function to prevent the freeze. What size delay makes for speedy updates but doesn't cause freezing?
- Examples->Communication->SerialCallandResponseASCII. This will show you how to do two-way communication with the Serial Monitor.
Serial communication with PD
Now let's try using serial to communicate with PD.
First let's try outputting information to the Arduino hardware:
- In Arduino, load Examples->Communication->PhysicalPixel
- The PD patch for communicating with this firmware is lab3/physicalpixel.pd.
- You may need to hunt for the right serial port to make this work. Serial port 4 worked for us...
Next let's try getting information from the Arduino hardware:
- In Arduino, load Examples->Communication->Graph
- The PD patch for communicating with this firmware is lab3/Graph.pd
- Again, you need to set the right serial port, ascii/binary, and graph on/off settings.
- Download example firmware for interfacing with a rotary encoder using the command
(Or use scp, Fetch, or your favorite secure FTP program to get encoder2011.zip onto your kit.)
- Extract the ZIP file by typing
- Enter the encoder2011 subdirectory by executing
One final reason that you would want direct control over the Arduino firmware is that you might have very low-latency sensing needs. As an example of this, we show you here how to use encoder input with the Arduino.
- Quit Pd to ensure that Pd isn't using the USB/serial connection to the Arduino.
- Start up the Arduino software using the command arduino & and upload the sketch ~/lab3/encoder2011/encoder/encoder.pde to the Arduino. Then quit the Arduino IDE and start up Pd by typing pd encoder.pd
- Now you need to build this schematic to interface the encoder: http://cm-wiki.stanford.edu/mediawiki/images/c/c1/Encoder_filter.png.
Pin two is the middle pin on the rotary encoder, and pins 1 and 3 are the other directly adjacent pins. It can be a bit difficult to plug the encoder into the solderless protoboard, but you can do it if you straighten out the pins first.
Note: In the schematic, AVR Phase A is digital pin 2 or the Arduino, and AVR Phase B is digital pin 3.
Now you're ready to send out the position of the encoder over the serial bus. The values should start near zero and increase or decrease, depending on which direction you turn the encoder. How are negative numbers represented? Why does the encoder always start near 0 when the program on the Arduino is restarted?
Make A Musical Interaction
As the final main deliverable of the lab, you should use the encoder in the musical interaction that you created for Lab 2. Use the encoder to add an additional parameter of control to the interaction that you have already designed. How much more interesting can you make your sounds with this additional element.
For your musical interaction, you can write your own firmware, or you can use Firmata. If you choose to use Firmata, then you need to re-flash Firmata to the Arduino. (See instructions from Lab 2.)
Start up the Jack audio server by executing the command qjackctl & at the terminal and clicking on the Start button. In order to be able to hear audio, you will need to plug a pair of ear buds, headphones, or loudspeakers into the 1/8" (2.54mm) jack labeled AUDIO OUT on the beagleboard.
It is probably easiest to make your patch by modifying ~/on-startup/windy-day.pd, which Edgar demonstrated in class. To start it up, first change to the directory ~/on-startup by typing cd ~/on-startup in the terminal. Then type pd windy-day.pd & to startup pd.
Don't forget to make a video of your musical interaction!
Optional: Programming Linux
We don't actually expect you to do anything here, we are just providing some more information that is maybe helpful for you linux gurus. Since Satellite CCRMA runs Ubuntu linux on an OMAP chip, many standard software packages have been compiled for it. This is why we were easily able to install software such as Jack, Audacity, ChucK, Faust, Jacktrip, and the Arduino software.
If you are lucky, you can install your favorite software using the apt-get utility. To get a list of packages available on the OMAP's ARM architecture, type
sudo apt-cache pkgnames
You will notice that this list is way too long to look at. You can pipe it to the text file using the command
sudo apt-cache pkgnames > packages.txt
and then look at it using emacs packages.txt, or you search for a particular package, such as
sudo apt-cache pkgnames | grep emacs.
Or, you can compile linux software yourself on the Satellite. The gcc, g++ tools etc. are already installed.
Type the df command. You can see that there is not a whole lot more than 1GB available on the SD card, so you should only install software if you decide that you need it.