domenica 26 agosto 2012

Compilare SDL con Code::Blocks


Per compilare con Code::Blocks programmi con dipendenza in SDL sotto Debian 6.0 e' sufficiente installare mediante apt-get le librerie di sviluppo sotto riportate

libsdl-sound1.2-dev
libsdl1.2-dev
libsdl-image1.2-dev 
libsdl-mixer1.2-dev
libsdl-net1.2-dev
libsdl-ttf2.0-dev
libsdl-ttf2.0-dev

venerdì 24 agosto 2012

Webcam ARKMicro

Ho ceduto alla tentazione di comprare su DealExtreme una webcam per circa 4 euro (spedizione compresa).
La descrizione parla di una camera 640x480 con led per illuminazione

Una volta inserita nella Linux Box e' stata immediatamente riconosciuta (temevo il peggio)
-----------------------------------------------------------------------

Aug 24 15:15:41 kranz kernel: [ 5669.032091] usb 2-1: new full speed USB device using uhci_hcd and address 2
Aug 24 15:15:41 kranz kernel: [ 5669.195355] usb 2-1: New USB device found, idVendor=18ec, idProduct=3290
Aug 24 15:15:41 kranz kernel: [ 5669.195369] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Aug 24 15:15:41 kranz kernel: [ 5669.195379] usb 2-1: Product: USB2.0 PC CAMERA
Aug 24 15:15:41 kranz kernel: [ 5669.195386] usb 2-1: Manufacturer: ARKMICRO
Aug 24 15:15:41 kranz kernel: [ 5669.195588] usb 2-1: configuration #1 chosen from 1 choice
Aug 24 15:15:41 kranz kernel: [ 5669.197529] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (18ec:3290)
Aug 24 15:15:41 kranz kernel: [ 5669.200674] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/input/input11
-----------------------------------------------------------------------

e qui sono arrivate le sorprese
la webcam e' in realta' una 320x240 di pessima qualita' con dei led nel visibile che sono assolutamente inutili in quanto non riescono ad illuminare in qualsiasi condizioni ambientale (se erano ad infrarossi forse era meglio)

certo che il confronto con la webcam integrata nel portatile 640x480 reali (che pure non e' eccezionale nelle prestazioni soprattutto con poca illumicazione) e' impietoso

certo funzionare funziona e per meno di 4 euro (spedizione compresa) puo' essere anche abbastanza

Webcam ARKMicro

Webcam integrata nel portatile

giovedì 23 agosto 2012

Esempio GUI con QTCreator

Da non confondersi con QT Designer questo tool e' una IDE integrata per QT e non un semplice disegnatore di interfacce

per creare l'esempio non e' stata scritta una riga di codice. E' stato sufficiente collegare il segnale del sender (in questo caso lo slider) al widget di destinazione (ovvero la label e la progress bar)

mercoledì 22 agosto 2012

Propeller Parallax Servo Controller

Per controllare dei servo motori mediante il controller della Parallax si inviano sulla porta seriale delle stringhe cosi' formate

“!SC” C R pw.LOWBYTE, pw.HIGHBYTE, $0D

dove
C = e' il numero di canale dove e' attaccato il servo (da 0 a 31)
R = e' un parametro della funzione di rampa (da 0 a 63) ovvero la velocita' con il motore raggiunge la velocita' richiesta

pw = e' la posizione richiesta del servo motore impostata da 250 a 1250 per una variazione di angoli da 0 a 180°

"!SC" e $0D sono parametri fissi (uno e' il preambolo ed uno il terminatore di riga

e' necessario quindi calcolare il valore del byte basso ed alto per comandare la velocita' dei motori

Tutti i comandi del Propeller sono identificati da una stringa di 8 byte con preambolo variabile e carattere 13 per chiusura

Lo script in Python per inviare comandi e' il seguente
--------------------------------------------------------------------------------

import time
import serial

ser = serial.Serial()
ser.baudrate = 2400
ser.bytesize = 8
ser.stopbits = 1
#ser.xonxoff = 0
#ser.rtscts = 0
#ser.timeout = 0
ser.port = '/dev/ttyUSB0'
ser.parity=serial.PARITY_NONE

ser.open()
ser.isOpen()

out = ''
ser.write("!SCVER?"+chr(13))
time.sleep(0.2)
while ser.inWaiting()>  0:
out += ser.read(1)
print out

v = 1250
v1 = hex(v)
print v1
l_o_w = v1[3:]
h_i_g = "0"+v1[2:3]
print h_i_g+" "+l_o_w

for i in range(250,1250,20):
print i,
v = hex(i)
print v,
l_o_w = v[3:]
h_i_g = "0"+v[2:3]
print h_i_g+l_o_w,
print int(h_i_g,16),
print int(l_o_w,16)
h = int(h_i_g,16)
l = int(l_o_w,16)

out = ''
ser.write("!SC"+chr(0)+chr(25)+chr(l)+chr(h)+chr(13))
time.sleep(0.2)
while ser.inWaiting()>  0:
out += ser.read(1)
print out


out = ''
ser.write("!SCRSP"+chr(0)+chr(13))
time.sleep(0.2)
while ser.inWaiting()>  0:
out += ser.read(1)
print out



--------------------------------------------------------------------------------
Nel video che segue un servo motore comandato da una scheda Propeller Parallax a sua volta comandata da una Raspberry via seriale



Importante: la scheda Propeller prende alimentazione dal cavo USB ma su questo canale non vengono alimentati i servo motori, e' quindi necessario fornire una ulteriore alimentazione separata sul connettore verde e spostare l'interruttore su On

La pedinatura del servo motore sulla Propeller e' indicata dai caratteri W (White), R (Red) e B (Black) che si trova in testa ai canali di connessione dei servo motori

Esempio GUI con WX Python

Cosi' come per PyGtk anche le librerie WxPython non sono aggiornate a Python 3.x per cui si deve usare la versione 2.x
Nella versione per Windows richiedono i privilegi di amministrazione


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

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition,(300,150))
panel = wx.Panel(self, -1)

        self.sld = wx.Slider(self, -1, 0, 0, 100,(10,10),(270,50),wx.SL_AUTOTICKS | wx.SL_HORIZONTAL | wx.SL_LABELS)
self.label = wx.StaticText(self,wx.ID_ANY,"0 ",pos=(140,60),size=(100,20))
self.progressbar = wx.Gauge(self,-1,100,pos=(10,90),size=(270,20))

self.Bind(wx.EVT_SLIDER, self.sliderUpdate)
       
        wx.EVT_BUTTON(self, 9, self.OnClose)

def OnClose(self, event):
self.Close()

def sliderUpdate(self,event):
self.label.SetLabel(str(self.sld.GetValue()))
self.progressbar.SetValue(self.sld.GetValue())

class MyApp(wx.App):
    def OnInit(self):
frame = MyFrame(None, -1, 'Progress Bar')
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)

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

Esempio GUI con Java

per scrivere questo esempio e' stato impiegato Eclipse nella versione per sviluppatori Java che include al suo interno il plugin di Google denominato WindowBuilder Pro per la gestione dell'interfaccia grafica di Java

Per creare un progetto Java/WindowBuilder, dopo aver installato Eclipse, si clicca File/New/Other/WindowBuilder/SwingDesigner/Application


per spostarsi tra l'editor visuale e la parte di codice si clicca nei tab in basso. Per il resto la programmazione e' molto simile agli altri ambienti di sviluppo visuale

------------------------------------------------------------------------
package com.test.swing2;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.SwingConstants;

public class Swing2 {

    private JFrame frmProgressBar;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Swing2 window = new Swing2();
                    window.frmProgressBar.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Swing2() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frmProgressBar = new JFrame();
        frmProgressBar.setTitle("Progress Bar");
        frmProgressBar.setBounds(100, 100, 279, 94);
        frmProgressBar.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
        final JProgressBar progressBar_1 = new JProgressBar();
        frmProgressBar.getContentPane().add(progressBar_1, BorderLayout.SOUTH);
      
        final JSlider slider = new JSlider();

        frmProgressBar.getContentPane().add(slider, BorderLayout.NORTH);
      
        final JLabel lblNewLabel = new JLabel("50");
        lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
        frmProgressBar.getContentPane().add(lblNewLabel, BorderLayout.CENTER);
      
        slider.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent arg0) {
                lblNewLabel.setText(Integer.toString(slider.getValue()));
                progressBar_1.setValue(slider.getValue());
            }
        });
    }

}


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

Esempio GUI con PYGtk

Al contrario degli esempio precedenti PyGtk non funziona con la versione 3.x di Python per cui e' necessario usare un compilatore della serie 2.x



----------------------------------------------
import pygtk
pygtk.require('2.0')
import gtk

class SecondWin:
        def __init__(self):
            self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.win.connect("delete_event", self.delete_event)
            self.win.connect("destroy", self.destroy)
            #self.win.set_resizable(gtk.FALSE)
            self.win.set_title('Progress Bar')
            self.win.set_border_width(5)
            self.win.resize(200,100)

            self.vbox = gtk.VBox()
            self.win.add(self.vbox)

            adjustment = gtk.Adjustment(0, 0, 100, 5, 10, 0)
            self.hscale = gtk.HScale(adjustment)
            self.vbox.pack_start(self.hscale)
            self.hscale.set_digits(0)
            self.hscale.connect("value-changed", self.scale_moved)

            self.label = gtk.Label(str="   ")
            self.vbox.pack_start(self.label)

            self.progressbar = gtk.ProgressBar()
            self.vbox.pack_start(self.progressbar)
           
            self.win.show_all()

        def scale_moved(self, event):
            self.label.set_text(str(self.hscale.get_value()))
            self.progressbar.set_fraction(self.hscale.get_value()/100)
           
        def delete_event(self, widget, event, data=None):
            return gtk.FALSE
        def destroy(self, widget, data=None):
            return gtk.main_quit()
        def main(self):
            gtk.main()

if __name__ == "__main__":
    second = SecondWin()
    second.main()

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

FigSpec FS-60CL

A lavoro mi hanno rifilato questo sensore iperspettrale cinese (pushbroom 400-1000 nm con larghezza di banda di 0.5 nm compatibile con DJI M...