Stavo cercando di andare sull'Apple Store da Itunes da una rete che non avevo utilizzato mai per questo scopo quando mi sono imbattuto in un messaggio strano..ovviamente usando Windows perche' su Linux non si fa e basta
vista la presenza di un proxy nella rete ho cercato le impostazioni nei settaggi di ITunes senza successo...leggendo a giro la versione Windows di ITunes non ha queste impostazioni ma le prende direttamente da Internet Explorer
Breve controllo ed i settaggi di rete sono ok e si naviga dal browser di Microsoft.
Ancora un po' di lettura e trovo che ITunes non digerisce i file di configurazione .pac dei client del proxy server...niente male, metto le configurazioni a mano, controllo di essere in grado di navigare ma niente da fare.
A questo punto i casi sono due
1) il proxy mi filtra il traffico che va verso i server Apple di ITunes (sono piu' di uno leggendo i log di rete)
2) ITunes non ne vuole sapere di bucare un proxy server
martedì 30 luglio 2013
Ipod Touch 2G e Debian
Un tentativo di utilizzare l'Ipod Touch 2G con Debian
Ho seguito le istruzioni riportate a questo link direttamente dal sito Debian http://wiki.debian.org/it/iPhone
Si parte da un Ipod con almeno un brano all'interno della libreria
In estrema sintesi su Wheezy si devono fare i seguenti passi
apt-get install install libimobiledevice-utils gvfs-backends gvfs-bin gvfs-fuse
poi si deve modificare /etc/fuse.conf togliendo il commento alla linea #user_allow_other
e si aggiunge il proprio utente al gruppo fuse
usermod -aG fuse luca
Per sincronizzare a questo punto si puo' usare Rythmbox che si installa banalmente con
apt-get install rhythmbox rhythmbox-plugins
Ho seguito le istruzioni riportate a questo link direttamente dal sito Debian http://wiki.debian.org/it/iPhone
Si parte da un Ipod con almeno un brano all'interno della libreria
In estrema sintesi su Wheezy si devono fare i seguenti passi
apt-get install install libimobiledevice-utils gvfs-backends gvfs-bin gvfs-fuse
poi si deve modificare /etc/fuse.conf togliendo il commento alla linea #user_allow_other
e si aggiunge il proprio utente al gruppo fuse
usermod -aG fuse luca
Per sincronizzare a questo punto si puo' usare Rythmbox che si installa banalmente con
apt-get install rhythmbox rhythmbox-plugins
Spedire mail da GMail via Python
Alla ricerca di un metodo per spedire le misure di un sensore attaccato a Raspberry ho trovato il codice di questo sito che permette di inviare mail in automatico mediante un account GMAIL
------------------------------------
#!/usr/bin/env python
import smtplib
from email.mime.text import MIMEText
USERNAME = "lucainnoc@gmail.com"
PASSWORD = "password"
MAILTO = "rec@toscana.it"
msg = MIMEText('valore sensore')
msg['Subject'] = 'Sensore'
msg['From'] = USERNAME
msg['To'] = MAILTO
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo_or_helo_if_needed()
server.starttls()
server.ehlo_or_helo_if_needed()
server.login(USERNAME,PASSWORD)
server.sendmail(USERNAME, MAILTO, msg.as_string())
server.quit()
------------------------------------
#!/usr/bin/env python
import smtplib
from email.mime.text import MIMEText
USERNAME = "lucainnoc@gmail.com"
PASSWORD = "password"
MAILTO = "rec@toscana.it"
msg = MIMEText('valore sensore')
msg['Subject'] = 'Sensore'
msg['From'] = USERNAME
msg['To'] = MAILTO
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo_or_helo_if_needed()
server.starttls()
server.ehlo_or_helo_if_needed()
server.login(USERNAME,PASSWORD)
server.sendmail(USERNAME, MAILTO, msg.as_string())
server.quit()
lunedì 29 luglio 2013
Mediacom 850i e ROM
Ieri ho rimesso mano al Mediacom 850i (fino ad adesso in possesso esclusivo di mio figlio) ed ho cercato un metodo per renderlo un po' piu' reattivo cercando qualche ROM partendo da questo link
In particolare ero curioso della PASCAPEX che necessita' pero' di installare la Cloclworkmod .. e qui sono iniziati i guai. Le istruzioni per CWM su Mediacom 850i si trovano qui ma dopo aver eseguito i programma il tablet non mostrava segni di vita con schermo completamente nero.
In realta' qualche segno di vita era presente perche' connettendo il cavo USB a Windows si vedeva (e sentiva) che una nuova porta era aggiunta..in pratica era come se il tablet fosse in modalita' recovery permanente a schermo spento.
Preso dallo sconforto ho frugato ed ho trovato che e' possibile aggiornare il firmware non solo tramite recovery ma anche utilizzando il software Rockchip Backup Tool (attualmente alla versione 1.4) ed una immagine completa del sistema
Attenzione : per il Mediacom 850i esistono due tipi di driver differenti. Quello per adb che permette la programmazione e di montare le memorie interne del tablet e quello da utilizzare per gestire la recovery (29Rockusb)
Come immagine ho preso vanilla (sembrava essere quella meno pericolosa e buggata) e dopo aver lanciato Rktool il tablet e' ripartito
Forse va un po' meglio di prima per quanto riguarda la velocita' ma e' presente un fastidiosissimo bug sulla gestione della grafica che corrompe alcune schermate. In compenso frugando un po' si trova il market ufficiale (non presente nella precedente versione se non in versione widget)
In ogni caso si puo' scaricare il pacchetto originale di ripristino dove sono contenuti tutti i programmi e le immagini per riportare il sistema all'originale
In particolare ero curioso della PASCAPEX che necessita' pero' di installare la Cloclworkmod .. e qui sono iniziati i guai. Le istruzioni per CWM su Mediacom 850i si trovano qui ma dopo aver eseguito i programma il tablet non mostrava segni di vita con schermo completamente nero.
In realta' qualche segno di vita era presente perche' connettendo il cavo USB a Windows si vedeva (e sentiva) che una nuova porta era aggiunta..in pratica era come se il tablet fosse in modalita' recovery permanente a schermo spento.
Preso dallo sconforto ho frugato ed ho trovato che e' possibile aggiornare il firmware non solo tramite recovery ma anche utilizzando il software Rockchip Backup Tool (attualmente alla versione 1.4) ed una immagine completa del sistema
Attenzione : per il Mediacom 850i esistono due tipi di driver differenti. Quello per adb che permette la programmazione e di montare le memorie interne del tablet e quello da utilizzare per gestire la recovery (29Rockusb)
Come immagine ho preso vanilla (sembrava essere quella meno pericolosa e buggata) e dopo aver lanciato Rktool il tablet e' ripartito
Forse va un po' meglio di prima per quanto riguarda la velocita' ma e' presente un fastidiosissimo bug sulla gestione della grafica che corrompe alcune schermate. In compenso frugando un po' si trova il market ufficiale (non presente nella precedente versione se non in versione widget)
In ogni caso si puo' scaricare il pacchetto originale di ripristino dove sono contenuti tutti i programmi e le immagini per riportare il sistema all'originale
Partizione GPT in Windows XP
Mi e' capitato di prendere un disco esterno da 500 Gb che non usavo da un po' di tempo e di non riuscire a montarlo su Windows Xp
Il sintomo e' che la periferica e' stata riconosciuta nella catena USB ma non veniva mostrata tra i dischi disponibili. Una verifica sugli strumenti di amministrazione/gestione dischi ha mostrato che il disco risultava integro ma con una partizione di protezione GPT...probabilmente avevo usato il disco su Windows 7.
Rimuovere la partizione GPT da Windows XP non e' banalissimo e comporta comunque la perdita dei dati.
Seguendo le istruzioni sul sito di Lacie si deve
entrare in shell (cmd), lanciare diskpart ed individuare il numero del disco (in questo caso 6)
ed effettuare
select disk 6
clean
a questo punto il disco di puo' formattare sotto Windows XP
Il sintomo e' che la periferica e' stata riconosciuta nella catena USB ma non veniva mostrata tra i dischi disponibili. Una verifica sugli strumenti di amministrazione/gestione dischi ha mostrato che il disco risultava integro ma con una partizione di protezione GPT...probabilmente avevo usato il disco su Windows 7.
Rimuovere la partizione GPT da Windows XP non e' banalissimo e comporta comunque la perdita dei dati.
Seguendo le istruzioni sul sito di Lacie si deve
entrare in shell (cmd), lanciare diskpart ed individuare il numero del disco (in questo caso 6)
ed effettuare
select disk 6
clean
a questo punto il disco di puo' formattare sotto Windows XP
venerdì 26 luglio 2013
Ext2/Ext3 su Windows
Dato che ho praticamente tutti i computer su Debian e' abbastanza ovvio che anche i dischi di backup siano formattati con filesytem Linux
Oggi pero' avevo la necessita' di scaricare i dati (e quindi di montare anche in sola lettura) i dischi di backup su un Windows Xp
La prima prova e' stata con Ext2Fsd. Questo metodo funziona ma ha dei grossi limiti, il piu' evidente e' quello di non riuscire a copiare dei file il cui nome includa caratteri speciali (spazi, accenti) il che e' abbastanza comune oggi
Il secondo tentativo e' stato con ExtFs, un prodotto commerciale che una licenza libera per uso personale
Il programma si comporta decisamente meglio del precedente (anche se non e' esente da difetti) e mi ha permesso di copiare oltre 10 Gb di dati con poche correzioni manuali
Oggi pero' avevo la necessita' di scaricare i dati (e quindi di montare anche in sola lettura) i dischi di backup su un Windows Xp
La prima prova e' stata con Ext2Fsd. Questo metodo funziona ma ha dei grossi limiti, il piu' evidente e' quello di non riuscire a copiare dei file il cui nome includa caratteri speciali (spazi, accenti) il che e' abbastanza comune oggi
Il secondo tentativo e' stato con ExtFs, un prodotto commerciale che una licenza libera per uso personale
Il programma si comporta decisamente meglio del precedente (anche se non e' esente da difetti) e mi ha permesso di copiare oltre 10 Gb di dati con poche correzioni manuali
venerdì 19 luglio 2013
PiBang su Raspberry
fdsa
Mentre stavo cercando di sostituire LXDE con Openbox su Raspbian mi sono imbattuto in PiBang, una versione compilata per Arm di Crunchbang
A differenza di Raspbian, questa distribuzione si presenta come una versione desktop completa (sono preinstallati Gimp, VLC, Abiword e viene proposto in modo semplice di installare Libreoffice).
Per questo motivo e' necessario utilizzare almeno una SD Card da 4 Gb
Le impressioni di utilizzo sono buone nonostante l'hardware limitato ...fra le altre cose al primo avvio viene proposta di effettuare l'overclock fino ad oltre 1GHz (io mi sono fermato a 900 MHz senza troppi problemi)
L'altro aspetto carino e' la semplicita' di configurazione della rete sia cablata che WiFi
L'unico problema reale che ho riscontrato e' stato al momento di inserire (a sistema operativo avviato) il dongle USB della scheda di rete WiFi...il sistema ha crashato senza possibilita' di recupero ed al successivo riavvio il file system era (ovviamente) corrotto
Mentre stavo cercando di sostituire LXDE con Openbox su Raspbian mi sono imbattuto in PiBang, una versione compilata per Arm di Crunchbang
A differenza di Raspbian, questa distribuzione si presenta come una versione desktop completa (sono preinstallati Gimp, VLC, Abiword e viene proposto in modo semplice di installare Libreoffice).
Per questo motivo e' necessario utilizzare almeno una SD Card da 4 Gb
Le impressioni di utilizzo sono buone nonostante l'hardware limitato ...fra le altre cose al primo avvio viene proposta di effettuare l'overclock fino ad oltre 1GHz (io mi sono fermato a 900 MHz senza troppi problemi)
L'altro aspetto carino e' la semplicita' di configurazione della rete sia cablata che WiFi
L'unico problema reale che ho riscontrato e' stato al momento di inserire (a sistema operativo avviato) il dongle USB della scheda di rete WiFi...il sistema ha crashato senza possibilita' di recupero ed al successivo riavvio il file system era (ovviamente) corrotto
giovedì 18 luglio 2013
Mandelbrot con Processing+Android
Per mettere alla prova quanto appreso dal post precedente un classico, Mandelbrot
Il programma e' eseguito interamente sul telefono Android dopo essere stato compilato con Processing
Il tempo di esecuzione e' inferiore ai 3 secondi e mezzo sul Samsung Next Turbo
-----------------------------------------
int larghezza = 200;
int altezza = 200;
float re_min = -2.0;
float im_min = -1.2;
float re_max = 1.0;
float im_max = 1.2;
int iterazioni = 255;
float a,b,x,y,x_new,y_new;
int i,j,k;
float re_factor=(re_max-re_min);
float im_factor=(im_max-im_min);
void setup() {
size(200,200);
background(0,0,0);
stroke(255);
}
void draw() {
for (i=0;i<altezza;i++)
{
for(j=0;j<larghezza;j++)
{
a = re_min+(j*re_factor/larghezza);
b = im_min+(i*im_factor/altezza);
x = 0;
y = 0;
for (k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
if (k%2 == 0) point(i,j);
break;
}
x = x_new;
y = y_new;
}
}
}
}
Il programma e' eseguito interamente sul telefono Android dopo essere stato compilato con Processing
Screenshot di Android |
-----------------------------------------
int larghezza = 200;
int altezza = 200;
float re_min = -2.0;
float im_min = -1.2;
float re_max = 1.0;
float im_max = 1.2;
int iterazioni = 255;
float a,b,x,y,x_new,y_new;
int i,j,k;
float re_factor=(re_max-re_min);
float im_factor=(im_max-im_min);
void setup() {
size(200,200);
background(0,0,0);
stroke(255);
}
void draw() {
for (i=0;i<altezza;i++)
{
for(j=0;j<larghezza;j++)
{
a = re_min+(j*re_factor/larghezza);
b = im_min+(i*im_factor/altezza);
x = 0;
y = 0;
for (k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
if (k%2 == 0) point(i,j);
break;
}
x = x_new;
y = y_new;
}
}
}
}
Processing ed Android
Con Processing e' possibile sviluppare applicazioni per Android senza la necessita' di utilizzare il metodo tradizionale in Java
Per settare Processing ad compilare per Android si deve prima di tutto avere un SDK Android funzionante ed avere installato installate le API 10 (le altre, sia superiori che inferiori vengono ignorate)
a questo punto si puo' installare Processing 2.0 dal sito di riferimento. Una volta installato si deve cliccare sul menu a discesa nell'angolo in alto a sinistra (dove nell'immagine sottostante si legge Android). Si sceglie quindi Add Mode e si sceglie Android
Al termine dell'installazione viene richiesta la directory di installazione di Android SDK.
Fatto.
A questo punto si puo' collegare il telefono Android via cavo (ovviamente gia' settato in Debuggin Mode come si solito si fa per lo sviluppo) e lanciando gli skecth il risultato sara' visibile sullo schermo del telefono
Per settare Processing ad compilare per Android si deve prima di tutto avere un SDK Android funzionante ed avere installato installate le API 10 (le altre, sia superiori che inferiori vengono ignorate)
a questo punto si puo' installare Processing 2.0 dal sito di riferimento. Una volta installato si deve cliccare sul menu a discesa nell'angolo in alto a sinistra (dove nell'immagine sottostante si legge Android). Si sceglie quindi Add Mode e si sceglie Android
Al termine dell'installazione viene richiesta la directory di installazione di Android SDK.
Fatto.
A questo punto si puo' collegare il telefono Android via cavo (ovviamente gia' settato in Debuggin Mode come si solito si fa per lo sviluppo) e lanciando gli skecth il risultato sara' visibile sullo schermo del telefono
Xively su Linux/Raspberry
Quanto visto per l'Arduino puo' essere ripetuto anche per un calcolatore che monta Linux (come per esempio Raspberry)
In questo caso verra' impiegato Python per dialogare con Xively come descritto a questo tutorial
Prima di lanciare lo script si devono eseguire i seguenti comandi che impostano Python e scaricano la libreria Xively per Python
$ sudo apt-get install git
$ sudo apt-get install python-setuptools
In questo caso verra' impiegato Python per dialogare con Xively come descritto a questo tutorial
Prima di lanciare lo script si devono eseguire i seguenti comandi che impostano Python e scaricano la libreria Xively per Python
$ sudo apt-get install git
$ sudo apt-get install python-setuptools
$ sudo easy_install pip
$ sudo pip install virtualenv
$ mkdir xively_tutorial
$ mkdir xively_tutorial
$ cd xively_tutorial
$ virtualenv .envs/venv
$ source .envs/venv/bin/activate
$ pip install xively-python
terminata la configurazione si puo' lanciare il seguente script in Python che invia Xively i dati sul carico di lavoro. Come nel caso precedente si devono eseguire delle personalizzazione sulla base delle propri settaggi del device su Xively inserendo la chiave, il feed_id ed il nome del feed (vedi righe evidenziate in giallo)
--------------------------------------------------------------
#!/usr/bin/env python
import os
import xively
import subprocess
import time
import datetime
import requests
# extract feed_id and api_key from environment variables
FEED_ID = 302563049
API_KEY = "KPpjdurjzx9jVhp8PwpMCd6byMSatfcKuOu1CHJbdDkxXrI4"
DEBUG = "true"
# initialize api client
api = xively.XivelyAPIClient(API_KEY)
# function to read 1 minute load average from system uptime command
def read_loadavg():
if DEBUG:
print "Reading load average"
return subprocess.check_output(["awk '{print $1}' /proc/loadavg"], shell=True)
# function to return a datastream object. This either creates a new datastream,
# or returns an existing one
def get_datastream(feed):
try:
datastream = feed.datastreams.get("load_avg")
if DEBUG:
print "Found existing datastream"
return datastream
except:
if DEBUG:
print "Creating new datastream"
datastream = feed.datastreams.create("load_avg", tags="load_01")
return datastream
# main program entry point - runs continuously updating our datastream with the
# current 1 minute load average
def run():
print "Starting Xively tutorial script"
feed = api.feeds.get(FEED_ID)
datastream = get_datastream(feed)
datastream.max_value = None
datastream.min_value = None
while True:
load_avg = read_loadavg()
if DEBUG:
print "Updating Xively feed with value: %s" % load_avg
datastream.current_value = load_avg
datastream.at = datetime.datetime.utcnow()
try:
datastream.update()
except requests.HTTPError as e:
print "HTTPError({0}): {1}".format(e.errno, e.strerror)
time.sleep(10)
run()
$ virtualenv .envs/venv
$ source .envs/venv/bin/activate
$ pip install xively-python
terminata la configurazione si puo' lanciare il seguente script in Python che invia Xively i dati sul carico di lavoro. Come nel caso precedente si devono eseguire delle personalizzazione sulla base delle propri settaggi del device su Xively inserendo la chiave, il feed_id ed il nome del feed (vedi righe evidenziate in giallo)
--------------------------------------------------------------
#!/usr/bin/env python
import os
import xively
import subprocess
import time
import datetime
import requests
# extract feed_id and api_key from environment variables
FEED_ID = 302563049
API_KEY = "KPpjdurjzx9jVhp8PwpMCd6byMSatfcKuOu1CHJbdDkxXrI4"
DEBUG = "true"
# initialize api client
api = xively.XivelyAPIClient(API_KEY)
# function to read 1 minute load average from system uptime command
def read_loadavg():
if DEBUG:
print "Reading load average"
return subprocess.check_output(["awk '{print $1}' /proc/loadavg"], shell=True)
# function to return a datastream object. This either creates a new datastream,
# or returns an existing one
def get_datastream(feed):
try:
datastream = feed.datastreams.get("load_avg")
if DEBUG:
print "Found existing datastream"
return datastream
except:
if DEBUG:
print "Creating new datastream"
datastream = feed.datastreams.create("load_avg", tags="load_01")
return datastream
# main program entry point - runs continuously updating our datastream with the
# current 1 minute load average
def run():
print "Starting Xively tutorial script"
feed = api.feeds.get(FEED_ID)
datastream = get_datastream(feed)
datastream.max_value = None
datastream.min_value = None
while True:
load_avg = read_loadavg()
if DEBUG:
print "Updating Xively feed with value: %s" % load_avg
datastream.current_value = load_avg
datastream.at = datetime.datetime.utcnow()
try:
datastream.update()
except requests.HTTPError as e:
print "HTTPError({0}): {1}".format(e.errno, e.strerror)
time.sleep(10)
run()
Xively su Arduino
Per sviluppare il progetto presentato in questo precedente post ho provato ad inviare i dati del sensore non ad un server udp ma ad un servizio internet denominato Xively (ex Cosm, ex Pachube) che permette la registrazione di dati (principalmente da sensori) e la visualizzazione direttamente su grafico
Una volta effettua la registrazione si deve andare nel menu di Develop e si deve creare un nuovo Device
una volta creato il device si entra nella configurazione e si devono annotare i valori delle Api Keys
i valori importanti sono il feed_id (in questo caso 302563049) e la chiave (KP........)
A questo punto si puo' iniziare a programmare l'Arduino. Sempre dal sito di Xively si sceglie il menu Developer Center/ Libraries e si sceglie di scaricare la libreria per Arduino a questo link. Per soddisfare si deve scaricare ed installare anche la liberia HttpClient
Si puo' quindi caricare il seguente sketch su Arduino che semplicemente manda sul sito i valori progressivi di un contatore. Ovviamente questo e' lo schema base e nell'uso reale si devono inviare gli output del proprio sensore.
Oltre ad impostare la Key ed il feed_id si deve anche impostare un nome per il sensore. Importante: tale stringa non deve contenere caratteri speciali o spazi
Attenzione: questo semplice sketch occupa circa 20 Kb dei 32Kb disponibili sull'Arduino Uno. Per rendere il tutto piu' snello si puo' impostare un indirizzo fisso alla scheda dell'Arduino e non usare il DHCP come nell'esempio
-------------------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>
// MAC address for your Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Xively key
char xivelyKey[] = "KPpjdurjzx9jVhp8PwpMCd6byMSatfcKuOu1CHJbdDkxXrI4";
//il sensorId deve essere una stringa senza spazi e caratteri speciali
char sensorId[] = "Contatore_test";
long unsigned int feed_id = 302563049;
XivelyDatastream datastreams[] = {
XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT),
};
XivelyFeed feed(feed_id, datastreams, 1 /* number of datastreams */);
EthernetClient client;
XivelyClient xivelyclient(client);
float contatore;
void setup() {
contatore = 0.0;
Serial.begin(9600);
while (Ethernet.begin(mac) != 1)
{
Serial.println("Error getting IP address via DHCP, trying again...");
delay(5000);
}
}
void loop() {
contatore = contatore + 1;
datastreams[0].setFloat(contatore);
int ret = xivelyclient.put(feed, xivelyKey);
Serial.println(ret);
delay(5000);
}
---------------------------------------------------------------------
Una nota finale: se si collega la scheda ad un router Fastweb il programma non funziona ritornando come codice di errore -405. Cio' e' ragionevolmente dovuto alla peculiare configurazione della rete ADSL casalinga di Fastweb
Una volta effettua la registrazione si deve andare nel menu di Develop e si deve creare un nuovo Device
una volta creato il device si entra nella configurazione e si devono annotare i valori delle Api Keys
i valori importanti sono il feed_id (in questo caso 302563049) e la chiave (KP........)
A questo punto si puo' iniziare a programmare l'Arduino. Sempre dal sito di Xively si sceglie il menu Developer Center/ Libraries e si sceglie di scaricare la libreria per Arduino a questo link. Per soddisfare si deve scaricare ed installare anche la liberia HttpClient
Si puo' quindi caricare il seguente sketch su Arduino che semplicemente manda sul sito i valori progressivi di un contatore. Ovviamente questo e' lo schema base e nell'uso reale si devono inviare gli output del proprio sensore.
Oltre ad impostare la Key ed il feed_id si deve anche impostare un nome per il sensore. Importante: tale stringa non deve contenere caratteri speciali o spazi
Attenzione: questo semplice sketch occupa circa 20 Kb dei 32Kb disponibili sull'Arduino Uno. Per rendere il tutto piu' snello si puo' impostare un indirizzo fisso alla scheda dell'Arduino e non usare il DHCP come nell'esempio
-------------------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>
// MAC address for your Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Xively key
char xivelyKey[] = "KPpjdurjzx9jVhp8PwpMCd6byMSatfcKuOu1CHJbdDkxXrI4";
//il sensorId deve essere una stringa senza spazi e caratteri speciali
char sensorId[] = "Contatore_test";
long unsigned int feed_id = 302563049;
XivelyDatastream datastreams[] = {
XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT),
};
XivelyFeed feed(feed_id, datastreams, 1 /* number of datastreams */);
EthernetClient client;
XivelyClient xivelyclient(client);
float contatore;
void setup() {
contatore = 0.0;
Serial.begin(9600);
while (Ethernet.begin(mac) != 1)
{
Serial.println("Error getting IP address via DHCP, trying again...");
delay(5000);
}
}
void loop() {
contatore = contatore + 1;
datastreams[0].setFloat(contatore);
int ret = xivelyclient.put(feed, xivelyKey);
Serial.println(ret);
delay(5000);
}
---------------------------------------------------------------------
Una nota finale: se si collega la scheda ad un router Fastweb il programma non funziona ritornando come codice di errore -405. Cio' e' ragionevolmente dovuto alla peculiare configurazione della rete ADSL casalinga di Fastweb
mercoledì 17 luglio 2013
Debian Hurd su VirtualBox
Giusto per curiosita' ho provato ad installare Debian/Hurd...ovviamente in una macchina virtuale per non fare troppi danni
La storia dello sviluppo di Hurd e' decennale e dopo aver letto che era uscita la nuova Debian Hurd ho voluto provarlo. So bene che non e' consigliato l'uso di produzione e che solo 2/3 dei pacchetti Debian sono disponibili....e' solo una prova con una prima incredibile sorpresa
Dopo aver configurato la macchina virtuale con un disco da 3Gb (come piu' o meno sono solito fare) ho lanciato il cd di installazione ed al momento di effettuare il partizionamento del disco fisso mi sono accorto che "semplicemente" non era elencato
Dopo una buona mezz'ora di riavvi mi sono messo alla ricerca su Internet di qualche indizio ed ho trovato che uno dei limiti attuali di Hurd e' quello di non gestire i dischi SATA ma di gestire solo in controller IDE
A questo punto sono ritornato in Virtualbox, ho cancellato il disco fisso ed il controller (di default sono SATA) ed ho creato un disco virtuale IDE
a questo punto l'installazione e' partita
Comunque una volta arrivati, dopo il riavvio, al login le impressioni di utilizzo sono pessime. Al di la' dei comandi che sono (ovviamente) differenti da Linux anche le operazioni piu' banali pongono problemi e vi sono molti errori. Il sistema e' sostanzialmente non usabile
La storia dello sviluppo di Hurd e' decennale e dopo aver letto che era uscita la nuova Debian Hurd ho voluto provarlo. So bene che non e' consigliato l'uso di produzione e che solo 2/3 dei pacchetti Debian sono disponibili....e' solo una prova con una prima incredibile sorpresa
Dopo aver configurato la macchina virtuale con un disco da 3Gb (come piu' o meno sono solito fare) ho lanciato il cd di installazione ed al momento di effettuare il partizionamento del disco fisso mi sono accorto che "semplicemente" non era elencato
Dopo una buona mezz'ora di riavvi mi sono messo alla ricerca su Internet di qualche indizio ed ho trovato che uno dei limiti attuali di Hurd e' quello di non gestire i dischi SATA ma di gestire solo in controller IDE
A questo punto sono ritornato in Virtualbox, ho cancellato il disco fisso ed il controller (di default sono SATA) ed ho creato un disco virtuale IDE
a questo punto l'installazione e' partita
Comunque una volta arrivati, dopo il riavvio, al login le impressioni di utilizzo sono pessime. Al di la' dei comandi che sono (ovviamente) differenti da Linux anche le operazioni piu' banali pongono problemi e vi sono molti errori. Il sistema e' sostanzialmente non usabile
martedì 16 luglio 2013
Esempio GUI con QtQuick 2.0
Riprendendo la serie di esempi di GUI stavolta e' la volta di QtQuick (Qt 5.1)
Da notare che la release 5.1 i problemi all'editor visuale di QtQuick all'interno di QtCreator sembrano essere risolti per cui per progettare la pagina e' sufficiente fare doppio clic sul file .qml della colonna Progetti
Editor Visuale di QtQuick in QtCreator |
------------------------------------------
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0
ApplicationWindow {
title: qsTr("Esempio")
width: 250
height: 160
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
TextField {
id: text_field1
x: 21
y: 17
width: 200
height: 20
text: ""
placeholderText: ""
}
ProgressBar {
id: progress_bar1
x: 21
y: 54
}
Slider {
id: slider__horizontal_1
x: 21
y: 101
value: 0.5
onValueChanged: aggiorna();
function aggiorna()
{
text_field1.text = slider__horizontal_1.value.toFixed(2).toString();
progress_bar1.setValue(slider__horizontal_1.value);
}
}
}
Mandelbrot in QtQuick 2
Visto che oramai sembra che nell'immediato futuro un po' di sistemi mobili useranno le QtQuick (Ubuntu Touch ed Android) e visto che e' uscito l'SDK Qt 5.1 ho voluto riaprire l'argomento per vedere se e' la volta buona
Come risulta chiaro dal confronto con questo post QtQuick eredita molta della struttura del codice da Javascript anche se vi sono comunque differenze. Per esempio la stampa con il comando
context.fillRect(j,i,1,1);
in QtQuick e' dovuta diventare
----------------------------------------------------
Come risulta chiaro dal confronto con questo post QtQuick eredita molta della struttura del codice da Javascript anche se vi sono comunque differenze. Per esempio la stampa con il comando
context.fillRect(j,i,1,1);
in QtQuick e' dovuta diventare
ctx.moveTo(j,i);
ctx.lineTo(j+1,i+1);
----------------------------------------------------
import QtQuick 2.0
Canvas {
id : canvas
width : 640
height : 640
MouseArea {
anchors.fill: parent
onClicked: { }
}
onPaint: {
var re_min = -2.0;
var im_min = -1.2;
var re_max = 1.0;
var im_max = 1.2;
var iterazioni = 255;
var r;
var a,b;
var x,y,x_new,y_new;
var k,j,i;
var SCREEN_HEIGHT = 640;
var SCREEN_WIDTH = 640;
var re_factor = (re_max-re_min);
var im_factor = (im_max-im_min);
var ctx = canvas.getContext('2d');
ctx.fillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
ctx.save();
ctx.strokeStyle = "#FFFFFF";
for (var i=0;i<SCREEN_WIDTH;i++) {
for (var j=0;j<SCREEN_HEIGHT;j++) {
a = re_min+(j*re_factor/SCREEN_WIDTH);
b = im_min+(i*im_factor/SCREEN_HEIGHT);
x = 0;
y = 0;
for (var k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
r = k%2;
if (r == 1)
{
ctx.beginPath();
ctx.moveTo(j,i);
ctx.lineTo(j+1,i+1);
ctx.stroke();
}
break;
}
x = x_new;
y = y_new;
}
}
}
}
}
----------------------------------------------------
Real Time Clock DS1302 su Raspberry
Di questo componente esistono molti tutorial su Internet e, cosa abbastanza incredibile, sono spesso molto differenti tra di loro. In alcuni casi viene proposto di rimuovere delle resistenza della schedina dell'RTC, in altri casi l'alimentazione deve essere collegata ai 5 Volts...in questo caso viene presentato l'esempio riportato da questo sito che per il mio caso ha funzionato
La pedinatura e' la seguente
Raspberry -> RTC
VCC 3 Volt -> VCC
GND -> GND
GPIO #21/27 -> CLK
GPIO #18 -> DAT
GPIO #17 -> RST
(il sito originale indica di inserire delle resistenze da 10 KOhm su DAT e VCC .. nel mio caso ha funzionato senza necessita' di questi componenti)
per usare questo componente si deve utilizzare il programma rtc-pi.c che si scarica da questo link
Dato che utilizzo la Raspberry 2 devono essere modificato il file rtc-pi.c come segue
si devono commentare (o cancellare alcune righe) ed inserirne altre; vedi righe evidenziate
---------------------------------------------
La pedinatura e' la seguente
Raspberry -> RTC
VCC 3 Volt -> VCC
GND -> GND
GPIO #21/27 -> CLK
GPIO #18 -> DAT
GPIO #17 -> RST
(il sito originale indica di inserire delle resistenze da 10 KOhm su DAT e VCC .. nel mio caso ha funzionato senza necessita' di questi componenti)
per usare questo componente si deve utilizzare il programma rtc-pi.c che si scarica da questo link
Dato che utilizzo la Raspberry 2 devono essere modificato il file rtc-pi.c come segue
si devono commentare (o cancellare alcune righe) ed inserirne altre; vedi righe evidenziate
---------------------------------------------
#define IO_INPUT *(gpio+GPIO_SEL1) &= 0xF8FFFFFFL
#define IO_OUTPUT *(gpio+GPIO_SEL1) &= 0xF8FFFFFFL; *(gpio+GPIO_SEL1) |= 0x01000000L
//#define SCLK_OUTPUT *(gpio+GPIO_SEL2) &= 0xFFFFFFC7L; *(gpio+GPIO_SEL2) |= 0x00000008L
#define CE_OUTPUT *(gpio+GPIO_SEL1) &= 0xFF1FFFFFL; *(gpio+GPIO_SEL1) |= 0x00200000L
#define IO_HIGH *(gpio+GPIO_SET) = 0x00040000L
#define IO_LOW *(gpio+GPIO_CLR) = 0x00040000L
//#define SCLK_HIGH *(gpio+GPIO_SET) = 0x00200000L
//#define SCLK_LOW *(gpio+GPIO_CLR) = 0x00200000L
#define CE_HIGH *(gpio+GPIO_SET) = 0x00020000L
#define CE_LOW *(gpio+GPIO_CLR) = 0x00020000L
#define IO_LEVEL *(gpio+GPIO_INP) & 0x00040000L
#define SCLK_OUTPUT *(gpio+GPIO_SEL2) &= 0xFF1FFFFFL; *(gpio+GPIO_SEL2) |= 0x00200000L
#define SCLK_HIGH *(gpio+GPIO_SET) = 0x08000000L
#define SCLK_LOW *(gpio+GPIO_CLR) = 0x08000000L---------------------------------------------
il programma si puo' compilare come
cc -o rtc-pi.c rtc-pi.c
chmod +x rtc-pi
per impostare la data sull' RTC si puo' procedere come (da sudo)
./rtc-pi 20130713173002 (ora 17:30:02 del 13 luglio 2013)
per impostare l'ora del Raspberry riprendendola dall' RTC e' sufficiente
./rtc-pi
per rendere il sistema funzionante si deve infine mandare in esecuzione automatica il programma ./rtc-pi ad ogni avvio del sistema
#define SCLK_HIGH *(gpio+GPIO_SET) = 0x08000000L
#define SCLK_LOW *(gpio+GPIO_CLR) = 0x08000000L---------------------------------------------
il programma si puo' compilare come
cc -o rtc-pi.c rtc-pi.c
chmod +x rtc-pi
per impostare la data sull' RTC si puo' procedere come (da sudo)
./rtc-pi 20130713173002 (ora 17:30:02 del 13 luglio 2013)
per impostare l'ora del Raspberry riprendendola dall' RTC e' sufficiente
./rtc-pi
per rendere il sistema funzionante si deve infine mandare in esecuzione automatica il programma ./rtc-pi ad ogni avvio del sistema
lunedì 15 luglio 2013
Usb Host Shield sun Arduino Uno
In questo post verra' descritto l'USB Host Shield Keynes che aggiunge la funzionalita' di utilizzare periferiche USB su una Arduino Uno.
Lo shield si monta come tutti gli altri dello stesso tipo e, oltre a replicare i pin della scheda ed il pulsante di reset, aggiunge una porta USB femmina tipo A
C'e' da specificare che esistono due release dell'USB Host shield...nel mio caso e' la versione 2 che necessita della libreria USB_HOST_Shield_2.0 che si recupera a questo link GitHub
Nella cartella esempi vi sono diversi programma ma nel mio caso mi interessava interfacciare solo HID (Human Interface Devices) ovvero mouse e tastiera
Prima di iniziare una precisazione. Gli esempi nella libreria settano la porta seriale alla velocita' di 115200 baud per cui il monitor seriale dovra' essere impostato di conseguenza (di default si apre a 9600 baud)
Il primo esempio e' USBHIDBootMouse
Questo e' l'output in cui sono riportati i movimenti relativi tra due acquisizioni
Il secondo e' USBHIDBootKbd
con il relativo output
Lo shield si monta come tutti gli altri dello stesso tipo e, oltre a replicare i pin della scheda ed il pulsante di reset, aggiunge una porta USB femmina tipo A
C'e' da specificare che esistono due release dell'USB Host shield...nel mio caso e' la versione 2 che necessita della libreria USB_HOST_Shield_2.0 che si recupera a questo link GitHub
Nella cartella esempi vi sono diversi programma ma nel mio caso mi interessava interfacciare solo HID (Human Interface Devices) ovvero mouse e tastiera
Prima di iniziare una precisazione. Gli esempi nella libreria settano la porta seriale alla velocita' di 115200 baud per cui il monitor seriale dovra' essere impostato di conseguenza (di default si apre a 9600 baud)
Il primo esempio e' USBHIDBootMouse
Questo e' l'output in cui sono riportati i movimenti relativi tra due acquisizioni
Output Mouse |
con il relativo output
Output Tastiera |
Arduino Uno su Windows
In generale uso veramente di rado Windows e cosi' mi sono accorto solo oggi che connettendo una Arduino Uno in una Windows Box il sistema operativo non riconosce la periferica
Il problema si risolve rapidamente andando installando i driver che si trovano nella directory drivers del software Arduino IDE
Il problema si risolve rapidamente andando installando i driver che si trovano nella directory drivers del software Arduino IDE
NOOBS Raspberry
Un metodo per provare (e solo per provare dato che viene rubato spazio sulla SD da immagini che poi non verranno utilizzate) i vari sistemi operativi supportati da Raspberry si puo' utilizzare il pacchetto NOOBS
Una volta scaricato NOOBS si deve scompattare l'archivio su una SD Card formattata FAT32 vuota di almeno 4 Gb
Al primo avvio si osserva la schermata sottostante che permette di scegliere quale SO provare
in questo caso e' stato selezionato Pidora che viene installato in automati
ed dopo un paio di riavvi compare Pidora con XFCE
Nel caso si voglia cambiare SO per qualche frazione di secondo ad ogni reboot compare questa schermata che invita a premere il tasto Shift...in questo modo si ritorna alla selezione del SO
Una volta scaricato NOOBS si deve scompattare l'archivio su una SD Card formattata FAT32 vuota di almeno 4 Gb
Al primo avvio si osserva la schermata sottostante che permette di scegliere quale SO provare
Selezione SO |
in questo caso e' stato selezionato Pidora che viene installato in automati
Installazione Pidora |
Nel caso si voglia cambiare SO per qualche frazione di secondo ad ogni reboot compare questa schermata che invita a premere il tasto Shift...in questo modo si ritorna alla selezione del SO
Megatools
Attenzione:
al momento di scrivere di questo post sul sito dello sviluppatore e' comparso un messaggio in cui lo sviluppo di questo tool e' sospeso a causa di una modifica alle API di Mega e sono stati rimossi i link per il download degli eseguibili. Risulta tuttora disponibile il link a GitHub per i sorgenti. Per adesso il tool funziona ma non e' chiaro fino a quando le API continueranno a funzionare come adesso
Finalmente iniziano ad essere disponibili i clienti per il servizio Cloud di Mega in particolar modo quello ufficiale per Android e quello non ufficiale per Linux/Windows offerto da Megatools
E' infatti sostanzialemente inutile avere 50 Giga di spazio e dover effettuare tutte le operazioni da interfaccia Web senza la possibilita' di automatizzare l'upload
In Linux, una volta scompattato l'archivio e compilato i sorgenti mediante ./configure make, si hanno a disposizione i seguenti principali comandi (ne ho omessi alcuni di uso meno frequente)
al momento di scrivere di questo post sul sito dello sviluppatore e' comparso un messaggio in cui lo sviluppo di questo tool e' sospeso a causa di una modifica alle API di Mega e sono stati rimossi i link per il download degli eseguibili. Risulta tuttora disponibile il link a GitHub per i sorgenti. Per adesso il tool funziona ma non e' chiaro fino a quando le API continueranno a funzionare come adesso
Finalmente iniziano ad essere disponibili i clienti per il servizio Cloud di Mega in particolar modo quello ufficiale per Android e quello non ufficiale per Linux/Windows offerto da Megatools
E' infatti sostanzialemente inutile avere 50 Giga di spazio e dover effettuare tutte le operazioni da interfaccia Web senza la possibilita' di automatizzare l'upload
In Linux, una volta scompattato l'archivio e compilato i sorgenti mediante ./configure make, si hanno a disposizione i seguenti principali comandi (ne ho omessi alcuni di uso meno frequente)
megadf come df mostra lo spazio disco a disposizione megals come ls (Linux) megamkdir come mkdir (Linux) megarm come rm (Linux) megamv come mv (Linux) megaput effettua l'upload di un file megaget effettua il download di un file megasync sincronizza una directory remota con una directory locale
in generale i comandi hanno tutti uno switch
-u nomeutente
-p password
una tipica sessione puo' essere
megadf -u lucainnoc@gmail.com -p password
megamkdir -u lucainnoc@gmail.com -p password Immagini
magesync -u lucainnoc@gmail.com -p password --local /home/luca/Immagini --remote /Root/Immagini
La directory di root del Cloud e' sempre Root
Le velocita' di upload sono piuttosto modeste e popolare i 50 Gb sara' veramente un'impresa
venerdì 12 luglio 2013
Shutdown Raspberry via pulsante
Questo progetto e' stato copiato da questo link per evitare uno dei problemi piu' fastidiosi della Raspberry (ovvero di Linux) ovvero la corruzione del file system in caso di arresto brutale dell'elaboratore
In questo esempio viene implementato un pulsante fisico che permetta di eseguire (ove possibile) uno shutdown corretto della macchina
Sono possibili due schemi elettrici
Io ho usato il metodo del secondo schema perche' nel primo la porta GPIO e' sempre sottotensione (stato logico 1) mentre nel secondo esempio lo stato logico e' 0
il programma per gestire il pulsante e' il seguente: se il pin 17 acquisisce uno stato logico 1 viene lanciato il comando di shell per lo shtdown. Le resistenze, come nello schema, sono da 1 e 10 KOhm
------------------------------------------------------
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)
while True:
if (GPIO.input(17)):
os.system("sudo shutdown -h now")
break
time.sleep(1)
Nella foto il cavo rosso e' collegato al pin di 3.3 V, il cavo nero al GND mentre il cavo giallo e' collegato alla porta 17
vistodall'alto
Ed ecco un breve video
In questo esempio viene implementato un pulsante fisico che permetta di eseguire (ove possibile) uno shutdown corretto della macchina
Sono possibili due schemi elettrici
Io ho usato il metodo del secondo schema perche' nel primo la porta GPIO e' sempre sottotensione (stato logico 1) mentre nel secondo esempio lo stato logico e' 0
il programma per gestire il pulsante e' il seguente: se il pin 17 acquisisce uno stato logico 1 viene lanciato il comando di shell per lo shtdown. Le resistenze, come nello schema, sono da 1 e 10 KOhm
------------------------------------------------------
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)
while True:
if (GPIO.input(17)):
os.system("sudo shutdown -h now")
break
time.sleep(1)
------------------------------------------------------
Nella foto il cavo rosso e' collegato al pin di 3.3 V, il cavo nero al GND mentre il cavo giallo e' collegato alla porta 17
vistodall'alto
Ed ecco un breve video
mercoledì 10 luglio 2013
GPIO su Raspberry (Led Blink)
In Raspberry e' presente una porta una porta GPIO (General Purpose Input Output) che puo' essere utilizzata come in Arduino per interfacciare la scheda con il mondo esterno (attenzione: ci sono controlli digitali e non analogici)
La prima fondamentale differenza rispetto al mondo Arduino e' che i pin sono spesso indicati con un doppio nome; il primo e' il numero ordinale (da 1 a 26) mentre il secondo prende in considerazione a quale collegamento rispetto alla CPU siano associati
ad aggiungere confuzione tra la prima e seconda revisione della Raspberry alcuni pin sono stati modificati per cui alcuni progetti girano su una versione e non sull'altra
Lo script seguente accende e spenge un led connesso al pin 11 (nome GPIO17)
-------------------------------------------------
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# Set up #17 as an output
print "Setup #17"
GPIO.setup(17, GPIO.OUT)
var=1
print "Start loop"
while var==1:
print "Set Output False"
GPIO.output(17, False)
time.sleep(1)
print "Set Output True"
GPIO.output(17, True)
time.sleep(1)
-------------------------------------------------
La prima fondamentale differenza rispetto al mondo Arduino e' che i pin sono spesso indicati con un doppio nome; il primo e' il numero ordinale (da 1 a 26) mentre il secondo prende in considerazione a quale collegamento rispetto alla CPU siano associati
GPIO Pin Rev.1 |
GPIO Pin Rev.2 |
Attenzione : la tensione di riferimento della Raspberry e' di 3.3 V sui pin digitali (ad esclusione di una alimentazione a 5 V sul pin 2)
Per programmare in modo semplice l'accesso i/o ai pin e' disponibile una libreria Python (gia' installata di default nelle versioni attuali di Raspbian). Tutti i programmi che usano le porte devono essere eseguiti come super-utente (script python compresi)
Lo script seguente accende e spenge un led connesso al pin 11 (nome GPIO17)
-------------------------------------------------
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# Set up #17 as an output
print "Setup #17"
GPIO.setup(17, GPIO.OUT)
var=1
print "Start loop"
while var==1:
print "Set Output False"
GPIO.output(17, False)
time.sleep(1)
print "Set Output True"
GPIO.output(17, True)
time.sleep(1)
-------------------------------------------------
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...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...