Hooking up Pixy to a Microcontroller like an Arduino

Version 10 (Rich LeGrand, 02/19/2014 06:45 pm)

1 1 Rich LeGrand
h1. Hooking up Pixy to a Microcontroller like an Arduino
2 1 Rich LeGrand
3 3 Rich LeGrand
Pixy is meant to talk to a microcontroller, and Pixy comes out of the box ready to talk to an Arduino.  Use the supplied Arduino cable to connect Pixy to your Arduino.  
4 1 Rich LeGrand
5 1 Rich LeGrand
**
6 1 Rich LeGrand
7 9 Rich LeGrand
Download the Arduino library "Pixy.zip" "here":http://cmucam.org/projects/cmucam5/files. 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.  
8 1 Rich LeGrand
9 9 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:
10 1 Rich LeGrand
11 2 Rich LeGrand
<pre>
12 1 Rich LeGrand
Detected 1:
13 1 Rich LeGrand
  block 0: sig: 1 x: 159 y: 109 width: 61 height: 61
14 1 Rich LeGrand
Detected 1:
15 1 Rich LeGrand
  block 0: sig: 1 x: 173 y: 114 width: 60 height: 61
16 1 Rich LeGrand
Detected 1:
17 1 Rich LeGrand
  block 0: sig: 1 x: 146 y: 111 width: 70 height: 65
18 4 Rich LeGrand
... 
19 1 Rich LeGrand
</pre>
20 3 Rich LeGrand
21 3 Rich LeGrand
Note, the example will only print messages if Pixy is running the "default program" and an object that matches one of its color signatures is visible. 
22 1 Rich LeGrand
23 6 Rich LeGrand
h3. Arduino API
24 6 Rich LeGrand
25 6 Rich LeGrand
Using Pixy with Arduino is really simple. You simply include the SPI and Pixy headers:
26 6 Rich LeGrand
27 6 Rich LeGrand
<pre>
28 6 Rich LeGrand
#include <SPI.h>  
29 6 Rich LeGrand
#include <Pixy.h>
30 6 Rich LeGrand
</pre>
31 6 Rich LeGrand
32 6 Rich LeGrand
And instantiate a global instance:
33 6 Rich LeGrand
34 6 Rich LeGrand
<pre>
35 6 Rich LeGrand
Pixy pixy;
36 6 Rich LeGrand
</pre>
37 6 Rich LeGrand
38 10 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:
39 6 Rich LeGrand
40 6 Rich LeGrand
* @pixy.blocks[i].signature@  The signature number of the detected object (1-7) 
41 6 Rich LeGrand
* @pixy.blocks[i].x@  The x location of the center of the detected object (0 to 319)
42 6 Rich LeGrand
* @pixy.blocks[i].y@  The y location of the center of the detected object (0 to 199)
43 6 Rich LeGrand
* @pixy.blocks[i].width@  The width of the detected object (1 to 320)
44 1 Rich LeGrand
* @pixy.blocks[i].height@  The height of the detected object (1 to 200)
45 1 Rich LeGrand
* @pixy.blocks[i].print()@  A member function that prints the detected object information to the serial port 
46 9 Rich LeGrand
47 9 Rich LeGrand
So it's simple to talk to Pixy with your Arduino!  Pixy 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.  
48 6 Rich LeGrand
49 8 Rich LeGrand
h3. Other Microcontrollers or Devices
50 3 Rich LeGrand
51 4 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 determines the output port.  
52 3 Rich LeGrand
53 5 Rich LeGrand
** 
54 1 Rich LeGrand
55 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.  
56 3 Rich LeGrand
57 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
58 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).  
59 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).
60 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).
61 4 Rich LeGrand
62 5 Rich LeGrand
**