lunedì 8 luglio 2013

Display Nokia 5110 su Raspberry

Per utilizzare il display Nokia 5110 su Raspberry la via piu' semplice e' quella di utilizzare la libreria PCD8544 presente a questo sito
Prima pero' deve essere soddisfatta la dipendenza dalla libreria WiringPi che si puo' scaricare da questo sito

La compilazione di WiringPi e' semplice in quanto, dopo aver spacchettato l'archivio. e' sufficiente da root digitare ./build

A questo punto si puo' spacchettare la libreria PCD8544 e procedere alla sua compilazione.
Una volta spacchettato l'archivio se si tenta di lanciare la compilazione con i comandi proposti dal sito


cc -o pcd8544_test pcd8544_test.c ../PCD8544.c -L/usr/local/lib -lwiringPi
cc -o pcd8544_test2 pcd8544_test2.c ../PCD8544.c -L/usr/local/lib -lwiringPi
cc -o pcd8544_rpi pcd8544_rpi.c ../PCD8544.c -L/usr/local/lib -lwiringPi

questa fallisce

La cosa da fare e' modificare leggermente i file contenuti nella cartella samples modificando la riga dell'include da
#include "PCD8544.h"

a
#include "../PCD8544.h"

a questo punto si puo' compilare con successo

Attenzione: i collegamenti sono validi solo per la Raspberry Ver.2. Nei commenti del sito originario e' presente lo schema di collegamento per la Raspberry Ver.1 a cui devono essere accoppiate anche delle leggere modifiche al codice

Le connessione sono le seguenti
LCD pins      Raspberry Pi
---------------------------------------
LCD1 - GND    P06  - GND
LCD2 - VCC    P01 - 3.3V
LCD3 - CLK    P11 - GPIO0
LCD4 - Din    P12 - GPIO1
LCD5 - D/C    P13 - GPIO2
LCD6 - CS     P15 - GPIO3
LCD7 - RST    P16 - GPIO4
LCD8 - LED    P01 - 3.3V

in piu' per avere il led della retroilluminazione acceso si puo' collegare il pin BL del display all'alimentazione a 3.3 V della Raspberry

Dettaglio dei collegamenti


L'esempio test2 in esecuzione


Quadro completo




Backup SD Card Raspbian

Una delle cose piu' fastidiose della Raspberry e' la necessita' di effettuare uno shutdown corretto pena la compromissione della SD Card ed il non riavvio del sistema operativo (abituati alle Arduino questo e' decisamente un problema)


Una soluzione puo' essere quella di creare una copia della SD Card in  modo da salvare le impostazione e le personalizzazioni alla Raspbian

Per fare cio' in Linux,avendo la SD Card montata su sdb, si puo' digitare (da root)

dd if=/dev/sdb of=./copia.img
tar cvfj copia.tgz copia.img

venerdì 5 luglio 2013

Easter Egg su Amministrazione Google AdSense

Stavo consultando l'amministrazione di AdSense di questo blog (come si puo' vedere in un anno ha fatto 2.9 euro di guadagno..) quando ho lasciato il mouse sull'immagine in basso a destra, il numero 10 che festeggia il compleanno di questa piattaforma


In maniera non prevedibile e' apparsa un barra verde che progressivamente aumentava
Al termine e' comparso il gioco di Pong


La cosa divertente e' che non sapevo della presenza dell'Easter Egg ed e' stato abbastanza sorprendente...per la cronaca e' piuttosto facile vincere

Porta seriale in Qt

Per leggere e scrivere i valori per la porta seriale si possono utilizzare varie librerie. In questo caso viene presentato un esempio relativo alla libreria Qt Serial Port che si trova sul sito ufficiale Qt

La libreria e' valida sia per Qt4 che Qt5

Una volta scaricato il pacchetto si entra nella directory e si digita
qmake
make 
make install

a questo punto si puo' creare un nuovo progetto Qt4
la prima cosa da modificare e' il file .pro aggiungendo la serialport
--------------------------------
QT       += core gui
CONFIG += serialport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = seri
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h


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

dopo di cio' si modifica il file header aggiungendo l'include all'header della libreria, uno slot privato per la funzione di lettura della porta ed una nuova variabile che identifica la porta seriale
--------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void readData();

    
private:
    Ui::MainWindow *ui;
    QSerialPort *serial;

};

#endif // MAINWINDOW_H

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

il programma vero e proprio puo' essere cosi' scritto
In questo caso viene letta la porta /dev/ttyUSB0 con parametri 2400 8N1

--------------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtSerialPort/QSerialPort>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    serial = new QSerialPort(this);
    serial->setPortName("/dev/ttyUSB0");

    if (serial->open((QIODevice::ReadWrite)))
    {
    serial->setBaudRate(QSerialPort::Baud2400);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    }

    connect(serial,SIGNAL(readyRead()),this,SLOT(readData()));
}

void MainWindow::readData()
{
    QByteArray data = serial->readAll();

    qDebug() << data;

}

MainWindow::~MainWindow()
{
    delete ui;

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

giovedì 4 luglio 2013

VLC e Proxy Server

Impostare il proxy server su VLC e' tutto fuorche' banale anche per colpa del menu' nascosto

Si parte da Strumenti/Preferenze
si seleziona Mostra le Impostazioni/Tutto


Ingresso/Codifica-Moduli di Accesso-HTTP


Sensore di allungamento su Arduino + Shield Ethernet

Questo sensore e' di comune utilizzo nei laboratori di geotecnica per misurare le variazioni di lunghezza.
Il sensore ha 4 cavi che corrispondono a

rosso = positivo alimentazione
bianco = negativo alimentazione
giallo = positivo segnale
verde = negativo segnale

nella posizione di riposo (ovvero con la molla a riposo) e con alimentazione a 9 V il segnale e' di circa 780 mV, via via che la testa rientra nel corpo cilindrico azzurro la tensione scende fino a 0 mV

La corsa della testa va da 35 mm (corrispondente a 780 mV) fino a 22. mm (0 mV), per valori di accorciamento superiori il valore e' sempre 0 mV. Si ha quindi una corsa utile di circa 13 mm


Per automatizzare la lettura e permettere la lettura in remoto (all'esterno del laboratorio di geotecnica) la sonda e' stata collegata ad un ingresso analogico della Arduino.
Il valore letto a riposo e' 165 per scendere a 0 a fine corsa. Considerando che la risoluzione di una unita' del convertitore ADC dell'Arduino coincide con circa 4.8 mV si ha una buona corrispondenza con i 780 mV misurati con il tester.
Inoltre visto che la corsa e' di circa 13 mm ed i livelli risultano essere 165 la precisione di campionamento dell'Arduino dovrebbe essere corrispondete al decimo di millimetro

Per permettere la lettura in remoto dei dati la scheda Arduino e' stata programmata come un client UDP che invia le letture ad un server UDP scritto in Python su una Debian Box



La rete e' cosi' configurata
Server : 192.168.0.1
Porta UDP : 5555

Arduino : 192.168.0.2

Lo sketch Arduino utilizzato e' il seguente
-----------------------------------------------
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>

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

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

int sensorPin = A0;    
int sensorValue = 0;  

EthernetUDP Udp;

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

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

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

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

mentre il server UDP (molto stupido e da implementare con il salvataggio dei dati)
-----------------------------------------------
import socket
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

listen_addr = ("",5555)
UDPSock.bind(listen_addr)
contatore = 0

while True:
        data,addr = UDPSock.recvfrom(1024)
        print data.strip(),contatore
contatore = contatore + 1
-----------------------------------------------
modificando leggermente lo sketch e' possibile utilizzare una Arduino Uno per monitorare fino a 5 sensori

Arduino Uno ed Ethernet Shield

Invece di acquistare una Arduino Ethernet ho preferito provare ad utilizzare un Ethernet Shield per aggiungere le funzionalita' di rete ad una Arduino Uno.
Da un punto di vista di costo non ha molto senso comprare uno shield in quanto l'accoppiata Uno+Ethernet Shield costa piu' o meno quanto una Arduino Ethernet...diciamo che questa soluzione e' piu' flessibile


Shield Ethernet

Per accoppiare le due l'orientamento e' quello indicato nella foto sottostante


Si sovrappongono e si connettono come nella foto successiva. A seconda dei modelli di Arduino non tutti i connettori dello shield trovano un corrispondente header dell'Arduino ma il tutto funziona ugualmente



dal punto di vista della programmazione nell'Arduino IDE deve essere comunque scelta come board l'Arduino Uno anche se poi si possono caricare gli sketch con le funzionalita' di rete

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