Hooking up Pixy to a Microcontroller like an Arduino

Version 27 (Rich LeGrand, 04/01/2014 10:19 am)

1 1 Rich LeGrand
h1. Hooking up Pixy to a Microcontroller like an Arduino
2 1 Rich LeGrand
3 20 Rich LeGrand
Pixy is meant to talk to a microcontroller, and Pixy comes out of the box ready to talk to an Arduino. It sends block information to Arduino at 1 Mbits/second which means Pixy can send more than 6000 detected objects per second or 135 detected objects per frame (Pixy can process 50 frames per second.)  
4 1 Rich LeGrand
5 20 Rich LeGrand
OK, to get Pixy and Arduino talking to each other, use the supplied Arduino cable to connect Pixy to your Arduino.  
6 20 Rich LeGrand
7 15 Rich LeGrand
!{width: 35%}http://i74.photobucket.com/albums/i241/cmucam/IMG_4521_zpsb5aa9a88.jpg!
8 1 Rich LeGrand
!{width: 35%}http://i74.photobucket.com/albums/i241/cmucam/IMG_4519_zpse7e5ea91.jpg!
9 1 Rich LeGrand
10 24 Rich LeGrand
Next, download the Arduino library "arduino_pixy-x.y.z.zip" "here":http://cmucam.org/attachments/download/958/arduino_pixy-0.1.2.zip. Bring up the Arduino IDE and import the Pixy library by selecting *Sketch➜Import Library* in the Arduino IDE, and then browsing to the Pixy.zip file that you just downloaded.  
11 1 Rich LeGrand
12 19 Rich LeGrand
Next, load the "hello_world" example by selecting it in *File➜Examples➜Pixy*.  Upload it and bring up the *Serial Monitor*.  You should see messages printed that look similar to this:
13 1 Rich LeGrand
14 2 Rich LeGrand
<pre>
15 1 Rich LeGrand
Detected 1:
16 1 Rich LeGrand
  block 0: sig: 1 x: 159 y: 109 width: 61 height: 61
17 1 Rich LeGrand
Detected 1:
18 1 Rich LeGrand
  block 0: sig: 1 x: 173 y: 114 width: 60 height: 61
19 1 Rich LeGrand
Detected 1:
20 1 Rich LeGrand
  block 0: sig: 1 x: 146 y: 111 width: 70 height: 65
21 4 Rich LeGrand
... 
22 1 Rich LeGrand
</pre>
23 3 Rich LeGrand
24 12 Rich LeGrand
Note, this example will only print messages if Pixy is running the "default program" and an object that matches one of its color signatures is visible. 
25 1 Rich LeGrand
26 6 Rich LeGrand
h3. Arduino API
27 6 Rich LeGrand
28 6 Rich LeGrand
Using Pixy with Arduino is really simple. You simply include the SPI and Pixy headers:
29 6 Rich LeGrand
30 6 Rich LeGrand
<pre>
31 6 Rich LeGrand
#include <SPI.h>  
32 6 Rich LeGrand
#include <Pixy.h>
33 6 Rich LeGrand
</pre>
34 6 Rich LeGrand
35 23 Rich LeGrand
And make a global instance of Pixy by putting this little guy outside your setup() and loop() functions:
36 6 Rich LeGrand
37 6 Rich LeGrand
<pre>
38 6 Rich LeGrand
Pixy pixy;
39 6 Rich LeGrand
</pre>
40 6 Rich LeGrand
41 11 Rich LeGrand
The API consists of one call: @getBlocks()@, which returns the number of objects Pixy has detected.  You can then look in the @pixy.blocks[]@ array for information about each detected object (one array member for each detected object.)  Each array member (@i@) contains the following fields:
42 6 Rich LeGrand
43 6 Rich LeGrand
* @pixy.blocks[i].signature@  The signature number of the detected object (1-7) 
44 6 Rich LeGrand
* @pixy.blocks[i].x@  The x location of the center of the detected object (0 to 319)
45 6 Rich LeGrand
* @pixy.blocks[i].y@  The y location of the center of the detected object (0 to 199)
46 6 Rich LeGrand
* @pixy.blocks[i].width@  The width of the detected object (1 to 320)
47 1 Rich LeGrand
* @pixy.blocks[i].height@  The height of the detected object (1 to 200)
48 1 Rich LeGrand
* @pixy.blocks[i].print()@  A member function that prints the detected object information to the serial port 
49 9 Rich LeGrand
50 14 Rich LeGrand
So it's simple to talk to Pixy with your Arduino!  
51 6 Rich LeGrand
52 3 Rich LeGrand
h3. Other Microcontrollers or Devices
53 1 Rich LeGrand
54 26 Rich LeGrand
Pixy will output objects that it detects through one of several interfaces that you choose.  It supports SPI, I2C, UART, and analog/digital I/O through its 10-pin I/O connector.  Pixy also supports USB 2.0 through its mini-USB connector.  You can configure which interface Pixy uses through the configure dialog in PixyMon.  The "Data out port" parameter in the "Interface" tab determines the output port.  
55 3 Rich LeGrand
56 25 Rich LeGrand
!http://i74.photobucket.com/albums/i241/cmucam/Image201_zpsa127f29e.jpg! 
57 1 Rich LeGrand
58 1 Rich LeGrand
If you hover the mouse pointer over the "Data out port" text, a help string will be displayed that describes which value corresponds to which type of port.  
59 3 Rich LeGrand
60 4 Rich LeGrand
* SPI - this is the default port that uses 3 wires (pins 1, 3, and 4 of the I/O connector) and is used to communicate with Arduino
61 4 Rich LeGrand
* I2C - this is a multi-drop 2-wire port (pins 5 and 9 of the I/O connector) that allows a single master to communicate with up to 127 slaves (up to 127 Pixys).  
62 22 Rich LeGrand
* UART - this is the common "serial port" (pins 1 and 4 of the I/O connector).  Pixy receives data via pin 1 (input) and transmits data via pin 4 (output).  
63 4 Rich LeGrand
* analog/digital x - this will output the x value of the largest detected object as an analog value between 0 and 3.3V (pin 3). It also outputs whether an object is detected or not as a digital signal (pin 1 of the I/O connector).
64 4 Rich LeGrand
* analog/digital y - this will output the y value of the largest detected object as an analog value between 0 and 3.3V (pin 3). It also outputs whether an object is detected or not as a digital signal (pin 1 of the I/O connector).
65 4 Rich LeGrand
66 27 Rich LeGrand
!{width: 40%}http://i74.photobucket.com/albums/i241/cmucam/Image140_zps87c8d289.jpg!