arduPython is a fork of pyFirmata, which is a Python interface for Arduino that uses the Firmata protocol. It is fully compatible with Firmata 2.1 and has some features of version 2.2. It runs on Python 3.7, 3.8, 3.9 and 3.10. With this library you will control the Arduino board using the Python language.
In the current version, you will find improvements using the latest Python version (3.10) and PulseIn support (eg to control the HC-SR04 sensor) of the Arduino language.
The preferred way to install is with pip::
pip install git+https://github.com/BosonsHiggs/arduPython
You can also install from source with python setup.py install
. You will need to have setuptools installed ::
git clone https://github.com/BosonsHiggs/arduPython.git
cd pyFirmata
python setup.py install
Basic usage::
>>> from pyfirmata import Arduino, util
>>> board = Arduino('/dev/ttyXXXX') or just board = Arduino()
>>> board.digital[13].write(1)
To use analog ports, it is probably useful to start an iterator chain. Otherwise, the board will keep sending data to your serial, until it bursts:
>>> it = util.Iterator(board)
>>> it.start()
>>> board.analog[0].enable_reporting()
>>> board.analog[0].read()
0.661440304938
If you use a pin more often, it might be worth using the board's get_pin
method. It allows you to specify which pin you need by a string, made up of 'a' or 'd' (depending on whether you need an analog or digital pin), the pin number and the mode ('i' for input, ' o 'for output, 'p' for pwm). All separated by :
. For example. a:0:i
for analog 0 as input or d:3:p
for digital pin 3 as pwm. ::
>>> analog_0 = board.get_pin('a:0:i')
>>> analog_0.read()
0.661440304938
>>> pin3 = board.get_pin('d:3:p')
>>> pin3.write(0.6)
If you want to use a board with a different layout than the standard Arduino or Arduino Mega (for which there are shortcut classes pyfirmata.Arduino
and pyfirmata.ArduinoMega
), instantiate the Board class with a dictionary as the layout
argument. This is the layout adage for Mega, for example::
>>> mega = {
... 'digital' : tuple(x for x in range(54)),
... 'analog' : tuple(x for x in range(16)),
... 'pwm' : tuple(x for x in range(2,14)),
... 'use_ports' : True,
... 'disabled' : (0, 1, 14, 15) # Rx, Tx, Crystal
... }
If you want to use ultrasonic range sensors that use a pulse to measure distance (like the very cheap and common HC-SR04
- See datasheet,
you will need to use a
pulseIn
compatible Firmata on your card.
You can download it from the pulseIn
branch of the Firmata repository:
Simply connect the sensor's Trig
and Echo
pins to a digital pin on your board.
And then use the ping method on the pin:
>>> echo_pin = board.get_pin('d:7:o')
>>> echo_pin.ping()
1204
You can use the ping_time_to_distance
function to convert
the result of the ping (echo time) in distance:
>>> from pyfirmata.util import ping_time_to_distance
>>> echo_pin = board.get_pin('d:7:o')
>>> ping_time_to_distance(echo_pin.ping())
20.4854580555607776
The codes will only work if you download and load the pulseIn
code on the Arduino board! It has to be exactly the code quoted!
- Official Discord Server
- My Discord User: Aril Ogai#5646