Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Quick fix for getting serial data from CMUcam5 Pixy (http://www.chiefdelphi.com/forums/showthread.php?t=152391)

jman4747 23-11-2016 15:19

Quick fix for getting serial data from CMUcam5 Pixy
 
2 Attachment(s)
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.

dirtbikerxz 23-11-2016 19:54

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.

jman4747 23-11-2016 20:01

Re: Quick fix for getting serial data from CMUcam5 Pixy
 
Quote:

Originally Posted by dirtbikerxz (Post 1617450)
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.

Cool thing is it is downloadable. Click on the image and open it in a new tab then open a blank VI. Click and drag the image from your web browser and on to the VI block diagram. This is called a VI snippet, see here: http://www.ni.com/tutorial/9330/en/

And yes this belongs in periodic tasks.

cad321 23-11-2016 20:51

Re: Quick fix for getting serial data from CMUcam5 Pixy
 
Quote:

Originally Posted by jman4747 (Post 1617451)
Cool thing is it is downloadable. Click on the image and open it in a new tab then open a blank VI. Click and drag the image from your web browser and on to the VI block diagram. This is called a VI snippet, see here: http://www.ni.com/tutorial/9330/en/

And yes this belongs in periodic tasks.

The code is awesome. Thanks for sharing. That being said, telling me about VI snippet tool I think is just as awesome. That's going to be super usefu .

dirtbikerxz 23-11-2016 20:55

Re: Quick fix for getting serial data from CMUcam5 Pixy
 
Quote:

Originally Posted by jman4747 (Post 1617451)
Cool thing is it is downloadable. Click on the image and open it in a new tab then open a blank VI. Click and drag the image from your web browser and on to the VI block diagram. This is called a VI snippet, see here: http://www.ni.com/tutorial/9330/en/

And yes this belongs in periodic tasks.

Woah. That's cool. Also what does ur begin.vi look like?

jman4747 23-11-2016 21:22

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.

jman4747 25-11-2016 05:24

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.

jman4747 27-11-2016 16:04

Re: Quick fix for getting serial data from CMUcam5 Pixy
 
1 Attachment(s)
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);
  }

}


Bpk9p4 28-11-2016 10:00

Re: Quick fix for getting serial data from CMUcam5 Pixy
 
nice work. Is there any reason you chose this method or i2c

jman4747 28-11-2016 10:35

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?

dirtbikerxz 28-11-2016 10:55

Re: Quick fix for getting serial data from CMUcam5 Pixy
 
Quote:

Originally Posted by jman4747 (Post 1618017)
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?

I am about to after school today.


All times are GMT -5. The time now is 13:21.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi