lunedì 30 gennaio 2012

MOD su U8150

Per vari motivi ho provato a cambiare il sistema Android montato di fabbrica sul mio Huawei Ideos 8150 della Vodafone con risultati alterni. In particolare


  • Dronix 0.4 : francamente la migliore che ho provato. Veloce, parca di batteria, multitouch abilitato, permessi di root
  • Dronix 0.5.4 : un mezzo inferno. Venendo dalla positiva esperienza ho provato l'upgrade alla 0.5.4 piu' che altro per sperimentare l'USB Host per un futuro utilizzo con Arduino. Il telefono funziona abbastanza bene ma non vengono installati gli aggiornamenti del Market, non e' possibile installare gli apk compilati da Eclipse,  il kernel modificato per l'USB Host azzera la batteria nel giro di poche ore
  • CyanogenMod 7.2: una volta installata richiede il PIN per attivare il telefono ogni 10 secondi. Scartata immediatamente senza ulteriori prove
In tutto cio' ho provato a reinstallare anche il firmware originale della Vodafone ma devo ammettere di non essere riuscito a tornare indietro per cui adesso sto usando, con soddisfazione, la Dronix 0.4

sabato 28 gennaio 2012

Studio GPS per DGPS

Sto lavorando ad una idea su come poter utilizzare telefoni Android o GPS Bluetooth a basso costo per creare un sistema di GPS Differenziale (DGPS) per migliorare le prestazioni e ridurre l'errore di localizzazione.

Il primo passo che ho fatto e' stato quello di studiare un sensore GPS Bluetooth della BlueSoleil
Per stimare l'errore sono state fatte circa 700 misure mantenendo il sensore fermo e leggendo con uno script Python i codici NMEA che vengono generati sulla seriale

Lo script di acquisizione e' il seguente
Per la definizione dei codici NMEA e' stato utilizzato questo sito
Per il calcolo del checksum della stringa NMEA e' stato modificato il codice trovato qui
La parte principale del codice e' accreditata a http://www.robertprice.co.uk/robblog/archive/2007/1/Using_A_Bluetooth_GPS_From_Python.shtml
(il mio contributo e' modesto ma nessuno dei codici da solo era completo e corretto..diciamo che ho messo insieme i pezzi giusti)
-----------------------------------------------------------------------

import bluetooth
import re


def checksum(sentence):
    if re.search("\n$", sentence):
        sentence = sentence[:-1]


    nmeadata,cksum = re.split('\*', sentence)
    nmeadata = nmeadata[1:]
    calc_cksum = 0
    print "nmeadata "+nmeadata
    print "check :"+str(int(cksum,16))


    for s in nmeadata:
        calc_cksum ^= ord(s)
    print "check calc :"+str(calc_cksum)
    return nmeadata,int(cksum,16),calc_cksum






# bluetooth address of the GPS device.
addr = "00:0A:3A:1F:A4:2E"


# port to use.
port = 1


# create a socket and connect to it.
socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
socket.connect((addr, port))
data = ""
olddata = ""


f = open('dati_gps.txt','w')


while True:
data = socket.recv(1024)
#print data
  # make sure we actually have some data.
if len(data) > 0:
  
    # append the old data to the front of data.
data = olddata + data


    # split the data into a list of lines, but make
    # sure we preserve the end of line information.
    lines = data.splitlines(1)


    # iterate over each line
    for line in lines:
    
      # if the line has a carriage return and a
      # linefeed, we know we have a complete line so
      # we can remove those characters and print it.
      if line.find("\r\n") != -1 :
        line = line.strip()
       
gpsstring = line.split(',')
if gpsstring[0] == '$GPRMC':
#print line
data,cksum,calc_cksum = checksum(line)
#print cksum
#print calc_cksum
if cksum == calc_cksum:
#print "GPRMC-------------"

print "Tempo: " + gpsstring[1]
#print "Stato: " + gpsstring[2]
print gpsstring[3][:2]
print gpsstring[3][2:]
print gpsstring[5][:3]
print gpsstring[5][3:]

  lat_d = float(gpsstring[3][:2])+(float(gpsstring[3][2:])/60)
lon_d = float(gpsstring[5][:3])+(float(gpsstring[5][3:])/60)
  print "Lat:  " + gpsstring[3]+gpsstring[4]
  print "Long: " + gpsstring[5]+gpsstring[6]
print str(lat_d)
print str(lon_d)
  #print "Nodi: " + gpsstring[7]
print "Data : "+ gpsstring[9]
#print "Checksum : "+ gpsstring[12]
#print "------------------\n"
f.write(gpsstring[1]+";"+str(lat_d)+";"+str(lon_d)+"\n")




#if gpsstring[0] == '$GPGGA' :
#print "GPGGA-------------"
#print  line
  #print "Tempo :  " + gpsstring[1]

  #print "Lat:  " + gpsstring[2]+gpsstring[3]
  #print "Long: " + gpsstring[4]+gpsstring[5]
#print "Fix: " + gpsstring[6]
#print "Satelliti in vista: " + gpsstring[7]
#print "HDOP: " + gpsstring[7]
#print "Altezza: " + gpsstring[8]
#print "------------------\n"




#if gpsstring[0] == '$GPGSA' :
#print "GPGSA-------------"
#print  line
  #print "PDOP: " + gpsstring[14]
  #print "HDOP: " + gpsstring[15]
  #print "VDOP: " + gpsstring[16]
#print "------------------\n"




        # empty the olddata variable now we have
        # used the data.
        olddata = ""
      # else we need to keep the line to add to data
      else :
        olddata = line
-----------------------------------------------------------------------
Il sensore GPS acquisisce una volta al secondo (sembra impossibile modificare tale valore) in un formato gradi, minuti, decimi di minuto. I dati vengono salvati su file con ora,latitudine,longitudine

Per vedere la fluttuazione del segnale e' stata fatta una prova con una acquisizione di 10 minuti in condizioni non ottimali (il sensore era posto sul davanzale di una finestra e riusciva a vedere solo la meta' del cielo)

In figura sono riportati i punti delle varie misure ed in rosso il valore della misura media. La distribuzione lungo un solo asse e' da imputare alla visione del cielo da parte del sensore


giovedì 26 gennaio 2012

webView su Android per Python


Python per SL4A e' un linguaggio completo ma con scarso controllo sulla grafica dell'output
Per poter avere una interfaccia utente piu' completa (al di la' della schermata terminale) si puo' usare il controllo di webView che permette di impaginare la schermata come una pagina html

di seguito un esempio minimale

--------------------------------------------------------------------------------------------------------------------
import time
import android
from string import Template
pagina = '''<html><body>
<h1>Contatore</h1>
<ul>
<li><strong>Contatore: $contatore</li>
</ul>
</body></html>'''
if __name__ == '__main__':
    droid = android.Android()
    contatore = 1
    while contatore < 10:
        f = open('/sdcard/sl4a/scripts/contatore.html', 'w')
        s = Template(pagina)
        modifica = s.safe_substitute(contatore=str(contatore))
        f.write(modifica)
        f.close()
        droid.webViewShow('file:///sdcard/sl4a/scripts/contatore.html')
        time.sleep(1)
        contatore = contatore + 1

--------------------------------------------------------------------------------------------------------------------


pagina e' una stringa che contiene il codice html piu' un tag speciale $contatore che sara' sostituito in modo dinamico durante l'esecuzione dello script.
In pratica la stringa Html diventa un template che viene modificato per sostituzione del tag speciale con il valore desiderato; il template poi viene riconvertito in stringa e poi salvato su file che sara' visualizzato da webView
E' possibile impaginare anche mediante css

Attenzione: se si perde il controllo dello script e' difficile interromperlo perche' sara' visualizzato a pieno schermo la finestra di webView

martedì 24 gennaio 2012

Calcola tempo passato in Python

il secondo pezzo che mi manca per calcolare la velocita' (nel post precedente era stata definita la distanza) e' quello di calcolare il tempo intercorso con l'approssimazione dei centesimi di secondo

scritto in Python il sistema e'
--------------------------------------------------------------------------------

import time


a = time.time()
time.sleep(1)
b = time.time()
print b - a

--------------------------------------------------------------------------------

Calcolare la distanza geodetica tra due punti

Due le coordinate in gradi decimali la distanza geodetica tra due punti si puo' calcolare con il metodo descritto qui

la traduzione in Python e' la seguente
-------------------------------------------------------------------------------

import math


def distanza(lat1,lon1,lat2,lon2):
    la1 = math.radians(lat1)
    la2 = math.radians(lat2)
    lo1 = math.radians(lon1)
    lo2 = math.radians(lon2)
    dLat = la1-la2
    dLon = lo1-lo2
    a = math.sin(dLat/2)*math.sin(dLat/2)+math.sin(dLon/2)*math.sin(dLon/2)* math.cos(la1) * math.cos(la2)
    c = 2*math.atan2(math.sqrt(a),math.sqrt(1-a))
    dist = 6378137*c
    return dist


print distanza(45,11,46,10)

-------------------------------------------------------------------------------
lo script calcola la distanza tra i due punti a coordinate lat=45°,lon=11° e lat=46°,lon=10° con il risultato di una distanza di 135786.09 metri.

L'errore di calcolo derivante dall'impiego della formula e' stimato in circa allo 0.3% il che equivale a 3 m per chilometro

Il valore di 6378137 m e' il raggio terrestre secondo il sistema WGS-84.

Il calcolo sopra ripòrtato e' impostato considerando la terra sferica; per una maggiore precisione e' necessario usare la formula ellissoidica di Vincenty (qui)


Stavo andando a giro per l'hard disk con Midnight Commander quando ho dato Invio su un file .apk e mi sono accorto che di fatto e' solo un file zip con una diversa estensione....


lunedì 23 gennaio 2012

Nello stesso momento ........

Nello stesso momento in cui usciva Next sui computer dei mortali si vedevano queste immagini.




Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...