Firmata

Instalare

Pentru a folosi firmata pe Raspberry Pi trebuie instalata biblioteca pyFirmata. Descarcati biblioteca de pe GitHub folosind comanda

git clone https://github.com/tino/pyFirmata.git

E important sa descarcam biblioteca pyFirmata de pe github, fiind mai noua decat cea din resursele python instalabila cu pip.

Aveti un director pyFirmata. Intrati in el si instalati biblioteca folosind

sudo python setup.py install

PyFirmata foloseste biblioteca pyserial pentru a comunica cu placa arduino. Pentru a instalat pyserial avem nevoie de pip.

sudo apt-get install pip
sudo pip install pyserial

Legarea Arduino

Legarea Arduino se va face folosind un port USB din Raspberry Pi. Raspberry Pi va simula un port serial peste USB. Acesata are in general numele /dev/ttyUSB0 sau /dev/ttyACM0. Pentru a determina portul, vom folosi

dmesg

Aceasta va afisa mesajele kernel-ului, printre care sa va afla si protul USB la care este legat Arduino.

PyFirmata

Clasa Board

In continuare vom prezenta un exemplu de utilizare a bibliotecii pyfirmata.
Clasa in jurul careia este construita biblioteca firmata este Board. Acesta are urmatoarele propietati:

  • digital[] - sirul de pini digitali [0,13] pentru Arduino
  • analog[] - surul de pini analogici [0,5] pentru Arduino

Functiile clasei Board sunt:

  • get_pin(nume_pin) intoarce un obiect ce reprezinta un pin al Arduino
    • numele unui pin este format din urmatoarea combinatie tip:numar:mod
    • tip poate fi a pentru analogic sau d pentru digital
    • numar este numarul pinului
    • mod este i pentru intrare, p pentru PWM, o pentru iesire
  • pass_time (secunde) - opreste programul un numar de secunde, insa nu blocheaza celelalte fire de esecutie
  • iterate - citeste valori de la Arduino, trebuie folosita pentru a citi valorile pinilor digitali si analogici. Functie se va bloca pana va avea date de intrare. Inainte de a o folosi, este bine sa verificam daca avem date de procesat folosind functie bytes_avalilable()
  • bytes_available () - verifica daca exista date
  • exit() iese

Din clasa Board deriva doua clase:

  • Arduino - pentru Arduino UNO, Leonardo, Duemilanova
  • ArduinoMega - pentru Arduino Mega si Mega ADK

Clasa Pin

Clasa Pin are urmatoarele functii:

  • enable_reporting () - informeaza Arduino sa trimita prin portul serial valoarea pinului, pinul trebuie sa fie setat ca intrare
  • read () - intoarce valoarea pinului (trebuie sa fi fost apelat error_reporting () inainte. get_pin () face asta pentru pinii de intrare. Trebuie apelata functia iterate () din clasa placii pentru a se citi valorile, altfel se vor intoarce tot valorile vechi.
  • write (valoare) - scrie o valoare pe pin

Exemplu

Scrierea unui pin

from pyfirmata import Arduino
board = Arduino ('/dev/ttyACM0')
board.digital[3].write (1)
board.exit ()

Programul descris mai sus va initializa placa Arduino conectata pe portul /dev/ttyACM0 si va seta pinul 3 la valoarea 1.

Folosirea pinilor

Am folosit pinii prin intermediul sirului digital al clasei Board. Pinii pot fi reprezentati fiecare de catre o variabila. Pentru a face asta, folosim functia get_pin(). Vom rescrie programul anterior folosind functia get_pin():

from pyfirmata import Arduino, util
board = Arduino ('/dev/ttyACM0')
# verificam starea butonului
b_pin = board.get_pin ('d:5:i')
while True:
    board.iterate()
    b = b_pin.read ()
    if b == 1:
        print "Buton este apasat"
board.exit ()

Numele pinilor sunt de forma tip:numar:mod.

Tip Explicatie
d digital
a analogic
Tip Explicatie
i intrare
p PWM
s servo
o iesire

Citirea unui pin

Pentru citire, va trebui sa apelam functia iterate().

from pyfirmata import Arduino
board = Arduino ('/dev/ttyACM0')
b_pin = board.get_pin ('d:5:i')
while True:
    # procesam valori noi de la placa Arduino
    if board.bytes_available():
        board.iterate () 
        # verificam starea butonului
        b = b_pin.read () 
        if b == 1:
            print "Buton este apasat"
    # asteptam o secunda
    board.pass_time (1) 
board.exit ()

Programul initializeaza placa Arduino legata pe portul /dev/ttyACM0, proceseaza intrarea primita de la placa, citeste valoarea butonului si asteapta o secunda.

Folosirea unui iterator

Pentru a nu fi obligati sa apelam mereu functia iterate (), putem folosi un iterator ce va face un fir de executie nou in care va apela functia iterate (). Pentru acesta importam din puyfirmata functiile din util.

from pyfirmata import Arduino, util
board = Arduino ('/dev/ttyACM0')
# instantiem un iterator
fir = util.Iterator (board)
# pornim firul de executie al iteratorului
# acesta va apela functia iterate () pe placa primita ca parametru
fir.start ()
 
# verificam starea butonului
b_pin = board.get_pin ('d:5:i')
while True:
    b = b_pin.read () 
    if b == 1:
        print "Buton este apasat"
board.exit ()

Flask si pyFirmata

Incercam sa aprindem un led legat pe portul 2 folosind o pagina web. Pentru acesta vom combina Flask cu pyFirmata

from pyfirmata import Arduino, util
from flask import Flask
 
app = Flask (__name__)
board = Arduino ('/dev/ttyACM0')
 
lumina = board.get_pin ('d:2:o')
 
html = '<html><head><title>Lumina</title></head><body><a href="/on">On</a> - <a href="/off">Off</a></body></html>'
 
@app.route ('/')
def web ():
    return html
 
@app.route ('/on')
def on ():
    lumina.write (1)
    return html
 
@app.route ('/off')
def off ():
    lumina.write (0)
    return html
 
app.run (host='0.0.0.0')
sisteme_integrate/cursuri/curs4.txt · Ultima modificare: 2013/08/06 18:00 de către bogdan.vlad
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0