Noah,
You do not need to use an arduino to communicate with the Pixy cam. There multiple interface options from the Pixy that the roboRIO can connect to directly. Last year we used the simple digital\analog x interface which tells you if it sees a target or not (digital), and where within the frame the target is (analog). This interface connects directly to 1 digital input and 1 analog input on the roboRIO.
The C++ class we created for this is shown here:
Code:
/*
* PixyCamera.cpp
*
* Created on: Mar 30, 2016
* Author: Gaelhawks
*/
#include "WPILib.h"
#include "Common.h"
#include "PixyCamera.h"
PixyCamera::PixyCamera()
{
goalLocator = new AnalogInput(PIXY_ANALOG_INPUT);
goalDetector = new DigitalInput(PIXY_GOAL_DETECTOR);
}
bool PixyCamera::GoalDetected()
{
if(goalDetector->Get())
{
return true;
}
else
{
return false;
}
}
float PixyCamera::GoalLocation()
{
float cameraVoltage;
cameraVoltage = goalLocator->GetVoltage();
return cameraVoltage;
}
bool PixyCamera::OKtoShoot(float desiredGoal)
{
// use lateralTrimValue in here somehow???
// like: (CENTERED_GOAL_VOLTAGE + lateralTrimValue*0.1)
if(GoalDetected() && (fabs)(GoalLocation() - desiredGoal) < VOLTAGE_TOLERANCE)
{
return true;
}
else
{
return false;
}
}
void PixyCamera::UpdateDash()
{
SmartDashboard::PutBoolean("Pixy OK to Shoot: ", OKtoShoot(CENTERED_GOAL_VOLTAGE));
SmartDashboard::PutBoolean("Pixy Goal Detected: ", GoalDetected());
SmartDashboard::PutNumber("Pixy Camera Voltage: ", GoalLocation());
SmartDashboard::PutNumber("Pixy Lateral Trim: ", lateralTrimValue);
}
This year we are using the I2C interface which provides more detailed data about multiple targets. This thread
https://www.chiefdelphi.com/forums/showthread.php?t=154355& has C++ code that we have used to successfully communicate with the Pixy.
Hope this helps.