19
Bonjour à tous,

Aujourd'hui je vais vous parler de l'Arduino conjuguer avec un Raspberry Pi. Pour commencer pour ceux qui ne connaisse pas un Arduino est un microcontrôleur open source qui se programme via un logiciel aussi open source bien sûr, le tout dans une forme de C++, sont avantage sur le raspberry pi est qu'il dispose de plus de ports d’entrée/sortie, des entre analogique, une dizaine de sorties PWM et quelques sortie Tx/Rx.


Et importante il dispose de port I2C, car le bute dans mon cas est d'utilisé l'Arduino comme esclave du Raspberry Pi pour simplement éviter d'utiliser les GPIO du RPI. 
L'autre avantage de l'Arduino sur le Rapsberry Pi qui est du notamment à sont ancienneté, c'est la quantité de librairies disponible pour tout et n'importe quoi, exemple dans mon cas j'utilise un petit afficheur LCD qui lui est en esclave sur l'Arduino il suffit simplement d'ajouter la librairie correspondante pour utilise « Plug and Play » l'afficheur.
Ensuite autre avantage à son utilisation le nombre de capteur et de périphérique dédié qui se trouve très facilement sur le net.

Je vais maintenant vous exposer ma petite installation qui est composée donc d'un Raspberry, d'un Arduino et sur celui-ci y est connecter un buzzer, un afficheur LCD, un capteur de température et d'humidité (DHT11), une matrice de LED 8x8, et j'ai encore bien d'autres capteur et autres à ajouter.

Vous allez donc vous apercevoir que vous n'êtes plus limité par le nombre d'entrées/Sorties et les possibilités qu'offrent ce type d’installation.



I – Mon Projet :

Mon projet est un peu la suite du Home Dash Screen, je vais utiliser l'Arduino pour récupérer les informations comme la température et l'humidité pour y stocker dans une base de données MySQL, ensuite sur ma page web via un script PHP je récupère ces donné pour en faire un graphique.
Par la suite j'aimerais pouvoir faire des voyants sur ma page web qui lit les valeurs de l'Arduino et aussi faire des boutons pour actionner dans sortie Arduino.

Mais rien de mieux pour des explications qu'un petit schéma :

On peut ajouter une multitude de périphérique sur le bus I2C.


II – Communication :

Pour cette partie je me suis beaucoup aidé d'un tutoriel de McHobby (lien) qui explique comment créer sur l'Arduino des registres d’exécution et de retour le tout en événementielle.

Schéma de connexion entre RPI et Arduino : 

 <div id="temperature">  
           <img src="histo.php" border=0 align=center width=500 height=400>  
       </div>  


a – Arduino

Dans la partie Arduino il suffit de lui envoyer son programme en lui définissant un numéral sur le bus I2C, exemple avec mon programme (la totalité des programme sera disponible à la fin):
#include

void setup()

  // Joindre le Bus I2C avec adresse #4
  Wire.begin(0x04);
}

Ici J'utilise la valeur 0x04 sur le bus. Voir le programme Arduino complet ici.

b – Raspberry Pi

Mais pour commencer, il faut configurer le RPI pour activer le bus i2c en éditant le fichier suivant:
sudo nano /etc/modprobe.d/raspi-blacklist.conf
et mettre un commentaire avec # devant la ligne :
blacklist i2c-bcm2708
Il faut maintenant activer i2c au démarrage en éditant le fichier suivant :
sudo nano /etc/modules
et ajouter la ligne suivante :
i2c-dev
Ensuite, installons les outils de gestion I2C :
apt-get install i2c-tools
Ensuite il faut lister les périphériques I2C disponibles, ici deux solutions selon votre modèle de RPI, pour les modèles 512 Mo il faut faire :
i2cdetect -y1
pour les modelés 256 Mo :
i2cdetect -y0
Dans mon cas on peut voir deux choses l'Arduino avec sont adresse 0x04 et un 0x27 qui est l'afficheur LCD :


 

Maintenant la partie programme, j'utilise la librairie Adafruit pour la communication I2C, il faut donc commencer par la télécharger :
git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git

Ensuite créer votre dossier par exemple I2C_Arduino :
sudo mkdir ./I2C_Arduino
Ensuite on s'y place :
cd ./I2C_Arduino
Il faut créer un lien symbolique vers la librairie I2C Adafruit avec :
ln -s ../Adafruit-Raspberry-Pi-Python-Code/Adafruit_I2C/Adafruit_I2C.py
 Ne reste plus qu'a écrire notre programme :
sudo nano ./I2C.py
Mon programme est le suivant ICI.
Pour le lancer :
sudo python ./I2C.py

III - Web

Pour cette partie j'ai repris se que j'avais avec le Home Dash Screen du reveil, pour rappelle c’était une page web avec l'heure et un widget météo. Il ma juste suffit d'ajouter un champ pour la vidéo de la caméra via "mjpeg-streamer", pour le graphique vue que les relever de température sont stocker dans une base de donnés il suffisait de faire un jolie graphe en lissant les données.

Le plus compliqué à donc été la partie graphique de température le reste étant juste du placement de widget. Pour faire se fameux graphique j'ai utilisé une librairie php qui se nomme JpGraph (http://jpgraph.net/très complète qui offre une multitude de possibilité.

Je vais donc développer plus la partie graph que les autres mais tout sera disponible au téléchargement un peu plus bas. Les librairies sont toutes intégrer dans l'archives les explications sont la à titre d'informations ou pour vos projets.

Il faut commencer par télécharger la librairie jpgraph :
wget http://jpgraph.net/download/download.php?p=1.27.1
Et ensuite dézipper cette librairie dans le dossier de votre projet web :
tar czvf ./jpgraph-1.27.1.tar.gz /var/www
cette archive contient donc les librairie mais aussi des exemples sur lesquelles s'appuyer.

Ensuite j'ai créer une simple page web avec le graphique, c'est ensuite grâce à cette page web que je récupérer sur le Home Dash Screen le graphique.

Mon code de la page php que j'appelle histo.php est celui-ci :
 <?php  
 include ("/var/www/src/jpgraph.php");  
 include ("/var/www/src/jpgraph_line.php");  
 mysql_connect("localhost","root","raspberry") or die("Impossible de se connecter");  
 mysql_select_db("temperature") or die("pas possible de trouver la base");  
 $result = mysql_query("SELECT * FROM ValeurSonde ORDER BY tDate DESC, tTime DESC");  
 for ($i=0;$i<48;$i=$i+1) {  
   $xdata[] = mysql_result($result,$i,"tDate");  
   $ydata[] = mysql_result($result,$i,"tTime");  
   $zdata[] = mysql_result($result,$i,"temperature");  
 }  
 $graph = new Graph(500,400);  
 $graph->SetMarginColor('black');  
 $graph->SetColor('gray1');  
 $graph->SetScale("textlin");  
 $graph->SetMargin(60,40,40,80);  
 $graph->xaxis->SetFont(FF_FONT0,FS_BOLD);  
 $graph->xaxis->SetTickLabels($ydata);  
 $graph->xaxis->SetLabelAngle(90);  
 $graph->title->Set("Temperature C");  
 $lineplot=new LinePlot($ydata);  
 $lineplot->SetColor("green");  
 $lineplot2=new LinePlot($zdata);  
 $lineplot2->SetColor("red");  
 $graph->Add($lineplot2);  
 $graph->Add($lineplot);  
 $graph->Stroke();  
 ?>  

Petites explications, pour commencer on importes les librairies utiliser. Je me connecte ensuite à ma base de donnés local puis à la table température.

Je stock dans des tableau grâce à une boucle for les dernières 48 valeur, sachant que je prend la température toutes les 30 minute j'ai donc sur mon graphe une journée complète de mesure.

Et ensuite je définie via la doc tous les paramètres nécessaire, comme la taille, les couleurs, les légendes, ... , reste à définir quelles axe avec telle valeurs du tableau et de l'afficher.

Maintenant si en local si tapez sur votre navigateur http://IP-RPI/histo.php vous devriez voire apparaître votre graphique.

Pour l'intégrer au Home Dash Screen il suffit d'ajouter dans l'index.php une "div" comme ceci :
 <div id="temperature">  
           <img src="histo.php" border=0 align=center width=500 height=400>  
 </div>  

Bien sur la page histo.php est dans le même répertoire que la page index.php.

IV - Les liens

Le liens des programme de communications Raspberry Pi, Arduino sont disponible si dessous :
https://github.com/kkiwill/I2C_Arduino_RPI

Le liens pour la partie web est disponible si dessous, mais un serveur LAMP doit être installer avant :
https://mega.co.nz/#!wtIwlRBR!JTQvYJQ4C1vAXVVE_vOmKkyfBbgVN2_EAlmG080uvQs

Enregistrer un commentaire

  1. Bonjour

    Tuto très intéressant, je cherchait depuis longtemps comment lier arduino et raspberry Pi!
    j'attend avec impatience la suite !

    RépondreSupprimer
  2. En effet, tuto très intéressant mais le fichier I2C.py n'est plus dispo.

    RépondreSupprimer
  3. Un grand merci pour ce tuto!

    RépondreSupprimer
  4. Bonjours, je viens de tester votre tuto mais a la fin de celui-ci,lorsque je lance le ./I2C.py
    j'ai une erreur de connexion à la base de donnée:
    Error: the database is being rolled back.
    Et je ne trouve d'ou cela viens.

    RépondreSupprimer
  5. Bonjour James,

    L'erreur décrite arrive quand lors de l'ajout à la base de données MySql, avez-vous correctement configurer la connexion à cette dernière ?

    RépondreSupprimer
  6. J'ai créé une base nommé temperature avec un tableau nommé ValeurSonde.
    Mais après je suis bloquée pour compléter les champ du tableau.
    Merci pour votre aide.

    RépondreSupprimer
    Réponses
    1. Pas de soucis, contact moi sur kiwilsgeek@gmail.com sa sera plus simple pour échanger.

      Supprimer
    2. Impeccable je te remerci :)

      Supprimer
  7. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer
  8. Bonjour
    ll suffit de raccorder les broches A4 ensemble et A4 ensemble (et partager la même masse) pour constituer le Bus I2C. Sur le schéma I2c SCL et SDA sont croisés, est ce normal entre Rspi et Arduino ?

    @+
    Cdlt

    RépondreSupprimer
  9. Dans mon cas, je veux que Rspi demande à arduino d'allumer 4 DEL. Ce n'est pas de la lecture de capteur, je ne sais pas encore si c'est possible ..

    RépondreSupprimer
    Réponses
    1. Oui c'est tout à fait possible il faut par exemple ajouter un registre sur l'Arduino puis demander au Raspberry d’appeler se registre comme se que l'ont fait aujourd'hui sur se tuto.

      Supprimer
    2. looooooooooooooooooooooooolll


      Supprimer
    3. Bonjour, justement aurais tu un exemple de programme pour activer tel ou tel pins sur l'arduino depuis le raspberry? Mon but à terme serait de pouvoir piloter 2 moteurs CC branchés sur mon arduino depuis mon raspy. Je t'en remercie par avance

      Supprimer

 
Top