Composé de 2 x 10 LED placées sur un axe symétrique horizontal, ce chenillard produit des figures lumineuses similaires à celles produites par le "système K2000".
Les figures sont codées en "dur" et ne peuvent pas être modifiées, sauf si vous retouchez au code source (fourni) et que vous le recompilez. La vitesse est ajustable au moyen d'un réglage matériel (potentiomètre) et/ou logiciel (boutons poussoir "plus vite" et "moins vite").
procedure Out_RefreshPort;
begin
PORTA.0 := OutData.0;
PORTA.1 := OutData.1;
PORTA.2 := OutData.2;
PORTA.3 := OutData.3;
PORTB.0 := OutData.4;
PORTB.1 := OutData.5;
PORTB.2 := OutData.6;
PORTB.3 := OutData.7;
PORTB.4 := OutData.8;
PORTB.5 := OutData.9;
end;
case idx of
0 : OutData := %0000000000000000;
1 : OutData := %0000000000000001;
2 : OutData := %0000000000000011;
3 : OutData := %0000000000000111;
4 : OutData := %0000000000001111;
5 : OutData := %0000000000011111;
6 : OutData := %0000000000111111;
7 : OutData := %0000000001111111;
8 : OutData := %0000000011111111;
9 : OutData := %0000000111111111;
10 : OutData := %0000001111111111;
11 : OutData := %0000001111111110;
12 : OutData := %0000001111111100;
13 : OutData := %0000001111111000;
14 : OutData := %0000001111110000;
15 : OutData := %0000001111100000;
16 : OutData := %0000001111000000;
17 : OutData := %0000001110000000;
18 : OutData := %0000001100000000;
19 : OutData := %0000001000000000;
20 : OutData := %0000000000000000;
21 : OutData := %0000001000000000;
22 : OutData := %0000001100000000;
23 : OutData := %0000001110000000;
24 : OutData := %0000001111000000;
25 : OutData := %0000001111100000;
26 : OutData := %0000001111110000;
27 : OutData := %0000001111111000;
28 : OutData := %0000001111111100;
29 : OutData := %0000001111111110;
30 : OutData := %0000001111111111;
31 : OutData := %0000000111111111;
32 : OutData := %0000000011111111;
33 : OutData := %0000000001111111;
34 : OutData := %0000000000111111;
35 : OutData := %0000000000011111;
36 : OutData := %0000000000001111;
37 : OutData := %0000000000000111;
38 : OutData := %0000000000000011;
39 : OutData := %0000000000000001;
end;
Out_RefreshPort;
La ligne RA4 inutilisée dans le programme actuellement diffusé peut être mise à profit pour ajouter un son bref à des instants précis. Pour cela, il faut configurer cette ligne en sortie et se rappeler qu'il s'agit d'une sortie en collecteur ouvert et non d'une sortie TTL standard. Le plus simple consiste à relier un buzzer piézoélectrique passif ou actif, ou un haut-parleur classique avec une résistance série optionnelle (pour limitation de courant). Le mode d'activation de la ligne RA4 dépend alors du type de transducteur sonore utilisé :
var
...
OutData: word;
bDoSound: boolean;
Out_Sound: sbit at RA4_bit;
procedure Init;
begin
...
INTCON.RBIE := 1; // enable RB4..RB7 int
TRISA := %11100000; // RA0..RA4 as output, others as input
TRISB := %11000000; // RB0..RB5 as output, others as input
...
end;
begin
...
if bOutReadyToChange then
begin
...
if idx < 39 then
inc(idx)
else
idx := 0;
bDoSound := (idx = 0) or (idx = 20); // play short sound when all lights are off
Out_Sound := bDoSound;
...
end;
end;
...
end;
Dans l'exemple qui précède, la variable bDoSound est positionnée à 1 quand idx vaut 0 ou 20, ce qui dans les deux cas correspond à l'extinction totale de toutes les LED. A adapter en fonction de vos envies ;)
var
...
OutData: word;
bDoSound: boolean;
Out_Sound: sbit at RA4_bit;
procedure Init;
begin
...
INTCON.RBIE := 1; // enable RB4..RB7 int
TRISA := %11100000; // RA0..RA4 as output, others as input
TRISB := %11000000; // RB0..RB5 as output, others as input
...
end;
begin
...
if bOutReadyToChange then
begin
...
if idx < 39 then
inc(idx)
else
idx := 0;
bDoSound := (idx = 0) or (idx = 20); // play short sound when all lights are off
if not bDoSound then Out_Sound := 0;
...
end;
end;
...
end;
Dans la procédure Interrupt, ajouter les lignes
suivantes :
procedure Interrupt;
begin
if TestBit(INTCON, T0IF) then
begin
inc(iTimerCount);
TMR0 := 0;
ClearBit(INTCON, T0IF); // reset T0 flag
if bDoSound then // play sound ?
Out_Sound := Out_Sound xor 1;
end;
...
end;
Côté code logiciel, il faut procéder aux ajustements indiqués pour l'utilisation d'un buzer piezo passif. Si le HP possède une impédance inférieure à 100 ohms, il faut ajouter une résistance série de limitation de courant de sorte que la totalité des deux donne une valeur voisine de 100 ohms (ce n'est pas critique à l'ohm près). Avec un HP 8 ohms, le son sera bien amoindri par la résistance câblée en série.
Pour un besoin de "forte" puissance, il faudra insérer un petit ampli BF "logique". entre la sortie du PIC et le HP. Dans ce cas bien précis, n'oubliez pas d'ajouter une résistance de rappel (4k7 à 22k) entre le +Valim et la sortie RA4 qui pour rappel est de type "collecteur ouvert".
Diffuser un son différent en fonction de l'état des sorties est tout à fait possible, bien que moins simple que la solution proposé ci-devant. Pour ce faire, il faut utiliser l'état logique de toutes les sorties pour activer un ou plusieurs générateurs sonores externes. Dans ce cas de figure, la génération des sons ne se fait pas dans le PIC et aucune modification du logiciel n'est à prévoir.
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.
05/02/2023
- Ajout paragraphe expliquant comment ajouter un son.
10/09/2009
- Première mise à disposition.