giovedì 2 agosto 2012

Montare disco su GingerBread e ICS

Sto iniziando ad usare il tablet con Ice Cream Sandwich (Android 4.0.3) ed ho notato una differenza sensibile rispetto a GingerBread (Android 2.2) ovvero che non compare piu' la possibilita' di montare la SD Card come disco esterno. Questa funzione, oltre che essere comoda, era anche praticamente identica sia su Windows che su Linux

Schermata di GingerBread


La differenza risulta nel fatto che su ICS i dispositivi esterni vengono montati tramite il protocollo MTP il che equivale a dire casino con Linux

Schermata di ICS

Usando il gestore dei dischi il tablet ICS viene visto come due unita' (la memoria interna da 8 Gb piu' la schedina SD da 8Gb) come Linux File-CD Gadget

Ci sono suggerimenti su come montare il protocollo MTP su Linux (vedi qui) ma le mie prove di lanciare mtp-detect non hanno dato nessun risultato

Una soluzione decisamente piu' indolore e' quella di installare la app AirDroid che permette di gestire e scambiare i file via WiFi in modo decisamente indolore (in questo caso e' estremamente comodo un router wireless portatile  per le aree non coperte da WiFi)


Epub format

Ultimamente mi capita sempre piu' spesso di leggere libri in formato elettronico, spesso Epub

Se si rinomina un file Epub (privo di DRM) con una estensione Zip e si tenta di aprirlo si scopre che di fatto si tratta solo di un archivio di file Html con pochi file accessori necessari per la formattazione



 un buon sistema per leggere file Epub senza installare un apposito reader e' quello di impiegare l'estensione di Firefox EPubReader. Una volta installata si possono aprire i file con il semplice comando File/Apri File

Tutti i file aperti vengono poi elencati nella biblioteca privata che si apre cliccando sull'icona del libro (in alto all'estrema destra) di Firefox

Modificare Path su Windows

Per utilizzare l'ambiente di sviluppo di Android si devono modificare i valori di Path predefiniti...in Windows la cosa puo' diventare difficoltosa passando attraverso Pannello di Controllo/Sistema/Variabili di Ambiente in quanto questa finestra e' sottoposta al controllo di amministratore


In problema puo' essere risolto in modo banale impostando le modifiche alla Path direttamente dalla finestra di shell (Start/Esegui/cmd)



mercoledì 1 agosto 2012

Adb devices no permissions ??????

passando da Ubuntu a Debian mi sono imbattuto in un problema piuttosto curioso che riguarda l'ambiente di sviluppo di Android.

Tutto sembrava funzionare bene (compilatore, simulatore di cellulare etc) ma quando sono andato ad attaccare il mio Ideos per compilare ed installare il programma sul cellulare la perificerica non venive riconosciuta come un target valido

digitando
adb devices 
viene risposto

List of devices attached
????????????        no permissions


si procede allora con il comando
lsusb -v | grep idVendor

si deve individuare la periferica Android che nel mio caso corrispondono a

id = 2207 Tablet Mediacom 850i
id = 12d1 Telefono Ideos

a questo punto si deve editare il file /etc/udev/rules.d/51-android.rules aggiungendo le righe
SUBSYSTEM=="usb", SYSFS{idVendor}=="2207", MODE="0666"
SUBSYSTEM=="usb", SYSFS{idVendor}=="12d1", MODE="0666"

subito dopo
chmod a+r /etc/udev/rules.d/51-android.rules

e poi 
adb kill-server
adb start-server

ritornando ad utente normale e digitando adb devices  a questo punto vengono enumerate le periferiche e si puo' iniziare a programmare in Eclipse
-------------------------------------------------------

nel caso in cui si riavvi il computer la procedura prevede solo gli ultimi aspetti
ovvero da superutente si deve dare
adb kill-server
adb start-server

e poi da utente normale si puo' iniziare ad usare Eclipse

altrimenti si puo' inserire l'utente normale tra i sudoers e si lancia il comando
sudo adb start-server 



---------------------------------------------------------------------
 un'altra modifica puo' essere quella di creare il link simbolico seguente

sudo ln -s /opt/android-sdk-linux_x86/platform-tools/adb /usr/local/sbin/adb




lunedì 23 luglio 2012

Installare Debian da USB Key su SAMSUNG N150 Plus (senza connessione di rete)

Ho questo portatile da circa due anni che dopo due anni di Ubuntu Netbook Remix ha subito un problema di corruzione del file system e non potendo reinstallare Ubuntu Remix (che al momento non esiste piu') ho provato a montare un XUbuntu 11.10...dopo pochi mesi mi sono stufato e mi sono lanciato nell'installazione di Debian




 L'installazione e' partita da una chiave USB senza connessione di rete

I problemi ovviamente sono iniziati al riavvio nel quale praticamente niente era stato riconosciuto (o configurato) per cui ho iniziato modificando a mano il file interfaces dentro /etc/network/interfaces
aggiungendo le seguenti righe

auto eth0
iface eth0 inet dhcp

riavviando il servizio ed attaccando il cavo la rete e' disponibile

A questo punto e' necessario cambiare il file sources.list in /etc/apt/ perche' installando senza rete non e' stato configurato
si deve commentare la riga riguardante il cdrom e si aggiungono
deb http://ftp.it.debian.org/debian squeeze main contrib non-free
deb-src http://ftp.it.debian.org/debian squeeze main contrib non-free

si aggiorna l'elenco dei pacchetti

apt-get install update

per gestire la rete wireless eseguire i comandi seguenti
apt-get install network-manager-gnome firmware-brcm80211
modprobe -r brcm80211 
modprobe brcm80211

la scheda video e' riconosciuta ma l'audio e' impostato a zero
si deve quindi installare
apt-get install gnome-media 
che installa sotto Preferenze/Audio il mixer

Installazione di Midnight Commander
apt-get install mc
apt-get install unzip

Google-Chrome deve essere installato e scaricato come deb a parte direttamente da Google (niente apt)
alla fine ho avuto la necessita' di eseguire
apt-get -f install

Installazione di Java
apt-get install openjdk-6-jre openjdk-6-jdk icedtea6-plugin

Installazione di Eclipse
se si installa Eclipse via apt-get poi si diventa pazzi nell'installazione del plugin ADT di Android perche' la versione nei repository Debian manca dei plugin necessari
La cosa migliore e' scaricare direttamente il file tgz di Eclipse dal sito scegliendo la versione Classic (circa 180 Mb di download)

Configurazione di Android
Una volte decompresso l'Android SDK dentro la home/android-sdk-tools si deve modificare la PATH

$ nano ~/.bashrc

aggiugendo alla fine
export PATH=${PATH}:~/android-sdk-linux/tools 
export PATH=${PATH}:~/android-sdk-linux/platform-tools

Per avere il software di sviluppo di Arduino si deve procedere come prima installando i seguenti pacchetti

apt-get install build-essential
apt-get install --reinstall gcc-avr
apt-get install --reinstall avr-libc
apt-get install --reinstall binutils-avr
apt-get iinstall --reinstall avrdude

e poi scaricando e decomprimendo il software Arduino

Openoffice
apt-get install openoffice.org

La  webcam funziona regolarmente su /dev/video0 cosi' come l'SD Card Reader

Per velocizzare il boot puo' essere comodo installare un login manager differente da GDM ed in particolare
apt-get install slim

modificando il file  /etc/slim.conf con
default_user luca
auto_login yes


per diminuire il tempo di attesa di Grub (impostato a 5 secondi) si edita il file /etc/default/grub modificando il valore di GRUB_TIMEOUT e poi eseguendo il comando update-grub
infine sono stati rimossi i demoni perche' non utilizzati mediante sys-rc-config (da installare a parte)

bootlogs
avahi-dae
cups
exim4
nfs-common
portmap
rsync
rsynclog 

in modo piuttosto strano si deve anche aggiungere il comando sudo
apt-get install sudo
con il seguente comando (effettuato da root)

adduser luca sudo 

per completare si possono aggiungere i codec non compresi in Debian prelevabili da qui

stranamente non e' compreso di default il decompressore dei file rar che si aggiunge
apt-get install unrar

mercoledì 11 luglio 2012

Proiezioni stereografiche per geologia strutturale

In questo post viene proposto un programma  per disegnare le proiezioni stereografiche di utilizzo in geologia stratigrafica

Per prima cosa si deve calcolare l'intersezione del piano di cui si e' effettuata la misura (strato o discontinuita')  con una sfera a centro (0,0,1) e raggio1; per fare cio' viene calcolato l'equazione del cerchio dell'equatore che poi viene ruotato dei corrispondenti valori di Strike e Dip
Dopo di cio' viene applicata la formula della proiezione stereografica per riportare i risultati sul piano di proiezione

----------------------
import pygame
import math

pygame.init()
screen = pygame.display.set_mode((300,300))

gamma = -math.pi # variabile per generare il cerchio massimo

teta = math.radians(90)   # angolo di dip
alfa = math.radians(159)  # angolo di strike

raggio = 100
raggio2 = 50

pygame.draw.circle(screen,(255,0,0),(150,150),raggio,1)

while True:
    while gamma < (math.pi):
        #calcola il cerchio come con il centro in 0,0,1 e parallelo ad XY
        #in pratica calcola l'equatore come cerchio massimo
        x = math.cos(gamma)
        y = math.sin(gamma)
        z = 0
        #ruota il cerchio dell'equatore sull'asse x dell'angolo di pendenza (dip)
        x1 = x
        y1 = ((math.cos(teta)*y)-(math.sin(teta)*z))
        z1 = ((math.sin(teta)*y)+(math.cos(teta)*z))
        #ruota il cerchio dell'equatore del valore di azimuth
        x2 = ((math.cos(alfa)*x1)-(math.sin(alfa)*y1))
        y2 = ((math.sin(alfa)*x1)+(math.cos(alfa)*y1))
        z2 = 1+z1 #sposta l'origine della sfera a 0,0,1 per preparare la proiezione stereografica
        #proiezione stereografica
        if (z2<1): # per convenzione si plottano solo le intersezioni con la semisfera inferiore
            x3 = (2*x2)/(2-z2)
            y3 = (2*y2)/(2-z2)
            screen.set_at((int(x3*raggio2)+150,int(y3*raggio2)+150),(0,255,0))
        gamma = gamma+0.01
    pygame.display.flip()

----------------------
Strike 159 - Dip 90

Strike 270 - Dip45

Strike 32 - Dip12

lunedì 9 luglio 2012

Sensori via Arduino Ethernet

 Questo programma mostra un esempio di come utilizzare una Arduino Ethernet per leggere i valori di alcuni sensori (su protocollo I2C o direttamente con input analogico) e mostrare il risultato su una pagina Web che si aggiorna una volta al secondo

--------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>

#define ADDRESS 0x60        // indirizzo I2C della bussola

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };

Server server(80);

int acc_x0,acc_y0,acc_z0;                     // Valori di accelerazione

unsigned long tempo;

void setup()
{
  //inizializza il bus I2C
  Wire.begin();
  //inizializza il web server
  Ethernet.begin(mac, ip);
  server.begin();
  // per debug
  Serial.begin(9600);
}

void loop()
{
   byte highByte, lowByte, fine;              // Bearing (transi)
   char pitch, roll;                          // Pitch and roll
   int bearing;                               // Bearing
   byte high_x,low_x,high_y,low_y,high_z,low_z;
   int acc_x,acc_y,acc_z;                     // Valori di accelerazione


   Wire.beginTransmission(ADDRESS);           // inizia la comunicazione con la bussola
   Wire.send(2);                              // inizia a leggere dal secondo registro
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);              // richiede 4 byte
   while(Wire.available() < 4);               // Wait for bytes to become available
   highByte = Wire.receive();          
   lowByte = Wire.receive();           
   pitch = Wire.receive();             
   roll = Wire.receive();              
  
   bearing = ((highByte<<8)+lowByte)/10;      // Calcola la parte intera del Bearing
   fine = ((highByte<<8)+lowByte)%10;         // Calcola la parte decimale del Bearing

   int fine2 = (int)fine;
   int pitch2 = (int)pitch;
   int roll2 = (int)roll;
  
   Wire.beginTransmission(ADDRESS);           //inizia lettura accelerometro
   Wire.send(16);                             
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 6);              // Richiede i 6 byte dell'accelerazione
   while(Wire.available() < 6);              
   high_x = Wire.receive();          
   low_x = Wire.receive();           
   high_y = Wire.receive();          
   low_y = Wire.receive();           
   high_z = Wire.receive();          
   low_z = Wire.receive();           
  
   acc_x = ((high_x<<8)+low_x);      // Calcola accel_x
   acc_y = ((high_y<<8)+low_y);      // Calcola accel_y
   acc_z = ((high_z<<8)+low_z);      // Calcola accel_z

   delay(1000);
 
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //gestisce il refresh automatico della pagina per aggiornare
          //al valore dei sensori
          client.println("<meta http-equiv=\"refresh\" content=\"1\">");
         
          tempo = round(millis()/1000);
          client.print("Tempo trascorso (sec): ");
          client.print(tempo);
          client.print("</br></br><table border=1>");
         
          // Stampa il valore del bearing
            client.print("<tr><td>Bearing</td><td>");
            client.print(bearing);
            client.print(".");
            client.print(fine2);
            client.print("</td></tr>");

          // Stampa il valore di Pitch
            client.print("<tr><td>Pitch</td><td>");
            client.print(pitch2);
            client.print("</td></tr>");

          // Stampa il valore di Roll
            client.print("<tr><td>Roll</td><td>");
            client.print(roll2);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su X
            client.print("<tr><td>Acc. Delta X (g)</td><td>");
            float acx = (acc_x-acc_x0)*0.000636364;
            client.print(acx);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Y
            client.print("<tr><td>Acc. Delta Y (g)</td><td>");
            float acy = (acc_y-acc_y0)*0.000636364;
            client.print(acy);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Z
          // il valore di acc su Z senza movimento e' 15400
          // quindi il fattore di correzione e' 9.8/15400 = 0.000636364
            client.print("<tr><td>Acc. Delta Z (g)</td><td>");
            float acz = (acc_z-acc_z0)*0.000636364;
            client.print(acz);
            client.print("</td></tr>");
           
            // salva i valori di accelerazione per il calcolo
            // del delta di accelerazione
            acc_x0 = acc_x;
            acc_y0 = acc_y;
            acc_z0 = acc_z;

          // Stampa il valore Temperatura
          // T = 68.033 exp(-0.2088*R(Kohm))
          // R_sensore = (10.000*5)/(
          int sensor_t = A0;
          int temp = analogRead(sensor_t);
          double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
          double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
          double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
            client.print("<tr><td>Temp. (C)</td><td>");
            client.print(temperatura);
            client.print("</td></tr>");

          // Stampa il valore Umidita
          int sensor_u = A1;
          int umi = analogRead(sensor_u);
          double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
            client.print("<tr><td>RH (%)</td><td>");
            client.print(umidita);
            client.print("</td></tr>");


            client.print("</table>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>

#define ADDRESS 0x60        // indirizzo I2C della bussola

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };

Server server(80);

int acc_x0,acc_y0,acc_z0;                     // Valori di accelerazione

unsigned long tempo;

void setup()
{
  //inizializza il bus I2C
  Wire.begin();
  //inizializza il web server
  Ethernet.begin(mac, ip);
  server.begin();
  // per debug
  Serial.begin(9600);
}

void loop()
{
   byte highByte, lowByte, fine;              // Bearing (transi)
   char pitch, roll;                          // Pitch and roll
   int bearing;                               // Bearing
   byte high_x,low_x,high_y,low_y,high_z,low_z;
   int acc_x,acc_y,acc_z;                     // Valori di accelerazione


   Wire.beginTransmission(ADDRESS);           // inizia la comunicazione con la bussola
   Wire.send(2);                              // inizia a leggere dal secondo registro
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);              // richiede 4 byte
   while(Wire.available() < 4);               // Wait for bytes to become available
   highByte = Wire.receive();          
   lowByte = Wire.receive();           
   pitch = Wire.receive();             
   roll = Wire.receive();              
  
   bearing = ((highByte<<8)+lowByte)/10;      // Calcola la parte intera del Bearing
   fine = ((highByte<<8)+lowByte)%10;         // Calcola la parte decimale del Bearing

   int fine2 = (int)fine;
   int pitch2 = (int)pitch;
   int roll2 = (int)roll;
  
   Wire.beginTransmission(ADDRESS);           //inizia lettura accelerometro
   Wire.send(16);                             
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 6);              // Richiede i 6 byte dell'accelerazione
   while(Wire.available() < 6);              
   high_x = Wire.receive();          
   low_x = Wire.receive();           
   high_y = Wire.receive();          
   low_y = Wire.receive();           
   high_z = Wire.receive();          
   low_z = Wire.receive();           
  
   acc_x = ((high_x<<8)+low_x);      // Calcola accel_x
   acc_y = ((high_y<<8)+low_y);      // Calcola accel_y
   acc_z = ((high_z<<8)+low_z);      // Calcola accel_z

   delay(1000);
 
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //gestisce il refresh automatico della pagina per aggiornare
          //al valore dei sensori
          client.println("<meta http-equiv=\"refresh\" content=\"1\">");
         
          tempo = round(millis()/1000);
          client.print("Tempo trascorso (sec): ");
          client.print(tempo);
          client.print("</br></br><table border=1>");
         
          // Stampa il valore del bearing
            client.print("<tr><td>Bearing</td><td>");
            client.print(bearing);
            client.print(".");
            client.print(fine2);
            client.print("</td></tr>");

          // Stampa il valore di Pitch
            client.print("<tr><td>Pitch</td><td>");
            client.print(pitch2);
            client.print("</td></tr>");

          // Stampa il valore di Roll
            client.print("<tr><td>Roll</td><td>");
            client.print(roll2);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su X
            client.print("<tr><td>Acc. Delta X (g)</td><td>");
            float acx = (acc_x-acc_x0)*0.000636364;
            client.print(acx);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Y
            client.print("<tr><td>Acc. Delta Y (g)</td><td>");
            float acy = (acc_y-acc_y0)*0.000636364;
            client.print(acy);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Z
          // il valore di acc su Z senza movimento e' 15400
          // quindi il fattore di correzione e' 9.8/15400 = 0.000636364
            client.print("<tr><td>Acc. Delta Z (g)</td><td>");
            float acz = (acc_z-acc_z0)*0.000636364;
            client.print(acz);
            client.print("</td></tr>");
           
            // salva i valori di accelerazione per il calcolo
            // del delta di accelerazione
            acc_x0 = acc_x;
            acc_y0 = acc_y;
            acc_z0 = acc_z;

          // Stampa il valore Temperatura
          // T = 68.033 exp(-0.2088*R(Kohm))
          // R_sensore = (10.000*5)/(
          int sensor_t = A0;
          int temp = analogRead(sensor_t);
          double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
          double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
          double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
            client.print("<tr><td>Temp. (C)</td><td>");
            client.print(temperatura);
            client.print("</td></tr>");

          // Stampa il valore Umidita
          int sensor_u = A1;
          int umi = analogRead(sensor_u);
          double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
            client.print("<tr><td>RH (%)</td><td>");
            client.print(umidita);
            client.print("</td></tr>");


            client.print("</table>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

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...