Tauon Barcadero

Ip pubblico con fastweb (metter su un server)

with 34 comments

Il triste passato

Noi utenti fastweb siamo da sempre stati costretti a dimenticarci della possibilità di metter su un piccolo server web  o ftp, o di giocare a svariati giochi multiplayer, se non affidandoci a software di tunneling come hamachi, remobo ecc… e di usare decentemente i vari programmi di file sharing. Questo per colpa del modo in cui era, ed è ancora organizzata per la maggior parte, la rete fastweb, che non collega direttamente i nostri computer a internet (come fanno gli altri provider) attraverso un ip pubblico ma li “rinchiude” invece in una MAN e attraverso una tecnica chiamata NAT permette la comunicazione con internet. Risultato è che noi possiamo tranquillamente collegarci a qualsiasi computer su internet ma un computer collegato a internet non può collegarsi direttamente al nostro.  Questo fino ad ora.

Fastweb oggi

I nuovi clienti e in genere anche quelli che hanno cambiato il proprio HAG fastweb da poco non sono più connessi alla vecchia rete di fastweb, ma il loro HAG(che funziona anche da router) riceve un indirizzo ip esterno, cioè è collegato direttamente a internet. Il nostro computer non è comunque collegato a internet direttamente, infatti i programmi che prima non funzionavano continueranno a non funzionare, questo perchè è necessario eseguire un port forwarding sull HAG. In parole povere dobbiamo dire all HAG di lasciare aperte determinate porte in modo che il traffico da e verso internet che arriva su quelle porte venga spedito al nostro pc, il risultato è che il nostro computer è direttamente collegato a internet su quelle porte(il router dell HAG si occupa infatti di tutto il routing dei pacchetti da internet al nostro pc).

Leggi il seguito di questo post »

Written by barcadero

22 ottobre 2012 at 7:00 pm

Sensore a ultrasuoni HC SR04 e Arduino

with 7 comments

Un sensore a ultrasuoni come il HC SR 04 misura il tempo impiegato dalle onde sonore emesse da un sorgente a ritornarvici dopo aver incontrato un ostacolo che le riflette. Il fascio di onde sonore emesso ha forma conica e lo stesso vale per le onde riflesse da un ostacolo, questo fa si che il sensore riceva molte riflessioni da diversi oggetti, ciò rende il sensore, da solo,  incapace di distinguere un oggetto da un altro o aperture negli oggetti troppo piccole.

Sensore a ultrasuoni HC SR 04

Calcolo della distanza

La velocità del suono nell’aria alla temperatura di 20° è di circa 343,4 m/s, qui usero la velocità approssimata di 340 m/s per semplicità, se è necessaria una maggior precisione si può usare la seguente legge in funzione della temperatura t: V = 331.4 + 0.62*t

Il sensore restituisce il tempo impiegato per andare e tornare dalle onde sonore in microsecondi, inoltre è comodo avere la misura in cm, quindi bisogna convertire la velocità del suono da m/s in cm/microsecondo: 1 m/s = 10^2/10^6 cm/microsec = 10^-4 cm/microsec => 340 m/s = 3,4*10^-2 cm/microsec

Il tutto va ancora diviso per 2 in quanto il tempo che abbiamo convertito è quello impiegato per andare e tornare indietro dalle onde, mentre per calcolare la distanza dall’oggetto ci basta metà di questo tempo, la formula finale, dove t è il tempo restituito dal sensore in cm/microsec è:

S = 1.7 * 10^-2 * t cm

Leggi il seguito di questo post »

Written by barcadero

14 febbraio 2012 at 9:32 pm

Modifica micro servo rotazione 360 gradi

with 3 comments

Micro servi

I micro-servocomandi o microservi, sono del tutto simili a servocomandi tradizionali tranne per il fatto che sono più piccoli e leggeri, creati per i modellini RC più piccoli, sono usati per i progetti più disparati, e non tutti sanno che con qualche modifica si può eliminare la costrizione che permette la rotazione soltanto nel range tra 0 e 180 gradi, ottenendo un motore elettrico con tanto di ingranaggi a bassimo costo,  infatti si riescono a trovare microservi su internet anche per pochi dollari.

Un microservo 9g

Il questo caso utilizzerò un comune microservo TowerPro SG91R, ma la procedura funziona anche con i 9g e dovrebbe poter essere adattata a qualsiasi microservo con poco sforzo.

Inoltre il metodo usato è più veloce, anche se un po più rozzo, di quello tradizionale che prevede l’uso delle due resistenza di valore uguale; io lascerò collegato il potenziometro bloccato sulla posizione 90 gradi,  ma prima è meglio vedere meglio come è fatto internamente il micro-servo e quali sono i parametri principali che lo caratterizzano.
Leggi il seguito di questo post »

Written by barcadero

23 ottobre 2011 at 9:43 pm

Automi cellulari unidimensionali

with 3 comments

Automi di Wolfram

Gli automi cellulari unidimensionali sono uno degli esempi più ecclatanti di quanto delle regole di base molto semplici possano portare alla costruzione di pattern anche molto complicati, in special modo qui si parlerà degli automi studiati da Stephen Wolfram intorno agli inizi degli anni 80.

Regola 129

Gli automi sono distribuiti su una riga, da cui la classificazione di automi monodimensionali, e ognuno di essi può assumere due stati differenti rappresentabili con 1 e 0(bianco e nero). Data una configurazione di partenza della riga, la generazione successiva viene calcolata in modo dipendente dalla riga precedente attraverso le regole mostrate nell’immagine:

spiegazione regole generazione successiva Leggi il seguito di questo post »

Written by barcadero

8 agosto 2011 at 2:56 pm

La formica di Langton

leave a comment »

Un’altro automa cellulare

Come Life di Conway, anche la formica di Langton è un automa cellulare a stati finiti, ovvero possiamo immaginarlo come un “essere vivente” che segue alcune regole preimpostate e in base a queste si evolve. In questo caso particolare, la formica si trova su di una griglia bidimensionale(una matrice) in cui ogni casella(elemento della matrice) può assumere i valori “1” o bianco e “0” o nero. Essa può girarsi di 90 gradi per volta a sinistra o a destra e può avanzare di una casella per iterazione.

Immagine della formica di langton

Formica di Langton

Leggi il seguito di questo post »

Written by barcadero

15 marzo 2011 at 6:32 pm

Programmare il gioco della vita di Conway

with 2 comments

L’automa cellulare di Conway

Il gioco della vita è un famosissimo automa cellulare elaborato dal matematico John Conway negli anni sessanta;  si tratta sostanzialmente di una griglia costituita da celle e ognuna di esse può essere o viva o morta(piena o vuota). Data una situazione iniziale della griglia, le successive iterazioni dell’algoritmo seguono delle regole semplicissime per decidere quali celle si devono accendere( nascere o continuare a vivere ) e quali spegnere( morire ), a seconda del numero di “vicini” che si trovano nel quadrato 3×3 con centro nella cella considerata.

  • Una cella vuota diventa piena( nasce ) se  ha 3 vicini
  • Una cella piena sopravvive se ha 2 o 3 vicini, altrimenti muore per solitudine o sovrappopolazione.

Glider Cannon image

(Un cannone di “glider” di Gosper)

L’implementazione

L’implementazione è scritta in C++ e per la parte grafica, che comprende la creazione della finestra, il disegno della griglia e delle celle, è stata usata la libreria SDL.

Per tracciare le linee della griglia è stata usata SDL_gfx, un’estensione di SDL che permette il disegno di primitive 2D ben più complesse delle semplici linee.

Il codice sorgente può essere scaricato QUI. Un binario per linux compilato con CodeBlocks può essere scaricato QUI.

Leggi il seguito di questo post »

Written by barcadero

6 marzo 2011 at 10:58 pm

Un semplice algoritmo genetico

with 2 comments

Cosa è un algoritmo genetico?

Un algoritmo genetico è, nella sua definizione più generica, un metodo di ricerca euristico di una soluzione a un dato problema usando tecniche che si ispirano a quelle della selezione naturale e dell’evoluzione darwiniane.

Si parte creando una popolazione di individui, ciascuno di questi rappresenta una soluzione al problema da risolvere codificata in una stringa, detta gene; nella prima generazione i geni vengono generati in modo casuale. A ogni iterazione dell’algoritmo si rimescolano i geni tra i vari individui e definita una funzione detta fitness(), che restituisce la bontà di un certo individuo, ovvero un valore numerico che misura la sua capacità di risolvere il dato problema, si selezionano ad ogni iterazione gli individui migliori ed i loro geni vengono mescolati a quelli di nuovi individui generati dalla funzione che si occupa del crossing-over, ovvero del rimescolamento casuale dei geni di individui già esistenti per crearne di nuovi. Questo procedimento porta, in genere, a ottenere un’individuo con valore di fitness molto alto e quindi capace di risolvere in modo “ottimizzato” il dato problema. Non trattandosi di un procedimento strettamente rigoroso non sempre questo succede, ma si tratta sicuramente di un metodo interessante e potente che rivela le sue capacità soprattutto nell’ottimizzazione per esempio delle interfacce grafiche, dei modelli che operano all’interno di simulazioni fisiche e naturalmente nella programmazione genetica.

Un problema semplice semplice da risolvere

Ora vediamo una mia implementazione in C++ di questo algoritmo per un problema banale come trovare 4 numeri compresi tra 0 e 10 che abbiano somma massima, si lo so, non serve una algoritmo genetico per capirlo, la combinazione giusta è 10 + 10 + 10 + 10 = 40, ma volete mettere il fatto di arrivarci in un modo completamente fuori dal comune?

L’implementazione

Per scarica l’intero sorgente fare click QUI.

Definiamo subito alcune costanti globali dentro a un namespace anonimo, in modo da limitarne la visibilità al solo file in questione:

namespace {
 const int GENE_DIM = 4;                //numero di geni
 const int POPULATION_DIM = 50;        //numero di individui della popolazione
 const int MAX_FITNESS = 40;         //fitness da raggiungere per fermare algoritmo
}

Iniziamo col definire una struttura C++ che rappresenti il singolo individuo:

struct Individuo {

int gene[ GENE_DIM ];

 //costruttore: azzera i geni
 Individuo();

 //assegna valori casuali a gene
 void ramdomize_gene();

 //funzione che misura la bontà di un individuo
 int fitness() const;

 //stampa il gene
 void print() const;

};

Leggi il seguito di questo post »

Written by barcadero

3 marzo 2011 at 10:44 pm