Allumer aléatoirement des del

François74

New Member
Bonjour,

Je suis débutant en picaxe, et suis bloqué :(

J'ai réalisé un sous-programme (pièce jointe) qui doit servir à allumer de façon aléatoire 8 led (par ex : led1 puis led6 puis led3...)
Je procède ainsi :
Une valeur d'une variable R est générée aléatoirement (entre 0 et 255), puis convertie en une valeur d'une variable S permettant d'allumer une des 8 led (si 0<R<32 alors S=1, si 32<R<64 alors S=2...)
S qui peut donc prendre les valeurs 1,2,4,8,16,32,64,128, est ensuite déposée sur les sorties allumant les del.

Cela fonctionne bien en simulation (avec logicator), je vois bien les variables et les sorties évoluer normalement.
Par contre, une fois transféré dans le picaxe (20M2), j'ai toujours la même séquence (led1 allumée 12 fois, puis la 3 une fois, puis la 5 une fois...) qui n'est en rien aléatoire.
Avec d'autres sous-programmes et sans la fonction aléatoire, le montage du picaxe fonctionne normalement (j'allume, j'éteins, je temporise...)

Je fais peut-être trop compliqué... ou il y a un truc que j'ai pas pigé...
Merci d'avance pour toute aide.
 

Attachments

PieM

Senior Member
Bonjour, et bienvenue .

Il faut savoir que le Picaxe (et d'autres) génère un nombre pseudo-aléatoire. La séquence est donc la même après chaque démarrage.
si on veut réellement de l'aléatoire, il faut affecter une "graine" au départ qui elle sera aléatoire. soit une valeur mémorisée en eeprom lors de l'appui sur une touche, soit une valeur analogique lue à un moment donné, etc ...

Je ne connais pas le détail de la fonction Random de Logicator, mais visiblement elle ne correspond pas au Random du basic une fois traduite.

Faites une exportation de votre fichier Logicator vers le basic pour mieux voir ce qui se passe.

Je pense que votre algorithme peut être très simplifié en adoptant :

Code:
aleatot:
random W1
b4 = W1 // 8
[COLOR="#0000FF"]if b4 = b5 then aleatot
b5 = b4[/COLOR]
high b4
pause 50
pinsB = 0
pause 4000 
goto aleatot
Les 2 lignes en bleu sont facultatives et permettent de ne pas avoir deux fois de suite la même sortie ( aléatoire revu et corrigé !)

b4 = W1 // 8 a pour résultat un chiffre compris entre 0 et 7
high b4 active directement la sortie concernée.
 

François74

New Member
Merci de ton aide.

J'ai dans un premier temps simplifié avec la commande basic que tu suggères, cela fait de la place.

J'ai bien compris qu'il fallait "initialiser" la commande random avec une variable évoluant de façon relativement aléatoire.
Ce que je ne sais pas, c'est comment faire : si j'utilise une durée de temps écoulé avant appui sur un bouton de déclenchement par exemple, faut-il copier cette valeur "graine" dans w1 ?
 

PieM

Senior Member
J'ai bien compris qu'il fallait "initialiser" la commande random avec une variable évoluant de façon relativement aléatoire.
Ce que je ne sais pas, c'est comment faire : si j'utilise une durée de temps écoulé avant appui sur un bouton de déclenchement par exemple, faut-il copier cette valeur "graine" dans w1 ?
Oui, tout à fait:

et si l'appui se fait pendant le déroulement du programme, mettre alors la valeur "graine" en mémoire eeprom par un
write 0, word graine.

en tout début de programme (avant le prog principal), lire la valeur par un read 0, word w1 pour initialiser ainsi aléatoirement le random lors du prochain démarrage de programme.

Nota: en basic l'argument de Random est une variable word
 

François74

New Member
C'est tout bon! :D

Ce n'est pas de l'aléatoire pur mais comme personne ne s'amusera à chronométrer le temps avant déclenchement... Cela ira bien.

J'ai pataugé pas mal à cause de l'éditeur pas net sur la commande random, à cause aussi du simulateur de cet éditeur qui n'est pas fidèle au fonctionnement réel du picaxe.
Je retiens qu'il ne faut pas hésiter à mettre son nez dans le basic.

Pour info, le projet développé est une machine d'entraînement pour compétiteur sportif.

Encore merci! Génial d'avoir une telle aide.
 

PieM

Senior Member
J'ai pataugé pas mal à cause de l'éditeur pas net sur la commande random, à cause aussi du simulateur de cet éditeur qui n'est pas fidèle au fonctionnement réel du picaxe.
Je retiens qu'il ne faut pas hésiter à mettre son nez dans le basic.
Logicator est surtout fait pour une utilisation dans l'enseignement, pour des petits programmes. Il conduit souvent à des programmes un peu "lourds" , difficilement commentés, avec une gestion rudimentaire des variables .
En outre, il ne permet pas d'utiliser toutes les instructions du Picaxe, à moins d'avoir recours à une cellule basic, ce qui est à mon sens, un mélange des genres.

Faire un organigramme, puis la programmation commentée dans le langage adapté au produit est plus rigoureux, et reste vrai quelque soit le type de µC utilisé.
 
Top