Ligne 1 : |
Ligne 1 : |
| {{RPI-ShieldBridge-NAV}} | | {{RPI-ShieldBridge-NAV}} |
− | {{traduction}}
| |
| | | |
| == Introduction == | | == Introduction == |
− | A small guide to show the communication via I2C between the Arduino (RPi-ShieldBridge) and Raspberry Pi.
| + | Voici un petit guide montrant comment établir une communication I2C entre RPi-ShieldBridge (Arduino compatible) et Raspberry Pi. |
| | | |
− | The I2C pins of the Raspberry Pi are connected to the AVR and the Arduino Shield connectors (SDA+SCL) on the RPi-ShieldBridge.
| + | Les broches I2C du Raspberry Pi sont connectés sur l'AVR (le microcontroleur) mais aussi sur les broches SDA & SCL des connecteurs Shield Arduino présents sur le RPi-ShieldBridge. |
| + | |
| + | == En savoir plus sur I2C == |
| + | I2C est un bus de communication à la fois simple, puissant (par ses applications) et très répandu. La sphère Arduino dispose d'ailleurs de nombreux périphériques I2C qui peuvent même être directement utilisé avec un Pi. |
| + | |
| + | Nous avons produit [[Arduino I2C Intro|un tutoriel I2C assez complet pour Arduino]], c'est là qu'I2C est le plus facile à apprendre. Notre tutoriel couvre aussi bien le Maître et l'Esclave. |
| + | |
| + | [[Fichier:tlogo-I2C.jpg]] |
| + | |
| + | Concernant la communication avancée en I2C entre Raspberry Pi et Arduino, vous pouvez consulter [[ArduPi-I2C|notre autre tutoriel ArduPi-I2C]]. |
| + | |
| + | [[Fichier:tlogo-ArduPi-I2C.jpg]] |
| | | |
| == Préparer votre Arduino / RPi-ShieldBridge == | | == Préparer votre Arduino / RPi-ShieldBridge == |
Ligne 19 : |
Ligne 29 : |
| void setup() | | void setup() |
| { | | { |
− | pinMode(13, OUTPUT); // set pin 13 as output (LED connected) | + | pinMode(13, OUTPUT); // Définir la broche 13 comme sortie (il y a une LED connectée) |
− | digitalWrite(13, LOW); // set pin 13 to low (0V) | + | digitalWrite(13, LOW); // Eteindre la LED sur la broche 13 |
| | | |
− | Wire.begin(ADDRESS); // join I2C bus with respective address | + | Wire.begin(ADDRESS); // joindre le bus I2C avec l'adresse 0x30 |
− | Wire.onReceive(receive); // receive data function | + | Wire.onReceive(receive); // Fonction de réception de donnée (envoyé par le maitre) |
− | Wire.onRequest(request); // send data function | + | Wire.onRequest(request); // Fonction traitant une demande de donnée (demandé par le maitre) |
| } | | } |
| | | |
| void loop() | | void loop() |
| { | | { |
− | // do nothing | + | // Rien à exécuter... |
| } | | } |
| | | |
− | void receive(int numBytes) // function that runs when data is received | + | // Fonction qui est appelée lorsque des données sont |
| + | // recues sur le bus I2C (donnée envoyée par le maître) |
| + | void receive(int numBytes) |
| { | | { |
| unsigned char c; | | unsigned char c; |
Ligne 39 : |
Ligne 51 : |
| { | | { |
| c = Wire.read(); | | c = Wire.read(); |
− | if(c == 0x00) // LED off, if byte equals 0 | + | if(c == 0x00) // Si l'octet/byte recu est 0 -> éteindre la LED |
| { | | { |
| digitalWrite(13, LOW); | | digitalWrite(13, LOW); |
| } | | } |
− | else if(c == 0x01) // LED on, if byte equals 1 | + | else if(c == 0x01) // Si l'octet/byte recu est 1 -> Allumer la LED |
| { | | { |
| digitalWrite(13, HIGH); | | digitalWrite(13, HIGH); |
Ligne 50 : |
Ligne 62 : |
| } | | } |
| | | |
− | void request() // function that runs when data is requested | + | // Fonction qui est exécutée lorsque le maître du bus I2C |
| + | // réclame des données à l'esclave (donc votre RPi-ShieldBridge |
| + | void request() |
| { | | { |
− | Wire.write(0xAA); // send 0xAA | + | Wire.write(0xAA); // renvoyer 0xAA |
| }</nowiki> | | }</nowiki> |
| + | |
| + | == Préparé votre Pi == |
| + | |
| + | Il faut bien entendu activer le bus I2C sur votre Raspberry-Pi. |
| + | |
| + | Si vous ne l'avez pas encore fait, chargez le module I2C et installez les logiciels nécessaires: |
| + | |
| + | <nowiki>$ sudo modprobe i2c_bcm2708 baudrate=100000 |
| + | $ sudo modprobe i2c-dev</nowiki> |
| + | |
| + | Il faut également installer les outils I2C et la gestion smbus pour Python: |
| + | |
| + | <nowiki>$ sudo apt-get update |
| + | $ sudo apt-get install i2c-tools |
| + | $ sudo apt-get install python-smbus</nowiki> |
| + | |
| + | Vous pouvez tester le bus I2C avec la commande suivante sur vos Raspberry Pi (rev 2): |
| + | |
| + | $ sudo i2cdetect -y 1 |
| + | |
| + | Le "1" est important et dépend de la révision du votre Pi. Les cartes Raspberry Pi révision 1 utilisent I2C bus 0 (GPIO 0 + 1) tandis que la révision 2 des cartes utilisent I2C bus 1 (GPIO 2 + 3) sur le connecteur GPIO. |
| + | |
| + | |
| + | === La Broche Reset Arduino === |
| + | Par défaut, la broche Reset de l'Arduino compatible (sur le RPi-ShieldBridge) est connecté sur le GPIO18 (broche #12) du Raspberry Pi. |
| + | |
| + | * GPIO18 = Etat Haut (high) = Reset Arduino '''activé'''. |
| + | * GPIO18 = Etat bas (low) = Reset Arduino '''désactivé'''. |
| + | |
| + | Il faut donc initialiser correctement le GPIO18 pour désactiver le Reset Arduino: |
| + | |
| + | <nowiki>$ sudo -i |
| + | $ echo 18 > /sys/class/gpio/export |
| + | $ echo out > /sys/class/gpio/gpio18/direction |
| + | $ echo 0 > /sys/class/gpio/gpio18/value |
| + | $ exit</nowiki> |
| + | |
| + | Ou vous pouvez utiliser l'utilitaire '''gpio''' si vous avez installé WiringPi (voir [[Pi-WiringPi|notre tutoriel WiringPi]]): |
| + | |
| + | <nowiki>gpio -g mode 18 out |
| + | gpio -g write 18 1</nowiki> |
| + | |
| + | == Tester == |
| + | |
| + | === Commande Shell === |
| + | |
| + | Commençons par utiliser une commande Shell |
| + | Switch on LED: |
| + | |
| + | $ sudo i2cset -y 1 0x30 0x01 |
| + | |
| + | Switch off LED: |
| + | |
| + | $ sudo i2cset -y 1 0x30 0x00 |
| + | |
| + | === Python === |
| + | Créons un script de test nommé i2ctest.py: |
| + | |
| + | $ nano i2ctest.py |
| + | |
| + | Et copiez y le code suivant: |
| + | |
| + | <nowiki>#!/usr/bin/env python |
| + | # -*- coding: latin-1 -*- |
| + | |
| + | import time |
| + | import smbus |
| + | bus = smbus.SMBus(1) |
| + | addr = 0x30 # Adresse de périphérique I2C |
| + | |
| + | while True: |
| + | # Ecrire le byte/octet 0x01 sur le périphérique I2C 0x30 |
| + | # (donc le RPi-ShieldBrigde) |
| + | bus.write_byte(addr, 0x01) |
| + | # Message pour indiquer que la Led est allumée sur le Rpi-ShieldBridge |
| + | print "on" |
| + | |
| + | # Attendre une seconde |
| + | time.sleep(1) |
| + | |
| + | # Ecrire le byte/octet 0x00 sur le périphérique I2C 0x30 |
| + | # (donc le TRi-ShieldBrigde) |
| + | bus.write_byte(addr, 0x00) |
| + | |
| + | # Message pour indiquer que la Led est éteinte sur le Rpi-ShieldBridge |
| + | print "off" |
| + | |
| + | time.sleep(1)</nowiki> |
| + | |
| + | |
| + | Exécuter le script Python: |
| + | |
| + | $ sudo python i2ctest.py |
| + | |
| {{RPI-ShieldBridge-TRAILER}} | | {{RPI-ShieldBridge-TRAILER}} |