Serve una premessa, la limitazione nel titolo mi ha fregato!
Stavo "giocando" con la funzione random(), quando mi sono incuriosito sul lampeggio ovviamente caotico del led13 presente sulla mia scheda uno. Mi sono chiesto: "Ma se collego l'oscilloscopio?"
Ebbene, avendo due oscilloscopi, uno digitale, l'altro analogico, non ho resistito.
Adesso il "dubbio", al limite della "sindrome di gundam", l'uso di millis() al posto della funzione delay() avrebbe senso in un contesto "a casaccio"?
Se ti serve un buon generatore di numeri random (lascia stare la funione random() di Arduino), senza andare su HW dedicato, a suo tempo Leo ne aveva scritto uno ... lo trovi QUI.
/*
BlinkRevenge
*/
long randNumber;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
randomSeed(analogRead(0));
}
// the loop function runs over and over again forever
void loop() {
randNumber = random(65);
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(randNumber); // wait for random time
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(900); // wait for 900ms
}
Sketch "copiaincollato":
/*
* Blink_Randomly
*
* Modified from the basic Arduino example. Turns an LED on for a random time,
* then off for a (most likely) different random time. We use pin 13 because,
* depending on your Arduino board, it has either a built-in LED
* or a built-in resistor so that you need only an LED.
*
* Original at - http://www.arduino.cc/en/Tutorial/Blink
*/
int ledPin = 13; // LED connected to digital pin 13
long randOn = 0; // Initialize a variable for the ON time
long randOff = 0; // Initialize a variable for the OFF time
void setup() // run once, when the sketch starts
{
randomSeed (analogRead (0)); // randomize
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop() // run over and over again
{
randOn = random (100, 1200); // generate ON time between 0.1 and 1.2 seconds
randOff = random (200, 900); // generate OFF time between 0.2 and 0.9 seconds
digitalWrite(ledPin, HIGH); // sets the LED on
delay(randOn); // waits for a random time while ON
digitalWrite(ledPin, LOW); // sets the LED off
delay(randOff); // waits for a random time while OFF
}
gpb01:
Se ti serve un buon generatore di numeri random (lascia stare la funione random() di Arduino), senza andare su HW dedicato, a suo tempo Leo ne aveva scritto uno ... lo trovi QUI.
Appena ho un attimo di tempo provo un'altro metodo basato sulle uscite pwm. L'idea è quella di sfruttare i soliti esempi con il potenziometro per variare il duty cycle, ma ovviamente lasciando il pin analogico fluttuante.
Spero solo non ci siano persone "sensibili" verso la programmazione! :lol:
Dato che mi sembri incline a complicarti la vita (scusa, non ho resistito :D), allora perche' non prendere un vecchio tubo Geiger ed usare gli intervalli in millisecondi fra i vari impulsi captati come numeri o come semi ? ... piu "random" di cosi, non mi viene in mente molto altro ...
EDIT: oppure, mi stavo dimenticando, si possono usare anche dei vecchi fotodiodi PIN, come i BPW34 o simili, come detector di particelle
Etemenanki:
Dato che mi sembri incline a complicarti la vita (scusa, non ho resistito :D), allora perche' non prendere un vecchio tubo Geiger ed usare gli intervalli in millisecondi fra i vari impulsi captati come numeri o come semi ? ... piu "random" di cosi, non mi viene in mente molto altro ...
EDIT: oppure, mi stavo dimenticando, si possono usare anche dei vecchi fotodiodi PIN, come i BPW34 o simili, come detector di particelle
Il fotodiodo bpw34 come detector di particelle credo di averlo visto su un numero di elektor.
Intanto grazie, "elaboro" le info e vedo cosa salta fuori.
In linea di principio per generare dei numeri random su un sistema "ordinato" quale e' una macchina microcontrollore o un elaboratore serve un evento esterno che non sia vincolato e completamente asincrono, questa considerazione nasce dal fatto che un il contenuto informativo di qualunque dato e' legato alla sua indeterminazione, fu questa una questione una ventina di anni fa circa mi posi quando volevo generare dei numeri a caso e la risolsi in un modo che vi descrivero; considerando che alcune proprieta' del rumore bianco o anche la temperatura ambiente o la direzione del vento o i tempi nei quali si schiacciano i tasti su una tastiera di computer durante il normale lavoro possono considerarsi eventi indeterminati e non dipendenti dal sistema cosi detti eventi possono essere utilizzati per triggerare la cattura di un dato all'interno di un ciclo nel quale vengono generati continuamente numeri casuali attraverso quella che possiamo comunque considerare prevedibile e comunque inaffidabile e ripetibile routine interna di cui dispongono un po tutti i sistemi di elaborazione.
Pertanto creando un ciclo continuo nel quale si scrive in una variabile un numero random creato dal microcontrollore attraverso la routine interna e pescando il valore di detta variabile solo in concomitanza dell'evento esterno, magari triggerando attraverso un interrupt esterno, si puo' selezionare dalla serie di numeri generati continuamente nel loop un sottoinsieme di numeri (scelti a caso) e cosi ottenere una serie di numeri, veramente casuale.
In prima approssimazione questo metodo e' piu' affidabile quanto piu' piccolo e' il rapporto tra il tempo nel quale il loop legge l'intera sequenza (prima che si ripeta) ed il tempo medio tra due eventi esterni oppure, in maniera quasi equivalente, quanto maggiore e' la differenza tra tempo massimo e minimo tra due eventi esterni.
Per restare in tema ;D non e' facile dare i numeri veramente bene, per darli come si deve ci vuole un bel po di impegno
p.s. non ho scritto come in pratica risolsi la questione, posto qui un semplice pseudocodice in pascal-basic (so che capirete benissimo il senso di cio che sgrammaticamente ho voluto esprimere) che mi consentiva di catturare 10 numeri casuali mettendoli nel vettore m(i) attraverso la pressione dei tasti.
on "pressione tasto" gosub xxxxx
begin
i=0;
while i<10 do
begin
a:=rnd(1);
end;
end.
xxxxx: m(i) :=a;
i:=i+1;
return
speedyant:
Il fotodiodo bpw34 come detector di particelle credo di averlo visto su un numero di elektor.
Intanto grazie, "elaboro" le info e vedo cosa salta fuori.
Si c'è un kit di Elektor, preso e costruito anni fa. Ho anche un contatore con tube Geiger.
Il fotodiodo è nettamente meno sensibile del tubo ed è giusto così in quanto il volume sensibile del tubo è di almeno un ordine di grandezza (o forse più) del volume della parte sensibile fotodiodo. Però si possono usare più fotodiodi.
Se non schermi il fotodiodo le cose cambiano, becchi una marea di disturbi e conteggi molto alti.
C'è gente che invece monta un filo su un pin analogico e legge quello.
Infatti.
Il circuito semplificato è usato nello Smart Geiger Counter per Android (costo 30 euro circa esagerato), dentro c'è il fotodiodo e uno o 2 transistor per l'amplificazione. Sarebbe dovuto costare meno di 5 euro.
La versione 2 sembra sia meglio ma ancora non è stata smontata.
C'è un qui quo qua nell'usare sorgenti random hardware.
Un conto è voler ottenere un treno di bit casuali, e qui il rumore di una giunzione è sufficiente.
Un altro è voler ottenere dei numeri (quindi gruppi di bit), in questo caso la distribuzione sarà quasi sicuramente una gaussiana invece che uniforme.
Esempio classico le 8 monete lanciate per aria, le combinazioni con quattro teste e quattro croci usciranno più spesso di quelle con otto teste o otto croci.
I generatori pseudo random logico/matematici permettono invece una distribuzione più uniforme dei valori, ma a un certo punto si ripetono.
Anche campionare un generatore pseudo random con un segnale random hardware, può creare "battimenti" tra il periodo di campionamento e quello di estrazione pseudo random, finendo con il creare addensamenti statistici di alcuni valori e rarefazioni di altri.
Tempo fa ho preso questa app per Android che sfrutta il sensore cmos per rilevare la radioattività, sebbene la precisione lascia molto a desiderare, errore di +/-50% sulla misura, funziona e quantomeno permette di verificare la presenza di radiazioni nelle vicinanze.