Dane.Kouttron
The
Vibrobyte: Haptic Feedback 
| What? A
wireless, haptic interface featuring a quick refresh rate, high current
output for driving variable loads / feedback devices, that can run from
a variety of power sources.
 The size of a pack of gum
 
 |   |  
 | 
| This
page serves as a backup of the documentation hosted on the team
wiki,  http://bluwiki.com/go/RPI_Haptics,
in a hopefully easier to browse, less cryptic fashion, with more uptime
:) | 
| HMM? | Image/
Media | 
| The
vibrobyte is a wireless, reprogrammable, interconnectable reciever for
use in preformances;  both local and co-located. It can run on a
variety of power sources, and can drive up to 4 seperate vibratory
motors, or dc devices, while changing color and communicating with a
master node at a high individual refresh rate. Devices are also
trackable via overead camera (each module has a high-power IR led). 
 High-speed, open source & hardware communications, the size of a pack of gum
 |  | 
The vibrobyte was presented at "Telemorphosis" at 
ICMC 2008. Technical details were presented at the 
156th ASA Meeting and 
NIME 2009.
 
Listed @ the Acoustic Society of America:  
J. Acoust. Soc. Am. Volume 124, Issue 4, pp. 2489-2489  
| Basic
Roadmap | Image/
Media | 
| The following outlines each step data must take from the
initial triggering to the actuation. Different groups are focusing on
different portions of this process, and some in-between portions are
being dealt with as they emerge.
 
 Conductor creates/maps vibrobyte
OSC data for display (GUI and input mapping in Max/MSP, PD, etc.)
 Data is sent to remote spaces
 OSC Data is transmitted (ports must be open,
remote space must have necessary hardware & software)
 (...continues as with local space)
 Data is distributed at local space
 Data is packaged (from OSC into a form suitable
for local transmission: serial packets, using Max/MSP, PD, etc.)
 Data is sent via serial to an Arduino
 Arduino echoes data to RF transmitter
 Each vibrobyte
RF receiver sends packets to the microcontroller
 Each vibrobyte
microcontroller interprets the packets and executes the command
 Outputs (vibrator motors) may be actuated
(need to be attached to performers)
 LEDs may be triggered
 |  
 
 
  
 | 
| Hardware | Image/
Media | 
| Here's
revision Pauline. This was the 4th
revision of harware, moving from custom RF and underpowered attiny to a
ful size atmega168 and a 915mhz daughterboard
 [Features]
 
 
 LEDs driven
directly from the 168, no transistor, and one quad resistor
 DC/DC step up
converter allows for multiple battery sources (2v->5v input)
 Correctly wired
RF receiver
 Correctly wired
LEDs
 Proper 3x2 ICSP
header
 2-position DIP
switch with permanently "on" DC-DC converter
 Smaller SOIC
output amplifiers instead of through-hole (1 amp / pwm output)
 Evenly bright
LEDs
 Breakout into
through-hole contacts for unused ADC and other IO (side of pcb)Freepcb bac files: LINKFreepcb schema files: LINK |  | 
| [Pin
Mapping] 
 
| Arduino | Purpose | Functions | Port +
Number | 168 Pin |  
| 7 | IR LED | PCINT23/ANIN1 | PD7 | 11 |  
| 5 | Red LED | PCINT21/OC0B/T1 | PD5 | 9 |  
| 6 | Green
LED | PCINT22/OC0A/ANIN0 | PD6 | 10 |  
| 9 | Blue LED | PCINT1/OC1A | PB1 | 13 |  
| 3 | Output1
Control | PCINT19/OC2B/INT1 | PD3 | 1 |  
| 11 | Output2
Control + MOSI | PCINT3/OC2A/MOSI | PB3 | 15 |  
| 10 | Output3
Control | PCINT2/SS/OC1B | PB2 | 14 |  
| 1 | Battery | ADC1/PCINT9 | PC1 | 24 |  |  | 
| [Assembly Instructions] 
 
 Solder the 16 MHz crystal
 Solder the diode, C1 (1uF) capacitors, 100 uF
capacitor and MAX756
 Solder the RJ-11 jack
 Solder the 22 uH inductor
 Test that the MAX756 is outputing 5V and using about
20-30 mA (pin 1 or 5)
 C2 (22pF) capacitors, R1 (10.5 kOhm) resistor,
ATmega 168 and DIP switch
 Test that Pauline is using 30-40 mA
 Add the ICSP header and try connecting with the
AVRISPMKII
 Add components for driving LEDs (quad resistor R2
and LEDs)
 Upload PaulineBlink
from the Arduino environment, the LEDs should flash (RGB, off, IR,
off); if not:
 Check the resistance between the 168 side of the
resistor and the positive terminal
 Check the resistance between the LED positive
terminal and the 168
 Make sure the solder is clean around the quad
resistor, and there is no cross-solder
 Add components for driving output
 Upload PaulineBuzz
from the Arduino environment, the motors should buzz (output1, pause,
output2, pause, output3, pause); if not:
 Check for cross-solder on the driver chips
 Make sure your motors are wired correctly
 Add RX module
 |  | 
| [Programming Via Avr Studio:] 
 
 Connect the AVR ISP MKII to Pauline and open AVR
Studio.
 Go to Tools > Program AVR > Connect
 Under "Main", select ATmega 168
 Under "Program", select the "..." next to "Input Hex
File" and select Pauline.hex
 Hit the "Program" button
 Under "Fuses", next to "EXTENDED", "HIGH" and "LOW"
enter 0xF8, 0xDF and 0xFF (same as Arduino fuse bits)
 Hit the "Program" button
 Under "Lock Bits", next to "LOCKBIT" enter 0xCF
(same as Arduino lock bits)
 Hit the "Program" button
 |  | 
| [Programming Via Arduino
Environment] 
 
 Change the above settings in AVR studio
 Open
C:\Documents and Settings\username\Application
Data\Arduino\preferences.txt
 Change
"upload.using=bootloader" to "upload.using=avrispmkii"
 If this
doesn't work, you may need to disable the AVR Studio drivers and use
the libusb drivers instead. There are some notes here on doing that.
 |  | 
| [Operating
Notes] 
 
 When
reprogramming or updating firmware, via the ICSP header, output 2 will
oscillate.  When not in use,
remove batteries from pauline to prevent parasitic draw (70ma). Pauline
pcb's can stay in standby for well over 20 hours from 2 standard NiMH /
NICD 2000mah rechargeable AA cells.
 When choosing
rechargeable batteries for performances, be sure to look for data
regarding output current, and charging current, most unmarked AA / AAA
style cells require overnight charging, whereas certain cells accept
larger current charge rates. |  | 
| [The Transmitter] Attached to a
users computer, the transmitter consists of an arduino, 915mhz transmit
shield  and an rf amplifier
 <code for
transmitter shield>
 |  
 | 
| Making
100 Vibrobytes in a Weekend | Video | 
| Jurrassic
5 + solder + lots of little tiny components. 
 
 |  | 
| Communications | Image/
Media | 
| Vibrobytes
receive serial data. To make
it easier to control the vibrobytes, manipulate the control data, and
send control data over a network, there is also an OSC to serial
interpreter for Max/MSP.
All
communications are ttl rs232 based | 
 | 
| [Serial
Communication, r3] 
 Revision 3 breaks
the basic 3-byte packet pattern of revisions 1 and 2. Packets are
composed of anywhere from 3 to 8 bytes and are specialized for a
continuous transmission system.
 Every
packet begins with a header byte followed by an address byte. Remaining
bytes are optional and specified by the header.
 |  | 
| [Header and Address] 
 The header byte
takes the form 011a bcde
 
 a address type: 0 is single, 1 is group
 b-e packet includes output state, led state, modes,
and group state, respectively
 Notice that the
header byte is the only byte to begin with a 0, distinguishing it from
all other bytes.The address byte takes the form 1aaa aaaa, with all bits a used for an
address 0-127.
 |  | 
| [Output State] The output state is
encoded in two bytes 1wwa aass 1fff fooo
 
 w wave shape
 a amplitude
 s sustain
 f frequency
 o
outputs this applies to |  | 
| [LED State] The LED state is
encoded in two bytes 11ir rrrg 1ggg bbbb
 
 i ir
 r red
 g green
 b blue
 |  | 
| [Modes] Output mode and LED
mode is encoded in one byte 1111 ooll
 |  | 
| [OSC Communications] All OSC control
packets begin with /vibrobyte.
 Every float should
be in the range [0, 1].
 As per OSC-1.0,
i is int32, f is float32, and s is string.
 /vibrobyte/output ,sisfffiii dest-type dest wave amp sus freq out1 out2 out3/vibrobyte/output/mode ,sis dest-type dest output-mode
 /vibrobyte/led ,siffff dest-type dest ir red green blue
 /vibrobyte/led/mode ,sis dest-type dest led-mode
 /vibrobyte/group/add ,sii dest-type dest group
 /vibrobyte/group/remove ,sii dest-type dest group
 /vibrobyte/group/reset ,si dest-type dest
 
 |  | 
| [Glossary] 
 
 dest-type destination type for
this message, takes the values {single, group}
 dest
 when dest-type is single,
a vibrobyte
address
 when dest-type is group,
a group number
 wave is the wave shape, takes
the value {square, saw-ascending, saw-descending, absolute-sine}
 amp is the amplitude of the wave
 sus is the sustain of the wave
 freq is the frequency of the
wave
 out1, out2
and out3 are boolean values describing which
outputs this message applies to
 output-mode takes the value
{repeat, impulse, off}
 led-mode takes the value
{battery, quality, blinkinput, blinkoutput}
 group is a group number,
(starting with group 1, group 0
is reserved for referring to all vibrobytes)
 |  | 
| Interface | Image/
Media | 
| The
abstraction is initialized with two arguments: the first to set its
type (group or single), the second to set its address. It can be
addressed via OSC, and can also be used as a GUI to output OSC. The
selected vibration pattern is made visible with a custom LED object.
See the help patch for more information. 
 To download the Max version and all dependencies in one easy package,
click here: LINK
 |  | 
| Place in jsui-library folder.
 Accepts:
  floats: changes the intensity (0 is off, 1 is on)
 setcolor: changes LED color
 setbgcolor: changes background color
 setdiameter: changes the LED diameter
 Outputs:
  float: the intensity of the led, can be toggled between 0 and 1 by clicking
 Color and size can be specified via the jsui Inspector window 
arguments field. Right-click and drag to change intensity. Hold shift 
for fine adjustment.
 |  | 
| max v2; #N vpatcher 627 458 1026 709;
 #P window setfont "Sans Serif" 9.;
 #P flonum 59 212 35 9 0. 1. 3 139 0 0 0 221 221 221 222 222 222 0 0 0;
 #P window linecount 1;
 #P newex 275 91 93 9109513 prepend setdiameter;
 #P flonum 275 51 35 9 0. 1. 3 139 0 0 0 221 221 221 222 222 222 0 0 0;
 #P toggle 16 51 15 0;
 #P newex 165 91 87 9109513 prepend setbgcolor;
 #P user swatch 165 51 105 32;
 #P newex 59 91 77 9109513 prepend setcolor;
 #P user swatch 59 51 105 32;
 #P user jsui 59 141 64 64 1 0 0 etp.led.js;
 #P flonum 19 91 35 9 0. 1. 3 139 0 0 0 221 221 221 222 222 222 0 0 0;
 #P connect 2 0 3 0;
 #P connect 0 0 1 0;
 #P connect 6 0 1 0;
 #P connect 8 0 1 0;
 #P connect 5 0 1 0;
 #P connect 3 0 1 0;
 #P connect 1 0 9 0;
 #P connect 4 0 5 0;
 #P connect 7 0 8 0;
 #P pop;
 
 |  | 
|  |  | 
| [The Transmitter] Attached to a
users computer, the transmitter consists of an arduino, 915mhz transmit
shield  and an rf amplifier
 | <code for
transmitter shield> 
 | 
Concluding
Remarks:
Its amazing what dedicated people can produce in a short
period of time. It was a privledge working with mcdonk, scully, and
jesse French.
(be
careful, im not responsible for those soldering iron burns, or being
blinded by LOTS OF BLINKY LEDS)
Dane.Kouttron
Rensselaer Polytechnic Institute 
Electrical & Electrical Power
631.978.1650
