Différences entre versions de « RPI-ShieldBridge-I2C »
(→Python) |
|||
Ligne 1 : | Ligne 1 : | ||
{{RPI-ShieldBridge-NAV}} | {{RPI-ShieldBridge-NAV}} | ||
− | |||
== Introduction == | == Introduction == |
Version actuelle datée du 25 janvier 2014 à 16:29
Introduction
Voici un petit guide montrant comment établir une communication I2C entre RPi-ShieldBridge (Arduino compatible) et Raspberry Pi.
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 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.
Concernant la communication avancée en I2C entre Raspberry Pi et Arduino, vous pouvez consulter notre autre tutoriel ArduPi-I2C.
Préparer votre Arduino / RPi-ShieldBridge
Téléversez le sketch/croquis suivant sur votre RPi-ShieldBridge.
Vous pouvez vous référer au point relatif à firmata si vous ne savez pas comment programmer et téléverser le programme suivant sur votre RPi-ShieldBridge.
#include <Wire.h> #define ADDRESS 0x30 void setup() { pinMode(13, OUTPUT); // Définir la broche 13 comme sortie (il y a une LED connectée) digitalWrite(13, LOW); // Eteindre la LED sur la broche 13 Wire.begin(ADDRESS); // joindre le bus I2C avec l'adresse 0x30 Wire.onReceive(receive); // Fonction de réception de donnée (envoyé par le maitre) Wire.onRequest(request); // Fonction traitant une demande de donnée (demandé par le maitre) } void loop() { // Rien à exécuter... } // 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; while(Wire.available()) { c = Wire.read(); if(c == 0x00) // Si l'octet/byte recu est 0 -> éteindre la LED { digitalWrite(13, LOW); } else if(c == 0x01) // Si l'octet/byte recu est 1 -> Allumer la LED { digitalWrite(13, HIGH); } } } // 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); // renvoyer 0xAA }
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:
$ sudo modprobe i2c_bcm2708 baudrate=100000 $ sudo modprobe i2c-dev
Il faut également installer les outils I2C et la gestion smbus pour Python:
$ sudo apt-get update $ sudo apt-get install i2c-tools $ sudo apt-get install python-smbus
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:
$ sudo -i $ echo 18 > /sys/class/gpio/export $ echo out > /sys/class/gpio/gpio18/direction $ echo 0 > /sys/class/gpio/gpio18/value $ exit
Ou vous pouvez utiliser l'utilitaire gpio si vous avez installé WiringPi (voir notre tutoriel WiringPi):
gpio -g mode 18 out gpio -g write 18 1
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:
#!/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)
Exécuter le script Python:
$ sudo python i2ctest.py
Source: RPi-ShieldBridge
Créé par Stephan Watterott pour Watterott.
Traduction réalisée et augmenté par Meurisse D pour MCHobby.be.
Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : « Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.
L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.
Traduction et documentation réalisées avec l'autorisation expresse de Stephan Watterott - Documentation and translation built with authorization of Stephan Watterott.