Cours:TPS 2103 5 : Différence entre versions
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 | + | |
| + | #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
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
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);
}
}