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:
#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.
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
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 !
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.