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)
giovedì 23 agosto 2012
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
--------------------------------------------------------------------------------
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
“!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)
----------------------------------------------------------
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());
}
});
}
}
------------------------------------------------------------------------
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()
----------------------------------------------
----------------------------------------------
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()
----------------------------------------------
Cattura video su Raspberry
Primo tentativo di cattura video su Raspberry. E' stata utilizzata una Logitech QuickCam 2500 con l'installazione di default di ffmpeg di Rapbian (che e' conosciuta per essere buggata)
La stringa di configurazione di ffmpeg e' la seguente
ffmpeg -f video4linux2 -s 640x472 -r 5 -sameq -i /dev/video0 -f m4v /home/pi/5.m4v
La stringa di configurazione di ffmpeg e' la seguente
ffmpeg -f video4linux2 -s 640x472 -r 5 -sameq -i /dev/video0 -f m4v /home/pi/5.m4v
320x240
640x472
Esempio di GUI con Gambas
Tempo di sviluppo : 3 minuti (e non avevo mai usato prima Gambas)
-----------------------------------------------------------------
PUBLIC SUB Form_Open()
Label1.Alignment = 3
END
PUBLIC SUB Slider1_Change()
Label1.Text = Slider1.Value
ProgressBar1.Value = Slider1.Value / 100
END
-----------------------------------------------------------------
-----------------------------------------------------------------
PUBLIC SUB Form_Open()
Label1.Alignment = 3
END
PUBLIC SUB Slider1_Change()
Label1.Text = Slider1.Value
ProgressBar1.Value = Slider1.Value / 100
END
-----------------------------------------------------------------
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...