ユーザーから右手と左手の値を取得し、データを Arduino に送信するプロジェクトに取り組んでいます。私の現在の問題は、Arduinoが私が知ることができるものから何も受け取っていないことです. 現在、ピンを 5V に設定しています。「2」または「3」を受信し、0Vに設定されている場合。Arduino と Kinect でプログラムを実行すると、ピンの出力が 0V に低下することはありません。
私が持っている完全なコードは次のとおりです。
#pragma region Includes
//---------------------------------------------------------------------------
// Includes
//---------------------------------------------------------------------------
#include <XnOS.h>
#include <GL/glut.h>
#include <math.h>
#include <XnCppWrapper.h>
using namespace xn;
#pragma endregion
#pragma region Defines
//---------------------------------------------------------------------------
// Defines
//---------------------------------------------------------------------------
#define SAMPLE_XML_PATH "../Data/SamplesConfig.xml"
// Pose to Use Added
#define POSE_TO_USE "Psi"
#pragma endregion
#pragma region Global Nodes
//---------------------------------------------------------------------------
// Globals
//---------------------------------------------------------------------------
// Nodes Added for Skeletal Tracking
UserGenerator g_UserGenerator;
#pragma endregion
#pragma region Functions
// Functions Added for Skeletal Tracking
void XN_CALLBACK_TYPE User_NewUser(xn::UserGenerator& generator, XnUserID nId, void* pCookie)
{
printf("New User: %d\n", nId);
g_UserGenerator.GetPoseDetectionCap().StartPoseDetection(POSE_TO_USE, nId);
}
void XN_CALLBACK_TYPE User_LostUser(xn::UserGenerator& generator, XnUserID nId, void* pCookie)
{}
void XN_CALLBACK_TYPE Pose_Detected(xn::PoseDetectionCapability& pose, const XnChar* strPose, XnUserID nId, void* pCookie)
{
printf("Pose %s for user %d\n", strPose, nId);
g_UserGenerator.GetPoseDetectionCap().StopPoseDetection(nId);
g_UserGenerator.GetSkeletonCap().RequestCalibration(nId, TRUE);
}
void XN_CALLBACK_TYPE Calibration_Start(xn::SkeletonCapability& capability, XnUserID nId, void* pCookie)
{
printf("Starting calibration for user %d\n", nId);
}
void XN_CALLBACK_TYPE Calibration_End(xn::SkeletonCapability& capability, XnUserID nId, XnBool bSuccess, void* pCookie)
{
if (bSuccess)
{
printf("User calibrated\n");
g_UserGenerator.GetSkeletonCap().StartTracking(nId);
}
else
{
printf("Failed to calibrate user %d\n", nId);
g_UserGenerator.GetPoseDetectionCap().StartPoseDetection(POSE_TO_USE, nId);
}
}
#pragma endregion
int main(int argc, char* argv[])
{
//System::IO::Ports::SerialPort^ serialPort1;
//serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));
//serialPort1->PortName="COM3";
XnStatus nRetVal = XN_STATUS_OK;
Context context;
nRetVal = context.Init();
// TODO: check error code
// Create the user generator
nRetVal = g_UserGenerator.Create(context);
// TODO: check error code
XnCallbackHandle h1, h2, h3;
g_UserGenerator.RegisterUserCallbacks(User_NewUser, User_LostUser, NULL, h1);
g_UserGenerator.GetPoseDetectionCap().RegisterToPoseCallbacks(Pose_Detected, NULL, NULL, h2);
g_UserGenerator.GetSkeletonCap().RegisterCalibrationCallbacks(Calibration_Start, Calibration_End, NULL, h3);
// Set the profile
g_UserGenerator.GetSkeletonCap().SetSkeletonProfile(XN_SKEL_PROFILE_ALL);
// Start generating
nRetVal = context.StartGeneratingAll();
// TODO: check error code
printf("Start Pose:\n");
while (TRUE)
{
// Update to next frame
nRetVal = context.WaitAndUpdateAll();
// TODO: check error code
// Extract hand position of each tracked user
XnUserID aUsers[1];
XnUInt16 nUsers = 1;
g_UserGenerator.GetUsers(aUsers, nUsers);
for (int i = 0; i < nUsers; ++i)
{
if (g_UserGenerator.GetSkeletonCap().IsTracking(aUsers[i]))
{
//serialPort1->Open();
//Get head position
/*XnSkeletonJointPosition Head;
g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_HEAD, Head);
printf("%d: (%f,%f,%f) [%f]\n", aUsers[i], Head.position.X, Head.position.Y, Head.position.Z, Head.fConfidence);*/
//Get right hand position
XnSkeletonJointPosition RightHand;
g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(aUsers[i], XN_SKEL_LEFT_HAND, RightHand);
printf("%d: (%f,%f,%f) [%f]\n", aUsers[i], RightHand.position.X, RightHand.position.Y, RightHand.position.Z, RightHand.fConfidence);
//http://stackoverflow.com/questions/13547574/visual-studio-2010-arduino-serial-communication
int portspeed;
int centerpix;
int xmid;
HANDLE hDevice = CreateFile("COM7",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
DCB lpTest;
GetCommState(hDevice,&lpTest);
lpTest.BaudRate = CBR_9600;
lpTest.ByteSize = 8;
lpTest.Parity = NOPARITY;
lpTest.StopBits = ONESTOPBIT;
SetCommState(hDevice,&lpTest);
DWORD btsIO;
if (RightHand.position.X<0)
{
char test[] = "2";
WriteFile(hDevice,test,strlen(test),&btsIO,NULL);
printf("Right ");
}
else
{
char test[] = "3";
WriteFile(hDevice,test,strlen(test),&btsIO,NULL);
printf("Left");
}
FlushFileBuffers(hDevice);
}
else
{
printf("Not tracking.\n");
}
}
}
// Clean up
context.Shutdown();
return 0;
}`
Arduino のコードは次のとおりです。
int incomingByte = 0; // For incoming serial data
void setup()
{
Serial.begin(9600); // Opens serial port, sets data rate to 9600 bit/s
}
void loop()
{
// Send data only when you receive data:
//if (Serial.available() > 0)
//{
incomingByte = Serial.read();
if (incomingByte==50) //if =2
analogWrite(9,0);
//else
// analogWrite(9,0);
if (incomingByte==51) //if =3
analogWrite(9,255);
//else
// analogWrite(9,0);
delay(3000);
//}
//else
// analogWrite(9,255);
}
このコードは現在、Kinect がユーザーの右手の新しい値を受け取るたびに while ループになっています。
コードを修正したり、別のコードを使用したりできるものはありますか?