Les Arduinos apparaissent généralement comme des périphériques série USB. Les cartes actuelles utilisent le pilote série USB intégré au microprocesseur principal, mais les anciens Arduinos (et leurs clones) utilisaient des puces série USB tierces distinctes.
Pour recevoir simplement des Serial.print
données sur le Raspberry Pi de l’Arduino, j’utilise le programme GNU Screen comme terminal de base: screen [serial-port] [baud-rate]
(par exemple screen /dev/ttyACM0 9600
).
J'ai testé trois Arduinos différents et un clone plutôt différent. Les nouvelles variantes sont toutes apparues en tant que /dev/ttyACM0
ports, et les plus anciennes /dev/ttyUSB0
. Voici ce que j'ai trouvé sous Raspbian:
Le Raspberry Pi peut ne pas fournir assez d’énergie pour conduire un Arduino, vous aurez donc peut-être besoin d’une alimentation externe. Par souci d’ exhaustivité, j’ai également testé un Prolific PL2303 , même s’il n’appartient à aucun Arduino. Il est apparu assez heureusement comme /dev/ttyUSB0
.
Pour des communications plus complexes avec des capteurs, vous pouvez envisager Firmata , "un protocole générique pour communiquer avec des microcontrôleurs à partir de logiciels sur un ordinateur hôte". Il a des implémentations pour Arduino et des bibliothèques Python à exécuter du côté Raspberry Pi.
Voici un petit exemple d'utilisation de pyFirmata pour lire un LM35 et modifier la luminosité d'une LED:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# simple test of pyfirmata and Arduino; read from an LM35 on A0,
# brighten an LED on D3 using PWM
# scruss, 2012-08-14 - tested on Arduino Uno & Raspberry Pi (Raspbian)
import pyfirmata
# Create a new board, specifying serial port
board = pyfirmata.Arduino('/dev/ttyACM0')
# start an iterator thread so that serial buffer doesn't overflow
it = pyfirmata.util.Iterator(board)
it.start()
# set up pins
pin0=board.get_pin('a:0:i') # A0 Input (LM35)
pin3=board.get_pin('d:3:p') # D3 PWM Output (LED)
# IMPORTANT! discard first reads until A0 gets something valid
while pin0.read() is None:
pass
for i in range(10):
pin3.write(i/10.0) # set D3 to 0, 10%, 20%, ... brightness
print "PWM: %d %% Temperature %.1f °C" % (i * 10, pin0.read() * 5 * 100)
board.pass_time(1) # pause 1 second
pin3.write(0) # turn LED back off
board.exit()
Il y a quelques mises en garde lors de l'utilisation de pyFirmata:
- Les lectures analogiques et les écritures PWM sont normalisées dans une plage de 0 .. 1, et non des Arduino standard 0 .. 255 et 0 .. 1023.
- Vous devez vraiment démarrer un thread d'itérateur séparé pour empêcher les anciennes lectures de déborder du tampon série.
- Puisque l’Arduino est lu de manière asynchrone, assurez-vous que la connexion pyFirmata est complètement initialisée avant de lire les ports. Sinon, les
None
valeurs s'ensuivent.