Nuova sezione libri disponibile!

HB Cloud Tutorial #2 - Uso dei Bottoni

Ludovico Russo

lettura in 6 minuti

Rieccomi con il secondo tutorial legato all'uso dei bottoni per il robot DotBot-ROS. In questo tutorial, vedremo come configurare ed utilizzare in Python un bottone attaccato ad un pin GPIO del Raspberry Pi 3.

DotBot bottone tutorial ROS Raspberry

Come al solito, scrivo questo tutorial come materiale di supporto per il corso che stiamo facendo presso l'ITIS Avogadro di Torino.

Scopo del Tutorial

Alla fine di questo tutorial, sapremo configurare ed utilizzare un bottone utilizzando le librerie gpiozero e dotbot_ros. In particolare, affronteremo i seguenti argomenti:

  • Uso della libreria gpiozero per interfacciarsi con un bottone e leggerne lo stato
  • Come stampare a video sulla shell di HBR Cloud
  • Uso della libreria dotbot_ros per pubblicare su un topic
  • Uso delle Callback

Il circuito elettronico

Come al solito, prima di iniziare a sviluppare il codice è importante configurare il circuito. Per il momento, utilizzeremo un semplice circuito, molto semplice, basato su un Led e un Bottone. Il led collegato al pin GPIO05, mentre il bottone, al pin GPIO02. Trovate un'immagine che mostra la numerazione dei pin in questa figura:

Raspberry Pi Configurazione PIN

Importante: Ricordate che la libreria gpiozero utilizza la numerazione dei pin colorata in Arancione.

I componenti necessari sono i seguenti:

  • Led Colorato
  • Resistenza da 270Ohm
  • Pulsante
  • Cavetti per Breadboard

Colleghiamo il led e la resistenza in serie, attaccando l'anodo del Led al pin GPIO05 e il catodo (attraverso la resistenza) a GND.

Colleghiamo una delle due fasi dell'interruttore al Pin GPIO02 e l'altra fase a massa.

Circuito elettronico

Scriviamo il codice!

Come al solito, partiamo dallo scheletro di un'applicazione, in cui impostiamo il nome del nodo come button_example

import dotbot_ros

class Node(dotbot_ros.DotbotNode):
    node_name = 'button_example'

    def setup(self):
        pass

    def loop(self):
        pass

Importiamo i due oggetti che andremo ad utilizzare dalla libreria gpiozero: Button e LED, utilizzando la seguente stringa prima della dichiarazione del nodo

from gpiozero import Button, LED

Utilizzo del bottone

Per il momento, utilizziamo solamente il bottone per visualizzare il suo stato (se chiuso o aperto) sfruttando la shell di DotBot-ROS e la funzione print di Python.

Per prima cosa, dobbiamo inilizzare il bottone e settare la frequenza di iterazione della funzione loop (per ora settiamola a 10Hz). Andiamo quindi ad implementare la funzione setup come segue

    def setup(self):
        self.btn = Button(2) #GPIO 2
        self.loop_rate = dotbot_ros.Rate(10)

Con la riga self.btn = Button(2) abbiamo creato un attributo chiamato btn al nostro nodo che gestisce un bottone collegato al pin GPIO02 del raspberry.

Invece, come già spiegato nel tutorial precedente, la riga self.loop_rate = dotbot_ros.Rate(10) setta a 10Hz la frequenza di iterazione di loop.

A questo punto, possiamo implementare la funzione loop in modo che stampi a video lo stato del bottone. Per farlo, utilizziamo l'attributo is_pressed dell'oggetto Button, che restituisce True se il bottone è premuto, False altrimenti.

Possiamo quindi utilizzare il costrutto if-else nella funzione loop:

    def loop(self):
        if self.btn.is_pressed:
            print 'interruttore chiuso'
        else:
            print 'interruttore aperto'
        sys.stdout.flush()

Importante: Ogni qual volta viene utilizzata la funzione print, bisogna aggiungere la linea di codice sys.stdout.flush() (e importare il modulo sys con la stringa import sys. Questo serve a forzare la stampa effettiva sulla shell di DotBot-ROS.

Proviamo ad eseguire il codice e vedere cosa succede. Dovreste vedere un output sulla shell di questo tipo:

Shell Bottone Status

Pubblichiamo lo stato del bottone su un topic ROS

Se il programma precedente funziona, siamo pronti ad utilizzare una delle funzione principali di ROS: i Topic.

Un topic è un canale di comunicazione che permette ai vari nodi di una rete ROS di scambiare informazioni. Un nodo può pubblicare o iscriversi ad un topic, in modo da mandare, o ricevere informazioni. Per ora ci focalizziamo sul pubblicare i dati.

Per farlo, dobbiamo creare un oggetto Publisher, utilizzando il costruttore dotbot_ros.Publisher(<Name>, <Type>). Dove il parametro Name è una stringa che indica il nome del topic, mentre il parametro Type è un oggetto che indica il tipo di messaggio che viene scambiato all'interno del topic.

In questo semplice esempio, chiameremo il topic button_status e manderemo messaggi di tipo booleano. Per utilizzare il tipo Bool dei messaggi, prima di tutto dobbiamo importarlo dalla libreria std_msgs.msg, aggiungendo questa stringa all'inizio del programma

from std_msgs.msg import Bool

Possiamo quindi creare l'oggetto publisher nella funzione setup

    def setup(self):
        #...
        self.pub_btn_status = dotbot_ros.Publisher('button_status', Bool)
        #...

A questo punto, possiamo utilizzarlo nella funzione loop. Modifichiamola nel modo seguente

    def loop(self):
        btn_status = self.btn.is_pressed
        self.pub_btn_status.publish(btn_status)
        if btn_status == True:
            print 'interruttore chiuso'
        else:
            print 'interruttore aperto'
        sys.stdout.flush()

In particolare, abbiamo creato una nuova variabile chiamata btn_status, che contiene il valore dello stato del bottone. Con la riga self.pub_btn_status.publish(btn_status) diciamo all'oggetto pubblicatore di mandare un messaggio sul topic a cui si riferisce contenente il valore della variabile btn_status. Il resto della funzione non è stato modificato.

A questo punto possiamo nuovamente testare il programma, per vedere se il topic ROS viene effettivamente utilizzato e i messaggi vengono mandati. Una volta lanciato il programma, accediamo al tab ROS della piattaforma online. Nella lista di topic, dovreste vedere un topic chiamato /<nome del robot>/button_status. Questo è il topic che abbiamo appena creato. Si noti che la piattaforma aggiunge automaticamente il namespace del vostro robot ai topic che creeremo. Nel mio caso specifico, il topic si chiama /polibot/button_status. Premiamo quindi sul pulsante Echo riferito al topic in questione. Si aprirà un nuovo pannello che mostrerà in tempo reale i dati scambiati all'interno del topic.

Echo Topic Status

Proviamo a premere il bottone e vediamo se i valori inviati cambiano di conseguenza!!

Controllo del LED

A questo punto, siamo pronti a completare la nostra applicazione utilizzando un Led. Voglio, in particolare, far si che ogni volta che il bottone venga premuto, il led cambi stato (utilizzando la funzione toggle vista nel tutorial precedente).

Per farlo, utilizzeremo un concetto di programmazione chiamato callback. La callback è una funzione che non viene chiamata in modo esplicito dal programma, ma che viene chiamata al verificarsi di un evento. In particolare, quello che faremo è creare una callback che chiamerà la funzione Led.toggle quando si verifica l'evento di pressione del bottone.

Prima di tutto, creiamo il nostro oggetto LED nella funzione setup utilizzando la linea di codice self.led = LED(5). A questo punto, siamo pronti a settare la callback: per associare una funzione all'evento pressione del pulsante, dobbiamo settare il nome della funzione da richiamare all’attributo Button.when_pressed: self.btn.when_pressed = self.led.toggle. Sembra semplice vero? Eppure questo basta per far funzionare il tutto.

    def setup(self):
        #...
        self.led = LED(5)
        self.btn.when_pressed = self.led.toggle

Si noti che noi non andiamo a chiamare esplicitamente la funzione self.led.toggle, ma informiamo solo il programma di chiamarla quando l'evento self.btn.when_pressed si verifica.

Possiamo a questo punto lanciare il programma e testare che tutto funzioni!

Codice completo

Qui trovate il codice completo appena realizzato

import dotbot_ros
from gpiozero import LED, Button
from std_msgs.msg import Bool

import sys

class Node(dotbot_ros.DotbotNode):
    node_name = 'button_example'

    def setup(self):
        self.btn = Button(2)  #GPIO 2
        self.loop_rate = dotbot_ros.Rate(10)
        self.pub_btn_status = dotbot_ros.Publisher('button_status', Bool)

        self.led = LED(5)
        self.btn.when_pressed = self.led.toggle

    def loop(self):
        btn_status = self.btn.is_pressed
        self.pub_btn_status.publish(btn_status)
        if btn_status == True:
            print 'interruttore chiuso'
        else:
            print 'interruttore aperto'
        sys.stdout.flush()

Esercizi

Provate a migliorare il programma come segue.

1. Aggiungere un secondo pulsante

Aggiungete un nuovo pulsante su un pin GPIO a piacere e stampate a video gli stati di entrambi i pulsanti ad ogni iterazione.

2. Controllo del led con entrambi i pulsanti

Controllate il led utilizzando i due pulsanti. In particolare, fate in modo che il led si spenga premendo il primo pulsante, e si accenda premendo il secondo pulsante. Utilizzate le funzioni led.on e led.off.

3. Topic btn1_and_btn2

Create un secondo topic di tipo Bool chiamato btn1_and_btn2. Su questo topic, inviate l'informazione ottenuta dall'AND logico del valore dei due pulsanti.

Ricordo che in Pyton, l'AND logico tra due variabili a e b booleane si implementa con la seguente sintassi

a_e_b = a and b

Fate la stessa cosa con l'OR logico.

Ti è piaciuto questo post?

Registrati alla newsletter per rimanere sempre aggiornato!

Ci tengo alla tua privacy. Leggi di più sulla mia Privacy Policy.

Ti potrebbe anche interessare

HB Cloud Tutorial #1 - Uso dei Led
Iniziamo ad utilizzare la piattaforma di Cloud Robotics
HB Cloud Tutorial #3 - I Motori
I Motori sono una delle parti essenziali dei robot. In questo tutorial, vederemo come è possibile in modo semplice ed intuitivo implementare un programma in Python che controlla i motori in base a comandi inviati via Wifi al Robot.
Utilizzare la RaspiCam in streaming con la piattaforma Cloud
Breve tutorial che spiega come abilitare la RaspiCam su ROS e la piattaforma di Cloud Robotics
Installiamo ROS su Raspberry Pi
Un breve tutorial su come utilizzare ROS sul Raspberry Pi
Video Corso ROS Rokers - Completati i video di Introduzione
Sono disponibili online i video tutorial del corso di ROS partito dalla community Rokers
Inviare Goals alla Navigation Stack - versione nodo ROS Python
Inviare un goal all ROS navigation stack utilizzando un nodo Python
Controllare siBOT dalla piattaforma HBR
Come controllare il manipolatore siBOT utilizzando la piattaforma HBR
Sviluppare un rilevatore di fiamma con la visione artificiale
Sviluppare un rilevatore di fiamma con la visione artificiale
Scriviamo un Blog in Python e Flask
Tutorial su come implementare, a partire da zero, un blog personale utilizzando Python e Flask! Prima parte!
Un laboratorio di Fisica con Arduino e Python
Primi esperimenti con Arduino e Python per realizzare un semplice laboratorio di fisica sfruttando la potenza di Python e la versatilità di Arduino
Un IDE web Arduino sviluppato in Python e Flask
Un mio progetto dell'estate del 2015 che permette di programmare Arduino da un'interfaccia Web esposta da un Raspberry Pi
Utilizziamo Atom come editor di testo remoto su Raspberry Pi
Come usare Atom come editor di testo remoto per Raspberry Pi
Canopy: una Pythonica alternativa a Matlab
Presento questo interessante tool python che può essere considerato una buona alternativa a Matlab per l'analisi dei dati!
Spyder, un'altra alternativa in Python a Matlab
Una velocissima prova del tool interattivo Spyder per l'analisi scientifica in Python
Simuliamo il moto parabolico in Python e Spyder
Un piccolo tutorial per iniziare ad utilizzare Spyder con Python
HB Robotics: con Python impariamo la Cloud Robotics
Vi presento la mia startup: ecco come riusciamo a insegnare la Cloud Robotics con Python e ROS.
Python + Arduino = Nanpy
Programmare Arduino in Python con Nanpy
Utilizzo di Nanpy con il sensore di temperatura/umidità della famiglia DHT
Come utilizzare Nanpy col sensore DHT di temperatura e Umidità
Accendere led con Arduino e Telegram
Un bot telegram in grado di controllare Arduino realizzato da 3 ragazzi del Liceo Stampacchia
Gestire le macchine virtuali senza sforzo con Vagrant
Introduzione ed esempio di utilizzo su Vagrant, il tool che semplifica la gestione delle macchine virtuali per lo sviluppo.
Implementiamo un bot Telegram con Python
Una semplice guida per iniziare a muovere i primi passi nello sviluppo di chatbot Telegram con Python
Pillole di Python: pyscreenshot
Una semplice tutorial che mostra il funzionamento della libreria pyscreenshot
Python Decorators
Introduzione ai decoratori in Python
TDD con Flask e PyTest per lo sviluppo di API REST. Parte 1
Tutorial su come usare il Test Driver Development (TDD) con Flask e PyTest per sviluppare delle semplici API REST
Implementiamo un bot Telegram con Python - I Comandi
Vediamo come gestire i comandi del nostro bot in Telegram
4 (+1) Libri su Python (in Inglese) da cui imparare
Una lista di libri su Python (in Inglese) da cui ho imparato a programmare
Virtualenv: gestiamo meglio le dipendenze in Python
A cosa servono e come si utilizzano i virtualenv Python
Leggere i codici a barre con OpenCV e zbar in Python
Come usare Python per leggere i codici a barre degli alimenti e ricavarne alcune informazioni utili
TDD con Flask e PyTest per lo sviluppo di API REST. Parte 2
Tutorial su come usare il Test Driver Development (TDD) con Flask e PyTest per sviluppare delle semplici API REST
Sviluppiamo un bot Telegram che legge i codici a barre degli alimenti
Implementiamo un bot Telegram in grado di leggere ed analizzare le immagini per la lettura ed interpretazione dei codici a barre
TDD con Flask e PyTest per lo sviluppo di API REST. Parte 3
Tutorial su come usare il Test Driver Development (TDD) con Flask e PyTest per sviluppare delle semplici API REST
Divertiamoci sviluppando UI da terminale con ASCIIMATICS
Le UI da terminale fanno molto anni '80, però sono sempre diventerti da implementare. Oggi vi voglio introdurre ad una semplice libreria per creare questo tipo di applicazione.
Sviluppiamo un Robot con tecnologie Open Source
Inizio una serie di videoguide, in cui voglio introdurvi al mondo della robotica di servizio in modo pratico, facendo vedere come è possibilile, sfruttando tecnologie completamente Open Source, quali Arduino, Raspberry Pi, ROS e Docker, costruire un piccolo robot di Servizio.
Parliamo come GMaps: come creare file audio con gtts (Google Text to Speech) in Python
gtts è una libreria in Python per sfruttare le API di Google Text to Speech per generare file audio dal testo
Robot Open Source - Introduzione a Docker
È disponibile il video "Introduzione a Docker".
I chatbot possono Parlare? Sviluppiamo un bot telegram che manda messaggi vocali
Usiamo le API di sintesi vocale di google per creare un bot in grado di mandare messaggi vocali
Robot Open Source - Docker e Raspberry
È disponibile il video "Docker e Raspberry".