Cours:TPS 2103 5 : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m
Ligne 28 : Ligne 28 :
 
=={{Bleu|Exemple de programme}}==
 
=={{Bleu|Exemple de programme}}==
 
<source lang=c>
 
<source lang=c>
#include <Servo.h>;#include <Wire.h>;// Doit être ajusté en fonction de chaque nunchuck#define ZEROX 530 #define ZEROY 530#define ZEROZ 530// adresse I2C du nunchuck#define WII_NUNCHUK_I2C_ADDRESS 0x52// définition d'une variable ServoServo servomoteur;// définition d'une variable counterint counter;// définition d'un tableau de donnéesuint8_t data[6];void setup() {  // on attache le servomoteur à la pin 11 (PWM) servomoteur.attach(11); // initialisation du nunchuck Wire.begin(); Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS); Wire.write(0xF0); Wire.write(0x55); Wire.endTransmission(); Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS); Wire.write(0xFB); Wire.write(0x00); Wire.endTransmission();}void loop() {     // on demande 6 octets au nunchuck   Wire.requestFrom(WII_NUNCHUK_I2C_ADDRESS, 6);   counter = 0;   // tant qu'il y a des données   while(Wire.available())   {     // on récupère les données     data[counter++] = Wire.read();   }   // on réinitialise le nunchuck pour la prochaine demande   Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);   Wire.write(0x00);   Wire.endTransmission();   if(counter >= 5)   {      // on extrait les données      // dans mon exemple j'utilise uniquement les données d'accélération sur l'axe Y      double accelX = ((data[2] << 2) + ((data[5] >> 2) & 0x03) - ZEROX);      double accelY = ((data[3] << 2) + ((data[5] >> 4) & 0x03) - ZEROY);      double accelZ = ((data[4] << 2) + ((data[5] >> 6) & 0x03) - ZEROZ);      // on limite la valeur entre -180 et 180      int value = constrain(accelY, -180, 180);      // on mappe cette valeur pour le servomoteur soit entre 0 et 180      value = map(value, -180, 180, 0, 180);      // on écrit sur le servomoteur la valeur      servomoteur.write(value);      // un petit delai pour pas saturer le servomoteur      delay(100);    }}
+
 
 +
#include <Servo.h>;
 +
#include <Wire.h>;
 +
 
 +
// Doit être ajusté en fonction de chaque nunchuck
 +
#define ZEROX 530
 +
#define ZEROY 530
 +
#define ZEROZ 530
 +
 
 +
 
 +
// adresse I2C du nunchuck
 +
#define WII_NUNCHUK_I2C_ADDRESS 0x52
 +
 
 +
// définition d'une variable Servo
 +
Servo servomoteur;
 +
// définition d'une variable counter
 +
int counter;
 +
 
 +
// définition d'un tableau de données
 +
uint8_t data[6];
 +
 
 +
 
 +
void setup()
 +
{
 +
   // on attache le servomoteur à la pin 11 (PWM)  
 +
  servomoteur.attach(11);
 +
  // initialisation du nunchuck
 +
  Wire.begin();
 +
  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
 +
  Wire.write(0xF0);
 +
  Wire.write(0x55);
 +
  Wire.endTransmission();
 +
 
 +
  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
 +
  Wire.write(0xFB);
 +
  Wire.write(0x00);
 +
  Wire.endTransmission();
 +
}
 +
 
 +
 
 +
void loop()
 +
{  
 +
  // on demande 6 octets au nunchuck
 +
  Wire.requestFrom(WII_NUNCHUK_I2C_ADDRESS, 6);
 +
  counter = 0; // tant qu'il y a des données
 +
  while(Wire.available())
 +
  {
 +
    // on récupère les données
 +
    data[counter++] = Wire.read();
 +
  }
 +
 
 +
  // on réinitialise le nunchuck pour la prochaine demande
 +
  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
 +
  Wire.write(0x00);
 +
  Wire.endTransmission();
 +
 
 +
  if(counter >= 5)
 +
  {
 +
     // on extrait les données
 +
     // dans mon exemple j'utilise uniquement les données d'accélération sur l'axe Y
 +
     double accelX = ((data[2] << 2) + ((data[5] >> 2) & 0x03) - ZEROX);
 +
     double accelY = ((data[3] << 2) + ((data[5] >> 4) & 0x03) - ZEROY);
 +
     double accelZ = ((data[4] << 2) + ((data[5] >> 6) & 0x03) - ZEROZ);
 +
 
 +
     // on limite la valeur entre -180 et 180
 +
     int value = constrain(accelY, -180, 180);
 +
     // on mappe cette valeur pour le servomoteur soit entre 0 et 180
 +
     value = map(value, -180, 180, 0, 180);
 +
     // on écrit sur le servomoteur la valeur
 +
     servomoteur.write(value);
 +
 
 +
     // un petit delai pour pas saturer le servomoteur
 +
     delay(100);
 +
   }
 +
}
 
</source>
 
</source>

Version du 3 septembre 2014 à 19:39

Communication série asynchrone rs232

Communication par bus SPI

Brochages de quelques cartes Arduino pour le SPI

Voici présenté les brochages utilisés par les cartes Arduino que nous possédeons à l'IUT :

SPI MISO MOSI SCK SS
UNO PB4 (Arduino:12) PB3 (Arduino:11) PB5 (Arduino:13) PB2 (Arduino:10)
LEONARDO PB3 (ICSP:1) PB2 (ICSP:4) PB1 (ICSP:3) -
MEGA2560 PB3 (Arduino:50) PB2 (Arduino:51) PB1 (Arduino:52) PB0 (Arduino:53)

Comme on peut le voir dans ce tableau, les broches utilisées pour SPI sur la Leonardo ne sont pas reliées aux connecteurs mais directement sur le programmateur ICSP. Il n'y a aucune broche dédiée au SS.

Pour éviter des recherches sur internet, nous rappelons la connectique associée des six broches avec les deux photos ci-dessous :

Connectique SPI

Voici par exemple ci- dessous la connectique ICSP présente sur une carte Arduino.

Connectique ISP de l'Arduino

Dialoguer en i2c avec une manette Nunchuk

Exemple de programme

#include <Servo.h>;
#include <Wire.h>;

// Doit être ajusté en fonction de chaque nunchuck
#define ZEROX 530
#define ZEROY 530
#define ZEROZ 530


// adresse I2C du nunchuck
#define WII_NUNCHUK_I2C_ADDRESS 0x52

// définition d'une variable Servo
Servo servomoteur;
// définition d'une variable counter
int counter;

// définition d'un tableau de données
uint8_t data[6];


void setup()
{
  // on attache le servomoteur à la pin 11 (PWM) 
  servomoteur.attach(11);
  // initialisation du nunchuck
  Wire.begin();
  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
  Wire.write(0xF0);
  Wire.write(0x55);
  Wire.endTransmission();

  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
  Wire.write(0xFB);
  Wire.write(0x00);
  Wire.endTransmission();
}


void loop()
{ 
  // on demande 6 octets au nunchuck
  Wire.requestFrom(WII_NUNCHUK_I2C_ADDRESS, 6);
  counter = 0;  // tant qu'il y a des données
  while(Wire.available())
  {
    // on récupère les données
    data[counter++] = Wire.read();
  }

  // on réinitialise le nunchuck pour la prochaine demande
  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
  Wire.write(0x00);
  Wire.endTransmission();

  if(counter >= 5)
  {
     // on extrait les données
     // dans mon exemple j'utilise uniquement les données d'accélération sur l'axe Y
     double accelX = ((data[2] << 2) + ((data[5] >> 2) & 0x03) - ZEROX);
     double accelY = ((data[3] << 2) + ((data[5] >> 4) & 0x03) - ZEROY);
     double accelZ = ((data[4] << 2) + ((data[5] >> 6) & 0x03) - ZEROZ);

     // on limite la valeur entre -180 et 180
     int value = constrain(accelY, -180, 180);
     // on mappe cette valeur pour le servomoteur soit entre 0 et 180
     value = map(value, -180, 180, 0, 180);
     // on écrit sur le servomoteur la valeur
     servomoteur.write(value);

     // un petit delai pour pas saturer le servomoteur
     delay(100);
   }
}