Difference between revisions of "250a Firmware Lab"

From CCRMA Wiki
Jump to: navigation, search
m (Removed all occurences of "Sketchbook", because "Examples" is not in the Sketchbook)
 
(50 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<font size=5>Lab 3: Beagleboard and Firmware Programming</font><br>
+
<font size=5>Lab 3: Firmware Programming</font><br>
Due on Wednesday, October 13th at 5PM
+
See [https://ccrma.stanford.edu/courses/250a/schedule.html this quarter's schedule] for due dates.
  
For this lab you need your [[MaxKit]], and Pd on a computer. During this lab, you will assemble your ccrma@satellite kit and start to use it.
+
For this lab you need your [[MaxKit]], with your Satellite CCRMA .  
  
  
== The ccrma@satellite setup ==
+
== Firmware Programming On Arduino ==
First, you'll need to set up your beagleboard, USB hub, and breadboard on a foamcore base. Included in your kit, you should have:
+
=== Compiling and uploading firmware code in the Arduino Program ===
- White USB hub with RJ45 Ethernet jack
+
- Beagleboard
+
- A 4GB SD card to plug into the beagleboard
+
- One 5V power adaptor (for the USB hub)
+
- One Ethernet cable
+
- Arduino Nano (from your kit)
+
- Two GT Max adjustable-length USB cables
+
  
If you are missing something, please go get it before assembling your kit. Use one USB cable to connect the Arduino to the hub, and use the other USB cable to connect the beagleboard to the hub (only to provide power).
+
For this class, 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.  
  
[[Image:SatellitePhoto3.JPG]]
+
* Use the usual procedure (see [https://ccrma.stanford.edu/wiki/Software_Lab_250 described before]) to power up Satellite CCRMA and login as the user ''ccrma'' with the password ''temppwd''.
  
== Powering Up For The First Time ==
+
* Make an empty directory for lab3 using
Plug the power cable from the 5V supply into the hub. You will see some lights turn on, flickering every now and then. This means that ccrma@satellite is booting up.
+
  
=== Connect To ccrma@satellite ===
+
''mkdir ~/lab3''
In order to see what your ccrma@satellite kit is doing, you need to log in to it. To do so, connect the USB hub to your laptop using the Ethernet cable and [https://ccrma.stanford.edu/wiki/CCRMA_Satellite_How_To_Connect remotely open an SSH window on ccrma@satellite].
+
  
=== Avoid Powering Down the Board Without Halting it First! ===
+
* Enter the lab3 directory by typing
Would you take the battery out of your laptop and unplug its power adaptor without shutting down? ''I don't think so!'' The same goes for ccrma@satellite because it is a small computer running linux. If you power if off without shutting down, then you can corrupt the files on the SD card, which in the worst case could cause it to stop booting up anymore, and we would have to burn you a new SD card! So just remember this: '''HALT ccrma@satellite BEFORE DISCONNECTING IT FROM ITS POWER!'''
+
  
Now we will test the halt procedure. Run the halt command as superuser by typing ''sudo halt'' at the ccrma@satellite prompt. Then you will again have to type in the password ''temppwd'' in order to have the privilege to run this command. The SSH connection will be closed, but it will still be 20 seconds or so before ccrma@satellite has completely shut down. (Note: The command ''sudo reboot'' would instead have caused ccrma@satellite to reboot itself.)
+
''cd ~/lab3''
  
Wait an extra entire minute to ensure that ccrma@satellite is shut down. However, it will not power itself off. To do this, you need to disconnect the 5V power adaptor from the hub.
+
* Download the first files for the lab using
  
=== Getting Comfortable With ccrma@satellite ===
+
''wget https://ccrma.stanford.edu/courses/250a/labs/lab3.zip
Turn on ccrma@satellite again using the same procedure as before where you plug the power into the USB hub. After about 30 seconds, the board should be booted up again, so you can log in again by running the command
+
  
''ssh -X ccrma@192.168.1.105''
+
* Unzip lab3 three with
  
If you list the device directory, you can see which devices are attached to linux. Type
+
''unzip lab3.zip''
  
''ls /dev''
 
  
to get an idea. Wow, there are so many! To list the devices with serial interfaces type
 
  
''ls /dev/tty*''
 
  
Once of these devices should be ''/dev/ttyUSB0'' for the Arduino Nano. If you do not see this one, then try rebooting using ''sudo reboot'' to see if that fixes this problem. (If you reboot, this will take about 45 seconds, and you will have to login again using ''ssh''. If that doesn't work, come talk to us. If you are a linux pro, you can try to debug the problem yourself by typing ''dmesg'' and looking at the result.)
 
  
== Firmware Programming On Arduino ==
+
* 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:
=== Compiling and uploading firmware code in the Arduino Program ===
+
  
For this class, 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.
+
* Examples->Digital->Blink
 +
* Examples->Digital->BlinkWithoutDelay
 +
* Examples->Digital->Button
  
Start the Arduino software by typing the command ''arduino &'' in the terminal. 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:
+
== Custom Communication ==
 +
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.
  
* Digital->Blink
+
=== Serial communication with the Arduino Serial Monitor ===
* Digital->BlinkWithoutDelay
+
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.
* Digital->Button (Even though it works, there is a bug in this file. In the text file that you submit to us
+
* answering questions for this lab, tell us what the bug is.)
+
  
 +
* 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. <span style="color:green;">What size delay makes for speedy updates but doesn't cause freezing?</span>
  
== Custom Communication ==
+
* Examples->Communication->SerialCallandResponseASCII. This will show you how to do two-way communication with the Serial Monitor.
Another reason that you might want to program the Arduino microcontroller even if you are connected to a laptop or desktop computer 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 software ===
+
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 software.
+
 
+
* Examples->Analog->Smoothing: Use the Serial Monitor (icon on the far left on the Arduino software toolbar) to get data back from the Arduino.
+
* Examples->Communication->SerialCallandResponse.
+
  
 
=== Serial communication with PD ===
 
=== Serial communication with PD ===
Line 74: Line 54:
  
 
First let's try outputting information to the Arduino hardware:
 
First let's try outputting information to the Arduino hardware:
* Load Examples->Communication->PhysicalPixel
+
* In Arduino, load Examples->Communication->PhysicalPixel
** The PD patch for communicating with this firmware is already stored in your ''~/250a/lab3'' directory (or you can try to get it from [http://ccrma.stanford.edu/courses/250a/labs/lab3/physicalpixel.pd here] and then upload it to ccrma@satellite using ''scp'', but that would be harder :)
+
** 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:
 
Next let's try getting information from the Arduino hardware:
* Load Examples->Communication->Graph
+
* In Arduino, load Examples->Communication->Graph
** The  PD patch for communicating with this firmware is already stored in your ''~/250a/lab3'' directory (or you can try to get it from [http://ccrma.stanford.edu/courses/250a/labs/lab3/Graph.pd here] and then upload it to ccrma@satellite using ''scp'', but that would be harder :)
+
** 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.
 
+
  
 
== Low-latency sensing ==
 
== Low-latency sensing ==
 
=== Encoder input ===
 
=== Encoder input ===
  
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.
+
* Download example firmware for interfacing with a rotary encoder using the command
  
Now you will learn how to use a rotary encoder.  Quit Pd or Max/MSP.  Then download [http://ccrma.stanford.edu/courses/250a/labs/lab3/encoder.zip encoder.zip] and use the Arduino software to download the ''encoder.pde'' firmware file to your Arduino board.
+
''wget ccrma.stanford.edu/courses/250a/labs/files/encoder2011.zip''
  
Build this schematic: http://cm-wiki.stanford.edu/mediawiki/images/c/c1/Encoder_filter.png. 
+
(Or use scp, Fetch, or your favorite secure FTP program to get encoder2011.zip onto your kit.)
  
Connect pin 2 of the Arduino to Phase A.  Connect pin 3 of the Arduino to Phase B, and you're ready to send out the position of the encoder over the serial bus.
+
* Extract the ZIP file by typing
  
You can read the values coming in from the encoder with the patches included in the ZIP file.
+
''unzip encoder2011.zip''
  
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?
+
* Enter the encoder2011 subdirectory by executing
  
 +
''cd encoder2011''
  
 +
 +
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.  <span style="color:green;">How are negative numbers represented?  Why does the encoder always start near 0 when the program on the Arduino is restarted?</span>
  
 
== Make A Musical Interaction ==
 
== Make A Musical Interaction ==
As the final main deliverable of the lab, you should cause your ccrma@satellite kit make some sound that depends on how you manipulate the sensors. For example, you could make a musical instrument, a music controller, a mock-up sound art installation, or some other sonic interaction. Now that you have had some experience synthesizing sound, your sound synthesis patch should involve more than just a few ''osc~''s. Think about what you want to design before you get started.
+
As the final main deliverable of the lab, you should cause your Satellite CCRMA kit make some sound that depends on how you manipulate the sensors. For example, you could make a musical instrument, a music controller, a mock-up sound art installation, or some other sonic interaction. Now that you have had some experience synthesizing sound, your sound synthesis patch should involve more than just a few ''osc~''s. Think about what you want to design before you get started.
  
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 beagleboard. To do so, first load the Arduino software. Then load the StandardFirmata sketch by choosing File|Examples|Firmata|StandardFirmata. Make sure that you have the correct Serial Port and Board selected. Then upload StandardFirmata to your Arduino Nano by clicking on the ''Upload'' button. Check that there were no errors with uploading StandardFirmata before you quit the Arduino software.
+
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 [https://ccrma.stanford.edu/wiki/Talk:250a_Microcontroller_%26_Sensors_Lab_Pd#Prepare_Arduino 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.  
 
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.  
Line 109: Line 104:
 
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''.
 
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''.
  
 +
<span style="color:green;">Don't forget to make a video of your musical interaction!</span>
  
 
+
<!-- == Optional: Autonomous Satellite CCRMA ==
== Optional: Autonomous ccrma@satellite ==
+
 
By this point you should be done with your musical interaction. If you would like to go the extra mile, we will now show you how to make your musical interaction autonomous in the sense that it can operate all by itself, free from any external laptop computer. We will show you how to do this using the example ''windy-day.pd''.
 
By this point you should be done with your musical interaction. If you would like to go the extra mile, we will now show you how to make your musical interaction autonomous in the sense that it can operate all by itself, free from any external laptop computer. We will show you how to do this using the example ''windy-day.pd''.
  
 
=== To Enable A Default Patch On Boot ===
 
=== To Enable A Default Patch On Boot ===
In the terminal, change to the ''on-startup'' directory by typing
+
* First put StandardFirmata back on the Arduino as described in lab 2.
 +
 
 +
* In the terminal, change to the ''on-startup'' directory by typing
  
 
''cd ~/on-startup''
 
''cd ~/on-startup''
  
and type ''ls -la'' to see what files are in there. You can see that the link (aka alias) ''default_patch.pd'' points to ''windy-day.pd''. In order to enable the default patch to load on boot, rename the file ''load_default_patch_disabled'' to ''load_default_patch'' using the command
+
* The files need to be updated. You can do this by running the command
  
''mv load_default_patch_disabled load_default patch''
+
''wget ccrma.stanford.edu/courses/250a/labs/files/newonstartupfiles.zip''
  
The ''cat'' command can be used to display the contents of any ASCII file. To look at the contents of ''load_default_patch'', type ''cat load_default_patch''. As you can see, it starts up Jack using the text-based ''jackd'' instead of ''qjackctl'', and then it loads ''default_patch.pd'' in pd with the graphical user interface (GUI) disabled.
+
and then
  
Now your kit should be ready for autonomous ccrma@satellite. To test it, just reboot the kit by typing ''sudo reboot'' and entering the password ''temppwd''. As it is rebooting, plug a pair of ear buds, headphones, or loudspeakers into the 1/8" (2.54mm) jack labeled AUDIO OUT on the beagleboard. Within about a minute, your kit should be fully rebooted. To check this, you can try logging in with SSH. Either way, it should start running ''windy_day.pd'' upon startup.
+
''unzip newonstartupfiles.zip''
  
Once your kit is fully rebooted, if you touch the anaog input pins on the Arduino A0-A7, it should start making some sound. However, unless you connect up a sensor circuit to some of the analog inputs, the exact behavior may be complicated. In particular, it will depend on the electrical properties of your body (how much sweat is on your fingers, whether you are touching a grounded device such as a laptop with any part of your body. Ask for help if you cannot get any sound.
+
and agree to replace the files in question.
  
Finally, log back into ccrma@satellite using the same command as always ''ssh -X ccrma@192.168.1.105''. Type ''ps -A'' at the prompt to get a list of the currently running processes. ''jackd'' is the Jack audio sound server, and ''pdextended'' is the pd process. To stop the default patch from running, type ''./stop_default''. To see how ''stop_default'' works, type ''cat stop_default''. (The ./ was necessary in order to run the script ''stop_default'' because the current user directory ~ is not in the user path, so linux needs the ./ to indicate to look for ''stop_default'' in the current directory.)
 
  
 +
* Now, type ''ls -la'' to see what files are in there. You can see that the link (aka alias) ''default_patch.pd'' points to ''windy-day.pd''. In order to enable the default patch to load on boot, rename the file ''load_default_patch_disabled'' to ''load_default_patch'' using the command
  
 +
''mv load_default_patch_disabled load_default patch''
 +
 +
* The ''cat'' command can be used to display the contents of any ASCII file. To look at the contents of ''load_default_patch'', type ''cat load_default_patch''. As you can see, it starts up Jack using the text-based ''jackd'' instead of ''qjackctl'', and then it loads ''default_patch.pd'' in pd with the graphical user interface (GUI) disabled.
 +
 +
* Now your kit should be ready for autonomous Satellite CCRMA. To test it, just reboot the kit by typing ''sudo reboot'' and entering the password ''temppwd''. As it is rebooting, plug a pair of ear buds, headphones, or loudspeakers into the 1/8" (2.54mm) jack labeled AUDIO OUT on the beagleboard. Within about a minute, your kit should be fully rebooted. To check this, you can try logging in with SSH. Either way, it should start running ''windy_day.pd'' upon startup.
 +
 +
* Once your kit is fully rebooted, if you touch the anaog input pins on the Arduino A0-A7, it should start making some sound. However, unless you connect up a sensor circuit to some of the analog inputs, the exact behavior may be complicated. In particular, it will depend on the electrical properties of your body (how much sweat is on your fingers, whether you are touching a grounded device such as a laptop with any part of your body. Ask for help if you cannot get any sound.
 +
 +
* Finally, log back into your Satellite. Type ''ps -A'' at the prompt to get a list of the currently running processes. ''jackd'' is the Jack audio sound server, and ''pdextended'' is the pd process. To stop the default patch from running, type ''stop_default''. To see how ''stop_default'' works, type ''cat ~/on-startup/stop_default''.
 +
-->
  
 
== Optional: Programming Linux ==
 
== 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 ccrma@satellite 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, [http://audacity.sourceforge.net/ Audacity], [http://chuck.cs.princeton.edu/ ChucK], [http://faust.grame.fr/ Faust], [https://ccrma.stanford.edu/groups/soundwire/software/jacktrip/ Jacktrip], and the Arduino software.
+
'''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, [http://audacity.sourceforge.net/ Audacity], [http://chuck.cs.princeton.edu/ ChucK], [http://faust.grame.fr/ Faust], [https://ccrma.stanford.edu/groups/soundwire/software/jacktrip/ 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
 
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
Line 148: Line 155:
 
''sudo apt-cache pkgnames | grep emacs''.
 
''sudo apt-cache pkgnames | grep emacs''.
  
Or, you can compile linux software yourself on the Beagleboard. The gcc, g++ tools etc. are already installed.
+
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.
 
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.
 
 
 
== Halt Your Board Properly When Finished! ==
 
'''Remember to shut down your board when you are done before powering it off!''' (Of course as Spencer pointed out, if you are operating ''truly'' autonomously, of course you cannot login and run the halt command. Nevertheless, if it is not too inconvenient please try to shut down properly if you can. If you do not, then you may find that your SD memory card becomes corrupted.) As described above, you can do this by executing the command ''sudo halt'' and then waiting 30 seconds before disconnecting the power cables.
 
 
 
 
== Wrap-Up ==
 
Instead of submitting your actual pd patch (because this is a little bit involved), it is okay to simply include some text in your email to Ed and Wendy describing what your patch did. Also please write a few sentences about what part of the lab was the most difficult, and please document any bugs that you find so that we can fix them! In fact, we may add some troubleshooting sections to the bottom of this Wiki.
 
 
Thanks so much! We are looking forward to seeing demos of your musical interactions at the beginning of the next lab session!
 
  
  
Line 169: Line 164:
  
  
<center>[[250a 2009]]</center>
 
 
[[Category:250a]][[Category:PID]]
 
[[Category:250a]][[Category:PID]]

Latest revision as of 10:35, 26 September 2012

Lab 3: Firmware Programming
See this quarter's schedule for due dates.

For this lab you need your MaxKit, with your Satellite CCRMA .


Firmware Programming On Arduino

Compiling and uploading firmware code in the Arduino Program

For this class, 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

mkdir ~/lab3

  • Enter the lab3 directory by typing

cd ~/lab3

  • Download the first files for the lab using

wget https://ccrma.stanford.edu/courses/250a/labs/lab3.zip

  • Unzip lab3 three with

unzip lab3.zip



  • 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

Custom Communication

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.

Low-latency sensing

Encoder input

  • Download example firmware for interfacing with a rotary encoder using the command

wget ccrma.stanford.edu/courses/250a/labs/files/encoder2011.zip

(Or use scp, Fetch, or your favorite secure FTP program to get encoder2011.zip onto your kit.)

  • Extract the ZIP file by typing

unzip encoder2011.zip

  • Enter the encoder2011 subdirectory by executing

cd encoder2011


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

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 cause your Satellite CCRMA kit make some sound that depends on how you manipulate the sensors. For example, you could make a musical instrument, a music controller, a mock-up sound art installation, or some other sonic interaction. Now that you have had some experience synthesizing sound, your sound synthesis patch should involve more than just a few osc~s. Think about what you want to design before you get started.

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.