Donc tous d'abord, vous allez devoir installer votre Raspberry PI avec Raspbian et tous dont se qu'il a besoin pour bien fonctionner.

Ensuite, nous allons utiliser une carte Arduino UNO, c'est deux cartes seront reliées par un bus I²C.

Le bus I²C fonctionne par un système de maître et d'esclave et donc nous allons mettre le Raspberry en tant que maître et l'Arduino UNO en tant qu'esclave.

Avant tout pour connecter les deux appareils il faut savoir quelles broches utiliser ! Pour le raspberry c’est sur les GPIO 2 et 3

Pour l’Arduino, ça se passe sur les broches A4 et A5 pour les cartes de type Arduino Uno.


Avant de connecter nos deux appareils, il faut s’assurer qu’ils vont pouvoir communiquer.

Voici ce qu'il faut faire:

Définir l'Arduino comme esclave.

#include <"Wire.h">
#define SLAVE_ADDRESS 0x12
int dataReceived = 0;
void setup() {
Serial.begin(9600);
Wire.begin(0x12);
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
}
void loop() {
delay(100);
}
void receiveData(int byteCount){
while(Wire.available()) {
dataReceived = Wire.read();
Serial.print("Donnee recue : ");
Serial.println(dataReceived);
}
}
void sendData(){
int envoi = dataReceived + 1;
Wire.write(envoi);
}

Vous l’aurez compris, le programme initialise l’Arduino avec l’adresse 0x12 , définit la méthode de réception des données, la méthode d’envoi des données et c’est parti pour l’envoyer vers la carte avec l’interface.

Définir le Raspberry en maître

import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# This is the address we setup in the Arduino Program
address = 0x04

def writeNumber(value):
bus.write_byte(address, value)
# bus.write_byte_data(address, 0, value)
return -1

def readNumber():
number = bus.read_byte(address)
# number = bus.read_byte_data(address, 1)
return number

while True:
var = input("Enter 1 - 9: ")
if not var:
continue

writeNumber(var)
print "RPI: Hi Arduino, I sent you ", var
# sleep one second
time.sleep(1)

number = readNumber()
print "Arduino: Hey RPI, I received a digit ", number
print

Activer la gestion I²C sur le Raspberry PI

Par défaut, des distributions de type Raspbian désactivent la gestion I²C pour économiser la mémoire utilisée par le module. Pour réactiver, rien de plus simple et c’est dans le fichier /etc/modprobe.d/raspi-blacklist.conf. Il faut mettre en commentaire avec un # la ligne :our réactiver, rien de plus simple et c’est dans le fichier /etc/modprobe.d/raspi-blacklist.conf. Il faut mettre en commentaire avec un # la ligne :

blacklist i2c-bcm2708


Reste à activer le module lors de chaque démarrage. C’est dans le fichier /etc/modules, en y ajoutant à la fin une nouvelle ligne :

i2c-dev

Ensuite vous installez la suite des outils de gestion I²C

apt-get install i2c-tools

Il va vous falloir redémarrer le Raspberry pour faire apparaitre deux fichiers :

root@raspberrypi:~# ls -l /dev/i2c*
crw-rw---T 1 root i2c 89, 0 Mar 2 2015 /dev/i2c-0
crw-rw---T 1 root i2c 89, 1 Mar 2 2015 /dev/i2c-1
root@raspberrypi:~#

Grâce à eux vous allez pouvoir communiquer sur la liaison I²C !

Vous pouvez lister les périphériques avec la commande :

i2cdetect -y 1

Voilà. Etape suivante : connecter l’Arduino et lui parler !

Communiquer avec l'Arduino

Vous pouvez maintenant relier l’Arduino au Raspberry et allumer tout ce petit monde !


Une fois fait, vous vous connectez sur le Raspberry Pi et vous relancez la commande i2cdetect avec le bon paramètre :


Il nous faut maintenant mettre en place le script sur le Raspberry Pi qui va envoyer/recevoir avec l’Arduino.

Pour cela, le plus simple c’est d’installer le support d’I2C dans les scripts Python. C’est ce que va faire python-smbus

apt-get install python-smbus

Maintenant on va pouvoir parler à notre Arduino UNO.

Donc on va faire un petit programme tous simple, on va choisir un chiffre entre 0 et 8.

import smbus
import time

# Remplacer 0 par 1 si nouveau Raspberry
bus = smbus.SMBus(1)
address = 0x12

print "Envoi de la valeur 3"
bus.write_byte(address, 3)
# Pause de 1 seconde pour laisser le temps au traitement de se faire
time.sleep(1)
reponse = bus.read_byte(address)
print "La reponse de l'arduino : ", reponse

Résultat de l'exécution:


Voila maintenant vous savez comment faire pour faire parler un Raspberry PI et un Arduino UNO via une liaison I²C.

  • Retourn à l'accueil Promo2016

  • Retour au menu principal