.: HosiriS :.

Informatica e non solo

Archive for the ‘Python’ Category

MeteArduino

Posted by hosiris su dicembre 1, 2011

Analisi iniziale
Il modulo meteo che verrà progettato dovrà soddisfare alcune semplici specifiche:

  • misurarazione di temperatura, pressione e umidità
  • inseririmento automatico dei dati misurati in un database
  • presentazione dei dati in maniera semplice ed intuitiva

La piattaforma di prototipazione che verrà utilizzata sarà Arduino con l’aggiunta di un piccola breadboard per le prime connessioni. La comunicazione tra Arduino e PC avverrà tramite USB.
Sono specifiche di massima, non restrittive, ma scritte solo per dare una linea guida al progetto.

Scelta dei sensori
Per la scelta dei sensori mi sono concentrato maggiormente sul costo degli stessi, in quanto per un progetto casalingo non è richiesta né una grande precisione né molta accuratezza.
Leggi il seguito di questo post »

Annunci

Posted in Arduino, C/C++, IHSys, Javascript, PHP, Progetti Personali, Python, SQL | 1 Comment »

Misuriamo la temperatura tramite Arduino

Posted by hosiris su ottobre 3, 2011

Dopo aver introdotto il mio progettino (IHSys) cominciamo con il progettare e realizzare il primo modulo: un misuratore di temperatura.
Leggi il seguito di questo post »

Posted in Arduino, C/C++, Hardware, IHSys, Javascript, PHP, Progetti Personali, Python, temparduino | 1 Comment »

Robotica con Python: pyro

Posted by hosiris su maggio 3, 2011

Al momento sono impegnato nella ricerca di un emulatore per Arduino che mi permetta di provare il codice senza doverlo trasferire sulla piattaforma. Il motivo? Semplice: il mio “piccolo” Arduino non è invisibile e a lavoro non è sempre utile far vedere cose strane :D. Mentre facevo queste ricerche mi sono imbattuto in Pyro… e sono rimasto veramente colpito.
Leggi il seguito di questo post »

Posted in Programmazione, Python, Robotica | 2 Comments »

Python debugging

Posted by hosiris su aprile 19, 2011

Quando si intraprende la stesura di un buon programma non si può rinunciare ad un buono strumento di debug.
Anche python permette di effettuare dei controlli sul codice tramite un modulo chiamato pdb, purtroppo non è di utilizzo immediato (almeno per i niubbi).
Alla base di questo articolo sta la possibilità di scrivere codice python attraverso un normale editor e che il codice verrà eseguito attraverso un terminale.
Leggi il seguito di questo post »

Posted in Programmazione, Python | 4 Comments »

Python, GTK e finestre multiple

Posted by hosiris su aprile 17, 2011

Come facciamo a gestire l’apertura di una finestra quando viene cliccato un pulsate su una finestra “principale”?
Per chi ha concetti di OOP potrebbe dire: basta istanziare un nuovo oggetto. Ed infatti è così.
Leggi il seguito di questo post »

Posted in Programmazione, Python | 1 Comment »

Interfacciare Arduino con il PC: pySerial

Posted by hosiris su aprile 11, 2011

Chi ha un minimo di dimestichezza con la programmazione di Arduino sa benissimo che è possibile avere una sorta di debug utilizzando la porta seriale per avere informazioni durante il funzionamento.
Ma questa porta ci permette anche di inviare comandi al controllore, facendo si che alcuni funzionalità possono essere implementate a livello software distogliendo l’attenzione dall’hardware (facile capire che il ponte H per la gestione dei motori è d’obbligo…).
Esistono varie possibilità di interfacciarsi tramite il PC (qui ho parlato di PHP), ma da poco ho scoperto che esiste una libreria che ci permette di scrivere una interfaccia tramite Python: PySerial.

Ipotizziamo di avere il seguente codice:

int ledPin = 13;
int inputPin = 2;
int val = 0;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(inputPin, INPUT);
  Serial.begin(9600);
  Serial.print("Program Initiated\n");
}
 
void loop(){
  val = digitalRead(inputPin);
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH);
    Serial.print("Ciao!\n");
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Banalmente ci aspettiamo un segnale sul pin 2, ad esempio la chiusura di un interruttore, e mostrerà un messaggio.
Passiamo adesso all’interfaccia. Dopo aver installato la libreria, possiamo scrivere la seguente routine:

import serial
 
location='/dev/ttyS0'
 
try:
  print "Trying...",location
  arduino = serial.Serial(location, 9600)
  break
except:
  print "Failed to connect on",location
 
try:
  print arduino.readline()
except:
  print "Failed to read!"

In questo modo, dopo l’esecuzione dello script, vedremo sul terminale apparire “Ciao!” ad ogni chiusura dell’interuttore.
Bello, no?

Buon divertimento

Posted in Arduino, Hardware, Python | 1 Comment »

Usare Python per interrogare Google Maps

Posted by hosiris su aprile 7, 2011

Come possiamo reperire informazioni da Google Maps senza utilizzare Javascript?
La potenza di Python e di JSON ci vengono in aiuto, rendendo questa operazione molto semplice. Vogliamo creare una picola applicazione che ci fornisce i dati di un indirizzo.
Iniziamo con le librerie necessarie:

import urllib
import urllib2
import json
import pprint
import gtk

Creiamo una funzione che ci permetterà di eseguire la query alle API:

def fetch_json(query_url, params={}, headers={}):
     encoded_params = urllib.urlencode(params)
     url = query_url + encoded_params
     request = urllib2.Request(url, headers=headers)
     response = urllib2.urlopen(request)
     return (url, json.load(response))

La funzione è molto semplice da comprendere e mi sembra inutile scendere nei particolari. Adesso creiamo le variabili necessarie:

STATUS_OK = 200
QUERY_URL = 'http://maps.google.com/maps/geo?'
pp = pprint.PrettyPrinter(indent=4)
params = {
    'q': 'Roma',
    'sensor': 'false',
    'output': 'json',
    'oe': 'utf8',
    'll': '',
    'spn': '',
    'gl': '',
}

Sfruttiamo la funzione definita prima per avere le informazioni richieste:

url, response = fetch_json(self.QUERY_URL, params=params)
status_code = response['Status']['code']
if status_code != self.STATUS_OK:
    print 'Errore'
else:
    pp.pprint(response)

Il risultato sarà il seguente:

{
    u'Placemark': [ {
        u'AddressDetails': {
            u'Accuracy': 4,
            u'Country': {
                u'AdministrativeArea': {
                    u'AdministrativeAreaName': u'Lazio',
                    u'SubAdministrativeArea': {
                        u'Locality': { u'LocalityName': u'Roma'},
                        u'SubAdministrativeAreaName': u'RM'
                    }
                },
                u'CountryName': u'Italia',
                u'CountryNameCode': u'IT'
            }
        },
        u'ExtendedData': {
            u'LatLonBox': {
                u'east': 12.994561900000001,
                u'north': 42.160691900000003,
                u'south': 41.629133299999999,
                u'west': 11.9700867
            }
        },
        u'Point': {
            u'coordinates': [ 12.4823243, 41.895465600000001, 0]
        },
        u'address': u'Rome, Italy',
        u'id': u'p1'
    }],
    u'Status': { u'code': 200, u'request': u'geocode'},
    u'name': u'Roma'
}

Posted in Programmazione, Python | 2 Comments »

Tips: Diagramma delle classi a partire dai sorgenti

Posted by hosiris su aprile 3, 2011

Vi è capitato mai di dover analizzare il codice scritto da altri, che magari non sanno cosa sono i commenti? A me fin troppe volte (anche perché molte delle cose che ho imparato derivano da studi sul codice) e quindi mi sono messo a cercare degli strumenti che mi aiutassero a comprendere.

Pyreverse è una piccola applicazione che prende in pasto dei programmi scritti in Python e genera il class diagram associato. Per installarlo è sufficiente dare il seguente comando:

$ sudo apt-get install pylint graphviz

Per utilizzarlo posizioniamoci nella cartella del sorgente e digitiamo:

$ pyreverse -o png - p SOMETHING project_dir/

Dopo l’elaborazione verrà generato un file immagine che ci darà le informazioni necessarie.

Posted in Programmazione, Python | 1 Comment »

Python and Festival TTS programming

Posted by hosiris su marzo 30, 2011

Bene bene bene… cosa abbiamo oggi?
Mi sono imbarcato in un bel progettino che ha come scopo principale operazioni di sintesi vocale su alcune frasi…
Come cominciare? La prima cosa da fare è di sicuro cercare le librerie (a meno che qualcuno non preferisca scriversele da se – too much work). Girovagando in lungo ed in largo ho trovato pyTTSx, una rapida letta alla documentazione e capisco che è quello che fa al caso mio.
La mia applicazione dovrà essere cross-plattform quindi oggi (in via eccezionale) parlerò anche di come far funzionare il tutto su Win[d|z]o[ws|zz].

Scarichiamo i pacchetti necessari per GNU/Linux e per Win[d|z]o[ws|zz].
L’installazione su Windows è delle più classiche e non spreco parole, su GNU/Linux l’operazione prevede l’installazione di un piccolo applicativo che ci permette di utilizzare il formato “egg” per l’installazione:

$ sudo apt-get install python-setuptool

In questo modo è possibile lanciare:

$ sudo easy_install package_pyttsx.egg

Già so che le vostre menti malvagie stanno pensando che Win[d|z]o[ws|zz] ci ha reso la vita semplice… ma vi siete fatti ingannare 😀 infatti è necessario installare questo programmino.

Ok pronti ad operare… apriamo VI (o blocco note buuuuuuuuuu) e scriviamo il seguente codice:

import pyttsx
tts = pyttsx.init()
tts.say('ciao sono un programma in python e parlo')
tts.runAndWait()

ecco fatto, difficile vero?

PS: probabilmente avrete dei messaggi di warning… purtroppo c’è qualche bug noto sul supporto audio per bluetooth, quindi si risolve facilmente con:

$ sudo apt-get remove --purge bluez-alsa

Buon divertimento!

PS: Sfortunatamente tutto questo sembra non funzionare su Ubuntu… o meglio funziona tutto tranne il fatto che quando si vuole creare l’istanza pyttsx l’interprete vada in tilt… Sto cerca una soluzione, se la conoscete siete “obbligati” a scriverla 😀

Posted in Programmazione, Python | 1 Comment »

Progettiamo e realizziamo la nostra prima interfaccia

Posted by hosiris su marzo 16, 2011

Si lo so: i programmi senza interfaccia sono molto più veloci e consumano meno risorse!
Purtroppo mi sono reso conto che, nonostante tutte le spiegazioni date, il 90% degli utenti vuole vedere qualcosa di colorato…
Ed allora ho iniziato a studiare le WxWidget, da affiancare a C++ o a Python che ci permettono di creare applicazioni compatibili con tutti i sistemi.

Esporrò quello che, secondo il mio modo di lavorare, può essere un buon metodo di progettazione e sviluppo dell’interfaccia.
Gli strumenti di cui ci serviremo sono:

  • Pencil: Applicazione standalone o estensione per Firefox che permette di progettare interfacce grafice;
  • wxGlade: programma per la realizzazione di interfacce grafiche che genera automaticamente i lcodice C++ o Python
  • wxPython: binding delle librerie wxwidget per python

Io ho preferito utilizzare la versione di Pencil standalone, perchè il mio firefox è già troppo carico… Questo programma tramite una semplice interfaccia ci permette di progettare la nostra grafica:

Cosa farà questa prima applicazione? Faremo un programmino che prende in input un indirizzo e restituisce le coordinate. Quindi ho immaginato la mia interfaccia come segue:

Dopo aver realizzato l’interfaccia che più ci piace (facciamolo con calma, perchè è meglio avere una idea chiara su come deve essere il risultato perchè sarà difficile dopo fare grosse modifiche), apriamo wxGlade e realizziamo la vera interfaccia:

Queste operazioni sono poco piacevoli, ma vi assicuro che ne vale la pena: ricordatevi di associare gli eventi ai pulsanti, date le giuste label, posizionate correttamente gli elementi (non scrivo come fare perchè le varie documentazioni sono molto esplicative). Quando abbiamo impostato tutti i parametri, definiamo il file di output su cui salvare il codice e selezioniamo il tast “Generate Code”.

Eseguendo il file generato, vedremo che il programma funziona senza problemi. Non rimane quindi che modificare il comportamento degli elementi. Io ho previsto solo due funzioni “OnLocalize” e “OnCancel”: il primo restituirà le coordinate dell’indirizzo immesso, il secondo cancellerà il contenuto degli elementi.
Apriamo il file sorgente e cerchiamo la definizione delle due funzioni (wxGlade fa tutto per noi, genera gli eventi e li collega ai pulsanti corretti) e modifichiamo il contenuto coem segue:

    def OnLocalize(self, event): # wxGlade: MyFrame.
        URL2 = "http://maps.googleapis.com/maps/api/geocode/json?address=%s&sensor=false" % self.text_ctrl_1.GetValue().replace(" ", "+")
        googleResponse = urllib.urlopen(URL2)
        jsonResponse = json.loads(googleResponse.read())
        pprint.pprint(jsonResponse)
        #data_address = json.dumps([s['formatted_address'] for s in jsonResponse['results']], indent=3)
        data_lat = json.dumps([s['geometry']['location']['lat'] for s in jsonResponse['results']], indent=3)
        data_lon = json.dumps([s['geometry']['location']['lng'] for s in jsonResponse['results']], indent=3)
        self.label_1.SetLabel("Ti trovi alle coordinate:\n latitudine => %s\n longitudine => %s" % (data_lat,data_lon))
        event.Skip()
    def OnCancel(self, event): # wxGlade: MyFrame.
        self.text_ctrl_1.SetValue("")
        self.label_1.SetLabel("")
        event.Skip()

Ricordiamoci di caricare le giuste librerie:

import urllib
import json
import pprint

Non vi rimane che salvare ed eseguire il programma:

Se eseguite il programma da un terminale, vedrete anche l’intero array JSON con tutte le informazioni che potete elaborare, per l’esempio mi è sembrato sufficiente usare solo le coordinate.

Magari tutto questo non rende giustizia ai vari strumenti presentati, ma voglio invitarvi a fare una modifica all’interfaccia… aggiungete un pulsante ad esempio! Rigenerate il codice usando lo stesso file del progetto precedente, cosa notate? Ebbene si: wxGlade ha modificato solo le classi dell’interfaccia, lasciando inalterato il codice aggiunto da noi!

Spero di essere stato esaustivo: Buon divertimento!

Posted in Programmazione, Python | 3 Comments »