Ho questo portatile da circa due anni che dopo due anni di Ubuntu Netbook Remix ha subito un problema di corruzione del file system e non potendo reinstallare Ubuntu Remix (che al momento non esiste piu') ho provato a montare un XUbuntu 11.10...dopo pochi mesi mi sono stufato e mi sono lanciato nell'installazione di Debian
L'installazione e' partita da una chiave USB senza connessione di rete
I problemi ovviamente sono iniziati al riavvio nel quale praticamente niente era stato riconosciuto (o configurato) per cui ho iniziato modificando a mano il file interfaces dentro /etc/network/interfaces
aggiungendo le seguenti righe
auto eth0
iface eth0 inet dhcp
riavviando il servizio ed attaccando il cavo la rete e' disponibile
A questo punto e' necessario cambiare il file sources.list in /etc/apt/ perche' installando senza rete non e' stato configurato
si deve commentare la riga riguardante il cdrom e si aggiungono
deb http://ftp.it.debian.org/debian squeeze main contrib non-free
deb-src http://ftp.it.debian.org/debian squeeze main contrib non-free
si aggiorna l'elenco dei pacchetti
apt-get install update
per gestire la rete wireless eseguire i comandi seguenti
apt-get install network-manager-gnome firmware-brcm80211
modprobe -r brcm80211
modprobe brcm80211
la scheda video e' riconosciuta ma l'audio e' impostato a zero
si deve quindi installare
apt-get install gnome-media
che installa sotto Preferenze/Audio il mixer
Installazione di Midnight Commander
apt-get install mc
apt-get install unzip
Google-Chrome deve essere installato e scaricato come deb a parte direttamente da Google (niente apt)
alla fine ho avuto la necessita' di eseguire
apt-get -f install
Installazione di Java
apt-get install openjdk-6-jre openjdk-6-jdk icedtea6-plugin
Installazione di Eclipse
se si installa Eclipse via apt-get poi si diventa pazzi nell'installazione del plugin ADT di Android perche' la versione nei repository Debian manca dei plugin necessari
La cosa migliore e' scaricare direttamente il file tgz di Eclipse dal sito scegliendo la versione Classic (circa 180 Mb di download)
Configurazione di Android
Una volte decompresso l'Android SDK dentro la home/android-sdk-tools si deve modificare la PATH
$ nano ~/.bashrc
aggiugendo alla fine
export PATH=${PATH}:~/android-sdk-linux/tools
export PATH=${PATH}:~/android-sdk-linux/platform-tools
Per avere il software di sviluppo di Arduino si deve procedere come prima installando i seguenti pacchetti
apt-get install build-essential
apt-get install --reinstall gcc-avr
apt-get install --reinstall avr-libc
apt-get install --reinstall binutils-avr
apt-get iinstall --reinstall avrdude
e poi scaricando e decomprimendo il software Arduino
Openoffice
apt-get install openoffice.org
La webcam funziona regolarmente su /dev/video0 cosi' come l'SD Card Reader
Per velocizzare il boot puo' essere comodo installare un login manager differente da GDM ed in particolare
apt-get install slim
modificando il file /etc/slim.conf con
default_user luca
auto_login yes
per diminuire il tempo di attesa di Grub (impostato a 5 secondi) si edita il file /etc/default/grub modificando il valore di GRUB_TIMEOUT e poi eseguendo il comando update-grub
infine sono stati rimossi i demoni perche' non utilizzati mediante sys-rc-config (da installare a parte)
bootlogs
avahi-dae
cups
exim4
nfs-common
portmap
rsync
rsynclog
in modo piuttosto strano si deve anche aggiungere il comando sudo
apt-get install sudo
con il seguente comando (effettuato da root)
adduser luca sudo
per completare si possono aggiungere i codec non compresi in Debian prelevabili da qui
stranamente non e' compreso di default il decompressore dei file rar che si aggiunge
apt-get install unrar
lunedì 23 luglio 2012
mercoledì 11 luglio 2012
Proiezioni stereografiche per geologia strutturale
In questo post viene proposto un programma per disegnare le proiezioni stereografiche di utilizzo in geologia stratigrafica
Per prima cosa si deve calcolare l'intersezione del piano di cui si e' effettuata la misura (strato o discontinuita') con una sfera a centro (0,0,1) e raggio1; per fare cio' viene calcolato l'equazione del cerchio dell'equatore che poi viene ruotato dei corrispondenti valori di Strike e Dip
Dopo di cio' viene applicata la formula della proiezione stereografica per riportare i risultati sul piano di proiezione
----------------------
import pygame
import math
pygame.init()
screen = pygame.display.set_mode((300,300))
gamma = -math.pi # variabile per generare il cerchio massimo
teta = math.radians(90) # angolo di dip
alfa = math.radians(159) # angolo di strike
raggio = 100
raggio2 = 50
pygame.draw.circle(screen,(255,0,0),(150,150),raggio,1)
while True:
while gamma < (math.pi):
#calcola il cerchio come con il centro in 0,0,1 e parallelo ad XY
#in pratica calcola l'equatore come cerchio massimo
x = math.cos(gamma)
y = math.sin(gamma)
z = 0
#ruota il cerchio dell'equatore sull'asse x dell'angolo di pendenza (dip)
x1 = x
y1 = ((math.cos(teta)*y)-(math.sin(teta)*z))
z1 = ((math.sin(teta)*y)+(math.cos(teta)*z))
#ruota il cerchio dell'equatore del valore di azimuth
x2 = ((math.cos(alfa)*x1)-(math.sin(alfa)*y1))
y2 = ((math.sin(alfa)*x1)+(math.cos(alfa)*y1))
z2 = 1+z1 #sposta l'origine della sfera a 0,0,1 per preparare la proiezione stereografica
#proiezione stereografica
if (z2<1): # per convenzione si plottano solo le intersezioni con la semisfera inferiore
x3 = (2*x2)/(2-z2)
y3 = (2*y2)/(2-z2)
screen.set_at((int(x3*raggio2)+150,int(y3*raggio2)+150),(0,255,0))
gamma = gamma+0.01
pygame.display.flip()
----------------------
Per prima cosa si deve calcolare l'intersezione del piano di cui si e' effettuata la misura (strato o discontinuita') con una sfera a centro (0,0,1) e raggio1; per fare cio' viene calcolato l'equazione del cerchio dell'equatore che poi viene ruotato dei corrispondenti valori di Strike e Dip
Dopo di cio' viene applicata la formula della proiezione stereografica per riportare i risultati sul piano di proiezione
----------------------
import pygame
import math
pygame.init()
screen = pygame.display.set_mode((300,300))
gamma = -math.pi # variabile per generare il cerchio massimo
teta = math.radians(90) # angolo di dip
alfa = math.radians(159) # angolo di strike
raggio = 100
raggio2 = 50
pygame.draw.circle(screen,(255,0,0),(150,150),raggio,1)
while True:
while gamma < (math.pi):
#calcola il cerchio come con il centro in 0,0,1 e parallelo ad XY
#in pratica calcola l'equatore come cerchio massimo
x = math.cos(gamma)
y = math.sin(gamma)
z = 0
#ruota il cerchio dell'equatore sull'asse x dell'angolo di pendenza (dip)
x1 = x
y1 = ((math.cos(teta)*y)-(math.sin(teta)*z))
z1 = ((math.sin(teta)*y)+(math.cos(teta)*z))
#ruota il cerchio dell'equatore del valore di azimuth
x2 = ((math.cos(alfa)*x1)-(math.sin(alfa)*y1))
y2 = ((math.sin(alfa)*x1)+(math.cos(alfa)*y1))
z2 = 1+z1 #sposta l'origine della sfera a 0,0,1 per preparare la proiezione stereografica
#proiezione stereografica
if (z2<1): # per convenzione si plottano solo le intersezioni con la semisfera inferiore
x3 = (2*x2)/(2-z2)
y3 = (2*y2)/(2-z2)
screen.set_at((int(x3*raggio2)+150,int(y3*raggio2)+150),(0,255,0))
gamma = gamma+0.01
pygame.display.flip()
----------------------
Strike 159 - Dip 90 |
Strike 270 - Dip45 |
Strike 32 - Dip12 |
lunedì 9 luglio 2012
Sensori via Arduino Ethernet
Questo programma mostra un esempio di come utilizzare una Arduino Ethernet per leggere i valori di alcuni sensori (su protocollo I2C o direttamente con input analogico) e mostrare il risultato su una pagina Web che si aggiorna una volta al secondo
--------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#define ADDRESS 0x60 // indirizzo I2C della bussola
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };
Server server(80);
int acc_x0,acc_y0,acc_z0; // Valori di accelerazione
unsigned long tempo;
void setup()
{
//inizializza il bus I2C
Wire.begin();
//inizializza il web server
Ethernet.begin(mac, ip);
server.begin();
// per debug
Serial.begin(9600);
}
void loop()
{
byte highByte, lowByte, fine; // Bearing (transi)
char pitch, roll; // Pitch and roll
int bearing; // Bearing
byte high_x,low_x,high_y,low_y,high_z,low_z;
int acc_x,acc_y,acc_z; // Valori di accelerazione
Wire.beginTransmission(ADDRESS); // inizia la comunicazione con la bussola
Wire.send(2); // inizia a leggere dal secondo registro
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // richiede 4 byte
while(Wire.available() < 4); // Wait for bytes to become available
highByte = Wire.receive();
lowByte = Wire.receive();
pitch = Wire.receive();
roll = Wire.receive();
bearing = ((highByte<<8)+lowByte)/10; // Calcola la parte intera del Bearing
fine = ((highByte<<8)+lowByte)%10; // Calcola la parte decimale del Bearing
int fine2 = (int)fine;
int pitch2 = (int)pitch;
int roll2 = (int)roll;
Wire.beginTransmission(ADDRESS); //inizia lettura accelerometro
Wire.send(16);
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 6); // Richiede i 6 byte dell'accelerazione
while(Wire.available() < 6);
high_x = Wire.receive();
low_x = Wire.receive();
high_y = Wire.receive();
low_y = Wire.receive();
high_z = Wire.receive();
low_z = Wire.receive();
acc_x = ((high_x<<8)+low_x); // Calcola accel_x
acc_y = ((high_y<<8)+low_y); // Calcola accel_y
acc_z = ((high_z<<8)+low_z); // Calcola accel_z
delay(1000);
Client client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//gestisce il refresh automatico della pagina per aggiornare
//al valore dei sensori
client.println("<meta http-equiv=\"refresh\" content=\"1\">");
tempo = round(millis()/1000);
client.print("Tempo trascorso (sec): ");
client.print(tempo);
client.print("</br></br><table border=1>");
// Stampa il valore del bearing
client.print("<tr><td>Bearing</td><td>");
client.print(bearing);
client.print(".");
client.print(fine2);
client.print("</td></tr>");
// Stampa il valore di Pitch
client.print("<tr><td>Pitch</td><td>");
client.print(pitch2);
client.print("</td></tr>");
// Stampa il valore di Roll
client.print("<tr><td>Roll</td><td>");
client.print(roll2);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su X
client.print("<tr><td>Acc. Delta X (g)</td><td>");
float acx = (acc_x-acc_x0)*0.000636364;
client.print(acx);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Y
client.print("<tr><td>Acc. Delta Y (g)</td><td>");
float acy = (acc_y-acc_y0)*0.000636364;
client.print(acy);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Z
// il valore di acc su Z senza movimento e' 15400
// quindi il fattore di correzione e' 9.8/15400 = 0.000636364
client.print("<tr><td>Acc. Delta Z (g)</td><td>");
float acz = (acc_z-acc_z0)*0.000636364;
client.print(acz);
client.print("</td></tr>");
// salva i valori di accelerazione per il calcolo
// del delta di accelerazione
acc_x0 = acc_x;
acc_y0 = acc_y;
acc_z0 = acc_z;
// Stampa il valore Temperatura
// T = 68.033 exp(-0.2088*R(Kohm))
// R_sensore = (10.000*5)/(
int sensor_t = A0;
int temp = analogRead(sensor_t);
double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
client.print("<tr><td>Temp. (C)</td><td>");
client.print(temperatura);
client.print("</td></tr>");
// Stampa il valore Umidita
int sensor_u = A1;
int umi = analogRead(sensor_u);
double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
client.print("<tr><td>RH (%)</td><td>");
client.print(umidita);
client.print("</td></tr>");
client.print("</table>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#define ADDRESS 0x60 // indirizzo I2C della bussola
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };
Server server(80);
int acc_x0,acc_y0,acc_z0; // Valori di accelerazione
unsigned long tempo;
void setup()
{
//inizializza il bus I2C
Wire.begin();
//inizializza il web server
Ethernet.begin(mac, ip);
server.begin();
// per debug
Serial.begin(9600);
}
void loop()
{
byte highByte, lowByte, fine; // Bearing (transi)
char pitch, roll; // Pitch and roll
int bearing; // Bearing
byte high_x,low_x,high_y,low_y,high_z,low_z;
int acc_x,acc_y,acc_z; // Valori di accelerazione
Wire.beginTransmission(ADDRESS); // inizia la comunicazione con la bussola
Wire.send(2); // inizia a leggere dal secondo registro
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // richiede 4 byte
while(Wire.available() < 4); // Wait for bytes to become available
highByte = Wire.receive();
lowByte = Wire.receive();
pitch = Wire.receive();
roll = Wire.receive();
bearing = ((highByte<<8)+lowByte)/10; // Calcola la parte intera del Bearing
fine = ((highByte<<8)+lowByte)%10; // Calcola la parte decimale del Bearing
int fine2 = (int)fine;
int pitch2 = (int)pitch;
int roll2 = (int)roll;
Wire.beginTransmission(ADDRESS); //inizia lettura accelerometro
Wire.send(16);
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 6); // Richiede i 6 byte dell'accelerazione
while(Wire.available() < 6);
high_x = Wire.receive();
low_x = Wire.receive();
high_y = Wire.receive();
low_y = Wire.receive();
high_z = Wire.receive();
low_z = Wire.receive();
acc_x = ((high_x<<8)+low_x); // Calcola accel_x
acc_y = ((high_y<<8)+low_y); // Calcola accel_y
acc_z = ((high_z<<8)+low_z); // Calcola accel_z
delay(1000);
Client client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//gestisce il refresh automatico della pagina per aggiornare
//al valore dei sensori
client.println("<meta http-equiv=\"refresh\" content=\"1\">");
tempo = round(millis()/1000);
client.print("Tempo trascorso (sec): ");
client.print(tempo);
client.print("</br></br><table border=1>");
// Stampa il valore del bearing
client.print("<tr><td>Bearing</td><td>");
client.print(bearing);
client.print(".");
client.print(fine2);
client.print("</td></tr>");
// Stampa il valore di Pitch
client.print("<tr><td>Pitch</td><td>");
client.print(pitch2);
client.print("</td></tr>");
// Stampa il valore di Roll
client.print("<tr><td>Roll</td><td>");
client.print(roll2);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su X
client.print("<tr><td>Acc. Delta X (g)</td><td>");
float acx = (acc_x-acc_x0)*0.000636364;
client.print(acx);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Y
client.print("<tr><td>Acc. Delta Y (g)</td><td>");
float acy = (acc_y-acc_y0)*0.000636364;
client.print(acy);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Z
// il valore di acc su Z senza movimento e' 15400
// quindi il fattore di correzione e' 9.8/15400 = 0.000636364
client.print("<tr><td>Acc. Delta Z (g)</td><td>");
float acz = (acc_z-acc_z0)*0.000636364;
client.print(acz);
client.print("</td></tr>");
// salva i valori di accelerazione per il calcolo
// del delta di accelerazione
acc_x0 = acc_x;
acc_y0 = acc_y;
acc_z0 = acc_z;
// Stampa il valore Temperatura
// T = 68.033 exp(-0.2088*R(Kohm))
// R_sensore = (10.000*5)/(
int sensor_t = A0;
int temp = analogRead(sensor_t);
double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
client.print("<tr><td>Temp. (C)</td><td>");
client.print(temperatura);
client.print("</td></tr>");
// Stampa il valore Umidita
int sensor_u = A1;
int umi = analogRead(sensor_u);
double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
client.print("<tr><td>RH (%)</td><td>");
client.print(umidita);
client.print("</td></tr>");
client.print("</table>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
--------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#define ADDRESS 0x60 // indirizzo I2C della bussola
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };
Server server(80);
int acc_x0,acc_y0,acc_z0; // Valori di accelerazione
unsigned long tempo;
void setup()
{
//inizializza il bus I2C
Wire.begin();
//inizializza il web server
Ethernet.begin(mac, ip);
server.begin();
// per debug
Serial.begin(9600);
}
void loop()
{
byte highByte, lowByte, fine; // Bearing (transi)
char pitch, roll; // Pitch and roll
int bearing; // Bearing
byte high_x,low_x,high_y,low_y,high_z,low_z;
int acc_x,acc_y,acc_z; // Valori di accelerazione
Wire.beginTransmission(ADDRESS); // inizia la comunicazione con la bussola
Wire.send(2); // inizia a leggere dal secondo registro
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // richiede 4 byte
while(Wire.available() < 4); // Wait for bytes to become available
highByte = Wire.receive();
lowByte = Wire.receive();
pitch = Wire.receive();
roll = Wire.receive();
bearing = ((highByte<<8)+lowByte)/10; // Calcola la parte intera del Bearing
fine = ((highByte<<8)+lowByte)%10; // Calcola la parte decimale del Bearing
int fine2 = (int)fine;
int pitch2 = (int)pitch;
int roll2 = (int)roll;
Wire.beginTransmission(ADDRESS); //inizia lettura accelerometro
Wire.send(16);
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 6); // Richiede i 6 byte dell'accelerazione
while(Wire.available() < 6);
high_x = Wire.receive();
low_x = Wire.receive();
high_y = Wire.receive();
low_y = Wire.receive();
high_z = Wire.receive();
low_z = Wire.receive();
acc_x = ((high_x<<8)+low_x); // Calcola accel_x
acc_y = ((high_y<<8)+low_y); // Calcola accel_y
acc_z = ((high_z<<8)+low_z); // Calcola accel_z
delay(1000);
Client client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//gestisce il refresh automatico della pagina per aggiornare
//al valore dei sensori
client.println("<meta http-equiv=\"refresh\" content=\"1\">");
tempo = round(millis()/1000);
client.print("Tempo trascorso (sec): ");
client.print(tempo);
client.print("</br></br><table border=1>");
// Stampa il valore del bearing
client.print("<tr><td>Bearing</td><td>");
client.print(bearing);
client.print(".");
client.print(fine2);
client.print("</td></tr>");
// Stampa il valore di Pitch
client.print("<tr><td>Pitch</td><td>");
client.print(pitch2);
client.print("</td></tr>");
// Stampa il valore di Roll
client.print("<tr><td>Roll</td><td>");
client.print(roll2);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su X
client.print("<tr><td>Acc. Delta X (g)</td><td>");
float acx = (acc_x-acc_x0)*0.000636364;
client.print(acx);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Y
client.print("<tr><td>Acc. Delta Y (g)</td><td>");
float acy = (acc_y-acc_y0)*0.000636364;
client.print(acy);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Z
// il valore di acc su Z senza movimento e' 15400
// quindi il fattore di correzione e' 9.8/15400 = 0.000636364
client.print("<tr><td>Acc. Delta Z (g)</td><td>");
float acz = (acc_z-acc_z0)*0.000636364;
client.print(acz);
client.print("</td></tr>");
// salva i valori di accelerazione per il calcolo
// del delta di accelerazione
acc_x0 = acc_x;
acc_y0 = acc_y;
acc_z0 = acc_z;
// Stampa il valore Temperatura
// T = 68.033 exp(-0.2088*R(Kohm))
// R_sensore = (10.000*5)/(
int sensor_t = A0;
int temp = analogRead(sensor_t);
double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
client.print("<tr><td>Temp. (C)</td><td>");
client.print(temperatura);
client.print("</td></tr>");
// Stampa il valore Umidita
int sensor_u = A1;
int umi = analogRead(sensor_u);
double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
client.print("<tr><td>RH (%)</td><td>");
client.print(umidita);
client.print("</td></tr>");
client.print("</table>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#define ADDRESS 0x60 // indirizzo I2C della bussola
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };
Server server(80);
int acc_x0,acc_y0,acc_z0; // Valori di accelerazione
unsigned long tempo;
void setup()
{
//inizializza il bus I2C
Wire.begin();
//inizializza il web server
Ethernet.begin(mac, ip);
server.begin();
// per debug
Serial.begin(9600);
}
void loop()
{
byte highByte, lowByte, fine; // Bearing (transi)
char pitch, roll; // Pitch and roll
int bearing; // Bearing
byte high_x,low_x,high_y,low_y,high_z,low_z;
int acc_x,acc_y,acc_z; // Valori di accelerazione
Wire.beginTransmission(ADDRESS); // inizia la comunicazione con la bussola
Wire.send(2); // inizia a leggere dal secondo registro
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 4); // richiede 4 byte
while(Wire.available() < 4); // Wait for bytes to become available
highByte = Wire.receive();
lowByte = Wire.receive();
pitch = Wire.receive();
roll = Wire.receive();
bearing = ((highByte<<8)+lowByte)/10; // Calcola la parte intera del Bearing
fine = ((highByte<<8)+lowByte)%10; // Calcola la parte decimale del Bearing
int fine2 = (int)fine;
int pitch2 = (int)pitch;
int roll2 = (int)roll;
Wire.beginTransmission(ADDRESS); //inizia lettura accelerometro
Wire.send(16);
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 6); // Richiede i 6 byte dell'accelerazione
while(Wire.available() < 6);
high_x = Wire.receive();
low_x = Wire.receive();
high_y = Wire.receive();
low_y = Wire.receive();
high_z = Wire.receive();
low_z = Wire.receive();
acc_x = ((high_x<<8)+low_x); // Calcola accel_x
acc_y = ((high_y<<8)+low_y); // Calcola accel_y
acc_z = ((high_z<<8)+low_z); // Calcola accel_z
delay(1000);
Client client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//gestisce il refresh automatico della pagina per aggiornare
//al valore dei sensori
client.println("<meta http-equiv=\"refresh\" content=\"1\">");
tempo = round(millis()/1000);
client.print("Tempo trascorso (sec): ");
client.print(tempo);
client.print("</br></br><table border=1>");
// Stampa il valore del bearing
client.print("<tr><td>Bearing</td><td>");
client.print(bearing);
client.print(".");
client.print(fine2);
client.print("</td></tr>");
// Stampa il valore di Pitch
client.print("<tr><td>Pitch</td><td>");
client.print(pitch2);
client.print("</td></tr>");
// Stampa il valore di Roll
client.print("<tr><td>Roll</td><td>");
client.print(roll2);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su X
client.print("<tr><td>Acc. Delta X (g)</td><td>");
float acx = (acc_x-acc_x0)*0.000636364;
client.print(acx);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Y
client.print("<tr><td>Acc. Delta Y (g)</td><td>");
float acy = (acc_y-acc_y0)*0.000636364;
client.print(acy);
client.print("</td></tr>");
// Stampa il valore di Accelerazione su Z
// il valore di acc su Z senza movimento e' 15400
// quindi il fattore di correzione e' 9.8/15400 = 0.000636364
client.print("<tr><td>Acc. Delta Z (g)</td><td>");
float acz = (acc_z-acc_z0)*0.000636364;
client.print(acz);
client.print("</td></tr>");
// salva i valori di accelerazione per il calcolo
// del delta di accelerazione
acc_x0 = acc_x;
acc_y0 = acc_y;
acc_z0 = acc_z;
// Stampa il valore Temperatura
// T = 68.033 exp(-0.2088*R(Kohm))
// R_sensore = (10.000*5)/(
int sensor_t = A0;
int temp = analogRead(sensor_t);
double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
client.print("<tr><td>Temp. (C)</td><td>");
client.print(temperatura);
client.print("</td></tr>");
// Stampa il valore Umidita
int sensor_u = A1;
int umi = analogRead(sensor_u);
double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
client.print("<tr><td>RH (%)</td><td>");
client.print(umidita);
client.print("</td></tr>");
client.print("</table>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
Booster
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()
------------------------------------------
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()
------------------------------------------
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
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...
-
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...