venerdì 22 novembre 2013

Calibrazione sensore di allungamento

Grazie ad un micrometro e' stato potuto calibrare con precisione il sensore di allungamentopresentato in questo post



Nella tabella sono riportate a sinistra i valori letti sul micrometro ed a destra il corrispondente valore letto direttamente sull'Arduino (i valori a sinistra sono in mm, a destra la lettura del canale analogico dell'Arduino)
Si deve precisare che i valori di lettura analogici sull'Arduino non erano molto stabili e quindi il dato  e' stato letto  come media di 5 misure consecutive


Riportando in grafico in grafico si evidenzia come la retta di taratura sia ottima come coefficiente di correlazione. Dai dati si potrebbe pensare di poter spingere la precisione fino a 5 centesimi di millimetro ma a causa della fluttazione del dato letto dall'Arduino e' piu' ragionevole impostare la sensibilita' della misura a circa il decimo di millimetro




mercoledì 20 novembre 2013

Software per progetto Force Gauge

Il progetto Force Guage sta arrivando al suo termine
L'hardware finale e' stato montato nella sua versione finale
-Arduino Due
-Ethernet Shield
-Amplifier Shield (autoprodotto)

adesso si passa al codice


per Arduino e' stato riutilizzato quasi tutto il codice di questo post
C'e' da annotare che (evindenziato in giallo)
1) per usare il comando itoa in Arduino Due si deve aggiungere  #include "itoa.h"
2) per far funzionare il convertitore analogico digitale di Arduino due a 12 bit lo si deve richiedere esplicitamente con il comando analogReadResolution

Codice Arduino
------------------------------------------
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include "itoa.h"

byte ardmac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ardip(192, 168, 0, 2);

byte Server[]  = { 192,168,0,1 };  
unsigned int porta = 7755;    
unsigned int localPort = 8888;      // local port to listen on

int sensorPin = A3;    
int sensorValue = 0;  

EthernetUDP Udp;

char buf[12]; // "-2147483648\0"

void setup() {
  Ethernet.begin(ardmac,ardip);
  Udp.begin(localPort);
  analogReadResolution(12);
}

void loop() {
    sensorValue = analogRead(sensorPin);    
    Udp.beginPacket(Server, porta);
    Udp.write(itoa(sensorValue, buf, 10));
    Udp.endPacket();
    delay(100);
}
----------------------------------------

per il frontend di rappresentazione realtime dei dati e' stato scritto un programmino in Qt che implementa un server UDP e mostra i dati mediante la libreria QCustomplot

Codice Qt (4.8.5)
file .pro (le modifiche sono in giallo)
------------------------------------------
QT      += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = geolab
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    qcustomplot.cpp

HEADERS  += mainwindow.h \
    qcustomplot.h

FORMS    += mainwindow.ui
------------------------------------------

in azzurro le righe di codice relative al server UDP mentre in giallo quelle relative alla visualizzazione del grafico

mainwindow.h
------------------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork>
#include <QVector>
#include "qcustomplot.h"


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_pushButton_clicked();
    void ricevi();

private:
    Ui::MainWindow *ui;
    QUdpSocket *udpSocket;

 };

#endif // MAINWINDOW_H
------------------------------------------
mainwindow.cpp
-------------------------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QUdpSocket>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

{
    ui->setupUi(this);

    ui->widget->addGraph();
    ui->widget->xAxis->setLabel("x");
    ui->widget->yAxis->setLabel("y");
    ui->widget->xAxis->setRange(0, 10);
    ui->widget->yAxis->setRange(0, 10);
    ui->widget->replot();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    udpSocket = new QUdpSocket(this);
    QString ip = "192.168.0.1";
    udpSocket->bind(QHostAddress("192.168.0.1"), 7755);
    connect(udpSocket, SIGNAL(readyRead()),
               this, SLOT(ricevi()));

}


void MainWindow::ricevi(){
    while (udpSocket->hasPendingDatagrams()) {
           QByteArray datagram;
           datagram.resize(udpSocket->pendingDatagramSize());
           QHostAddress sender;
           quint16 senderPort;

           udpSocket->readDatagram(datagram.data(), datagram.size(),
                                   &sender, &senderPort);

           qDebug() <<datagram;
           ui->widget->graph(0)->addData(i,datagram.toDouble());
           ui->widget->graph(0)->rescaleValueAxis(true);
           ui->widget->graph(0)->rescaleKeyAxis(true);

           ui->widget->replot();
           QString valore = datagram;
           ui->label->setText("Lettura istantanea : "+valore);

       }
}
-------------------------------------------


Telerilevamento con Beam

Alla ricerca di un software non coperto da licenza per il telerilevamento di dati Landsat ho provato Beam, un software sponsorizzato da ESA

Il programma e' scritto in Java ed eredita da questa scelta una sostanziale lentezza di calcolo e di gestione dei dati in memoria


Fra i pregi, oltre ad essere gratuito, vi e' la possibilita' di aprire una grande quantita' di formati compreso il recente Landsat 8 (sono esclusi i satelliti iperspettrali) ed una serie di algoritmi avanzati (solo per Meris)

Per poterlo utilizzare al momento attuale per i dati Landsat si deve effettuare un aggiornamento mediante Module Manager (Module Updates) del modulo Landsat perche' in agosto 2013 la Nasa, come spesso accade, ha modificato gli header delle immagini

Interessante da aggiungere a posteriori e' il modulo Envi Reader per le immagini salvate in .hdr


lunedì 18 novembre 2013

DIY: riparare un registratore ad audiocassette

Puo' sembrare strano ma c'e' ancora qualcuno che oggi i registratori ad audiocassette e me li porta a riparare dato che non sono piu' acquistabili

Di solito i registratori sono oggetti piuttosto solidi e basta un minimo di assistenza per farli ripartire.
Il modello sotto riportato ha una ventina di anni ed all'accensione si udiva il motore sotto sforzo ma nessun movimento


E' stato sufficiente aprirlo, sostituire le due cinghie di trasmissione oramai non piu' in tensione con due elastici (frecce in rosso) e lubrificare il meccanismo sottostante il volano (il cerchio tra le due frecce) per fare ripartire il registratore

In altri modelli, piu' vecchi, dove il problema e' di tipo elettrico spesso si risolve sostituendo il fusibile nascosto all'interno della scocca


Attaccare una WIFi/WPA mediante WPS e Reaver


Come ex amministratore di rete presso l'universita' e come ex white hat conosco un po' di trucchetti per attaccare una rete WiFi
Con l'arrivo del protezione WPA pero' pensavo che non fosse possibile entrare in una rete Wireless a meno di un colpo di fortuna (l'attacco WPA si basa sulla forza bruta) o stupidita' nella configurazione dell'access point (mi e' capitato di vedere degli access point con la password wpa che coincideva con l'SSID)

Frugando su Internet mi  sono imbattuto in Reaver, un software che sfrutta una vulnerabilita' sull'autenticazione automatica WPS, ed ho voluto provare sulla mia attrezzatura

Ho a disposizione un solo router wireless con capacita' Wps ed e' un access point portatile PN51T.
Per usare Reaver e' inoltre necessario avere a disposizione una scheda di rete che possa entrare in Monitor Mode..con mia grande sorpresa una scheda wifi Alfa AWUS036H su porta USB e dotata di chipset Realtek 8087 supporta questa modalita' in modo eccellente aggiungendo anche una antenna ad alto guadagno



Per usare Reaver conviene usare la distribuzione Back Track in modo da avere gia' tutto configurato

L'attacco e' piuttosto semplice perche si deve mandare prima la scheda in Monitor Mode
airmon-ng start wlan1

dopo si individuano gli access point visibili con capacita' wps mediante wash
wash -i mon0

guardando alla colonna WPS Locked si puo' vedere come alcuni access point siano protetti da questo tipo di attacco (Yes)

Selezionato l'obbiettivo di iniziare l'attacco (che rientra nella categoria di forza bruta perche' prova tutte le combinazioni di wps pin code) 
reaver -b mac_access_point -i mon0 -v


con un po' di disappunto la chiave wpa del mio access point e' stata trovata in meno di 30 secondi.
Il motivo della rapidita' e' che l'access point e' configurato con il pin code di default (12345670) che e' il primo che reaver prova

Un paio di controindicazioni:
1) l'attacco e' molto rumoroso perche' genera traffico per tutto il tempo in cui vengono provati i pin code (possono occorrere anche ore) e quindi e' facile da identificare. Alcuni access point prevedono un numero limitato di tentativi nell'unita' di tempo od addirittura disabilitano il wps dopo un certo numero di tentativi falliti

2) l'access point bersaglio deve essere piuttosto vicino all'attaccante perche' il traffico e' basato su una sequenza precisa di pacchetti che non devono essere persi (nel mio caso questo era sicuramente soddisfatto  perche' trra l'antenna e l'access point c'erano circa 20 cm)

PS: ovviamente questi esperimenti si fanno sulle reti che si amministrano....no su quelle dei vicini anche perche' e' reato 

venerdì 15 novembre 2013

Utilizzo di IP Camera Maygion su Linux

aggiornamento 20 maggio 2016
---------------------------------------
se si collega la camera con il cavo 192.168.1.111
per resettare il firmware si seguono le istruzioni a questa pagina
le istruzioni sul movimento della ptz del codice Python non sono esattamente corrette. Debuggando
la pagina web dell'amministrazione della camera le istruzioni corrette sono



html=urlopen(ur+"moveptz.xml?dir="+direzione+"&user=admin&password=admin")
time.sleep(0.1)
html=urlopen(ur+"moveptz.xml?dir=stop&user=admin&password=admin"

in pratica si fa movimento in una direzione, si attende e poi si stoppa, altrimenti il movimento va a fine corsa
---------------------------------------


Per cercare un sostituto a basso costo della IP Camera Samsung PTZ vista in questo post mi sono per una trentina di euro questa Ip Camera non marcata su un e-commerce cinese

La cosa divertente dell'acquistare prodotti cinesi e' che arrivano totalmente privi di istruzioni e sostanzialmente privi di marca per cui la prima sfida e' stata quella di capire cosa avevo davanti. Il cd incluso con i driver recava un directory denominata asw-380 ed un manuale in inglese ma senza indicazioni di marca e modello.


Guardando in una immagine relativa all'uso del software Android IP Cam Viewer viene riportato che deve essere selezionata l'opzione MayGion IP Camera V3 e questa e' stata l'indicazione fondamentale per individuare il modello.
Per quanto riportato dal manuale la camera e' pilotabile via browser mediante un OCX..quindi non solo sarei stato costretto ad usarlo sotto Windows ma sarei stato costretto ad usare Internet Explorer...la presenza di un programma per Android comunque mi lasciava speranze

La configurazione della rete wireless e' stata semplice perche' sul retro della camera e' disponibile il pulsante WPS per cui il WiFi e' stato autoconfigurato senza l'utilizzo di un computer esterno

Frugando su Internet vi sono frammentarie e scarse informazioni ma sono riuscito a trovare un paio di Pdf in cinese che mostrano la possibilita' di pilotare il dispositivo mediante delle URL (attenzione: esistono due versioni del software della IP Camera MayGion che differiscono sensibilmente, si deve individuare quindi il corretto set di URL)

Per visualizzare lo stream video si puo' utilizzare VLC usando come sorgente del flusso di rete questa URL
http://ipcamera:81/videostream.asf?usr=admin&pwd=admin

Per quanto riguarda il movimento PTZ ho scritto invece un semplice programmino in Python che sfrutta un joystick per muovere la camera

----------------------------------------------
import pygame,time

try:
    from urllib.request import urlopen
except ImportError:
    from urllib2 import urlopen

pygame.init()
j = pygame.joystick.Joystick(0)
j.init()
conta = 0
tick = 100

try:
    while True:
conta=conta+1
        pygame.event.pump()
        if j.get_button(0) == 1:
print "Pulsante 1 : "+str(j.get_button(0))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=up&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")

        if j.get_button(1) == 1:
print "Pulsante 2 : "+str(j.get_button(1))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=right&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")

        if j.get_button(2) == 1:
print "Pulsante 3 : "+str(j.get_button(2))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=down&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")

        if j.get_button(3) == 1:
print "Pulsante 4 : "+str(j.get_button(3))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=left&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")


        if j.get_button(4) == 1:
print "Pulsante 4 : "+str(j.get_button(4))
tick = tick+25
if tick > 200:
tick = 200

        if j.get_button(5) == 1:
print "Pulsante 5 : "+str(j.get_button(4))
tick = tick-25
if tick < 50:
tick = 25


time.sleep(0.1)

except KeyboardInterrupt:
    j.quit()

----------------------------------------------


giovedì 14 novembre 2013

Arduino Amplifier Shield

Cercando di rendere utilizzabile il circuito visto in questo post, ho pensato di rendere la versione definitiva come uno shield Arduino in modo da evitare al massimo cavi volanti

Per fare cio' e' stata presa una normale piastrina millefori tagliata sulle dimensioni di una Arduino a cui sono stati aggiunti pin mediante una strip (i pin inseriti sul lato dei contatti digitali dell'Arduino servono solo a rendere meccanicamente stabile lo shield e non sono elettricamente connessi)



I cavi dalla strumentazione vengono connessi alle morsettiere verdi (il contatto centrale non e' connesso...avevo solo morsettiere a tre posti)
Nelle foto e' mostrato il circuito completo per l'amplificazione da un solo canale dell'LM358 ma sono gia' stati predisposte la morsettiera ed il trimmer per regolare l'amplificazio (a destra nella foto sottostante) per il secondo canale

La lettura dei dati avviene sui Pin A3 (canale 1) e A5 (canale 2) dell'Arduino

Lo shield rovesciato
Alla fine la realizzazione e' piuttosto pulita ed ordinata (almeno per i miei standard)


Feature Matching OpenCv

Il problema e' il seguente: trovare le differenze tra le due foto. Le due immagini sono state riprese a distanza di oltre un anno ed il ...