RPI-ShieldBridge-I2C

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.


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.

Tlogo-I2C.jpg

Concernant la communication avancée en I2C entre Raspberry Pi et Arduino, vous pouvez consulter notre autre tutoriel ArduPi-I2C.

Tlogo-ArduPi-I2C.jpg

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.