Le javascript est désactivé sur votre navigateur
 
Prononcer /'po.bot/
Accueil du siteComposants et techniqueLes entréesCaméra Pob-Eye 2
  publication inférieure à 7 jours
  publié < 7j sous cette rubrique
     
À propos de l'article
    Publié le 24 novembre 2009
    par Julien H.

    Mis à jour le 24 novembre 2009
Mots-clés de cet article
    Communications :
    I2C
Choisir votre langue :

Communication I2C avec la Pob-Eye 2

Comme cette caméra peut être utilisée pour contrôler tout un robot, on va tester ses autres périphériques, comme le bus I2C, qui peut nous servir à communiquer avec des périphériques d’affichage d’information (écran LCD) mais aussi avec des cartes programmables "filles" qui vont se charger d’une partie des tâches du robot (le déplacement et la commande des moteurs par exemple).

Rappel

Le bus I2C fonctionne en mode maitre/esclave : le maitre envoie sur le bus l’adresse du périphérique esclave avec qui il veut communiquer.

Disponibilité sur la Pob-eye 2

Le circuit intègre déjà un périphérique I2C : la caméra elle-même ! Mais on va essayer dans cet article de communiquer avec un autre périphérique I2C, en l’occurence une led intelligente "BlinkM".

 Préparation

Il faut tout d’abord souder un connecteur et préparer un câble ayant un connecteur femelle au format Arduino et BlinkM : GND/VCC/SDA/SCL. Il faut prendre garde car la Pob-Eye a un format différent : GND/VCC/SCL/SDA ce qui empêche de connecter directement la BlinkM, ce qui aurait pourtant été utile pour faire office de "flash" d’appoint pour la caméra :) :) :)

Bibliothèque de fonctions

L’environnement de développement Pob-Tools v4 propose des fonctions déjà écrites pour gérer le bus I2C. Il suffit donc de reprendre les exemples fournis pour les commandes principales parmi :


- void InitI2C (I2C_SPEED speed) : Initalize I2C bus as Master.
- void SendSlaveAddress (UInt8 Addr_S) : Send slave adress through the bus.
- UInt8 ReadOnI2C (void) : Read a byte from a slave device.
- UInt8 ReadOnI2CWithAck (UInt8 ack) : Read a byte from a slave device.
- void WriteOnI2C (UInt8 Byte) : Write a byte on the I2C bus to the slave device.
- void WriteBufferOnI2C (UInt8 *Data, UInt32 Len) : Write a buffer on the I2C bus to the slave device.
- void StopI2C (void) : Stop I2C communication.

Trouver la bonne adresse

Pour ceux qui ont déjà utilisé une BlinkM avec une carte Arduino, vous vous souvenez que Tod utilise comme adresse par défaut 0x09. Mais attention, il s’agit de l’adresse sur 7 bits car la bibliothèque Wire qui gère l’I2C sur Arduino ne demande pas le dernier bit de l’adresse 8 bits qui sert pour indiquer si on est en écriture ou en lecture.

Mais la Pob-Eye 2 considère quant à elle l’adresse en 8 bits. Donc 0x09 ou 000 1001 devient 0001 0010 soit 0x12 !!! Je me suis arraché les cheveux alors que j’avais déjà eu le même problème avec AVRlib..

 Dispositif expérimental

On va s’amuser non seulement avec la BlinkM, mais on va conserver le code de la caméra utilisée dans les articles précédents. On va faire une moyenne de tous les pixels sur rouge, vert et bleu puis assigner cette moyenne comme couleur de la BlinkM.

Code

#include 

int main(void)
{
  UInt8 *rgbFrame;
  UInt32 i;
  UInt32 red = 0, green = 0, blue = 0;


  UInt8 blinkm_addr = 0x12; // The slave address (sur 8 bits)
  UInt8 buffer;
  UInt8 data[4];

  InitPobeye2();
  InitI2C(I2C_100_KHZ);
  InitCameraPobeye2();
  InitUART0(115200);

  SendString("Test I2C !");

  // arrêt de la playlist interne
  SendSlaveAddress( blinkm_addr );         
  buffer = 'o';
  WriteOnI2C(buffer);
  StopI2C();

  rgbFrame = GetRGBFrame();
  while(1) {
    GrabRGBFrame();

    for (i=0; i<  100; i++) // 100 valeurs
    {
       red   += GetRed(rgbFrame[i*100]); // tous les 100 pixels
       green += GetGreen(rgbFrame[i*100]);
       blue  += GetBlue(rgbFrame[i*100]);  
    }
    
    red = red / 100;
    green = green / 100;
    blue = blue / 100;

    PrintToUart0("%d %d %d\n",red,green,blue);

    data[0] = 'n';
    data[1] = red;
    data[2] = green;
    data[3] = blue;

    SendSlaveAddress( blinkm_addr );    
    WriteBufferOnI2C(data,4);
    StopI2C();

    WaitUs(500);
  }    
  return 0;
}

Il y aurait sans doute de meilleurs algorithmes pour déterminer une dominante de couleur, mais ici l’intérêt était surtout de montrer 2 communications avec un périphérique I2C : écriture d’un octet et écriture d’un buffer.

Résultat

Voici la caméra et une BlinkM connectée dessus. Belle couleur, n’est-il pas ? :)

Pob-Eye et BlinkM
 
Répondre à cet article
Vous avez aimé cet article ? Merci de nous recommander !