Cours:PixyUartArduino

De troyesGEII
Aller à : navigation, rechercher

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);
          }
        }
      }
    }
  }
}