Nous avons déjà abordé la communication entre le Raspberry Pi et l'Arduino au moyen d'un câble USB, ce qui imposait une certaine proximité entre les deux cartes.
Aujourd'hui, nous nous débarrassons du câble: l'Arduino et le Raspberry Pi s'échangeront des informations par ondes radio, à une fréquence de 433 MHz.
Matériel nécessaire
En plus du Raspberry Pi et de l'Arduino, nous utiliserons un émetteur et un récepteur 433 MHz, le modèle ultra-économique qu'on peut trouver sur eBay pour environ 1 euro. Une antenne constituée d'un fil conducteur d'environ 17 cm vous permettra d'augmenter considérablement la portée de votre paire émetteur-récepteur.
Installation des bibliothèques
Du côté de l'Arduino, j'ai utilisé la bibliothèque VirtualWire même si elle n'est plus mise à jour par son auteur (je ne me suis pas encore converti à RadioHead). Donc, si ce n'est pas déjà fait, vous devriez télécharger et installer VirtualWire dans votre IDE Arduino.
Du côté du Raspberry Pi, j'ai utilisé le module Python rédigé par Joan du Forum Raspberry Pi. Donc vous téléchargez le fichier vw.py et vous le placez dans le même répertoire que votre script Python (voir plus loin pour les scripts). Ce n'est pas tout: ce module requiert la bibliothèque pigpio . Pour installer cette bibliothèque dans votre Raspberry Pi, vous tapez ces lignes de commande dans le terminal:
Branchez l'émetteur à l'Arduino de la façon suivante:
Branchez le récepteur au Raspberry Pi de la façon suivante:
Et voici le script Python à installer dans le Raspberry Pi. N'oubliez pas d'installer ce script dans le même répertoire que le fichier vw.py.
Avant d'exécuter le script, vous devez mettre en marche le "démon pigpio" au moyen de cette ligne de commande:
sudo pigpiod
Transmission du Raspberry Pi vers l'Arduino
Aujourd'hui, nous nous débarrassons du câble: l'Arduino et le Raspberry Pi s'échangeront des informations par ondes radio, à une fréquence de 433 MHz.
Matériel nécessaire
En plus du Raspberry Pi et de l'Arduino, nous utiliserons un émetteur et un récepteur 433 MHz, le modèle ultra-économique qu'on peut trouver sur eBay pour environ 1 euro. Une antenne constituée d'un fil conducteur d'environ 17 cm vous permettra d'augmenter considérablement la portée de votre paire émetteur-récepteur.
Émetteur |
Récepteur |
Installation des bibliothèques
Du côté de l'Arduino, j'ai utilisé la bibliothèque VirtualWire même si elle n'est plus mise à jour par son auteur (je ne me suis pas encore converti à RadioHead). Donc, si ce n'est pas déjà fait, vous devriez télécharger et installer VirtualWire dans votre IDE Arduino.
Du côté du Raspberry Pi, j'ai utilisé le module Python rédigé par Joan du Forum Raspberry Pi. Donc vous téléchargez le fichier vw.py et vous le placez dans le même répertoire que votre script Python (voir plus loin pour les scripts). Ce n'est pas tout: ce module requiert la bibliothèque pigpio . Pour installer cette bibliothèque dans votre Raspberry Pi, vous tapez ces lignes de commande dans le terminal:
wget https://github.com/joan2937/pigpio/archive/master.zip
unzip master.zip
cd pigpio-master
make
sudo make install
Transmission de l'Arduino vers le Raspberry Pi
Branchez l'émetteur à l'Arduino de la façon suivante:
- Broche DATA de l'émetteur à la sortie 12 de l'Arduino
- Broche Vcc de l'émetteur à la sortie 5 V de l'Arduino
- Broche GND de l'émetteur à une des broches GND de l'Arduino
Branchez le récepteur au Raspberry Pi de la façon suivante:
- Une des broches DATA du récepteur (peu importe laquelle) à la pin GPIO 11 du Raspberry Pi.
- Broche 5 V du récepteur à une des broches 3,3 V du Raspberry Pi
- Broche GND du récepteur à une des pins GND du Raspberry Pi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Émission d'un message a 433 MHz par l'Arduino | |
// http://electroniqueamateur.blogspot.com/2014/10/communication-rf-433-mhz-entre.html | |
// basé sur: | |
// transmitter.pde | |
// | |
// Simple example of how to use VirtualWire to transmit messages | |
// Implements a simplex (one-way) transmitter with an TX-C1 module | |
// | |
// See VirtualWire.h for detailed API docs | |
// Author: Mike McCauley (mikem@airspayce.com) | |
// Copyright (C) 2008 Mike McCauley | |
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $ | |
#include <VirtualWire.h> | |
int compteur = 0; | |
const char *msg = "Bonjour, ici l'Arduino. Message # "; | |
char nombre[VW_MAX_MESSAGE_LEN]; | |
char message[VW_MAX_MESSAGE_LEN]; | |
void setup() | |
{ | |
Serial.begin(9600); // Debugging only | |
// Initialise the IO and ISR | |
vw_set_ptt_inverted(true); // Required for DR3100 | |
vw_setup(2000); // Bits per sec | |
} | |
void loop() | |
{ | |
compteur++; | |
// Conversion du int en tableau de chars | |
itoa(compteur,nombre,10); // 10 car décimal | |
strcpy (message, msg); | |
strcat(message,nombre); | |
digitalWrite(13, true); // Flash a light to show transmitting | |
vw_send((uint8_t *)message, strlen(message)); | |
vw_wait_tx(); // Wait until the whole message is gone | |
digitalWrite(13, false); | |
delay(200); | |
} |
Et voici le script Python à installer dans le Raspberry Pi. N'oubliez pas d'installer ce script dans le même répertoire que le fichier vw.py.
Avant d'exécuter le script, vous devez mettre en marche le "démon pigpio" au moyen de cette ligne de commande:
sudo pigpiod
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import pigpio | |
#!/usr/bin/env python | |
# -*- coding: latin-1 -*- | |
''' | |
Réception d'un message par le Raspberry Pi, | |
reçu à 433 MHz par un récepteur | |
relié à la pin GPIO 11 | |
Nécessite la présence du fichier vw.py dans le | |
même répertoire. | |
http://www.raspberrypi.org/forums/viewtopic.php?t=84596&p=598087 | |
http://electroniqueamateur.blogspot.com/2014/10/communication-rf-433-mhz-entre.html | |
''' | |
import vw | |
RX=11 | |
BPS=2000 | |
pi = pigpio.pi() | |
rx = vw.rx(pi, RX, BPS) | |
start = time.time() | |
print("En attente de la reception des donnees") | |
while (time.time()-start) < 100: | |
while rx.ready(): | |
print("".join(chr (c) for c in rx.get())) | |
rx.cancel() | |
pi.stop() |
Transmission du Raspberry Pi vers l'Arduino
N.B.: Lors de la mise à jour de cet article le 8 janvier 2021, je ne suis pas parvenu à faire fonctionner la transmission du Raspberry Pi vers l'Arduino.
Branchez l'émetteur au Raspberry Pi de la façon suivante:
Branchez le récepteur à l'Arduino de la façon suivante:
Voici le sketch à installer dans l'Arduino (n'oubliez pas d'afficher le moniteur série, où les résultats reçus seront affichés):
Et voici le script Python à exécuter par le Raspberry Pi (n'oubliez pas d'installer ce script dans le même répertoire que le fichier vw.py).
Avant d'exécuter le script, vous devez mettre en marche le "démon pigpio" au moyen de cette ligne de commande:
sudo pigpiod
Si vous préférez une communication 433 MHz entre deux Arduinos, référez-vous à cet article. Et j'ai tout plein d'articles sur le Raspberry Pi qui vous plairont peut-être.
Yves Pelletier (Twitter: @ElectroAmateur)
Branchez l'émetteur au Raspberry Pi de la façon suivante:
- Broche DATA de l'émetteur à la pin GPIO 25 du Raspberry Pi
- Broche Vcc de l'émetteur à une des pins 5 V du Raspberry Pi
- Broche GND de l'émetteur à une des pins GND du Raspberry Pi
Branchez le récepteur à l'Arduino de la façon suivante:
- Une des broches DATA du récepteur (peu importe laquelle) à l'entrée 11 de l'Arduino.
- Broche 5 V du récepteur à la sortie 5 V de l'Arduino
- Broche GND du récepteur à une des pins GND de l'Arduino
Voici le sketch à installer dans l'Arduino (n'oubliez pas d'afficher le moniteur série, où les résultats reçus seront affichés):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Réception d'un signal 433 MHz par Arduino. | |
// http://electroniqueamateur.blogspot.com/2014/10/communication-rf-433-mhz-entre.html | |
// receiver.pde | |
// | |
// Simple example of how to use VirtualWire to receive messages | |
// Implements a simplex (one-way) receiver with an Rx-B1 module | |
// | |
// See VirtualWire.h for detailed API docs | |
// Author: Mike McCauley (mikem@airspayce.com) | |
// Copyright (C) 2008 Mike McCauley | |
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $ | |
#include <VirtualWire.h> | |
void setup() | |
{ | |
Serial.begin(9600); // Debugging only | |
Serial.println("Attente de reception des donnees"); | |
// Initialise the IO and ISR | |
vw_set_ptt_inverted(true); // Required for DR3100 | |
vw_setup(2000); // Bits per sec | |
vw_rx_start(); // Start the receiver PLL running | |
} | |
void loop() | |
{ | |
uint8_t buf[VW_MAX_MESSAGE_LEN]; | |
uint8_t buflen = VW_MAX_MESSAGE_LEN; | |
if (vw_get_message(buf, &buflen)) // Non-blocking | |
{ | |
int i; | |
digitalWrite(13, true); // Flash a light to show received good message | |
// Message with a good checksum received, dump it. | |
Serial.print("Message recu: "); | |
for (i = 0; i < buflen; i++) | |
{ | |
Serial.write(buf[i]); | |
//Serial.print(" "); | |
} | |
Serial.println(""); | |
digitalWrite(13, false); | |
} | |
} |
Et voici le script Python à exécuter par le Raspberry Pi (n'oubliez pas d'installer ce script dans le même répertoire que le fichier vw.py).
Avant d'exécuter le script, vous devez mettre en marche le "démon pigpio" au moyen de cette ligne de commande:
sudo pigpiod
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: latin-1 -*- | |
''' | |
Émission d'un message par le Raspberry Pi, | |
qui sera transmis à 433 MHz par un émetteur | |
relié à la pin GPIO 25 | |
Nécessite la présence du fichier vw.py dans le | |
même répertoire. | |
http://www.raspberrypi.org/forums/viewtopic.php?t=84596&p=598087 | |
http://electroniqueamateur.blogspot.com/2014/10/communication-rf-433-mhz-entre.html | |
''' | |
import time | |
import pigpio | |
import vw | |
TX=25 | |
BPS=2000 | |
pi = pigpio.pi() | |
tx = vw.tx(pi, TX, BPS) | |
compteur = 0 | |
start = time.time() | |
while (time.time()-start) < 100: | |
compteur += 1 | |
while not tx.ready(): | |
time.sleep(0.1) | |
time.sleep(0.2) | |
tx.put("Bonjour, ici le Raspberry Pi! Message #{}.".format(compteur)) | |
tx.cancel() | |
pi.stop() |
Si vous préférez une communication 433 MHz entre deux Arduinos, référez-vous à cet article. Et j'ai tout plein d'articles sur le Raspberry Pi qui vous plairont peut-être.
Yves Pelletier (Twitter: @ElectroAmateur)