Per inserire una icona personalizzata in un progetto Android e' sufficiente inserire nelle directory una immagine .png come suggerito qui
res/drawable-hdpi
res/drawable-mdpi
res/drawable-ldpi
rispettivamente alle risoluzioni 72x72 (hdpi), 48x48 (mdpi) e 36x36 (ldpi) ed usando sempre lo stesso nome (per esempio miaicona.png)
Successivamente si dovra' modificare il file Manifest.xml
<application
android:icon="@drawable/miaicona"
inserendo il nome dell'icona dopo la scritta @drawable senza l'estensione png
lunedì 30 gennaio 2012
Scrivere dati su SD Card
Modificando il codice ritrovato qui e' possibile scrivere i dati su un file presente nella SD Card
In questo esempio, mettendo a True, l'attributo di FileWrite si mette la scrittura in Append in modo da accodare i risultati in fondo al file
---------------------------------------------------------------------------------------------------------------------------
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
double lon = 43.14;
try {
File root = Environment.getExternalStorageDirectory();
if (root.canWrite()){
File gpxfile = new File(root, "gpxfile.gpx"); //nome del file
FileWriter gpxwriter = new FileWriter(gpxfile,true);
BufferedWriter out = new BufferedWriter(gpxwriter);
String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
out.write(currentTimeString+";"+lon+";"+lat+"\n"); // stringa da scrivere
// a differenza di Python si puo' scrivere su file anche dati float senza effettuare una esplicita conversione in string
out.close();
}
} catch (IOException e) {
}
---------------------------------------------------------------------------------------------------------------------------
Per rendere il codice operativo bisogna impostare nel file Manifest.xml la seguente riga prima del tag <application>
---------------------------------------------------------------------------------------------------------------------------
Per rendere il codice operativo bisogna impostare nel file Manifest.xml la seguente riga prima del tag <application>
---------------------------------------------------------------------------------------------------------------------------
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
---------------------------------------------------------------------------------------------------------------------------
Suggerimenti di Eclipse
Usando Eclipse puo' tornare comodo usare i suggerimenti di completamento del codice
Se si digitano le seguenti righe pero'
--------------------------------------------------------------------------------------------
String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
--------------------------------------------------------------------------------------------
vengono proposti alcuni import mentre quelli corretti sono
--------------------------------------------------------------------------------------------
import java.text.DateFormat;
import java.text.SimpleDateFormat;
--------------------------------------------------------------------------------------------
In caso contrario il codice non compila
Il motivo dell'errore risiede nel fatto che i comandi sono contenuti, con lo stesso nome, in piu' librerie e quindi Eclipse, non sapendo quale scegliere, sbaglia
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)
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
--------------------------------------------------------------------------------
scritto in Python il sistema e'
--------------------------------------------------------------------------------
import time
a = time.time()
time.sleep(1)
b = time.time()
print b - a
--------------------------------------------------------------------------------
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...