giovedì 21 marzo 2013

Installare Arduino IDE su Debian

UPDATE
-------------------------------------------------------
Soluzione ultrarapida per Debian Testing
apt-get install arduino

al momento della scrittura il pacchetto corrisponde ad Arduino IDE 1.0.1 mentre sul sito
Arduino l'ultima stable e' 1.0.4
-------------------------------------------------------

Dato che era un po' di tempo che non giocavo piu' con Arduino ho dovuto reinstallare tutto il sistema di sviluppo sulla mia Debian Box


supponendo di avere gia' Java configurato e' sufficiente digitare
apt-get install openjdk-6-jre gcc-avr avr-libc avrdude

per poter compilare i programmi.
A questo punto si puo' scaricare e decomprimere il pacchetto della IDE di Arduino per iniziare a programmare.

Una accortezza: per problemi di permessi non e' possibile di default effettuare l'upload degli sketch sulla scheda perche' i permessi dell'utente normale non permettono di accedere alle porte seriali (virtuali o reali che siano)
Per operare con il proprio utente (e non come superuser) si dovranno modificare i permessi come segue

------------------------------------------------------
usermod -a -G tty yourUserName
usermod -a -G dialout yourUserName


Modulo rele' con Bluetooth

Questo modulo a 4 rele' viene normalmente associato ad Arduino ma in realta' ha ben poco da spartire le note schede opensource principalmente perche' in grado di vivere da solo senza l'appoggio a nessun altro apparato

Il sistema monta puo' essere interfacciato sia via cavo USB o via Bluetooth (in questo caso un modulo Bluetooth Bee rimuovibile che puo' essere sostituito anche da ZigBee); la selezione avviene mediante un microinterruttore a slitta parzialmente nascosto sotto il modulo Bluetooth

In entrambi i casi il sistema si interfaccia come una porta seriale a cui inviare dei caratteri che corrispondono all'apertura e chiusura dei circuiti dei rele' secondo lo schema della immagine seguente



La password per accoppiare il modulo Bluetooth e' 1234



L'alimentazione puo' derivare dalla porta microUSB oppure da una fonte esterna (jack sulla destra nella foto)
In alto il microinterruttore a slitta


Pulsante Done su EditText



Puo' essere comodo far sparire la tastiera e gestire l'evento una volta che e' stato premuto il tasto Done sulla tastiera virtuale di una Edit Text

Il trucco e' quello di attivare un OnEditorActionListener come nel breve listato che segue
---------------------------------------------------------------------------------

EditText test = (EditText) findViewById(R.id.editText1);
test.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
              if (actionId == EditorInfo.IME_ACTION_DONE) {
              Log.d("test","Premuto il tasto Done");
                    }
            return false;
               }});

martedì 19 marzo 2013

Mantenere lo schermo acceso in Android


Per mantenere lo schermo acceso in una applicazione Android si puo' aggiungere la seguente riga nella funzione OnCreate

------------------------------------
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        

Wav file in Android

Per emettere suoni in un programma Android la prima cosa da fare e' trovare un file con il suono desiderato.
Una ottima fonte di suoni gratuiti e' Freesound.org

Una volta scaricato il file wav si clicca sulla cartella /res del progetto e si crea un nuovo folder denominato raw (si avra' quindi /res/raw) dove si copia il file del suono

a questo punto si puo' inserire questa funzione (copiata da qui) dove il suono in questo caso e' chiamato beep (da notare che si omette l'estensione)
-------------------------------------------------------------

private void playAlarm() {
            MediaPlayer mp = MediaPlayer.create(this,R.raw.beep);
            mp.start();
            mp.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.release();
                }

            });

giovedì 14 marzo 2013

martedì 12 marzo 2013

Esempio di utilizzo di Itext in Java

Presento adesso un esempio reale dell'utilizzo della libreria IText per la creazione di pettorali per una corsa podistica.
La caratteristica dei pettorali era quella di dover contenere, oltre al numero, anche il relativo QrCode. Il pettorale e' quindi determinato dalla sovrapposizione di una immagine di base con i logo, il QrCode ed il numero. Il tutto e' gia' formattato per andare direttamente in tipografia (il foglio in formato Super A3 comprende 4 numeri che saranno successivamente tagliati)

Immagine di fondo

QrCode


Il risultato finale

Il codice per la generazione dei Pdf e' il seguente. Si deve precisare che le immagini dei QrCode erano gia' state create con il programma presentato in un precedente post e viene usato un font speciale (CITYB.ttf)
----------------------------------------------------------------------

package pettorale;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

/**
 *
 * @author l.innocenti
 */
public class Pettorale {
    private static PdfWriter writer;
    

    public static void main(String[] args) throws BadElementException, MalformedURLException, IOException {
        
    //String numero = args[0];
    String  numero = "175";
    int inizio = Integer.parseInt(numero);
    
    BufferedOutputStream out = null;
    try {
        out = new BufferedOutputStream (new FileOutputStream (new File ("Pettorale_"+numero+"_"+Integer.toString(inizio+3) +".pdf")));
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        }
    
        //Definisce le dimensioni del foglio come SuperA3 (45x32 cm)
        //Itext usa una unita'  di misura in punti tipografici 
        //1 cm = 28.35 unita' per cui le dimesioni del foglio sono
        //45 cm = 1285 u
        //32 cm = 907 u
        Rectangle pagina = new Rectangle(1275, 907);
        Document doc = new Document (pagina,0,0,0,0);

        try
        {
            writer = PdfWriter.getInstance (doc, out);
            doc.open ();
            PdfContentByte canvas = writer.getDirectContent();
            
            //inserisce lo sfondo 
            Image pettorale = Image.getInstance("pettorale/vuoto.png");
            pettorale.setAbsolutePosition(0f, 0f);
            pettorale.scalePercent(24.5f);
            doc.add(pettorale);

            //inserisce il QrCode del numero del pettorale
            Image qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio) +".png");
            qrcode.setAbsolutePosition(475f, 620f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);
            
            //2° numero
            qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+1) +".png");
            qrcode.setAbsolutePosition(1125f, 620f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);
            
            //3° numero
            qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+2) +".png");
            qrcode.setAbsolutePosition(475f, 170f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);

            //4° numero
            qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+3) +".png");
            qrcode.setAbsolutePosition(1125f, 170f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);

            
            //scrive il numero del pettorale alla giusta posizione
           //1° numero 
           if (inizio <10) {
                absText(Integer.toString(inizio),270,625);
            }
            if ((inizio >=10) && (inizio <= 99)) {
                absText(Integer.toString(inizio),235,625);
            }
            if ((inizio >=100) && (inizio <= 999)) {
               absText(Integer.toString(inizio),150,625);
            }
            
            //2°numero
            if (inizio+1 <10) {
               absText(Integer.toString(inizio+1),920,625);
            }
            if ((inizio+1 >=10) && (inizio+1 <= 99)) {
                absText(Integer.toString(inizio+1),885,625);
            }
            if ((inizio+1 >=100) && (inizio+1 <= 999)) {
               absText(Integer.toString(inizio+1),790,625);
            }

            //3°numero
            if (inizio+2 <10) {
               absText(Integer.toString(inizio+2),270,165);
            }
            if ((inizio+2 >=10) && (inizio+2 <= 99)) {
               absText(Integer.toString(inizio+2),235,165);
            }
            if ((inizio+2 >=100) && (inizio+2 <= 999)) {
               absText(Integer.toString(inizio+2),150,165);
            }
            
            //4°numero
            if (inizio+3 <10) {
               absText(Integer.toString(inizio+3),920,165);
            }
            if ((inizio+3 >=10) && (inizio+3 <= 99)) {
               absText(Integer.toString(inizio+3),885,165);
            }
            if ((inizio+3 >=100) && (inizio+3 <= 999)) {
               absText(Integer.toString(inizio+3),790,165);
            }

     
        }
        catch (DocumentException e)
        {
            System.out.println ("Fatal PDF error: " + e);
        }

        doc.close ();

    }
    
    private static void absText(String text, int x, int y) {
    try {
      PdfContentByte cb = writer.getDirectContent();
      BaseFont slam = BaseFont.createFont("CITYB.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      cb.saveState();
      cb.beginText();
      cb.moveText(x, y);
      cb.setFontAndSize(slam, 200);
      cb.showText(text);
      cb.endText();
      cb.restoreState();
    } catch (DocumentException | IOException e) {
    }
  }
}
----------------------------------------------------------------------


Physics informed neural network Fukuzono

Visto che puro ML non funziona per le serie tempo di cui mi sto occupando ed le regressioni basate su formule analitiche mostrano dei limiti...