|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools | Rate Thread | Display Modes |
|
#1
|
||||
|
||||
|
Quick fix for getting serial data from CMUcam5 Pixy
So I have a way to get the data from the pixy cam to the RoboRIO via USB at 50 frames a second. The pixy is plugged in to an Arduino Uno with the induced cable and the Arduino is plugged into a PC or RoboRIO via USB. This assumes the pixy is set up to track one object (ie. reflective tape). I set up the Arduino running this:
Code:
#include <SPI.h>
#include <Pixy.h>
// This is the main Pixy object
Pixy pixy;
void setup()
{
Serial.begin(57600);
Serial.print("on\n");
delay(1000);
Serial.print("waiting\n");
pixy.init();
}
void loop()
{
static String C = "wait";
int j;
uint16_t blocks;
char buf[32];
// grab blocks!
blocks = pixy.getBlocks();
if (Serial.available() > 0)
{
C = Serial.readString();
if (C == "go")
{
Serial.print("User command: " + C + "\n");
//delay(500);
//Serial.print("Data start in 1 second!\n");
delay(1000);
}
else
{
Serial.print("User command: " + C + "\n");
}
}
// else
//{
//}
if(C == "go")
{
if (blocks)// If there are blocks detected, print them!
{
//i++;
// do this (print) every 2 frames because printing every
// frame would bog down the Arduino(not)
/*if (i%2==0)
{*/
for (j=0; j<blocks; j++)
{
//sprintf(buf, " block %d: ", j);
//Serial.print(buf);
pixy.blocks[j].print();
}
//}
}
}
/* else if(C == "stop")
{
C = "wait";
} */
else if(C == "wait")
{
//C = "hold";
delay(250);
}
else if(C == "light")
{
Serial.print("not implemented\n");
C = "wait";
Serial.print("waiting\n");
delay(250);
}
else if(C == "help")
{
Serial.print("command list:\ncommand: go = activate camera & start data stream\n");
Serial.print("command: wait = stop data stream\n");
Serial.print("command: light = toggle LED ring on or off\nLED ring cannot be toggled off if camera is active\r\n");
C = "wait";
Serial.print("waiting\n");
delay(250);
}
else
{
Serial.print("bad command\n");
C = "wait";
Serial.print("waiting\n");
delay(250);
}
}
I then plug in the Arduino to a PC or the RIO and run the attached LabVIEW snippet. The main difference between running it on the computer and the RIO is the visa resource name. On the computer it is "COM3" on the RIO it is "ASRL3::INSTR". Data comes over USB like this: "sig: 1 x: 164 y: 78 width: 81 height: 71" I'm not a C programmer or all tha good at LabVIEW so this is all very rough but it seems to get the job done with minimal latency. |
|
#2
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
Can you make the Labview code downloadable please. Thanks. Also, I'm assuming you are running that in Periodic tasks on the roborio right? I'm also extremely new to labview.
|
|
#3
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
Quote:
And yes this belongs in periodic tasks. |
|
#4
|
|||
|
|||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
Quote:
|
|
#5
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
Quote:
|
|
#6
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
There isn't anything related to serial communication in the begin VI. In this case having the initialization code outside of and feeding the loop is effectively the same as having it in the begin VI. The only difference is that code in the begin VI executes before code in periodic tasks. There is also no need for a Refnum set/get VI.
The begin VI exists to help organize code that only needs to execute once and at the beginning of the program, and to ensure that code that initializes something executes before that thing is called in other VIs like periodic tasks or teleop. |
|
#7
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
This has been turned into a git hub repo here: https://github.com/FRC4080Turner/Pixy-cam-to-RoboRIO. I will be updating it tomorrow and over the weekend after I have tested this on the RIO again. I will also be testing the Pixy with this lens: http://www.ebay.com/itm/122198892672 and its standard lens on 2016 reflective tape targets.
|
|
#8
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
So far the Pixy has done a pretty good job of finding reflective tape lit with green LED rings in a well lit area.
Right now I am having an odd problem with the RIO talking to the arduino. Whenever I run the labview code on my computer it works as intended but when I run it on the RIO it seems the RIO is writing to the serial port several times every time I tell it to write once. I double checked with the arduino sketch below and it seems to confirm that the RIO is writing several times every time the VISA write VI executes while the computer only writes once as intended. Arduino: Code:
void setup() {
// put your setup code here, to run once:
Serial.begin(57600);
delay(2000);
Serial.print("on\n");
}
void loop() {
static String C = "wait\n";
if (Serial.available() > 0)
{
C = Serial.readString();
Serial.print(C);
}
}
|
|
#9
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
nice work. Is there any reason you chose this method or i2c
|
|
#10
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
One is how easy the wiring is:
Plug in provided ribbon cable (Pixy to Arduino) Plug in USB cable (Arduino to RoboRIO) It's basically impossible for that set up to go wrong. I also find that rs-232 style serial communication is (was...) very easy to wrap my head around. Has anyone else tested this by the way? |
|
#11
|
||||
|
||||
|
Re: Quick fix for getting serial data from CMUcam5 Pixy
Quote:
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|