Un programma misto Arduino/Python per controllare da un joystick collegato ad un portatile dei servo motori pilotati da Arduino
Parte Arduino Ethernet
--------------------------------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <Udp.h>
#include <Servo.h>
#include <string.h>
#include <stdlib.h>
byte mac[] = {0xDE, 0xAD, 0xBF, 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; //destra
Servo m2; //sinistra
Servo m3; //prua
Servo m4; //poppa
int val;
void setup() {
Ethernet.begin(mac,ip);
Udp.begin(localPort);
m1.attach(3); // collega motore destro
m2.attach(5); // collega motore sinistro
m3.attach(6); // collega motore prua;
m4.attach(9); // collega motore poppa
pinMode(7,OUTPUT); // collega Luce 1
pinMode(8,OUTPUT); // collega Luce 1
//pinMode(4,OUTPUT); // collega Luce 1
//pinMode(7,OUTPUT); // collega Luce 1
Serial.begin(9600);
}
void loop() {
char *p, *i;
int potenza1, potenza2, potenza3, potenza4;
int l1, l2, l3, l4;
int packetSize = Udp.available();
if(packetSize)
{
packetSize = packetSize - 8;
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
//Serial.println(packetBuffer);
p = strtok_r(packetBuffer,":",&i);
int asse = atoi(p);
Serial.print(asse);
Serial.print(" = ");
p = strtok_r(NULL,":",&i);
potenza1 = 0;
potenza1 = atoi(p);
Serial.print("M1 = ");
Serial.println(potenza1);
p = strtok_r(NULL,":",&i);
potenza2 = 0;
potenza2 = atoi(p);
Serial.print("M2 = ");
Serial.println(potenza2);
p = strtok_r(NULL,":",&i);
potenza3 = 0;
potenza3 = atoi(p);
Serial.print("M3 = ");
Serial.println(potenza3);
p = strtok_r(NULL,":",&i);
potenza4 = 0;
potenza4 = atoi(p);
Serial.print("M4 = ");
Serial.println(potenza4);
//luci
p = strtok_r(NULL,":",&i);
l1 = 0;
l1 = atoi(p);
Serial.print("L1 = ");
Serial.println(l1);
if (l1 == 1)
{
val = digitalRead(7);
if (val == HIGH)
{
digitalWrite(7,LOW);
}
else
{
digitalWrite(7,HIGH);
}
}
p = strtok_r(NULL,":",&i);
l2 = 0;
l2 = atoi(p);
Serial.print("L2 = ");
Serial.println(l2);
if (l2 == 1)
{
val = digitalRead(7);
if (val == HIGH)
{
digitalWrite(7,LOW);
}
else
{
digitalWrite(7,HIGH);
}
}
p = strtok_r(NULL,":",&i);
l3 = 0;
l3 = atoi(p);
Serial.print("L3 = ");
Serial.println(l3);
if (l3 == 1)
{
val = digitalRead(8);
if (val == HIGH)
{
digitalWrite(8,LOW);
}
else
{
digitalWrite(8,HIGH);
}
}
p = strtok_r(NULL,":",&i);
l4 = 0;
l4 = atoi(p);
Serial.print("L4 = ");
Serial.println(l4);
if (l4 == 1)
{
val = digitalRead(8);
if (val == HIGH)
{
digitalWrite(8,LOW);
}
else
{
digitalWrite(8,HIGH);
}
}
m1.write(potenza1);
delay(50);
m2.write(potenza2);
delay(50);
m3.write(potenza2);
delay(50);
m4.write(potenza4);
delay(50);
}
delay(100);
}
--------------------------------------------------------------------
Parte PC
--------------------------------------------------------------------
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()
speed = 10
try:
while True:
pygame.event.pump()
l1 = int(j.get_button(4))
l2 = int(j.get_button(5))
l3 = int(j.get_button(6))
l4 = int(j.get_button(7))
if (int(j.get_button(0)) == 1):
speed = 10
if (int(j.get_button(1)) == 1):
speed = 20
if (int(j.get_button(2)) == 1):
speed = 30
win.write("Mult speed : ", x=2, y=9)
win.write("Mult speed : "+str(speed), x=2, y=9)
win.write("Luce 1 : "+str(l1), x=2,y=10)
win.write("Luce 2 : "+str(l2), x=2,y=11)
win.write("Luce 3 : "+str(l3), x=2,y=12)
win.write("Luce 4 : "+str(l4), x=2,y=13)
#sinistra/destra
if (int(j.get_button(3)) == 1):
m1 = 90-int((j.get_axis(0)*speed))
m2 = 90+int((j.get_axis(0)*speed))
else:
#avanti/indietro
m1 = 90+int((j.get_axis(2)*speed))
m2 = 90+int((j.get_axis(2)*speed))
#alto/basso
m3 = 90+int((j.get_axis(1)*speed))
m4 = 90+int((j.get_axis(1)*speed))
win.write("M 1 : ", x=2,y=14)
win.write("M 2 : ", x=2,y=15)
win.write("M 3 : ", x=2,y=16)
win.write("M 4 : ", x=2,y=17)
win.write("M 1 : "+str(m1), x=2,y=14)
win.write("M 2 : "+str(m2), x=2,y=15)
win.write("M 3 : "+str(m3), x=2,y=16)
win.write("M 4 : "+str(m4), x=2,y=17)
sock.sendto("1:"+str(m1)+":"+str(m2)+":"+str(m3)+":"+str(m4)+":"+str(l1)+":"+str(l2)+":"+str(l3)+":"+str(l4)+":0",("192.168.1.3",8888))
sleep(0.3)
except KeyboardInterrupt:
j.quit()
------------------------------------------
lunedì 9 luglio 2012
Salvare con formati utente in VLC
In VLC e' possibile impostare delle modalita' di salvataggio del video in formati non direttamente disponibili
Per fare cio' si deve creare un nuovo profilo dal menu Converti
Ho trovato particolarmente conveniente il seguente metodo basato su un incapsulamento MPEG-TS
ed una traccia video M-JPG
escludendo la traccia audio di cui non ho bisogno
Con queste impostazioni e' possibile salvare e contemporaneamente visualizzare il video da una sorgente esterna anche per computer non particolarmente performanti
Per fare cio' si deve creare un nuovo profilo dal menu Converti
Ho trovato particolarmente conveniente il seguente metodo basato su un incapsulamento MPEG-TS
ed una traccia video M-JPG
escludendo la traccia audio di cui non ho bisogno
Con queste impostazioni e' possibile salvare e contemporaneamente visualizzare il video da una sorgente esterna anche per computer non particolarmente performanti
Camera SMT-SNP-3120 con PTZ
Recentemente mi e' capitato di lavorare con la telecamera in oggetto che ha uno zoom ottico di 12x con una risoluzione di 795x596 Pixel (reale 704x576 quindi niente di che rispetto alle comuni e economiche webcam 640x480) , autofocus
L'alimentazione viene fornita tramite Ethernet via POE
La rotazione e' di 360° sull'asse orizzontale e di 180° su quello verticale
Il sistema di gestione principale e' costituito da un programma in Silverlight che ovviamente non funziona via Linux (a meno di non rischiare la via Moonlight che francamente ho scartato) .. fortunatamente ci sono un po' di sostituzioni
Per la visualizzazione delle immagini si puo' tranquillamente usare VLC collegato in modalita' rtsp all'indirizzo
rtsp://192.168.1.100/profile2/media.smp
per utilizzare la modalita' PTZ ovvero la possibilita' di muovere la telecamera le cose sono piu' complicate
Sono disponibili dei comandi http
http://192.168.1.100/cgi-bin/ptz.cgi?movepan=100 (il parametro e' un angolo da 0° a 359°)
http://192.168.1.100/cgi-bin/ptz.cgi?movetilt=90 (il parametro e' un angolo da -5° a 185°)
http://192.168.1.100/cgi-bin/ptz.cgi?movezoom=3 (il parametro e' un valore da 1 a 12)
il problema grosso e' che non si puo' creare uno script (per esempio in Python) per muovere la telecamera in quanto in sistema monta un sistema di autenticazione via http che NON e' possibile disattivare (almeno su questo modello di camera)
Di seguito un esempio di codice Python per inviare comandi http che NON funziona a causa del sistema di autenticazione
--------------------------------------------------------------------
import pygame
import urllib
from pygame import *
pygame.init()
pygame.display.set_mode((500,500),OPENGLBLIT|OPENGL|DOUBLEBUF)
exitt = 0
inte = 4096
while not exitt:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exitt = True
if event.type == pygame.KEYDOWN and event.key == pygame.K_a:
params = urllib.urlencode({'movepan': '100'})
url = "http://192.168.1.4//cgi-bin/ptz.cgi?%s" % params
f = urllib.urlopen(url)
if event.type == pygame.KEYDOWN and event.key == pygame.K_s:
params = urllib.urlencode({'movepan': '200'})
url = "http://192.168.1.4//cgi-bin/ptz.cgi?%s" % params
f = urllib.urlopen(url)
--------------------------------------------------------------------
Come workaround ho installato apache sulla macchina ed ho creato una pagina fatta di soli link su http://localhost/index.html alle varie funzioni della camera
per esempio
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=100> Pan 100</a>
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=120> Pan 120</a>
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=140> Pan 140</a>
cliccando sul link, se non autenticati, la camera richiede l'autenticazione
In questo modo si sfrutta il browser per gestire il lato autenticazione http
L'alimentazione viene fornita tramite Ethernet via POE
La rotazione e' di 360° sull'asse orizzontale e di 180° su quello verticale
Il sistema di gestione principale e' costituito da un programma in Silverlight che ovviamente non funziona via Linux (a meno di non rischiare la via Moonlight che francamente ho scartato) .. fortunatamente ci sono un po' di sostituzioni
Per la visualizzazione delle immagini si puo' tranquillamente usare VLC collegato in modalita' rtsp all'indirizzo
rtsp://192.168.1.100/profile2/media.smp
per utilizzare la modalita' PTZ ovvero la possibilita' di muovere la telecamera le cose sono piu' complicate
Sono disponibili dei comandi http
http://192.168.1.100/cgi-bin/ptz.cgi?movepan=100 (il parametro e' un angolo da 0° a 359°)
http://192.168.1.100/cgi-bin/ptz.cgi?movetilt=90 (il parametro e' un angolo da -5° a 185°)
http://192.168.1.100/cgi-bin/ptz.cgi?movezoom=3 (il parametro e' un valore da 1 a 12)
il problema grosso e' che non si puo' creare uno script (per esempio in Python) per muovere la telecamera in quanto in sistema monta un sistema di autenticazione via http che NON e' possibile disattivare (almeno su questo modello di camera)
Di seguito un esempio di codice Python per inviare comandi http che NON funziona a causa del sistema di autenticazione
--------------------------------------------------------------------
import pygame
import urllib
from pygame import *
pygame.init()
pygame.display.set_mode((500,500),OPENGLBLIT|OPENGL|DOUBLEBUF)
exitt = 0
inte = 4096
while not exitt:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exitt = True
if event.type == pygame.KEYDOWN and event.key == pygame.K_a:
params = urllib.urlencode({'movepan': '100'})
url = "http://192.168.1.4//cgi-bin/ptz.cgi?%s" % params
f = urllib.urlopen(url)
if event.type == pygame.KEYDOWN and event.key == pygame.K_s:
params = urllib.urlencode({'movepan': '200'})
url = "http://192.168.1.4//cgi-bin/ptz.cgi?%s" % params
f = urllib.urlopen(url)
--------------------------------------------------------------------
Come workaround ho installato apache sulla macchina ed ho creato una pagina fatta di soli link su http://localhost/index.html alle varie funzioni della camera
per esempio
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=100> Pan 100</a>
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=120> Pan 120</a>
<a href http://192.168.1.100/cgi-bin/ptz.cgi?movepan=140> Pan 140</a>
cliccando sul link, se non autenticati, la camera richiede l'autenticazione
In questo modo si sfrutta il browser per gestire il lato autenticazione http
sabato 30 giugno 2012
Salvare un video da VLC
VLC permette di salvare (anche con compressione al volo) lo stream che deriva da una periferica di acquisizione..ovviamente piu' il flusso e' veloce e corposo maggiore e' la richiesta di processore.
Le operazioni da eseguire sono le seguenti
Da VLC selezionare il menu Media/Apri periferica di acquisizione, selezionare il dispositivo di input video e poi in basso accanto a Riproduci cliccare sulla freccia in basso e selezionare Converti (ALT+C)
si apre il menu sottostante in cui si puo' indicare il file da salvare ed il tipo di codifica richiesta
importante per salvare e contemporaneamente visualizzare lo stream e' flaggare Mostra Risultato
con le impostazioni sopra riportate lo stream di una webcam 640x480 del portatile genera un flusso di circa 5Mb per minuto di ripresa quindi decisamente accettabile come occupazione di spazion disco
Le operazioni da eseguire sono le seguenti
Da VLC selezionare il menu Media/Apri periferica di acquisizione, selezionare il dispositivo di input video e poi in basso accanto a Riproduci cliccare sulla freccia in basso e selezionare Converti (ALT+C)
si apre il menu sottostante in cui si puo' indicare il file da salvare ed il tipo di codifica richiesta
importante per salvare e contemporaneamente visualizzare lo stream e' flaggare Mostra Risultato
con le impostazioni sopra riportate lo stream di una webcam 640x480 del portatile genera un flusso di circa 5Mb per minuto di ripresa quindi decisamente accettabile come occupazione di spazion disco
giovedì 21 giugno 2012
Creazione di amplificatore reale con LM358
Nel caso reale di costruzione di un amplificatore e' stato utilizzato l'operazionale LM358 per operare una amplificazione di guadagno pari a 2 in modalita' invertente
per questo motivo le due resistenze sull'operazionale sono uguali a pari a 1 KOhm
Il cavo verde indica il segnale da amplificare (sul Pin 3)
Il cavo rosso indica l'uscita del segnale amplificato (sul Pin 1)
Il cavo nero indica la terra (sul Pin 4)
Le resistenza sul circuito di alimentazione dell'integrato sono entrambi da 10 KOhm
per questo motivo le due resistenze sull'operazionale sono uguali a pari a 1 KOhm
Il cavo verde indica il segnale da amplificare (sul Pin 3)
Il cavo rosso indica l'uscita del segnale amplificato (sul Pin 1)
Il cavo nero indica la terra (sul Pin 4)
Le resistenza sul circuito di alimentazione dell'integrato sono entrambi da 10 KOhm
Il Pin 1 e' in alto a sinistra (una resistena da 10 KOhm e' parzialmente coperta dal filo verde) |
L'integrato a sinistra non e' impiegato |
Visione complessiva |
Clone di Arduino Nano 3.0
Un po' perche' mi serve, un po' perche' costa poco ed e' molto piccola, mi sono comprata su Dealer Extreme un clone di Arduino Nano 3.0 (circa 10 Euro)
E' molto difficile da inserire sulla breadboard a causa del numero di piedini..bisogna fare attenzione ed avere mano ferma
E' molto difficile da inserire sulla breadboard a causa del numero di piedini..bisogna fare attenzione ed avere mano ferma
Dall'alto |
Dal basso |
Montata sulla breadboard |
martedì 19 giugno 2012
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...