Cours:TPS 2103 5
Révision datée du 3 septembre 2014 à 19:33 par Bjacquot (discussion | contributions)
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 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); }}