LA VAGUE ou Faire un chenillard a puissance variable. En fait, les leds doivent s'allumer avec des puissances variables et donner l'impression d'une vague. Pour mieux comprendre ce qui est demande, nous allons etablir un tableau qui expliquera un peu mieux ce qu'il faut faire. Voici un exemple avec la puissance en % : pas led7 led6 led5 led4 led3 led2 led1 led0 0 00 00 00 00 00 00 00 00 1 01 00 00 00 00 00 00 00 2 02 01 00 00 00 00 00 00 3 03 02 01 00 00 00 00 00 4 04 03 02 01 00 00 00 00 . . . . . . 98 98 97 96 95 94 93 92 91 99 99 98 97 96 95 94 93 92 100 100 99 98 97 96 95 94 93 101 99 100 99 98 97 96 95 94 102 98 99 100 99 98 97 96 95 103 97 98 99 100 99 98 97 96 104 96 97 98 99 100 99 98 97 105 95 96 97 98 99 100 99 98 106 94 95 96 97 98 99 100 99 107 93 94 95 96 97 98 99 100 108 92 93 94 95 96 97 98 99 109 91 92 93 94 95 96 97 98 110 90 91 92 93 94 95 96 97 . . . . . . 199 01 02 03 04 05 06 07 08 200 00 01 02 03 04 05 06 07 201 00 00 01 02 03 04 05 06 202 00 00 00 01 02 03 04 05 203 00 00 00 00 01 02 03 04 204 00 00 00 00 00 01 02 03 205 00 00 00 00 00 00 01 02 206 00 00 00 00 00 00 00 01 207 00 00 00 00 00 00 00 00 L'exemple donne l'est ici avec 100 niveaux d'eclairement. En fait, nous savons que pour cet exercice, nous allons utiliser l'instruction PWM du STAMP2. Or, cette instruction utilise 256 niveaux de puissance (de 0 a 255), et comme ça fait beaucoup, nous allons reduire ce nombre a 16 ou a 32 (toujours des puissance de 2). Si nous prenons un exemple avec 16 niveaux d'eclairement, (de 0 a 15) il nous suffira de diviser 256 par 16, et nous obtenons un pas de 16 pour l'utisation de la commande PWM. Voici le tabeau de puissance avec 16 niveaux: pas led7 led6 led5 led4 led3 led2 led1 led0 0 00 00 00 00 00 00 00 00 1 01 00 00 00 00 00 00 00 2 02 01 00 00 00 00 00 00 3 03 02 01 00 00 00 00 00 4 04 03 02 01 00 00 00 00 5 05 04 03 02 01 00 00 00 6 06 05 04 03 02 01 00 00 7 07 06 05 04 03 02 01 00 8 08 07 06 05 04 03 02 01 9 09 08 07 06 05 04 03 02 10 10 09 08 07 06 05 04 03 11 11 10 09 08 07 06 05 04 12 12 11 10 09 08 07 06 05 13 13 12 11 10 09 08 07 06 14 14 13 12 11 10 09 08 07 15 15 14 13 12 11 10 09 08 16 14 15 14 13 12 11 10 09 17 13 14 15 14 13 12 11 10 18 12 13 14 15 14 13 12 11 19 11 12 13 14 15 14 13 12 20 10 11 12 13 14 15 14 13 21 09 10 11 12 13 14 15 14 22 08 09 10 11 12 13 14 15 23 07 08 09 10 11 12 13 14 24 06 07 08 09 10 11 12 13 25 05 06 07 08 09 10 11 12 26 04 05 06 07 08 09 10 11 27 03 04 05 06 07 08 09 10 28 02 03 04 05 06 07 08 09 29 01 02 03 04 05 06 07 08 30 00 01 02 03 04 05 06 07 31 01 00 01 02 03 04 05 06 32 02 01 00 01 02 03 04 05 33 03 02 01 00 01 02 03 04 34 04 03 02 01 00 01 02 03 35 05 04 03 02 01 00 01 02 36 06 05 04 03 02 01 00 01 37 07 06 05 04 03 02 01 00 38 08 07 06 05 04 03 02 01 En observant ce tableau, nous nous rendons compte que si nous voulons avoir un mouvement continu de nos leds, il serait interessant de commencer notre boucle au pas numero 7 et de la terminer au pas numero au pas 36, puisque le pas numero 37 est identique au pas numero 7. nous aurons ainsi un mouvement qui aurra l'impression de ne jamais avoir de cassure. Nous obtenons donc finalement le tableau suivant : pas led7 led6 led5 led4 led3 led2 led1 led0 0 07 06 05 04 03 02 01 00 1 08 07 06 05 04 03 02 01 2 09 08 07 06 05 04 03 02 3 10 09 08 07 06 05 04 03 4 11 10 09 08 07 06 05 04 5 12 11 10 09 08 07 06 05 6 13 12 11 10 09 08 07 06 7 14 13 12 11 10 09 08 07 8 15 14 13 12 11 10 09 08 9 14 15 14 13 12 11 10 09 10 13 14 15 14 13 12 11 10 11 12 13 14 15 14 13 12 11 12 11 12 13 14 15 14 13 12 13 10 11 12 13 14 15 14 13 14 09 10 11 12 13 14 15 14 15 08 09 10 11 12 13 14 15 16 07 08 09 10 11 12 13 14 17 06 07 08 09 10 11 12 13 18 05 06 07 08 09 10 11 12 19 04 05 06 07 08 09 10 11 20 03 04 05 06 07 08 09 10 21 02 03 04 05 06 07 08 09 22 01 02 03 04 05 06 07 08 23 00 01 02 03 04 05 06 07 24 01 00 01 02 03 04 05 06 25 02 01 00 01 02 03 04 05 26 03 02 01 00 01 02 03 04 27 04 03 02 01 00 01 02 03 28 05 04 03 02 01 00 01 02 29 06 05 04 03 02 01 00 01 Ce tableau nous fait remarquer trois choses. La premiere, est qu'il n'est compose que de 30 lignes, alors que nous aurrions pu nous attendre a en avoir 32 (16 * 2), en fait, si nous observons la colonne de la Led0, nous remarquons que l'intensite varie de 0 a 15 (16 pas), puis de 14 a 1 (14 pas) et ceci vient du fait que les pas 0 et 15 ne sont effectues qu'une seule fois, alors que tous les autres pas sont repetes 2 fois. La deuxieme se remarque bien en observant la derniere colonne (de nouveau la led0). Pour les pas 0 a 15, le niveau d'intensite est le même que le numero du pas. Par contre, pour les pas 16 a 29, le niveau d'intensite decroit, et un petit calcul rapide nous montre que " intensite = 30 - pas". Donc pour la led0, nous avons "intensite = pas" pour les pas de 0 a 15, et "intensite = 30-pas" pour les pas superieurs a 15. La derniere, est que la puissance de chaque led peut-être deduite du numero du pas par un petit calcul simple. En effet, si nous prenons comme exemple la led5, nous remarquons que sa puissance est egale a celle du pas plus 5, ce qui pourrais s'ecrire "led(n) = pas+n". Au nombre obtenu, il suffit d'appliquer la regle que nous avons deduite dans la deuxieme remarque. Le probleme est que arrive a 30, le calcul devient faux. Par contre, si a partir de 30 nous retranchons 30 au lieu de 15, le calcul redevient juste. Donc, en resume, nous pouvons etablir le calcul suivant pour la led(n): Niveau = pas + n pour niveau < 15 alors intensite = niveau pour niveau compris entre 15 et 30 alors intensite = 30 - niveau et pour niveau > 30 alors intensite = niveau - 30 Il ne nous reste plus qu'a coucher tout cela sur le papier. Commençons par la programmation structuree. Tout d'abord, il faut definir les variables utilisees. Le raisonnement precedent, nous a montre que nous allons avoir besoin d'une variable de comptage du pas (pas) qui variera de 0 a 29. Puis une variable pour chaque led (n) qui variera de 0 a 7. Puis une variable qui sera utilisee pour le calcul du "pas" de chaque led (intensite) qui variera de 0 a 36 (29+7), cette variable pourra aussi contenir en fin de traitement, la valeur de l'intensite a envoyer dans la LED, a ce moment, sa valeur devra être comprise entre 0 et 15. Evidement, il nous faudra une variable tableau qui contiendra le niveau d'intensite de chaque led (led(n)). Cette variable variera de 0 a 255, puisque ce sont les valeurs utilisee dans l'intruction PWM. Et enfin, il nous faudra une contante de temps pour determiner la duree d'eclairement des leds, nous l'appellerons duree. Une fois les variables definie, et le raisonnement etabli, il n'y a plus qu'a ... ******************************************************************************* Structure du programme BEGIN DECLARE pas AS byte ' numero du pas, varie de 0 a 29 DECLARE intensite AS byte ' "niveau" pour chaque led, peut varier de 0 a 36 ' puis valeur de l'intensite d'eclairement DECLARE n AS nibble ' indice du numero de led, varie de 0 a 7 DECLARE led(7) AS nibble ' intensite de chaque led, varie de 0 a 255 DECLARE duree AS byte ' definit la duree d'eclairement des leds LET duree = 2 ' definit duree comme une constante. Ceci nous ' permettra de "jouer" avec la duree d'eclairage ' afin de determiner le meilleur effet. DO WHILE pas=pas ' boucle "infinie" LET pas=0 ' initialisation du comptage DO WHILE pas<30 ' debut du bouclage sur 30 pour le niveau LET n=0 ' initialisation du numero de la led DO WHILE n<8 ' debut du bouclage sur 8 pour les leds LET intensite=pas+n 'calcul du niveau IF intensite>29 THEN 'si niveau > 30 LET intensite=intensite-30 'calcul de l'intensite ELSE 'si niveau < 30 IF intensite>15 THEN 'Si niveau compris entre 15 et 30 LET intensite=30-intensite 'calcul de l'intensite ENDIF ' ENDIF ' LET led(n)=16*intensite 'calcul de l'intensité pour PWM ENDDO ENDDO ENDDO END ***************************************************************************** 'Listing du programme pour le STAMP2 pas VAR byte ' numero du pas, varie de 0 a 29 intensite VAR byte ' "pas" pour chaque led, peut varier de 0 a 36 ' puis calcul de l'intensite, varie de 0 a 15 n VAR nib ' indice du numero de led, varie de 0 a 7 duree CON 2 ' definit la duree d'eclairement des leds ' Notez que dans les STAMP2, la variable led(n) n'existe pas, puisque l'indice ' (n) servira d'argument a la commande PWM. debut: FOR pas=0 to 29 FOR n=0 to 7 intensite=pas+n IF intensite<30 THEN saut1 intensite=intensite-30 GOTO saut2 saut1: IF intensite<16 THEN saut2 intensite=30-intensite saut2: PWM n,16*intensite,duree NEXT NEXT GOTO debut