Cours:TPS 2103 5 : Différence entre versions
m |
m (→Dialoguer en i2c avec une manette Nunchuk) |
||
Ligne 26 : | Ligne 26 : | ||
=Dialoguer en i2c avec une manette Nunchuk= | =Dialoguer en i2c avec une manette Nunchuk= | ||
+ | =={{Bleu|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 [http://ejenn.free.fr/index.php?title=Interconnexion_5V_/_3.3V dans ce lien]. La manette Nunchuk est quant à elle [http://fr.wikiversity.org/wiki/Very_High_Speed_Integrated_Circuit_Hardware_Description_Language/Les_nouvelles_interfaces_:_de_la_nunchuk_de_Nintendo_à_android décrite dans ce lien]. | ||
=={{Bleu|Exemple de programme}}== | =={{Bleu|Exemple de programme}}== | ||
<source lang=c> | <source lang=c> |
Version du 3 septembre 2014 à 21:37
Sommaire
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 :
Voici par exemple ci- dessous la connectique ICSP présente sur une carte 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 ce lien.
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);
}
}