venerdì 29 marzo 2013

Spedire pacchetti UDP con Netcat

Per fare delle prove di server UDP puo' essere utile il programma netcat (che non e' installato di default in Debian ma deve essere aggiunto con apt-get install netcat)

una volta avviato il server UDP si puo' inviare pacchetti UDP con la seguente sintassu
dove localhost e' l'indirizzo del server (in questo caso in locale) e 21567 e' la porta di ascolto del server

echo -n "hello" | nc -u -w1 localhost 21567

giovedì 28 marzo 2013

Deploy Application in Qt su Windows

Una volta creata una applicazione Qt funzionante in Window puo' venire il momento di distribuirla

Per prima cosa si deve creare il file eseguibile dentro a QtCreator  selezionando l'opzione Release nei metodi di compilazione. Nella cartella del progetto viene quindi creata una sottocartella Release con l'eseguibile

Per visualizzare le dipendenza si puo' usare il programma Depend (scaricabile a questo link)


Si copiano quindi nella directory release dell'eseguibile le DLL necessarie copiandole da C:\QtSDK\Desktop\Qt\4.7.3\mingw\bin
che nel caso in esame sono
QtCore4.dll
QtGui4.dll
QtSql4.dll

a queste vanno aggiunte
libgcc_s_dw2-1.dll
mingwm10.dll

si zippa il contenuto della directory e tramite il software NSIS si crea un installer scegliendo l'opzione "Installer based in Zip File"


Mouse Bluetooth su Debian

Questa e' una delle classiche cose che ti fa odiare Linux



Ho provato a connettere il mouse Bluetooth (recuperato di regalo) Sony VGP-BMS30 alla mia Debian Box e sono iniziati i problemi
La connessione e' piuttosto semplice da eseguire

apt-get install bluez-compat bluetooth
hcitool scan


si legge l'ID del mouse (in questo caso 00:03:C9:D1:61:B3) e poi si lancia
hidd --connect 00:03:C9:D1:61:B3

a questo punto sono iniziati i problemi
L'accoppiamento e' stato eseguito in modo corretto ma lasciando il mouse fermo per qualche decina di secondi questo sembrava essersi messo in modalita' sleep e non dava segni di vita

lanciando il comando
echo on > `readlink -f /sys/class/bluetooth/hci0`/../../../power/level 
e' possibile disattivare l'autosospend 
Problemi finiti ??? Nemmeno per idea
Il mouse a questo punto ha iniziato a muoversi con un ritardo notevole ed anche erratico sullo schermo senza un ragione precisa. Consultando questa pagina ho potuto verificare che si tratta di un bug conosciuto dello stack bluez quindi...mi compro un Logitech wireless da 2.4GHz




Cross compilare Qt su WIndows e Linux

Qt permette di scrivere applicazione che possono essere eseguite su piu' piattaforme ma non e' banale utilizzando una sola piattaforma creare eseguibili per tutti i sistemi operativi supportati (per esempio per compilare eseguibili Windows partendo da Qt SDK su Linux)

La soluzione piu' banale e' salvare la cartella del progetto, portarla su una macchina con montato il sistema operativo target e l'SDK installato, e ricompilare qui il progetto....non e' necessario infatti fare nessuna modifica

Nel caso in esempio il progetto e' stato sviluppato su Windows

ed e' stato portato su Linux digitando esclusivamente il comando make all'interno della cartella del progetto


Ci sono ovviamente delle piccole differenze relative ai Window Manager ma la cosa interessante e' che non e' stata effettuata nessuna modifica ne' sul codice ne' sul progetto

mercoledì 27 marzo 2013

UDP Server in Qt

Creare un server UDP in Qt non e' banalissimo

per prima cosa si deve modificare il file .pro per aggiungere il modulo network
-------------------------------------------------
QT += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = udp_server
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

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

successivamente sul file .h della finestra si aggiungono i riferimenti evidenziati in giallo
-------------------------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUdpSocket>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    QUdpSocket *udpSocket;

private slots:
void processPendingDatagrams();


};

#endif // MAINWINDOW_H
-------------------------------------------------

ed ecco la parte di codice che gestisce direttamente il server
in pratica si apre la porta di ascolto (in questo caso la 64009) e si connette una funzione di ascolto (processPendingData)
-------------------------------------------------
#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);

    udpSocket = new QUdpSocket(this);
   QHostAddress myAddr = QHostAddress("192.168.0.100") ;
   udpSocket->bind(myAddr, 7755);
   bool result = connect(udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

}

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


void MainWindow::processPendingDatagrams()
{
QByteArray datagram;

do {
    datagram.resize(udpSocket->pendingDatagramSize());
    udpSocket->readDatagram(datagram.data(), datagram.size());
    qDebug() << datagram.data();
} while (udpSocket->hasPendingDatagrams());


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

per testare il tutto si puo' usare questo semplice codice di client UDP in Python
-------------------------------------------------
import socket

IPADDR = '192.168.0.100'
PORTNUM = 7755
PACKETDATA = 'Luca'
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.connect((IPADDR, PORTNUM))
s.send(PACKETDATA)
s.close()
-------------------------------------------------

Sensore ad ultrasuoni HC SR04 su Arduino

Questo modulo ad ultrasuoni permette di calcolare la distanza di oggetti con Arduino (e di farsi anche un Theremin digitale
Il modulo ha 4 cavi
Vcc
Gnd
Trigger
Echo

Nello sketch successivo(ripreso da qui)  i pint digitali 7 ed 8 devono essere collegati al Trigger ed ad Echo
La distanza massima misurabile e' dell'ordine di 40-50 cm (dipende anche dalle dimensioni ed il materiale del bersaglio)

---------------------------------------------------------------------
//HC RS04 Sensore ultrasuoni
int triggerPort = 8;
int echoPort = 7;

void setup() {

pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");

}

void loop() {
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );

//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );

long duration = pulseIn( echoPort, HIGH );

long r = 0.034 * duration / 2;

Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );

//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}

//aspetta 1.5 secondi
delay( 1500 );
}
----------------------------------------------
Alcuni utenti usano una libreria alternativa (Arduino New Ping) che sembra garantire prestazioni migliori

Buzzer su Arduino

In questo esempio viene presentato l'utilizzo di un Buzzer alimentato su Arduino
Utilizzare questo componente permette di ottenere un suono di volume piu' alto rispetto ad un buzzer passivo


Quando arriva il componente e' dotato di una pellicola di protezione che deve essere rimossa dopo la saldatura


La pedinatura e' piuttosto semplice (+,- ed S) che corrispondono a (VCC,GND e Segnale)
Nello sketch successivo (ricopiato dal Playground di Arduino) il segnale e' collegato al Pin Digitale 4

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

#define SPEAKER_Pin 4

  int length = 15;                                              // the number of notes
char notes[] = "ccggaagffeeddc ";                               // a space represents a rest
 int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
  int tempo = 300;

void playTone(int tone, int duration)
{
  for (long i = 0; i < duration * 1000L; i += tone * 2)
   {
     digitalWrite(SPEAKER_Pin, HIGH);
     delayMicroseconds(tone);
     digitalWrite(SPEAKER_Pin, LOW);
     delayMicroseconds(tone);
   }
}


void playNote(char note, int duration)
{
  char names[] = { 'c',  'd',  'e',  'f',  'g',  'a',  'b', 'C'  };
   int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}



void setup()
{
  pinMode(SPEAKER_Pin, OUTPUT);
}


void loop()
{
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }

    // pause between notes
    delay(tempo / 2);
  }
}

---------------------------------------------------
Aggiornamento:
a distanza di tempo mi sono reso conto che il codice e' poco leggibile e ridondante. Il codice minimale per emettere un suono e' il seguente
----------------------------------------------------
int speakerPin = 9;

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void setup() {
  pinMode(speakerPin, OUTPUT);
}


void loop() {
playTone(400,1000);
delay(1000);
}

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