Cours:PixyUartArduino
Un exemple "brut de décoffrage" de communication avec la caméra Pixy en utilisant le protocole v2
https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:porting_guide
void setup() {
Serial.begin(115200);
Serial1.begin(200000);
}
unsigned long myTime=0;
uint16_t getSerial16()
{
uint16_t data;
data=Serial1.read();
data=(data)|(Serial1.read()<<8);
return data;
}
void loop() {
unsigned long currentTime = millis();
// envoyer une requête de temps en temps
if (currentTime>(myTime+200))
{
while(Serial1.available())Serial1.read();
Serial.write('\n');
Serial.print("new : ");
myTime=currentTime;
uint8_t data[6];
data[0]=0xae;
data[1]=0xc1;
data[2]=32;
data[3]=2;
data[4]=255;
data[5]=1;
for (int i=0;i<5;i++) Serial1.write(data[i]);
}
// lorsqu'on a une réponse de la pixy
if(Serial1.available()>=6)
{
if (Serial1.read()==0xaf)
{
if (Serial1.read()==0xc1)
{
if (Serial1.read()==33)
{
uint8_t taille=Serial1.read();
Serial.print("trame reçue, lenght/checksum : ");
Serial.print(taille);
Serial.write(' ');
uint16_t checksum=getSerial16();
Serial.println(checksum,HEX);
// ce serait bien de vérifier le checksum !
if ((taille%14)!=0)
{
Serial.println("erreur, devrait être un multiple de 14 !!");
// on vide le buffer
while(Serial1.available())Serial1.read();
}
else
{
uint16_t dataToRead=taille;
do
{
// lire par paquet de 14 pour ne pas saturer le buffer (taille max ??)
while(Serial1.available()>=14)
{
uint16_t signature=getSerial16();
uint16_t mx=getSerial16();
uint16_t my=getSerial16();
uint16_t width=getSerial16();
uint16_t height=getSerial16();
uint16_t angle=getSerial16();
uint8_t index=Serial1.read();
uint8_t age=Serial1.read();
Serial.print("bloc : ");
Serial.print(mx);Serial.write(' ');
Serial.print(my);Serial.write(' ');
Serial.write('\n');
dataToRead-=14;
}
}while(dataToRead!=0);
}
}
}
}
}
}