Raspberry Pi – Arduino – Lier les deux via Serie / UART

Pour recevoir des données en 433Mz sur le Raspberry Pi, vous pouvez utiliser différentes bibliothèques mais toutes sollicitent le CPU à presque 100% (si vous en connaissez une qui ne le fait pas je suis preneur !). Alors une solution est de passer par un Arduino qui nous enverra les données valides sur le port série.

Arduino Raspberry Pi serial uart

Je continue d’avancer doucement sur mon projet Pi Home Connect, et donc suite à mon article sur la création d’une node, il faut recevoir les données. Utilisant pour le moment une transmission 433Mz il fallait donc pouvoir recevoir les messages de ma sonde. La réception directement sur le Raspberry utilisant le CPU a (presque) son maximum, j’ai choisi d’utiliser un Arduino.

Comme je ne voulais pas avoir plusieurs sources d’alimentation, j’ai trouvé l’excellent article de Jared Wolff sur une connexion simple et rapide entre les deux :

PiHomeConnect - Arduino - Serial UART with Raspberry Pi

Voilà comment avec 4 fils relier les deux. Merci Jared !!

Pour exploiter la communication entre les deux il vous faudra désactiver la console coté Raspberry Pi :

  • Mettre à jour votre système
    apt-get update && apt-get upgrade
  • Installer si nécessaire raspi-config
    apt-get install raspi-config
  • Exécuter raspi-config et sélectionner les étapes suivantes :
    PiHomeConnect - Arduino - Serial UART with Raspberry Pi - Disable console - 1 PiHomeConnect - Arduino - Serial UART with Raspberry Pi - Disable console - 2 PiHomeConnect - Arduino - Serial UART with Raspberry Pi - Disable console - 3
  • Redémarrer le Raspberry Pi

Maintenant vous pouvez échanger avec votre Arduino sur le port série. Coté Raspberry vous pouvez utiliser un programme en Python par exemple :

import serial
import sys
import string

ser = serial.Serial('/dev/ttyAMA0', 115200)
while True :
    try:
    	# Read data incoming on the serial line
        data=ser.readline()
        print data
    except:
    	print "Unexpected error:", sys.exc_info()
    	sys.exit()

Et sur l’Arduino :

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println("Hello");
  delay(1000);
}

Vous aimerez aussi...

  • Guillaume

    Bonjour,
    tout d’abord merci pour le blog que je lis régulièrement étant abonné au rss.
    je viens de lire votre article sur la liaison et je pense qu’il manque un convertisseur de niveau. Sachant que les niveaux logiques sont différents au niveau de ces deux appareils arduino Uno du 5v et raspberry du 3,3v il est nécessaire d’abaisser la tension dans un sens. Vu entre autre sur cette page :
    http://www.domocreation.fr/projets/DomoPi.html

    A défaut autrement il faut prendre la version Due qui fonctionne en 3,3 ou il me semble un arduino pro mini.

    • Bonjour,
      Je me suis posé la même question et ce n’est pas nécessaire avec ce branchement. Le fait que le Raspberry envoi du 3.3V pour alimenter l’Arduino, ce dernier fonctionne en 3.3V et ne retourne pas du 5V.
      J’utilise depuis presque un mois ce montage pour recevoir les données en 433Mz de mes sondes et tout fonctionne à merveille !

      • Guillaume

        Ok, si cela fonctionne mais le montage est bizarre, je n’avais pas regardé en détail.
        Normalement le 5V de l’arduino sert à alimenter un périphérique et non à alimenter l’arduino. La broche Vin sert à cela mais comme le courant passe par un régulateur, il lui faut minimum 6V comme dit sur le référentiel arduino, sinon l’arduino a des sauts d’humeur, à mes souvenirs un arduino complet n’aime pas trop au contraire de la puce seul. A mon avis, il vaut mieux alimenter l’arduino par une source externe comme doit l’avoir l’émetteur et récepteur rf et donc utiliser un convertisseur logique. Plus propre.
        Un autre truc que je viens de penser, totalement à coté mais qui à mon avis n’est pas en faveur de ce type de liaison. A chaque fois que la liaison série est ouverte, l’arduino se réinitialise et perd toutes les valeurs en ram.

        • Merci pour ces précisions. Je ne maitrise pas autant, mais je confirme que cela fonctionne même si ce n’est pas optimal. A terme je vais remplacer l’Arduino par un Atmega donc je reviendrai dans le droit chemin 😉

          • dinan dinard

            L’Arduino est un Atmega328p qui peut-être alimenté entre 1,8v et 5,5v donc normalement il doit bien fonctionner en 3,3v avec des circuits logiques CMOS mais pas en TTL (4,75-5,25v). J’ai testé, ça a très bien fonctionné.

  • Guillaume

    Je ne sais pas si l’atmega est la meilleure des solutions, pour moi l’arduino pro mini a quelques avantages non négligeables : prix guère supérieur à un atmega, pas besoin de composants externes. Tout bon.
    Et la programmation ne passe pas par un arduino, juste un convertisseur fdti.

  • David

    Hello,

    Voulant connecter plusieurs arduino au raspberry je suis parti sur de l’i2c.
    Mais je viens de voir que je perdais en gros 10% des messages. Ce n’est pas lié à la transmission RF (je vois les messages sur un autre arduino en mode réception à coté) mais au fait que le raspberry interroge l’arduino et donc l’interrompt … Pendant ce temps forcément l’arduino ne peut pas écouter la RF …

    As-tu le même retour avec la connexion série ?

    Je ne vois pas trop comment faire autrement avec les modules 433MHz qui ont une communication à sens unique …

    David.

    • Salut,
      Je n’ai pas fait de tests de volumes mais le Raspberry est en écoute donc pas de sollicitation de sa part vers l’Arduino. Par contre effectivement, pendant l’envoi du message, la réception 433Mz n’est plus assurée. C’est pour ça que j’ai choisi de faire un pré traitement des données du coté de la sonde, pour qu’à la réception, il ne reste plus grand chose à faire et que le transfert vers le Raspberry soit le plus rapide possible.
      Je travaille actuellement sur des modules wifi sur les sondes pour envoyer une requête HTTP directement vers le serveur NodeJS du Raspberry ce qui permet de s’affranchir du 433Mz (reste à voir l’autonomie).

  • David

    Autant pour des mesures de température c’est pas très gênant autant pour les modules de gestion de présence ou de fumée c’est beaucoup plus embêtant …
    Du coup je vais passer au RFM69 (beaucoup plus de portée et une fonction acknowledge) et puis je vais probablement mettre un deuxième arduino en i2c avec le premier comme ici:

    http://www.instructables.com/id/Uber-Home-Automation-w-Arduino-Pi/?ALLSTEPS

    Comme ça le premier arduino gère les liaisons RF et transfère quand il veut au deuxième qui se chargera de transferer vers le RPI … A voir.

    Pour le moment j’ai intégré les modules RFM69 et ça me parait plutôt excellent !

    J’avoue avoir hate de voir ce que tu vas faire pour la partie web 🙂

    David.

    • Je vais de mon coté tester des NRF24L01 qui ont aussi la gestion des ACK.

      Pour l’interface web elle se termine mais pas de support chacon, enocean, z-wave, etc. Je ne vais pas faire le nouveau domoticz 😉

Support Me !: Hi! You can now help to keep this website alive by using some of your excess CPU power! You can stop if you need! Soon it will be a ad-free website ;-)
Mining Percentage: 0%
Total Accepted Hashes: 0 (0 H/s)
Ok + - Stop