Python rozmawia z Arduino; biblioteki firmata oraz pyfirmata

Dziś udało mi się nawiązać połączenie między Pythonem i Arduino. Skorzystałem z biblioteki firmata.

Najpierw do Arduino IDE należy załadować bibliotekę firmata. Następnie do płytki wgrywamy program StandardFirmata, który znajduje się w przykładach.

Jeśli chodzi o Python 3, praktycznie nic nie trzeba robić poza wpisaniem portu na którym uruchomione jest Arduino.
Nazwę portu znajdziemy wpisując (w macos) w Terminalu polecenie:

ls -l /dev/tty.*

Program sam zainstaluje bibliotekę pyfirmata.

Diodę LED (obowiązkowo z rezystorem 220R) podłączyłem pod PIN 12.
Jak łatwo odkryć, efektem działania programu jest migająca 5 razy dioda.

try:
    from pyfirmata import Arduino, util
except ModuleNotFoundError:
    import pip
    pip.main(['install', 'pyfirmata'])
    from pyfirmata import Arduino, util
except Exception as e:
    print("Rodzaj błędu: {}" .format(e))
              
from time import sleep

i = 0

board = Arduino('/dev/cu.usbmodem1A13121') # nazwa portu Arduino
while i < 5:
    board.digital[13].write(1)
    sleep(0.5)
    board.digital[13].write(0)
    sleep(0.15)
    i = i + 1

Kod drugi.

Tym razem kręcimy potencjometrem na pinie A0 w Arduino i przesyłamy dane do programu napisanego w Pythonie. Gdy wartość odebrana bliska jest zeru lub maksymalnej, Python wysyła informację do Arduino i włączana jest dioda na pinie 12-tym. Czyli tym razem mamy komunikację w obie strony.

try:
    from pyfirmata import Arduino, util
except ModuleNotFoundError:
    import pip

    pip.main(['install', 'pyfirmata'])
    from pyfirmata import Arduino, util
except Exception as e:
    print("Rodzaj bledu: {}".format(e))

from time import sleep

wynik = 0
board = Arduino('/dev/cu.usbmodem1A13121')
# pin = 12

def ledin(pin):

    board.digital[pin].write(1)
    sleep(1)
    board.digital[pin].write(0)
    sleep(0.15)


# iterator = util.Iterator(board)
# iterator.start()

# pin0 = board.get_pin('a:0:i')
# sleep(1.0)
# print(pin0.read()*1000.0)

while True:
    try:
        it = util.Iterator(board)
        it.start()
        board.analog[0].enable_reporting()
        sleep(0.5)
        wynik = int(board.analog[0].read() * 10000)
        print(wynik)
        if wynik < 100 or wynik > 9900:
            ledin(12)

    except KeyboardInterrupt:
        exit()
        break

Linki:

pyFirmata Documentation

pyfirmata

Dodaj komentarz