Visualizzazione post con etichetta Debian. Mostra tutti i post
Visualizzazione post con etichetta Debian. Mostra tutti i post

venerdì 1 marzo 2019

Toolchain per ESP32 su Linux

Post per impostare l'ambiente di sviluppo esp32-idf su Debian 9



si installano i pacchetti

apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing

e successivamente
mkdir esp
cd ~/esp 
git clone -b v3.1.3 --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
export IDF_PATH=~/esp/esp-idf 

si scarica il compilatore e lo si decomprime

tar -xzf ~/Downloads/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
si inserisce l'ambiente di sviluppo in Path

export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
se tutto e' andato bene si puo' andare in $HOME/esp/esp-idf/examples/get-started/hello_world e digitare make per vedere se il progetto si compila (viene generato il bootloader all'indirizzo 0x10000 oltre al programma vero e proprio all'inidirizzo 0x8000). Al termine si puo' digitare

make flash 

per copiarlo sulla scheda (questi i messaggi)

-----------------------------------------
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000 )...
esptool.py v2.6
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32D0WDQ6 (revision 0)
Features: WiFi, BT, Dual Core, Coding Scheme None
MAC: 24:0a:c4:05:df:5c
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 21184 bytes to 12506...
Wrote 21184 bytes (12506 compressed) at 0x00001000 in 1.1 seconds (effective 153.7 kbit/s)...
Hash of data verified.
Compressed 144080 bytes to 68379...
Wrote 144080 bytes (68379 compressed) at 0x00010000 in 6.0 seconds (effective 190.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 1843.8 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
---------------------------------------------------

Collegandosi con minicom alla /dev/ttyUSB0 si ottengono le seguenti stringhe
---------------------------------------------------
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)                          
configsip: 0, SPIWP:0xee                                                        
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00         
mode:DIO, clock div:2                                                           
load:0x3fff0018,len:4                                                           
load:0x3fff001c,len:5804                                                        
load:0x40078000,len:9188                                                        
load:0x40080000,len:6084                                                        
entry 0x4008032c                                                                
I (29) boot: ESP-IDF v3.1.3 2nd stage bootloader                                
I (29) boot: compile time 11:25:47                                              
I (29) boot: Enabling RNG early entropy source...                               
I (34) boot: SPI Speed      : 40MHz                                             
I (38) boot: SPI Mode       : DIO                                               
I (42) boot: SPI Flash Size : 4MB                                               
I (46) boot: Partition Table:                                                   
I (49) boot: ## Label            Usage          Type ST Offset   Length         
I (57) boot:  0 nvs              WiFi data        01 02 00009000 00006000       
I (64) boot:  1 phy_init         RF data          01 01 0000f000 00001000       
I (72) boot:  2 factory          factory app      00 00 00010000 00100000       
I (79) boot: End of partition table                                             
I (83) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x07180 ( 2p
I (102) esp_image: segment 1: paddr=0x000171a8 vaddr=0x3ffb0000 size=0x022a0 ( d
I (106) esp_image: segment 2: paddr=0x00019450 vaddr=0x40080000 size=0x00400 ( d
I (110) esp_image: segment 3: paddr=0x00019858 vaddr=0x40080400 size=0x067b8 ( d
I (130) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11150 ( p
I (155) esp_image: segment 5: paddr=0x00031170 vaddr=0x40086bb8 size=0x02130 ( d
I (164) boot: Loaded app from partition at offset 0x10000                       
I (164) boot: Disabling RNG early entropy source...                             
I (166) cpu_start: Pro cpu up.                                                  
I (170) cpu_start: Starting app cpu, entry point is 0x40080e74                  
I (162) cpu_start: App cpu up.                                                  
I (181) heap_init: Initializing. RAM available for dynamic allocation:          
I (187) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM                       
I (193) heap_init: At 3FFB32F8 len 0002CD08 (179 KiB): DRAM                     
I (200) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM                    
I (206) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM                   
I (213) heap_init: At 40088CE8 len 00017318 (92 KiB): IRAM                      
I (219) cpu_start: Pro cpu start user code                                      
I (237) cpu_start: Starting scheduler on PRO CPU.                               
I (0) cpu_start: Starting scheduler on APP CPU.                                 
Hello world!                                                                    
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 0, 4MB exterh
Restarting in 10 seconds...                                                     
Restarting in 9 seconds...                                                      
Restarting in 8 seconds...                                                      
Restarting in 7 seconds...                                                      
Restarting in 6 seconds...                                                      
Restarting in 5 seconds...                                                      
Restarting in 4 seconds...                                                      
Restarting in 3 seconds...                                                      
Restarting in 2 seconds...                                                      
Restarting in 1 seconds...                                                      
Restarting in 0 seconds...                                                      
Restarting now.

-------------------------------------------------------
Questo comportamento e' coerente con il programma hello_world.c

---------------------------------------------
/* Hello World Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"


void app_main()
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
            chip_info.cores,
            (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
            (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

    printf("silicon revision %d, ", chip_info.revision);

    printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
            (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    printf("Restarting now.\n");
    fflush(stdout);
    esp_restart();
}
------------------------------------------------------

In conclusione l'ambiente di sviluppo e' funzionante

giovedì 28 febbraio 2019

AC6 System Workbench per Debian 9

ed alla fine sono riuscito ad avere una IDE per STM32 funzionante su Debian 9

Per l'installazione l'utente deve poter essere nei sudoers

Il problema era piuttosto semplice alla fine e viene dopo l'installazione. Una volta installato System Workbench con l'installer la compilazione del programma funziona in modo corretto ma viene generato un errore da GDB

la soluzione e' installare libncurses e creare un link simbolico tra la versione 6 32bit e la versione 5 (non disponibile nel repository...basta il symlink)

root@debian:/usr/lib/i386-linux-gnu# ln -s libncurses.so.6 libncurses.so.5






giovedì 7 febbraio 2019

U-Blox U-Center e Wine

U-Center di U-Blox funziona correttamente in Wine su Debian
L'unica accortezza e' che si deve creare un symlink della porta USB verso un COM virtuale con

ln -s /dev/ttyACM0 /home/luca/.wine/dosdevices/com5




a questo punto il GPS verra' visto in U-Center sotto COM5


martedì 15 gennaio 2019

Installare Debian testing su Lenovo X1 Carbon

Mi sono trovato a dover installare Debian su un Ultrabook Lenovo X1 Carbon e dover seguire una procedura mai provata.

Di solito installo i driver della scheda WiFi al secondo riavvio, anche perche' i driver sono spesso proprietari, usando la Ethernet per scaricare la distribuzione (Debian testing e' scaricabile solo come netinst)

X1 Carbon non ha una Ethernet integrata ed il dongle USB della Lenovo monta un Realtek 8153 il cui driver non e' compreso nel Cd di installazione



Come fare allora. Arrivato a questa schermata ho trovato il firmware della scheda di rete Wireless del Carbon (iwlwifi-7260-17.ucode), ho scaricato il file .dpgk su un altro computer, lo ho scompattato con ar e salvato il file .ucode (nel pacchetto ve ne sono molti altri) su una chiavetta USB


A questo punto ho rimosso il supporto USB con la iso Debian e messo quello con il driver. L'installer ha preso al volo il cambio di chiavetta e montato il driver attivando il WiFi. E' pero' necessario continuare l'installazione con il supporto di installazione e qui le cose si fanno un po' piu/ complicate.,...reinserendo la chiavetta di installazione questa non viene montata in automatico. Si deve entrare in shell (CTRL+ALT+F4) e montare a mano la chiavetta su /cdrom.
A questo punto si ritorna sulla finestra dell'installer (CTRL+ALT+F7) per terminare la configurazione

mercoledì 26 dicembre 2018

Let's Encrypt e DynDNS su Debian

Ad oggi diventa sempre piu' frequente la necessita' di usare connessioni HTTPS e spesso cio' crea problemi nella fase di sviluppo quando si devono fare delle semplici prove prima di andare in produzione




Una soluzione puo'essere quella di usare i certificati di Let's Encrypt, che garantiscono un traffico criptato su canale HTTPS ma non danno garanzie sull'autenticita' del host da cui le informazioni vengono (Let's Encrypt non effettua nessuna verifica sulla veridicita' dell'host e dell'organizzazione che lo mantiene)

Prima di procedere bisogna pero' indicare che i certificati di Let's Encrypt vengono forniti a server identificati via DNS e non via semplice IP (come spesso accade nelle macchine di sviluppo). Si puo' ovviare con un DNS Dinamico come DynDNS

Su Debian si procede installando il client di DynDNS

apt-get install ddclient

creando il nuovo dyndns nell'interfaccia web di https://dyndns.it/ 

e configurando il file /etc/ddclient.conf (il nome host e' quello inserito nella pagina web e scelto dall'utente nel formato xxxx.ns0.it

# /etc/ddclient.conf
protocol=dyndns2
use=web, web=checkip.dyndns.it
server=update.dyndns.it
login=INSERIRE_IL_PROPRIO_USERNAME
password='INSERIRE_LA_PROPRIA_PASSWORD'
INSERIRE_IL_NOME_HOST


si controlla che tutto sia a posto con

ddclient -debug

e poi si lancia il servizio

/etc/init.d/ddclient restart

si passa quindi a configurare la parte https

wget https://dl.eff.org/certbot-auto 
chmod a+x certbot-auto

e si lancia lo script specificando il web server

certbot-auto --apache

durante la configurazione si dovra' rispondere ad alcune domande

I certificati di Let's Encrypt hanno validita' di 90 giorni e quindi ci puo' essere la necessita' di mettere in cron il rinnovo automatico con

certbot-auto renew

giovedì 22 novembre 2018

Bash script come cgi in Apache

Cosa succede quando scrivi uno script bash che funziona bene e non vuoi convertirlo in Php? Semplice...ritorni indietro di venti anni e lo fai diventare un cgi script

Per prima cosa si devono abilitare gli script CGI in Apache

a2enmod cgi

service apache2 restart

in Debian la directory di default per i CGI e' in /usr/lib/cgi-bin...si copia quindi lo script e lo si rende eseguibile
Per prima cosa c'e' da dire che lo script non deve rispondere in modo arbitrario (per esempio con un semplice testo) ma con un file html altrimenti verranno generati errori del tipo 500 di output non correttamente formattato

In Bash si possono leggere anche le variabile GET passate sulla URL e cio' mediante IFS
Nell'esempio sottostante e' prevista una sola variabile (che corrisponde ad un id numerico) e che e' stata salvata nell'array parm all'indice 1
----------------------------------------------------
#!/bin/bash

echo "Content-type: text/html"
echo ""

echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
PATH="/bin:/usr/bin:/usr/opt/bin"
export $PATH

saveIFS=$IFS
IFS='=&'
parm=($QUERY_STRING)
IFS=$saveIFS


stringa="$(xidel --silent --extract "//img/@src" "http://xxxxxxxxxxxx.it/?utf8=true&size=micro&mode=double&idc=${parm[1]}" | grep idraulico | awk 'FNR==1')"


echo '</head>'
echo '<body>'
#echo ${parm[1]}
file="$(basename $stringa)"

echo $file

echo '</body>'
echo '</html>'

exit 0
----------------------------------------------------

martedì 20 novembre 2018

Estrarre dati da un XML a linea di comando

Per estrarre dati in modo semplice da un XML una soluzione puo' essere xml_grep
Questo comando e' incluso nel pacchetto Debian xml-twig-tools

si procede quindi con

apt-get install xml-twig-tools

supponiamo di avere un XML tipo

---------------
<?xml version='1.0' encoding='UTF-8'?>
<alert xmlns="urn:oasis:names:tc:emergency:cap:1.2">
  <identifier>XXXXXX</identifier>
  <sender>XXXXXX</sender>
  <sent>2018-11-14T15:24:00+01:00</sent>
  <status>Actual</status>
  <msgType>Alert</msgType>
  <scope>Public</scope>
  <note>XXXXXXX</note>
  <info>
    <category>Met</category>
    <event>XXXXX</event>
............
---------------
e che si voglia estrarre il contenuto di <note>
si puo' usare la semplice sintassi

xml_grep 'note' test.xml --text_only

lunedì 28 agosto 2017

SDR Software defined radio su Linux

Ho sempre avuto la passione per il radio ascolto ma nessuno che mi potesse insegnare o che mi potesse prestare l'attrezzatura (un tempo decisamente costosa e per la quale erano comunque necessarie conoscenze di base di elettronica)
Per provare mi sono comprato un dongle NooElec per RTL_SDR, un piccolo dispositivo USB che fa la funzione di radio scanner su frequenze tra 25 e 1700 MHz. Ho preso il kit con le tre antenne (433 MHz la piu' piccola  anche se ne viene sconsigliato l'uso (non avendone gia' altre) ..piu' lunga l'antenna e meglio capta le lunghezze d'onda piu' lunghe

Il dispositivo monta un chip Realtek  RTL2832U con un sintonizzatore  R820T. Il dispositivo scalda abbastanza (il case e' metallico) e necessita' di un buona potenza di calcolo perche' gran parte del lavoro e' demandata alla CPU

L'installazione su Debian e' piuttosto lineare ...l'unica attenzione e' come segnalato nel log, sara' necessaria una porta USB dalla ver 2 in su perche' il dongle succhia molta corrente



Come software si puo' usare Gqrx gia' disponibile pacchettizzato
In questo caso sto ascoltando Controradio su 93.6 in modulazione di frequenza


Il dispositivo funziona (ovviamente) anche su Windows previa installazione dei driver e l'utilizzo di CubicSDR.

Una volta installato ci si puo' divertire a cercare i picchi tra le frequenze. Per caso per esempoi ho sintonizzato  il segnale del sistema Vortac dell' aeroporto di Firenze a 115.200 MHz (ci sono delle schede per riconoscere la trasmittente in base alla frequenza ed all'area di ricezione)


questa la scheda del Vortac di Firenze


Se si ha una ricetrasmittente si puo' osservare chiaramente anche la trasmissione. Nell'esempio sottostante ho fatto un paio di impulsi con la radio manuale (si vede il colore da blu diventare verde a 438.525)


Frugando un po' ho trovato anche questo segnale a 120 MHz che si ripete alla 2° e 3° armonica (240 MHz e 480 MHz)..frugando su internet sembra un disturbo del rumore di qualche dispositivo elettronico...


Uno dei motivi per il quale mi sono comprato questo dispositivo era quello di esplorare il range delle VLF (ed ovviamente ho sbagliato date le caratteristiche tecniche

venerdì 17 febbraio 2017

Realtek 8188CUS su Debian

Premessa: puo' essere che non sia stato capace io....

E' da tempo che non trovavo un hardware non compatibile con la mia Debian..la cosa divertente e' che il dongle in foto e' stato ripreso da una Raspberry (Raspbian) su cui funzionava perfettamente. Iniziamo la storia



Il dispositivo con lsusb si presenta come
Bus 001 Device 002: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter

su Debian il modulo che gestisce la Realtek 8188CUS e' gestito dal driver rtl8192cu e si installa facilmente mediante
apt-get install firmware-realtek

fino a qui niente di strano...il dispositivo viene montato e si mostra in ifconfig...sembra tutto funzionare..

root@debian:/home/luca# iwconfig
wlan0     IEEE 802.11bgn  ESSID:"AndroidAP"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 02:1A:11:FD:D2:1B   
          Bit Rate:72.2 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=100/100  Signal level=100/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

quando si cerca pero' di accoppiare con l'access point accade qualcosa di strano

wpa_supplicant -B -i wlan0 -c <(wpa_passphrase AndroidAP passwortd) 
Successfully initialized wpa_supplicant
nl80211: Driver does not support authentication/association or connect commands
wlan0: Failed to initialize driver interface

ok proviamo a modificare con wext

wpa_supplicant -B -i wlan0 -c <(wpa_passphrase AndroidAP Tmd1ccdUs) -D wext

a questo punto viene iniziata l'autenticazione con l'access point che non va mai a buon fine

cercando su Internet sembra che il problema sia relativo al kernel Linux e sono state apportate patch al pacchetto standard dei driver in particolare su https://github.com/pvaret/rtl8192cu-fixes. Ho seguito le istruzioni niente successo.

In conclusione ho preso una Ralink...



martedì 27 dicembre 2016

Debian dual monitor su Virtual Box

Come usare Debian usando VirtualBox in modalita' dual monitor

Per prima cosa si deve creare una macchina virtuale con due monitor




Dopo di cio' si installano le Guest Additions secondo la classica trafile

apt-get install build-essential
apt-get install linux-headers-$(uname -r)
VBoxLinuxAdditions.run 
reboot

A questo punto con la macchina virtuale attiva si deve abilitare il secondo schermo virtuale dal menu Visualizza




ed alla fine si manda tutto a pieno schermo


giovedì 15 dicembre 2016

Debian su Compaq R4006EA

Un amico mi ha chiesto di rimettere in vista un vetusto Compaq R4006EA (anno 2005)

Non mi era mai capitato di averne uno per le mani e la prima cosa che salta all'occhio e' la robustezza ed il peso...infatti non era venduto come un portatile ma come un desktop replacement.

Si tratta di una macchina con processore Sempron 3000+ con la batteria e' ancora funzionante (seppure con un tempo di carica molto ridotto..circa 20 minuti)  ed il piu' fuori standard tra tutti i connettori di alimentazione che abbia visto
Il disco da 40 Gb e'





Vista l'eta ho montato una Debian LXDE che con i 384 Mb installati (256+128 in parte utilizzati dalla memoria video) che funziona decisamente bene. In fase di boot viene segnalata solo l'impossibilita' a a caricare il firmware r300_cp.bin per cui viene disabilitata l'accelerazione della GPU...si tratta di un problema della scheda ATI Radeon R300  e che e' discusso in questo post Francamente non ho tanta voglia di perdere tempo con una macchina cosi' vecchia ed in ogni caso il sistema funziona

giovedì 11 agosto 2016

C.H.I.P

ATTENZIONE: il segnale composito standard di CHIP e' NTSC. Si devono quindi usare televisori/monitor che supportino la doppia codifica o deve essere impostata manualmente la codifica PAL in UBoot (e' quindi necessario armarsi un cavo TTL-USB per connettersi alla porta seriale in fase di boot)
i pin Tx ed Rx sono vicini a GND sulla fila interna vicino alla porta microUsb (tra GND e FEL per essere piu' precisi

screen /dev/ttyUSB0 115220

quando si vedono i messaggi di Uboot si deve premre un tasto (non della tastiera attaccata al CHIP ma sulla consolle seriale) e si digitano i comandi

setenv video-mode sunxi:720x576-24@50,monitor=composite-pal,overscan_x=40,overscan_y=20
savenv
reset------------------------------------------------------------------------------------

E' passato un po' di tempo (circa 1 mese) da quando ho ricevuto per posta il mio primo tentativo di pledge su Kickstarter ovvero C.H.I.P. un microcomputer con 512 Mb di Ram, 4 Giga di storage, un processore da 1 Giga e la possibilita' di avere uscita video in HDMI, VGA o composito (non c'e' Ethernet ma solo Wifi integrato)


La prima cosa da fare per poter usare il modulo VGA e' quello di flashare il firmware con la versione 4.4 GUI che crea un desktop Debian.... e qui sono entrato nei guai

Per entrare in modalita' programmazione del firmware si deve cortocircuitare i pin GND e FEL (si trovano sulla fila interna del connettore vicino alla microUsb) per entrare in fastboot mode e subito dopo connettere la corrente



Per la riprogrammazione si deve usare necessariamente Chrome almeno alla versione 49 perche' il tutto avviene tramite un plugin del browser

Non e' proprio intuitivo ma qui si deve premere Start Flashing. Per comodita' e' meglio scarica il file immagine da qui cliccando sull'icona della nuova




Per usare il DIP Vga e' necessario utilizzare la versione del firmware 4.4 ma dopo un bel po' di tentativi su diversi sistemi operativi, con diversi cavi, con diversi alimentatori CHIP non dava segni di vita ne' su VGA ne' sul segnale composito ne' sulla porta seriale legata alla porta microsub

Giusto per provare ho montato la versione GUI 4.3 e finalmente sono riuscito a far partire il sistema, anche se solo con la qualita' del segnale composito



Se si connette il cavo USB con una Linux Box, nel mio caso una Centos, apparira' una porta seriale virtuale (nel mio caso /dev/ttyACM0) da cui si accede ad una shell
di default le credenziali sono

user : root
password : chip

Da qui in poi il sistema si comporta come una Debian quindi c'e' poco da dire..peraltro non avendo il DIP VGA montato rimangono scoperti i connettori GPIO per le prove

Il consumo del dispositivo ha un picco di 580 mA in boot ed un consumo di 200 mA in idle (questo ultimo valore differisce di molto da quelli di fabbrica che riporta valori piu' bassi di oltre la meta')

PS ho aperto un ticket vero l'assistenza di NextThing Co per vedere se riesco a far funzionare la VGA
(aggiornamento...il problema non e' il DIP ma il fatto che con il sistema 4.4 semplicemente il sistema non fa il boot.)

CHIP e' un po' esosa di corrente...quando l'alimentazione e' scarsa semplicemente si spenge. In generale il picco di consumo senza il DIP VGA e' di circa 300 mA con un valore di idle di 170 mA





martedì 2 agosto 2016

Debian 8 su PowerBook G4 Titanium

Con questo post si rientra alle origini del blog ovvero installare Debian su macchina obsolete
In questo caso c'e un dubbio. Ha una mela sullo schermo ma e' un Apple PowerBook od un PC piuttosto bruttino e molto standard ????
Si tratta di un modello particolarmente esotico (su Ebay al momento non sono presenti in vendita esemplari funzionanti) ovvero di un A1025 PowerBook G4 Titanium, un pezzo di storia risalente al 2002 nel periodo di passaggio da OS 9 a OS X


La macchina era destinata alla distruzione ed era priva dell'Hd (il precedente possessore si e' sincerata di rimuovere tutti i suoi dati)..fortunatamente ha lasciato pero' il flat cable per il montaggio dell'HD . Ha montati 256 MB di Ram (standard dell'epoca)

Scheda madre con il nuovo HD da 40 Gb

Accesso alla Ram sotto la tastiera
Le porte sono tutte nascoste da uno scomodissimo sportellino sul retro del computer



L'installazione di Debian 8 per PowerPC (non ci sono repository PowerPC su Debian.it quindi bisogna puntare su Debian.org) non ha mostrato nessun problema...la mancanza di Ram mette un po' in crisi XFCE ma con un po' di tuning si tratta di macchina ancora usabile


mercoledì 20 aprile 2016

Leap Motion SDK

Mi sono comprato per circa 20 euro il Leap Motion su un e-commerce cinese (su Amazon costa piu' del doppio) con il dubbio che non fosse l'originale ma un clone.



Il dispositivo funziona perferttamente con i driver originali ed anche la confezione sembra corretta

Il sito web di Leap Motion riporta il pacchetto .deb per l'installazione sotto Linux e le istruzioni per Ubuntu ma funziona tranquillamente anche su Debian. Peraltro anche i requisiti minimi del sistema sono abbondantemente sorvradimesionati....il dispositivo funziona anche su un Centrino 1GHz (anche se si inizia a notare il ritardo)

dpkg -i Leap-*-.x86.deb

Dal punto di vista hardware il Leap Motion e' costituito da una coppia di telecamere ad infrarossi ad alta velocita' (200 fotogrammi al secondo) ed un illuminatore ad infrarossi. Vista la ridotta potenza dell'illuminatore il raggio d'azione del sensore e' inferiore al metro ma la risoluzione e' stimata a circa 0.7 cm


Non ho capito bene se il sensore usa la visione stereoscopica per determinare la terza dimensione oppure si tratta solo di una coppia di telecamere ed il lavoro di interpretazione e' demandato al PC e' connesso (aggiornamento: leggendo la documentazione tecnica tutto il lavoro di riconoscimento viene fatto dal PC, il sensore manda solo coppie di immagini, peraltro il Leap Motion viene riconosciuto nel syslog come un dispositivo video come una qualunque webcam)

Un aspetto da non sottovalutare e' la disponibilita' dell'SDK che si puo' scaricare direttamente da questo link.Sono previste librerie per C, Python e Unity

Ho provato ad usare l'esempio per Python (nella directory /samples) ma non riusciva a importare il modulo Leap. Ho riscritto parte del codice, evidenziato in giallo per fare il puntamento alle directory in modo corretto.
(versione ridotta con la sola posizione di pitch, roll e yaw)
--------------------------------------------------------------------------
import os, sys, thread, time,inspect,thread

sys.path += ["/usr/lib/Leap","../lib/x86","../lib"]

import Leap
from Leap import CircleGesture, KeyTapGesture, ScreenTapGesture, SwipeGesture


class SampleListener(Leap.Listener):
    finger_names = ['Thumb', 'Index', 'Middle', 'Ring', 'Pinky']
    bone_names = ['Metacarpal', 'Proximal', 'Intermediate', 'Distal']
    state_names = ['STATE_INVALID', 'STATE_START', 'STATE_UPDATE', 'STATE_END']

    def on_init(self, controller):
        print "Initialized"

    def on_connect(self, controller):
        print "Connected"

        # Enable gestures
        controller.enable_gesture(Leap.Gesture.TYPE_CIRCLE);
        controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP);
        controller.enable_gesture(Leap.Gesture.TYPE_SCREEN_TAP);
        controller.enable_gesture(Leap.Gesture.TYPE_SWIPE);

    def on_disconnect(self, controller):
        # Note: not dispatched when running in a debugger.
        print "Disconnected"

    def on_exit(self, controller):
        print "Exited"

    def on_frame(self, controller):
        # Get the most recent frame and report some basic information
        frame = controller.frame()

        # Get hands
        for hand in frame.hands:

            handType = "Left hand" if hand.is_left else "Right hand"

            print "  %s, id %d, position: %s" % (
                handType, hand.id, hand.palm_position)

            # Get the hand's normal vector and direction
            normal = hand.palm_normal
            direction = hand.direction

            # Calculate the hand's pitch, roll, and yaw angles
            print "  pitch: %f degrees, roll: %f degrees, yaw: %f degrees" % (
                direction.pitch * Leap.RAD_TO_DEG,
                normal.roll * Leap.RAD_TO_DEG,
                direction.yaw * Leap.RAD_TO_DEG)

def main():
    # Create a sample listener and controller
    listener = SampleListener()
    controller = Leap.Controller()

    # Have the sample listener receive events from the controller
    controller.add_listener(listener)

    # Keep this process running until Enter is pressed
    print "Press Enter to quit..."
    try:
        sys.stdin.readline()
    except KeyboardInterrupt:
        pass
    finally:
        # Remove the sample listener when done
        controller.remove_listener(listener)


if __name__ == "__main__":
    main()
--------------------------------------------------------------------------

La cosa incredibile e' la quantita' di informazioni fornita.
Per esempio il sensore riesce a distinguere
1) mano destra da mano sinistra
2) vettore normale della mano
3) yaw, pitch e roll della posizione della mano
4) direzione del braccio, direzione del polso
5) per ogni dito vengono forniti 4 valori per ciascuna delle giunzioni delle ossa

--------------------------------------------------------------------------
Frame id: 81414, timestamp: 1461155610589896, hands: 1, fingers: 5, tools: 0, gestures: 0
  Right hand, id 19, position: (33.206, 101.55, 31.0056)
  pitch: -0.360167 degrees, roll: -19.586099 degrees, yaw: -15.937854 degrees
  Arm direction: (-0.539341, -0.159729, -0.8268), wrist position: (56.3493, 103.269, 80.5455), elbow position: (201.971, 146.396, 303.781)
    Thumb finger, id: 190, length: 52.116371mm, width: 20.250000mm
      Bone: Metacarpal, start: (27.9765, 103.101, 92.2079), end: (27.9765, 103.101, 92.2079), direction: (0, 0, 0)
      Bone: Proximal, start: (27.9765, 103.101, 92.2079), end: (-6.82482, 100.813, 56.4951), direction: (0.697175, 0.0458273, 0.715435)
      Bone: Intermediate, start: (-6.82482, 100.813, 56.4951), end: (-30.6533, 99.3269, 32.1536), direction: (0.698872, 0.0435907, 0.713917)
      Bone: Distal, start: (-30.6533, 99.3269, 32.1536), end: (-50.3944, 104.308, 20.6123), direction: (0.843508, -0.212845, 0.493145)
    Index finger, id: 191, length: 58.807510mm, width: 19.342800mm
      Bone: Metacarpal, start: (38.8333, 118.553, 77.8819), end: (4.48218, 112.147, 13.1405), direction: (0.46692, 0.0870757, 0.880002)
      Bone: Proximal, start: (4.48218, 112.147, 13.1405), end: (-13.782, 110.943, -25.7277), direction: (0.42512, 0.0280223, 0.904703)
      Bone: Intermediate, start: (-13.782, 110.943, -25.7277), end: (-25.9697, 93.3597, -36.9743), direction: (0.504241, 0.727484, 0.465305)
      Bone: Distal, start: (-25.9697, 93.3597, -36.9743), end: (-31.1777, 77.3075, -34.3053), direction: (0.304817, 0.939512, -0.156218)
    Middle finger, id: 192, length: 67.006439mm, width: 18.997200mm
      Bone: Metacarpal, start: (49.2811, 115.897, 71.9318), end: (25.0349, 106.497, 7.19131), direction: (0.347527, 0.134729, 0.92794)
      Bone: Proximal, start: (25.0349, 106.497, 7.19131), end: (15.6093, 104.469, -40.035), direction: (0.19555, 0.0420621, 0.979791)
      Bone: Intermediate, start: (15.6093, 104.469, -40.035), end: (2.5615, 85.8319, -57.0945), direction: (0.458841, 0.655411, 0.599918)
      Bone: Distal, start: (2.5615, 85.8319, -57.0945), end: (-6.32149, 69.2732, -56.8969), direction: (0.472701, 0.88116, -0.0105194)
    Ring finger, id: 193, length: 64.428482mm, width: 18.077040mm
      Bone: Metacarpal, start: (59.6432, 110.65, 67.9288), end: (46.5165, 98.9206, 7.8132), direction: (0.209559, 0.187246, 0.9597)
      Bone: Proximal, start: (46.5165, 98.9206, 7.8132), end: (49.952, 104.128, -36.4287), direction: (-0.0768931, -0.116561, 0.990202)
      Bone: Intermediate, start: (49.952, 104.128, -36.4287), end: (42.4103, 90.7847, -59.5039), direction: (0.272243, 0.48169, 0.832981)
      Bone: Distal, start: (42.4103, 90.7847, -59.5039), end: (33.5572, 75.4563, -65.4834), direction: (0.473833, 0.820404, 0.320031)
    Pinky finger, id: 194, length: 50.510735mm, width: 16.057440mm
      Bone: Metacarpal, start: (68.5105, 99.5173, 67.8996), end: (64.7404, 88.1882, 11.157), direction: (0.065018, 0.19538, 0.97857)
      Bone: Proximal, start: (64.7404, 88.1882, 11.157), end: (75.9784, 92.3616, -22.108), direction: (-0.317824, -0.11803, 0.940775)
      Bone: Intermediate, start: (75.9784, 92.3616, -22.108), end: (74.1183, 84.4117, -39.8812), direction: (0.0951014, 0.406461, 0.908705)
      Bone: Distal, start: (74.1183, 84.4117, -39.8812), end: (66.4641, 71.7476, -48.7209), direction: (0.444062, 0.734713, 0.51284)
--------------------------------------------------------------------------

fra le altre coste e' possibile impostare anche il riconoscimento delle gesture

lunedì 4 aprile 2016

wget in Tor

Oltre ad usare la rete Tor per navigare via Web con il comodo Tor Bundle e' possibile utilizzare anche comandi scriptabili (per esempio wget) all'interno di una connessione Tor

Si usa quindi il comando torsocks (apt-get install torsocks)

la sintassi e' estremamente semplice

torsocks wget ..... http://www.test.com


Esempio di connessione http standard (sopra) e wget via Tor (sotto) 

L'unica difficolta' e' avere la conferma che lo scaricamento avvenga da una connessione Tor al posto che dal proprio Ip. Se all'interno di Tor Bundle c'e' una comoda icona con torsocks a linea di comando non ci sono informazioni dirette.

Si puo' usare allora un servizio online che riporta l'ip del chiamante come http://www.get-ip.me/. Ho selezionato questo servizio perche' altri piu' siti piu' famosi, come http://getip.com oppure www.whatsmyip.org non permettono la connessione da wget

mercoledì 10 febbraio 2016

RTKLib e Ublox M8T su Debian

RTKLib e' un software per gestire dati GPS in modalita' avanzata. Viene fornita una versione gia' compilata per Windows ma e' possibile farlo funzionare anche su Linux compilando i sorgenti (su Linux non e' prevista l'interfaccia grafica ma solo i programmi a linea di comando)

Sistema di acquisizione Toughbook CF-18 con Debian collegato a Ublox M8T


Si parte scaricando il pacchetto da GitHub (questo perche' e' disponibile una versione piu' avanzata rispetto a quella linkata sul sito.

 Prima di iniziare si devono soddisfare le dipendenze

sudo apt-get install build-essential
sudo apt-get install automake
sudo apt-get install checkinstall
sudo apt-get install liblapack3gf
sudo apt-get install libblas3gf


dopo aver scompattato il pacchetto di GitHub si entra nella directory app e si lancia la compilazione con
makeall.sh
in questo modo si compila la versione 2.4.2 p11, ho avuto invece problemi con la 2.4.3

Connettendo la USB dell'Ublox M8T questo viene riconosciuto come seriale virtuale su /dev/ttyACM0

il programma per effettuare l'acquisizione dati si chiama rtkrcv e si configura mediante un file testo (io ho un po' barato nel senso che prima ho creato un file di configurazione con RTKNavi su Windows e poi lo ho importato, ovviamente modificando alcune parti, sulla Linux box)

Il file compilato si trova in RTKLIB-master/app/rtkrcv/gcc

File M8T.conf
--------------------------------------------------------
# RTKNAVI options (2016/02/08 17:25:54, v.2.4.3 b8)pos1-posmode       =single     # (0:single,1:dgps,2:kinematic,3:static,4:movingbase,5:fixed,6:ppp-kine,7:ppp-static,8:ppp-fixed)
pos1-frequency     =l1         # (1:l1,2:l1+l2,3:l1+l2+l5,4:l1+l5)
pos1-soltype       =forward    # (0:forward,1:backward,2:combined)
pos1-elmask        =15         # (deg)
pos1-snrmask_r     =off        # (0:off,1:on)
pos1-snrmask_b     =off        # (0:off,1:on)
pos1-snrmask_L1    =0,0,0,0,0,0,0,0,0
pos1-snrmask_L2    =0,0,0,0,0,0,0,0,0
pos1-snrmask_L5    =0,0,0,0,0,0,0,0,0
pos1-dynamics      =off        # (0:off,1:on)
pos1-tidecorr      =off        # (0:off,1:on,2:otl)
pos1-ionoopt       =brdc       # (0:off,1:brdc,2:sbas,3:dual-freq,4:est-stec,5:ionex-tec,6:qzs-brdc,7:qzs-lex,8:stec)
pos1-tropopt       =saas       # (0:off,1:saas,2:sbas,3:est-ztd,4:est-ztdgrad,5:ztd)
pos1-sateph        =brdc       # (0:brdc,1:precise,2:brdc+sbas,3:brdc+ssrapc,4:brdc+ssrcom)
pos1-posopt1       =off        # (0:off,1:on)
pos1-posopt2       =off        # (0:off,1:on)
pos1-posopt3       =off        # (0:off,1:on,2:precise)
pos1-posopt4       =off        # (0:off,1:on)
pos1-posopt5       =off        # (0:off,1:on)
pos1-posopt6       =off        # (0:off,1:on)
pos1-exclsats      =           # (prn ...)
pos1-navsys        =1          # (1:gps+2:sbas+4:glo+8:gal+16:qzs+32:comp)
pos2-armode        =continuous # (0:off,1:continuous,2:instantaneous,3:fix-and-hold)
pos2-gloarmode     =off        # (0:off,1:on,2:autocal)
pos2-bdsarmode     =off        # (0:off,1:on)
pos2-arthres       =3
pos2-arthres1      =0.9999
pos2-arthres2      =0.25
pos2-arthres3      =0.1
pos2-arthres4      =0.05
pos2-arlockcnt     =0
pos2-arelmask      =0          # (deg)
pos2-arminfix      =10
pos2-armaxiter     =1
pos2-elmaskhold    =0          # (deg)
pos2-aroutcnt      =5
pos2-maxage        =30         # (s)
pos2-syncsol       =off        # (0:off,1:on)
pos2-slipthres     =0.05       # (m)
pos2-rejionno      =30         # (m)
pos2-rejgdop       =30
pos2-niter         =1
pos2-baselen       =0          # (m)
pos2-basesig       =0          # (m)
out-solformat      =llh        # (0:llh,1:xyz,2:enu,3:nmea)
out-outhead        =off        # (0:off,1:on)
out-outopt         =off        # (0:off,1:on)
out-timesys        =gpst       # (0:gpst,1:utc,2:jst)
out-timeform       =hms        # (0:tow,1:hms)
out-timendec       =3
out-degform        =deg        # (0:deg,1:dms)
out-fieldsep       =
out-height         =ellipsoidal # (0:ellipsoidal,1:geodetic)
out-geoid          =internal   # (0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000)
out-solstatic      =all        # (0:all,1:single)
out-nmeaintv1      =0          # (s)
out-nmeaintv2      =0          # (s)
out-outstat        =off        # (0:off,1:state,2:residual)
stats-eratio1      =100
stats-eratio2      =100
stats-errphase     =0.003      # (m)
stats-errphaseel   =0.003      # (m)
stats-errphasebl   =0          # (m/10km)
stats-errdoppler   =1          # (Hz)
stats-stdbias      =30         # (m)
stats-stdiono      =0.03       # (m)
stats-stdtrop      =0.3        # (m)
stats-prnaccelh    =10         # (m/s^2)
stats-prnaccelv    =10         # (m/s^2)
stats-prnbias      =0.0001     # (m)
stats-prniono      =0.001      # (m)
stats-prntrop      =0.0001     # (m)
stats-prnpos       =0          # (m)
stats-clkstab      =5e-12      # (s/s)
ant1-postype       =llh        # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant1-pos1          =90         # (deg|m)
ant1-pos2          =0          # (deg|m)
ant1-pos3          =-6335367.6285 # (m|m)
ant1-anttype       =
ant1-antdele       =0          # (m)
ant1-antdeln       =0          # (m)
ant1-antdelu       =0          # (m)
ant2-postype       =llh        # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant2-pos1          =90         # (deg|m)
ant2-pos2          =0          # (deg|m)
ant2-pos3          =-6335367.6285 # (m|m)
ant2-anttype       =
ant2-antdele       =0          # (m)
ant2-antdeln       =0          # (m)
ant2-antdelu       =0          # (m)
misc-timeinterp    =off        # (0:off,1:on)
misc-sbasatsel     =0          # (0:all)
misc-rnxopt1       =
misc-rnxopt2       =
misc-pppopt        =
file-satantfile    =
file-rcvantfile    =
file-staposfile    =
file-geoidfile     =
file-ionofile      =
file-dcbfile       =
file-eopfile       =
file-blqfile       =
file-tempdir       =C:\Temp
file-geexefile     =
file-solstatfile   =
file-tracefile     =
file-cmdfile1      =ubx_m8t_glo_raw_1hz.cmd


#

inpstr1-type       =serial     # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr3-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr1-path       =ttyACM0:9600:8:n:1:off
inpstr2-path       =
inpstr3-path       =
inpstr1-format     =ubx        # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-format     =rtcm2      # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr3-format     =rtcm2      # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-nmeareq    =off        # (0:off,1:latlon,2:single)
inpstr2-nmealat    =0          # (deg)
inpstr2-nmealon    =0          # (deg)
outstr1-type       =file       # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr1-path       =./soluzioni.txt
outstr2-path       =
outstr1-format     =llh        # (0:llh,1:xyz,2:enu,3:nmea)
outstr2-format     =llh        # (0:llh,1:xyz,2:enu,3:nmea)
logstr1-type       =file       # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr3-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr1-path       =./raw_data.ubx
logstr2-path       =
logstr3-path       =
misc-svrcycle      =10         # (ms)
misc-timeout       =10000      # (ms)
misc-reconnect     =10000      # (ms)
misc-nmeacycle     =5000       # (ms)
misc-buffsize      =32768      # (bytes)
misc-navmsgsel     =all        # (0:all,1:rover,2:base,3:corr)
misc-proxyaddr     =
misc-fswapmargin   =30         # (s)

--------------------------------------------------------
Per abilitare la trasmissione dei pacchetti Ublox si deve chiamare il file ubx_mt8_glow_raw_1hz.cmd. Nella directory data di RTKLib sono presenti anche altri file a diversi passi di campionamento (5Hz e 10Hz) e da differenti impostazioni (ubx_m8t_bds_raw_1hz.cmd). Il file ubx_raw_1hz.cmd serve solo per cambiare il passo di campionamento ed e' sostanzialmente inutile


I dati vengono salvati in due file
soluzioni.txt e' un semplice file testo in cui vengono salvati i dati della posizione gia' elaborati (sono presenti anche le colonne sdn,sde,sdu,sdne,sdeu,sdun che sono rispettivamente la standard deviation nelle componenti Nord, Est, Z e quelle sulla componente Nord-Est, Est-Z e Z-Nord ). Questo fase e' sostanzialmente inutile per il postprocessing

In raw_data.ubx  vengono salvati tutti i dati in uscita dalla seriale senza elaborazione ovvero le stringhe NMEA ed i pacchetti UBX binari. Questi ultimi possono essere utilizzati per il postprocessing convertendo i dati in Rinex mediante il programma convbin.

./convbin -od -os -oi -ot -f 1 data.ubx
Una volta creato il file M8T.conf si lancia ./rtkrcv e si apre una shell (altrimenti ./rtkrcv -o M8T.conf) . Si digita
load M8T.conf 
restart

il sensore entra in acquisizione
per vedere l'avanzamento si puo' digitare status. Altrimenti si puo' digitare solution per vedere l'aggiornamento del punto GPS con i relativi errori. Spesso aggiungendo un numero alla fine del comando si setta il tempo di refresh del comando per esempio solution 1 aggiorna la posizione una volta al secondo

file .ubx con le stringhe NMEA e pacchetti binari UBX

status

satellite

solution


Per terminare il comando e' shutdown
Con questa soluzione e' possibile evitare di usare U-Center e Windows


Opencv camera calibration in cpp

Oltre che con uno script Python come visto qui la calibrazione della camera si puo' fare anche con il programma in CPP Questo il proce...