Cours:TPS 2103 5 : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m ({{Bleu|Adaptation de tensions}})
m (Communication série asynchrone rs232)
Ligne 1 : Ligne 1 :
 
=Communication série asynchrone rs232=
 
=Communication série asynchrone rs232=
 +
Vous avez déjà eu l'occasion d'utiliser cette liaison avec les primitives Arduino. Rappelez-vous le programme utilisé pour sortir les valeurs des capteurs analogiques :
 +
<source lang=c>
 +
void setup()
 +
{
 +
  Serial.begin(9600);
 +
}
 +
 +
void loop()
 +
{
 +
  Serial.print("Photocoupleur : ");
 +
  Serial.println(analogRead(A2),DEC);
 +
  delay(500); 
 +
}
 +
</source>
 +
Nous allons maintenant utiliser cette liaison en C.
  
 
=Communication par bus SPI=
 
=Communication par bus SPI=

Version du 3 septembre 2014 à 21:47

Communication série asynchrone rs232

Vous avez déjà eu l'occasion d'utiliser cette liaison avec les primitives Arduino. Rappelez-vous le programme utilisé pour sortir les valeurs des capteurs analogiques :

void setup()
{
  Serial.begin(9600);
}
 
void loop()
{
  Serial.print("Photocoupleur : ");
  Serial.println(analogRead(A2),DEC);
  delay(500);  
}

Nous allons maintenant utiliser cette liaison en C.

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

Adaptation de tensions

Les cartes Arduino que nous utilisons sont en général en 5V. Il existe cependant un certain nombre de périphériques I2C qui sont en 3,3V. La manette Nunchuk en est un exemple. Il faut donc réaliser une adaptation bidirectionnelle. Ce genre d'adaptation est décrit par exemple dans ce lien.

La manette Nunchuk est quant à elle décrite dans la WIKIVersité et aussi ici (rédigé par les étudiantes KONAK Sumeyye et SAVRY Maelle).

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