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
venerdì 19 luglio 2013
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);
}
}
}
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...