Un metodo semplice per visualizzare immagini in Python/Pygame
-----------------------------------------
import pygame
pygame.init()
size = [428,375]
screen = pygame.display.set_mode(size);
img = pygame.image.load("concordia.jpg").convert();
screen.blit(img, [0,0])
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
-----------------------------------------
lunedì 11 giugno 2012
venerdì 8 giugno 2012
Stream video via Webcam su Ubuntu
per installare mjpg_streamer su Ubuntu/Debian non e' proprio una passeggiata perche' il pacchetto scaricabile dal sito non si installa
digitando
dpkg -i mjpg-streamer_r94-1_i386.deb
si ha un messaggio di errore che corrisponde a "errore nella stringa Version "r94-1"
dpkg-deb -x mjpg-streamer.deb tmpdir
dpkg-deb --control mjpg-streamer.deb tmpdir/DEBIAN
si deve poi editare il file control che si trova in tmpdir/DEBIAN
nano tmpdir/DEBIAN/control
cambiando la stringa r94-1 in 94.1
a questo punto si puo' ricostruire il pacchetto deb con il comando
dpkg -b tmpdir mjpeg-streamer_my.deb
che e si puo' installare con il comando
dpkg -i mjpeg-streamer_my.deb
(istruzioni riprese da questo sito)
per attivare lo streaming da linea di comando si puo' digitare
mjpg_streamer -i "input_uvc.so -d /dev/video0 -y -r 640x480" -o "output_http.so -w ./www -p 8082"
dove
video0 e' il device video da usare
-r 640x480 e' la risoluzione
-p 8082 e' la porta di ascolto
-f 10 e' il numero di frame
con queste impostazioni si hanno 5 frame al secondo
per visualizzare lo stream si deve digitare l'indirizzo
http://localhost:8082/?action=stream
sia dentro una finestra di un browser (meglio Firefox) si usando VCL (File/Apri Flusso di rete/Rete)...e' molto piu' stabile la visualizzazione su VLC
Sul calcolatore su cui sono state effettuate le prove c'e' un ritardo di circa 1.5 secondi da quando avviene un evento a quando viene visualizzato
Un esempio di streaming contempoeraneamente su Firefox (al centro) e VLC (a destra) lanciato dalla finestra di shell (a sinistra)
Il ritardo e' piuttosto evidente ed anche il fuori sincrono tra Firefox e VLC ma si deve considerare che server e client girano sulla stessa macchina (peraltro di prestazioni non eccezionali)
digitando
dpkg -i mjpg-streamer_r94-1_i386.deb
si ha un messaggio di errore che corrisponde a "errore nella stringa Version "r94-1"
dpkg-deb -x mjpg-streamer.deb tmpdir
dpkg-deb --control mjpg-streamer.deb tmpdir/DEBIAN
si deve poi editare il file control che si trova in tmpdir/DEBIAN
nano tmpdir/DEBIAN/control
cambiando la stringa r94-1 in 94.1
a questo punto si puo' ricostruire il pacchetto deb con il comando
dpkg -b tmpdir mjpeg-streamer_my.deb
che e si puo' installare con il comando
dpkg -i mjpeg-streamer_my.deb
(istruzioni riprese da questo sito)
per attivare lo streaming da linea di comando si puo' digitare
mjpg_streamer -i "input_uvc.so -d /dev/video0 -y -r 640x480" -o "output_http.so -w ./www -p 8082"
dove
video0 e' il device video da usare
-r 640x480 e' la risoluzione
-p 8082 e' la porta di ascolto
-f 10 e' il numero di frame
con queste impostazioni si hanno 5 frame al secondo
per visualizzare lo stream si deve digitare l'indirizzo
http://localhost:8082/?action=stream
sia dentro una finestra di un browser (meglio Firefox) si usando VCL (File/Apri Flusso di rete/Rete)...e' molto piu' stabile la visualizzazione su VLC
Sul calcolatore su cui sono state effettuate le prove c'e' un ritardo di circa 1.5 secondi da quando avviene un evento a quando viene visualizzato
Il ritardo e' piuttosto evidente ed anche il fuori sincrono tra Firefox e VLC ma si deve considerare che server e client girano sulla stessa macchina (peraltro di prestazioni non eccezionali)
lunedì 4 giugno 2012
Transistor come interruttore su Arduino
L'uso di un transistor come interruttore permette di dividere il circuiti in due settori non in connessione elettrica tra di loro
La base e' il punto dove si applica la tensione; nel caso in cui si sia tensione tra base (+) ed emettitore (terra) la resistenza tra emettitore e collettore scende quasi a zero aprendo il circuito.
Sulla base e' sempre necessario inserire una resistenza da almeno 1 KOhm
Nei grafici l'emettitore e' indicato con una freccia; nei transistor reali la posizione dei pin puo' essere variabile e si deve consultare la scheda tecnica
Vce - è la massima tensione che può essere applicata fra il collettore e l'emettitore
Vbe - è la massima tensione che può essere applicata fra la base e l'emettitore
Ic - è la massima corrente che può attraversare il circuito di collettore
Ib - è la massima corrente che può attraversare il circuito di base
hfe - e' il guadagno di corrente in uscita
Esistono diverse configurazioni:
1) A base comune (terminale di base a terra)
2) Ad emettitore comune (ovvero Base ed Emittore con in continuita' elettrica. Uso Amplificatore)
3) A Collettore comune (Inseguitore di Emettitore)
------------------------------------------------------------------------------------------------
Il mio transitor di test e' BC547B
Si tratta di un sensore NPNda 625 mW con
Vce = 45 V
Vcb = 50 V
Vbe = 6 V
Ic = 100 mA
hfe = 290 (2mA), 180 (100mA) a 5Volts
Per il calcolo della resistenza R1 da mettere sulla base si deve prevedere quale e' la corrente che si vuole che scorra tra collettore ed emettitore
Per esempio se si vuole una corrente di 0.3mA sull'uscita del transistor si deve calcolare
Ib (corrente sulla base) = Ic/290 Ic dove Ic e' imposto a 0.3mA
n pratica si divide la corrente che vogliamo avere per il fattore di amplificazione in modo da calcolare quale deve essere la corrente sulla base
Risulta che Ib = 0.1 mA
Usando poi la legge di Ohm (R=5/0.0001) si ha che la resistenza da inserire sulla base e' 50KOhm
La base e' il punto dove si applica la tensione; nel caso in cui si sia tensione tra base (+) ed emettitore (terra) la resistenza tra emettitore e collettore scende quasi a zero aprendo il circuito.
Sulla base e' sempre necessario inserire una resistenza da almeno 1 KOhm
Fonte Wikipedia |
Nei grafici l'emettitore e' indicato con una freccia; nei transistor reali la posizione dei pin puo' essere variabile e si deve consultare la scheda tecnica
Vce - è la massima tensione che può essere applicata fra il collettore e l'emettitore
Vbe - è la massima tensione che può essere applicata fra la base e l'emettitore
Ic - è la massima corrente che può attraversare il circuito di collettore
Ib - è la massima corrente che può attraversare il circuito di base
hfe - e' il guadagno di corrente in uscita
Esistono diverse configurazioni:
1) A base comune (terminale di base a terra)
2) Ad emettitore comune (ovvero Base ed Emittore con in continuita' elettrica. Uso Amplificatore)
3) A Collettore comune (Inseguitore di Emettitore)
------------------------------------------------------------------------------------------------
Il mio transitor di test e' BC547B
Si tratta di un sensore NPNda 625 mW con
Vce = 45 V
Vcb = 50 V
Vbe = 6 V
Ic = 100 mA
hfe = 290 (2mA), 180 (100mA) a 5Volts
Disposizione della pedinatura del componente
|
Per esempio se si vuole una corrente di 0.3mA sull'uscita del transistor si deve calcolare
Ib (corrente sulla base) = Ic/290 Ic dove Ic e' imposto a 0.3mA
n pratica si divide la corrente che vogliamo avere per il fattore di amplificazione in modo da calcolare quale deve essere la corrente sulla base
Risulta che Ib = 0.1 mA
Usando poi la legge di Ohm (R=5/0.0001) si ha che la resistenza da inserire sulla base e' 50KOhm
venerdì 1 giugno 2012
Input da pulsante su Arduino
Per poter gestire l'input di un utente mediante la pressione di un pulsante si puo' collegare un circuito come nella figura seguente
La resistenza (da almeno 1KOhm) serve a non mandare in corto il circuito quando viene premuto il tasto.
La pressione del tasto viene gestita dalla lettura dello stato dell'input digitale (in questo caso il 12)
Lo sketch per Arduino e' il seguente
Il programma accende e spenge il led integrato sulla scheda che corrisponde al PIN13 digitale a seconda dello stato del PIN 12 comandato dal pulsante
--------------------------------------------------------------------------------------
const int buttonPin = 12; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
sdfsf
giovedì 31 maggio 2012
Fotoaccoppiatore 4N35
Il fotoaccoppiatore e' un dispositivo che funziona come un rele' ovvero mantenendo fisicamente separati due circuiti. Invece di un'azione meccanica un led (collegato tra i pin 1 e 2) aziona un fotodiodo che collega i pin 4 5 e 6
Il fotoaccoppiatore in uso e' 4N35 che presenta la seguente pedinatura
pin 1 : positivo
pin 2 : negativo
pin 3 : non usato
pin 4 : emettitore
pin 5 : collettore
pin 6 : base
Esistono altri modelli di packaging (in cui per esempio il pin 1 e' indicato da un pallino)
Comportandosi come un led, tra i pin 1 e 2, e' necessario inserire una resistenza (1KOhm)
Se si mette tensione sui pin 1 e 2 si apre il collegamento tra pin 4 e pin 5 circuitando i due pin con una modesta resistenza residua
Per vedere in azione l'integrato si puo' usare il semplice programma che attiva e disattiva l'interruttore ogni 3 secondi
-----------------------------
L'integrato riesce a gestire fino a 70 V Dc. Nella applicazioni reali il 4N35 serve a gestire la corrente di bobina di rele' (l'Arduino da sola con 40 mA non riesce ad attivare la bobina del rele') che a sua volta attiva la gestione del 220 V Ac
Il fotoaccoppiatore in uso e' 4N35 che presenta la seguente pedinatura
pin 1 : positivo
pin 2 : negativo
pin 3 : non usato
pin 4 : emettitore
pin 5 : collettore
pin 6 : base
Esistono altri modelli di packaging (in cui per esempio il pin 1 e' indicato da un pallino)
Comportandosi come un led, tra i pin 1 e 2, e' necessario inserire una resistenza (1KOhm)
Dettaglio del montaggio |
Se si mette tensione sui pin 1 e 2 si apre il collegamento tra pin 4 e pin 5 circuitando i due pin con una modesta resistenza residua
Per vedere in azione l'integrato si puo' usare il semplice programma che attiva e disattiva l'interruttore ogni 3 secondi
-----------------------------
int ledPin = 12;
void setup()
{
pinMode(ledPin, OUTPUT);
void loop()
{
digitalWrite(ledPin, HIGH);
delay(3000);
digitalWrite(ledPin, LOW);
delay(3000);
}
----------------------------- L'integrato riesce a gestire fino a 70 V Dc. Nella applicazioni reali il 4N35 serve a gestire la corrente di bobina di rele' (l'Arduino da sola con 40 mA non riesce ad attivare la bobina del rele') che a sua volta attiva la gestione del 220 V Ac
martedì 29 maggio 2012
LM35DZ Sensore temperatura su Arduino
L'uso di questo sensore e' piuttosto semplice perche' riporta i risultati gia' in gradi Celsius con incrementi di 10 mV/Grado Celsius.
Per avere la temperatura e' sufficiente quindi leggere il voltaggio su una porta analogica, convertire il DN in Volts e moltiplicare per 100.
La pedinatura e' come da immagine successiva (positivo e terra a sinistra e destra ed il valore da misurare al centro)
--------------------
int pin = 0; // analog pin
void setup()
{
Serial.begin(9600);
}
void loop()
{
float tempc = ( 5.0 * analogRead(pin) * 100.0) / 1023.0;
Serial.println(tempc,DEC);
delay(1000);
}
Servo controllato via Arduino Ethernet
Questo esempio mostra come usare una Arduino Ethernet per pilotare un servo motore via Internet mediante un joystick
Sul PC sul quale e' connesso il joystick si deve lanciare il seguente programma che genera dei pacchetti UDP leggendo il valore del sensore progressivo del Joystick e convertendolo in valori tra 0 e 180 (da usare poi nel servo)
Il PC deve essere ovviamente connesso alla rete e si deve avere il file pygcurse nella directory dello script
----------------------------
import pygame
import pygcurse
import socket
from time import sleep
pygame.init()
win = pygcurse.PygcurseWindow(40, 25, 'Rov Controller')
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
j = pygame.joystick.Joystick(0)
j.init()
try:
while True:
pygame.event.pump()
pot1 = int((j.get_axis(0)*90)+90)
if (pot1 <100):
pote1 = "0"+str(pot1)
else:
pote1 = str(pot1)
win.write("Motore 1 : "+str(pote1), x=2, y=7)
sock.sendto("M1"+str(pot1),("192.168.1.3",8888))
sleep(0.01)
except KeyboardInterrupt:
j.quit()
----------------------------
all'altro capo della rete c'e' in ascolto sulla porta UDP 8888 una Arduino Ethernet che riceve i pacchetti, estrae il valore per pilotare il servo e manda il comando al motore
----------------------------
#include <SPI.h> #include <Ethernet.h>
#include <Udp.h>
#include <Servo.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,1,3 };
unsigned int localPort = 8888; // local port to listen on
byte remoteIp[4]; // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
Servo m1;
void setup() {
Ethernet.begin(mac,ip);
Udp.begin(localPort);
m1.attach(9); // collega il motore 1 al servo 9
Serial.begin(9600);
}
void loop() {
int packetSize = Udp.available();
if(packetSize)
{
packetSize = packetSize - 8;
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
int m = atoi(&packetBuffer[1]);
int c = atoi(&packetBuffer[2]);
Serial.println(m);
Serial.println(c);
Serial.println("----------");
m1.write(c);
}
delay(10);
}
----------------------------
Ed ecco lo script in azione
volendo invece di comandi progressivi si possono mandare anche comandi on/off usando i pulsanti mediante una semplice modifica del programma (in realta' usando il pulsante Mode del joystick i comandi progressivi possono essere commutati in on/off e quindi non sono necessarie modifiche al programma)
jhkhkjh
Sul PC sul quale e' connesso il joystick si deve lanciare il seguente programma che genera dei pacchetti UDP leggendo il valore del sensore progressivo del Joystick e convertendolo in valori tra 0 e 180 (da usare poi nel servo)
Il PC deve essere ovviamente connesso alla rete e si deve avere il file pygcurse nella directory dello script
----------------------------
import pygame
import pygcurse
import socket
from time import sleep
pygame.init()
win = pygcurse.PygcurseWindow(40, 25, 'Rov Controller')
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
j = pygame.joystick.Joystick(0)
j.init()
try:
while True:
pygame.event.pump()
pot1 = int((j.get_axis(0)*90)+90)
if (pot1 <100):
pote1 = "0"+str(pot1)
else:
pote1 = str(pot1)
win.write("Motore 1 : "+str(pote1), x=2, y=7)
sock.sendto("M1"+str(pot1),("192.168.1.3",8888))
sleep(0.01)
except KeyboardInterrupt:
j.quit()
----------------------------
all'altro capo della rete c'e' in ascolto sulla porta UDP 8888 una Arduino Ethernet che riceve i pacchetti, estrae il valore per pilotare il servo e manda il comando al motore
----------------------------
#include <SPI.h> #include <Ethernet.h>
#include <Udp.h>
#include <Servo.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,1,3 };
unsigned int localPort = 8888; // local port to listen on
byte remoteIp[4]; // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
Servo m1;
void setup() {
Ethernet.begin(mac,ip);
Udp.begin(localPort);
m1.attach(9); // collega il motore 1 al servo 9
Serial.begin(9600);
}
void loop() {
int packetSize = Udp.available();
if(packetSize)
{
packetSize = packetSize - 8;
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
int m = atoi(&packetBuffer[1]);
int c = atoi(&packetBuffer[2]);
Serial.println(m);
Serial.println(c);
Serial.println("----------");
m1.write(c);
}
delay(10);
}
----------------------------
Ed ecco lo script in azione
jhkhkjh
Iscriviti a:
Post (Atom)
Change Detection with structural similarity
L'idea di base e' quella di cercare le differenze tra le due immagini sottostanti Non e' immediatamente visibile ma ci sono dei ...
-
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...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...