J'ai fait une mise à jour de mon programmeur d'EEPROM et de mémoire FLASH. Maintenant il est possible de programmer des mémoires à interface SPI de type Winbond W25Q80 et W25Q128 ou d'autres marques qui utilisent les même commandes. Le jeux de commandes de ce type de mémoire étant standardisé, ça devrait fonctionner avec d'autres marques mais je ne l'ai pas vérifié.
Le MCU STM8L151K6 possède un périphérique que peu de MCU 8 bits possèdent, un convertisseur Numérique/Analogique (DAC) de 12 bits. Il possède aussi 4 canaux DMA (Direct Memory Access). Donc il se prête bien à la lecture de fichiers audio. Avec ce projet j'ai donc utilisé ce MCU avec une mémoire FLASH de 1 MO sur laquelle j'ai enregistré 8 fichiers audio au format WAV. Un sélecteur permet de choisir le fihcier qui sera joué lorsque le bouton de la porte est activé. Les détails du projet sont sur github. Pour voir la vidéo de démonstration suivez ce lien
Hier dimanche le 15 février c'était la journée de la radio.
Le premier emplois que j'ai occupé en sortant du CÉGEP était justement dans un atelier de réparation d'appareil électronique et en 1978 il y avait encore beaucoup d'appareils qui fonctionnaient avec des tubes électroniques; triode, tétrode, pentode. Comme je suis un babyboomer, les premiers appareils électroniques que j'ai connu fonctionnaient avec de tels tubes. Je me rappelle encore ce récepteur AM dans son boitier en bois trônant sur le comptoir de la cuisine/salle à manger.
un circuit typique
À cet époque il y avait, peu importe le manufacturier, un circuit typique pour ces récepteurs radio conçus autour de 5 tubes électroniques. Quelques détails varaient d'un fabriquant à l'autre mais cette standardisation permettait la fabrication à grande échelle à faible coût.
Si on regarde le numéro de modèle des tubes on voit 12SA7, 12SK7, 12SQ7, 50L6GY et 35Z5GT. Le premier nombre indique le voltage de fonctionnement du filament du tube. Si on additionne ces 5 nombres on arrive à 121 volt c'est à dire le voltage d'alimentation secteur en amérique du nord (120VAC). Si on regarde dans le bas du schéma électronique on voit que les 5 filaments sont branchés en série. Cette configuration évitait d'utiliser un coûteux, lourd et volumineux transformateur pour abaisser la tension. Tout était penser pour réduire le coût de fabrication. L'inconvénient était que si un filament brulait il fallait vérifier les 5 tubes pour savoir lequel avait flanché.
Juste au dessus des filaments on aperçoit le tube redresseur de tension 35Z5GT. Encore là en raison du coût on se contentait d'une rectification demi-phase. La filtration était assurée par condensateur double de 50µF. Ce condensateur se présentait dans un seul boitier d'aluminium cylindrique d'environ 15mm de diamètre par environ 50mm de hauteur avec 3 fils qui sortaient à une extrémité dans le genre de ceux-ci:
On voit qu'il y avait 2 tensions DC la première à 119VDC pour alimenter l'amplicateur audio-fréquence. Il s'agit d'une pentode 50L6GT. Puisque l'impédance de sortie des tubes électronique est élevée il fallait utiliser un transformateur pour réduire l'impédance entre la sortie de l'amplificateur et le haut-parleur. Cependant de type de transformateur est plus petit et plus léger qu'un transformateur d'alimentation.
Parti radio-fréquence
À cette époque c'est la radio AM qui dominait le marché et les récepteurs à 5 tubes étaient conçu pour la réception dans la bande 540 à 1600 Khertz. Il n'y avait pas de barre de ferrite pour le bobinage d'antenne, ça n'existait pas encore. À la place sur le panneau arrière du récepteur, côté intérieur était collée une bobine plate qui couvrait la surface. Cette bobine était fabriquée avec un fil spécial appellé Litz. Ce genre de fil est constitué de nombreux fils plus petits et isolés les uns des autres. Ce type de fil augmente la sélectivité du circuit d'accord, je n'entrerai pas dans les détails. Complètement à gauche du schéma cette boucle de fil est identifiée par loop.
Le tube électronique identifié 12SA7 est une pentode qui joue 3 rôles. Amplification du signal reçu, oscillateur local et mélangeur de fréquences. Le signal radio est amplifié par contrôle de la grille branché à la broche 8 tandis que l'oscillatuer local est branché sur la grille à la broche 5. La double grille sur la broche 4 est ce qu'on appelle une grille de supression et sert à réduire le couplage entre les différentes électrodes du tube. L'accord de la fréquence de réception se fait par un condensateur variable à double section dans le genre de celui-ci:
Un récepteur superhétérodyne fonctionne par réduction de la fréquence reçu vers une fréquence intermédiaire constante. Dans le cas des récepteurs AM cette fréquence intermédiaire était de 455Khz. Une fréquence plus basse permet une meilleur sélectivitée. Cette fréquence intermédiaire est la différence entre celle de l'oscillateur local et la fréquence reçu. Puisque cette différence doit-être constante à 455Khz il faut que l'oscillateur local suive l'accord. C'est le rôle du condensateur variable d'assurer cette constance. L'oscillateur local fonctionne à 455Khz plus haut que la fréquence de réception de sorte que FRif=FRosc-FRrec. la capacitance des 2 sections varie ensemble. La ligne pointillée identifié var. con. sur le schéma représente ce lien mécanique entre les 2 sections du condensateur. Puisque la grille en 5 varie à la fréquence de l'oscillateur local alors que celle branchée sur 8 varie à la fréquence de réception on retrouve à l'anode du tube sur la broche 3 à la fois la somme et la différence de ces 2 fréquences. Mais le transformateur qui est branchée sur l'anode est un circuit accordé à la fréquence de 455Khz et ne laisse passer que la différence de fréquence.
Le tube 12SK7 est encore une pentode qui sert à amplifier la fréquence intermédiaire et sa sortie est aussi branchée sur un transformateur accordé sur 455Khz. Ces 2 filtres augmentent la sélectivité et permettent de réduire l'interférence des stations voisines en fréquence.
Le tube 12SQ7 comprend un double diode de détection et une triode amplificatrice. Sur les broches 4 et 5 on a les anodes des rectificatrices de démodulation. La démodulation d'un signal AM, c'est à dire la récupération du signal audio qui module la porteuse radio-fréquence, est simple. Il suffit de redresser le signal radio avec une diode et d'éliminer la radio-fréquence en la court-circuitant avec un condensateur. Dans ce circuit on voit que la filtration est à l'intérieur du boitier du transformateur IF et branché au bornes d'une résistance de 50Kohms. Ce signal audio résultant est acheminé vers la triode amplificatrice en passant par le contrôle de volume et un condensateur de 0.01µF relié à la grille sur la broche 2. La sortie de la triode contrôle la grille (broche 5) de la pentode 50L6GT qui est l'étage d'amplification audio final.
Contrôle de gain automatique
Notez la résistance de 3Mohms branchée sur le contrôle de volume. En ce point il y a un voltage DC négatif résultant de la rectification et de la filtration. Si vous suivez le fil qui part de là et s'en va vers la gauche on voit qu'il y a un condensateur de 0.05µF qui filtre encore plus. Celui-là élimine les fréquences audios. On ne veut pas que ce voltage varie avec le signal audio mais plus lentement selon l'amplitude du signal radio fréquence reçu. Plus le le signal de la station sous écoute est fort plus ce voltage est négatif. Notez que ce voltage est branché sur les grilles des 12SK7 et 12SA7 en passant à travers les bobines. Ce voltage contrôle le gain du tube pour garder autant que possible le volume audio constant lorsqu'on change de station ou que la réception d'une même station fluctue. C'est ce qu'on appelle le contrôle de gain automatique.
En conclusion
Il s'agit d'un circuit simple et facile à comprendre. Je ne vous décriré pas le fonctionnement d'un téléviseur de cette époque, au CÉGEP le cours sur la télévision prenait une session complète et était accompagné d'un bouquin de quelques centaines de pages.
Si vous possédez un thermomètre électronique qui donne aussi le pourcentage d'humidité de l'air, vous vous êtes peut-être demander comment ça fonctionne.
Voici à quoi peut ressembler un capteur hygrométrique. Je dis, peut, car certains capteurs sont enfermés à l'intérieur d'une coquille en plastique.
Il s'agit en fait d'un condensateur dont la valeur varie avec le taux d'humidité dans l'air. En effet la capacitance d'un condensateur est proportionnelle à un facteur qu'on appelle la permittivité. La permittivité est une propriété de l'isolant qui sépare les armatures du condensateur. Sur la photo on voit que les armatures sont imprimées sur un rectangle de céramique. Hors la permittivité de cette céramique varie en absorbant l'humidité qui est dans l'air. Donc l'appareil mesure la capacitance de la sonde et calcul le taux d'humidité à partir de cette valeur. Les spécifications du capteur donne la courbe de cette capacitance en fonction du taux d'humidité.
J'ai démonté une ampoule DEL défectueuse et analysé le circuit. Voici une explication du fonctionnement du circuit.
Le circuit était cellé dans la base. J'ai endommagé BL2 (marqué BL1 par erreur sur la photo) lors de l'extraction forcée. Les composants montés en trous passants sont sur cette face.
Le circuit imprimé est cuivré sur une seule face. Les composants montés en surface sont de ce côté.
En amérique du nord l'alimentation domestique fonctionne à 120 volt alternatif noté 120VAC. Cependant les DELs sont des composants semi-conducteur fonctionnant en courant continue à bas voltage. Par exemple la tension aux bornes d'une DEL blanche se situe entre 3.2 et 3.6 Volt. Donc il faut convertir la tension 120VAC en voltage DC. dans l'ampoule que j'ai démonté il y a 12 DELs en série, il faut donc une alimentation de 38 à 43 VDC pour alimenter la chaîne de DELs.
L'alimentation 120VAC arrive sur RF1 et FR2 qui sont des résistances bobinées qui font 15 ohms en résistance et 8µH en inductance. J'ai représenté ces résistances comme 2 composants dans une boite alors qu'en fait il ne s'agit que d'un composant qui ressemble en tout point à une résistance ordinaire. C'est l'indication RF* au lieu de simplement R* qui indique qu'il s'agit d'une résitance bobinée sur une ferrite pour ajouter un effet inductif. Ces inductances bloquent le passage des radiofréquences qui sont présentent sur l'alimentation secteur.
Le composant RV1 est un varistor. Ce composant sert à écrêter les surtensions transitoires qui se superposent à l'alimentation 120VAC.BD1 est un pont redresseur de tension, il s'agit de 4 diodes dans un seul boitier. Le redresseur ne supprime pas les ondulations. Sans le filtreur qui suit le voltage aux bornes -|+ du pont ressemblerait à ceci.
Les condensateurs C1, C2, C3 ainsi que la résistance R3 et l'inductance L3 servent à supprimer ces ondulations. Le voltage de crête aux bornes de C3 doit être d'environ 120*√2=170VDC.
Puisqu'on ne peut appliquer 170VDC directement sur la chaîne de DELs sans provoquer une destruction rapide, il faut contrôler le courant qui passe à travers. C'est le rôle du circuit intégré marqué régulateur sur la deuxième photo. Même si je n'ai pu trouver le feuillet de spécifications pour ce circuit intégré le principe de fonctionnement est le même de façon générale. Il s'agit d'une régulation par largeur d'impulsion. Le régulateur génère un train d'impulsion de fréquence fixe, de l'ordre de 100 à 200KHertz, mais de rapport cyclique variable.
Je dois dire que ce circuit m'a laissé perplexe au point où j'ai vérifié le schéma à partir du circuit imprimé 3 fois plutôt qu'une. Ça ne ressemble pas à un convertisseur abaisseur de tension habituel (buck converter). La chaîne de DELs est branchée en parrallèle avec BL2 et la diode D1 de sorte que la cathode de la chaîne de DELs se retrouve sur le positif de l'alimentation et l'anode est connectée sur la cathode de D1. La chaîne de DELs n'est pas connectée directement au moins de l'alimentation.
fonctionnement du circuit
Lorsque la tension du secteur est appliquée à l'ampoule le condensateur C3 se charge rapidement vers 170VDC en même temps que le condensateur C6 se charge à travers BL2 et D1 la diode DS2 de type TVS protège le condensateur C5 et la chaîne de DELs contre une tension inversée. Puisque le seul chemin entre le plus et le moins de l'alimentation est à travers C6, une fois celui-ci chargé le courant cesse de circuler à travers BL2 et D1. Le champ magnétique de BL2 s'effondre et génère une tension inversée à ses bornes. C'est là que la diode DS2 joue son rôle le plus important, protéger C3 et la chaîne de DELs contre les surtension. Ces diodes absorbent les transitoires en sens inverse de leur conduction normale lorsque la tension dépasse le seuil de protection. Cependant le seuil de protection de DS2 doit-être suffisamment élevé pour permettre à C5 de se charger au voltage de fonctionnement de la chaîne de DELS, soit environ 40 volts.
Le contrôleur 1S96-3GS commece à fonctionner et commute son transistor NFET par impulsion. Ce transistor de puissance pendant sa phase active connecte directement BL2 entre le plus et le moins de l'alimentation. l'inductance commence à laisser passer du courant et accumule de l'énergie dans son champ magnétique. Lorsque le transistor coupe encore une fois l'effondrement du champ magnétique de BL2 inverse la tension aux bornes de celle-ci et l'énergie se transfert dans C5.
Le voltage aux bornes de C5 est proportionnel à la durée des impulsions. Le 1S96-3GS contrôle le courant qui circule dans BL2 en mesurant le voltage aux bornes de R5 et R6 qui sont branchées en parralèle entre les broches 3 et 4. Si le voltage est trop bas la largeur des impulsions envoyé sur le gate du NFET est augmentée et vice-versa. C'est ainsi que la bonne valeur de l'alimentation des DELs est maintenue.
J'ai mesuré le courant d'une de ces DEL à une tension d'alimentation de 3.2 volt il est d'environ 250mA.
J'étais chez ma soeur lorsqu'elle m'a montré sa sonnette qui faisait un gros "hum", j'ai compris immédiatement qu'il s'agissait d'un condensateur de filtration défectueux. Il s'agit d'une sonnette sans fil qui se branche dans la prise murale à 120VAC. Il existe aussi des versions qui fonctionnent sur pile. Le bouton de la sonnette utilise une pile au lithium CR2032. Le fonctionnement de ces sonnettes est le même que celui des portes de garages. Le bouton de la sonnette contient un émetteur à 433.9Mhz qui émet un code tandis que le module sonnette contient le récepteur décodeur. Comme il s'agit d'une sonnette l'appareil contient aussi un générateur de son. Dans le cas spécifique de cet appareil, il y a 4 transistors utilisés comme amplificateurs radio-frquence ainsi qu'un circuit intégré TX102R qui est le récepteur décodeur fonctionnant à 433.9Mhz IC1. Un deuxième circuit intégré marqué SXD0033R, IC2 et le générateur de mélodies. Ce circuit utilise la synthèse FM comme on retrouvait dans les ordinateurs des années 80 tel que les Commodore VIC20 et 64. Mais comme il est déjà pré-programmé avec un certain nombre de mélodies il suffit d'un petit boitier SOIC-8, puisqu'il n'a pas besoin d'une interface de programmation. Le troisième circuit intégré IC3 est simplement un ampli audio LM386. Cette sonnette est fabriquée en Chine par la compagnie Quhwa.
réparation
photos du circuit imprimé
Comme je l'avais spoçonné dès le départ il s'agissait bien du condensateur de filtration de l'alimentation qui était défectueux (C6). La réparation fut donc des plus simple et rapide. J'ai dessiner le circuit d'alimentation pour illustration.
Le condensateur C1 en série avec la résistance R2 limite le courant maximum qui peut circuler dans le circuit à environ 100mA puisque l'impédance de Zc1=1/(2*PI*60*2.2e-6)=1206 ohms. La zener diode 1N4739A a une tension de régulation de 9.1 volts, donc c'est à cette tension que le circuit électronique fonctionne. C6 est le condensateur que j'ai du remplacé.
Si vous voulez voir cette sonnette en action suivez ce lien.
J'utilise Ubuntu 24.04LTS sur mon ordinateur de développement. La version de SDCC qui est installé par la commande sudo apt install sdcc est la version 2.4.0 alors que la dernière version disponible est 2.5.0. Donc pour mettre à jour SDCC sur mon ordinateur je devais reconstruire les binaires à partir des sources. La procédure est simple lorsque les dépendances sont satisfaites. Donc on doit d'abord s'assurer qu'elles le sont.
prérequis
Le projet SDCC utilise le compilateur GCC ainsi que les outils binutils. Lorsque j'avais installé la version 4.4.0, lorsque j'ai lancé la commande ./configure j'ai eu une erreur me disant que libboost-graph-dev devait-être installé. Je l'ai donc installé avec la commande sudo apt install libboost-graph-dev. Avant de relancé ./configure assuront nous donc d'avoir les outils et les librairies nécessaires installées sur le système.
$ apt list --installed gcc binutils libboost-graph-dev
En train de lister... Fait
binutils/noble-updates,noble-security,now 2.42-4ubuntu2.8 amd64 [installé]
gcc/noble,now 4:13.2.0-7ubuntu1 amd64 [installé]
libboost-graph-dev/noble,now 1.83.0.1ubuntu2 amd64 [installé]
procédure
Une fois l'archive des sources du projet a été téléchargée. Il suffit de décompresser l'archive dans le dossier de son choix. Le dossier principal s'appelle sdcc-src-2.5.0 et contient le dossier sdcc-4.5.0. Dans un terminal on se déplace vers ce dernier dossier et on lance les 3 commandes suivantes:
./configure Cette commande sert à vérifier que le système possède les outils et les librairies nécessaire à la construction des binaire. S'il manque un outil ou une librairie un message d'erreur s'affiche. Cette opération prend moins d'une minute.
make Cette commande compile tous les binaires du projet. Sur mon ordinateur ça prend environ 30 minutes. S'il y a une erreur alors il faut la régler et relancer make. Dans mon cas il n'y a pas eu d'erreur.
sudo make install Cette dernière commande copie les binaires dans /usr/local/bin et effectue d'autres tâches connexes. Ce n'est pas long, moins d'une minute.
Le Charlieplexing est une technique qui permet de contrôler un grand nombre de DELs avec petit nombre d'entrée/sortie binaires d'un MCU. Pour utiliser cette technique il faut que chaque E/S utilisée soit configurable selon 3 états.
En mode entrée haute impédance. C'est à dire sans résistance pull up.
En mode sortie haute. C'est à dire à Vdd.
En mode sortie basse. C'est à dire à Vss
Cette technique est rendue possible par le fait que les Diode Électro-Luminescentes comme leur nom l'indique ne conduisent que dans un seul sens. En connectant 2 DELs tête bèche entre 2 E/S d'un MCU on peut allumer l'une ou l'autre ou les éteintre. Si Une des broche est configurée en mode sortie haute et l'autre en mode sortie basse la DEL dont l'anode est sur la sortie haute va allumée. Il suffit d'inverser la polarité des 2 broches pour allumer l'autre DEL. Pour les éteindre il suffit de configurer les 2 E/S en mode entrée haute impédance.
Dans ce circuit si PB3 et PB6 sont en mode entrée haute impédance les 2 DELs sont éteintes.
Si PB6 est en mode sortie haute et PB3 en mode sortie basse alors D26 est allumée.
Si PB6 est en mode sortie basse et PB3 en mode sortie haute alors D25 est allumée.
Pour que cette technique fasse du sens dans son utilisation il faut avoir plus de DELs à contrôler que le MCU dispose d'E/S. Le nombre de DELs multiplexables par cette technique est de N*(N-1) où N est le nombre d'E/S disponibles. Dans le circuit de démonstration qui suis on dispose de 4 E/S donc on peut contrôler 12 DELs.
Notez que les broches 7 et 8 du MCU ne sont pas utilisées pour le multiplexeur. La raison en est qu'elles ne sont pas configurable en mode sortie push-pull. Ce sont des broche open drain conçues pour les bus I2C.
À un instant donné une seule DEL peut-être allumée mais en faisant fonctionner le multiplexeur rapidement avec la persistance de la vision on peut créer l'illusion qu'elles sont toutes allumées en même temps.
Circuit de démonstration
interconnection des DELs
Dans la table suivante C est pour cathode et A pour anode.
PA0
PA2
PB5
PB6
D1C
D1A
D2A
D2C
D3A
D3C
D4A
D4C
D5A
D5C
D6A
D6C
D7C
D7A
D8C
D8A
D9C
D9A
D10C
D10A
D11C
D11A
D12A
D12C
vidéo de démonstration
Circuit version 2
J'ai fait un montage permanent avec des DELs bleus montées en cercle. Le Firmware contient un engin d'animation avec un jeu de commandes simple pour créer différentes animations.
Ce circuit utilise 3 switches boutons à contact temporaire. 2 servent pour sélectioner l'animation. Le 3ième est pour faciliter la programmation du MCU.
Description du firmware
Les fichiers du projet sont disponible ici. C'est écris en assembleur pour SDCC
La minuterie TIMER 4 est configurée pour générer une interruption à intervalle d'une milliseconde. Le fonctionnement du multiplexeur est géré par la routine d'interruption suivante. Ce code est dans le fichier hardware_init.asm
;------------------------------
; TIMER 4 is used to maintain
; timers and ticks
; interrupt interval is 1 msec
;--------------------------------
Timer4UpdateHandler:
clr TIM4_SR ; reset interrupt flag
; multiplexer control
call leds_off
ld a,mx_step
inc a
cp a,#12
jrmi 1$
clr a
4$:
; check if pause is active
btjf flags,#F_PAUSE,1$
dec pause_timer
jrne 1$
; end of pause
bres flags, #F_PAUSE
1$:
; turn on LED if bit set
; shift the corresponding bit in carry
ld mx_step, a
ldw x, led_set
tnz a
jreq 3$
2$: srlw x
dec a
jrne 2$
3$: srLw x ; now bit is in carry flag
jrnc 9$ ; bit is reset
; bit set turn on LED
ld a,mx_step
call led_on
9$: callr read_buttons
iret
La variable mx_step contient un entier dans l'intervalle {0..11} qui indique quelle DEL doit-être contrôlée à cette étape. cette valeur est incrémentée à chaque interruption de sorte que la boucle de 12 DELs est parcourue en 12 interruptions soit 12msec. Ce qui donne une fréquence du multiplexeur de 83 cycles/seconde. C'est suffisant pour éviter l'effet de scintillement.
Les bits 0..11 de la variable led_set contiennent le patron de configuration allumée/éteint des 12 DELs. Si le bit est à 0 la DEL reste éteinte et elle est allumée si le bit est à 1
L'interruption gère aussi la lecture des boutons tactiles ainsi que le délais de la routine pause qui contrôle la vitesse de l'animation.
Notez que le fonctionnement du multiplexeur est indépendant de l'animation. On pourrait mettre un patron dans la variable led_set et à partir de là faire tourner le programme dans une bouche infinie. Le résultat serait une configuration de DELs fixe. Puisque le logiciel d'animation est un programme client du multiplexeur il est dans un fichier différent, animation-demo.asm
Une animation est une liste de mots de 16 bits. Chaque mot est structuré de la façon suivante:
bits
description
0..11
ensemble de bits représentant chaque DEL, bit 0 pour la DEL 1 à bit 11 pour la DEL 12
12..15
commande
Liste des commandes
commande
valeur
description
CPY
0
copie les bits 0..11 dans la variable led_set.
INC
1
copie les bits 0..11 dans la variable led_set et incrémente la variable anim_step.
DEC
2
copie les bits 0..11 dans la variable led_set et décrémente la variable anim_step.
RST
3
Boucle l'animation à partir du début de la liste.
SPD
4
Initialise la variable anim_delay avec les bits 0..7 et incrément la variable anim_step. Ce délais détermine le temps en multiple de 12 msec entre chaque étape de l'animation.
RND
7
Initialise la variable led_set avec une valeur aléatoire.
Le bit 15 de chaque commande est appellée INV et a pour effet lorsqu'il est à 1 d'inverser les bits 0..11 avant de les copier dans anim_step.
La variable anim_step est lue et sert à indexer la table de l'animation dont l'adresse est conservée dans la variable anim_table. Les bits 12..15 sont extrait et un sélecteur de commande est utilisé pour sélectionner le code à exécuter pour cette commande. Pour les commandes 0..3 ainsi que 7 la routine pause est appellée pour générer un délais avant l'exécution de la prochaine commande. Ce délais est consrvé dans la variable anim_delay et contrôle la vitesse d'exécution de l'animation.
La liste des animations disponible est conservée dans la table anim_list et l'animation désirée est sélectionnée en utilisant les boutons btn1 et btn2. Au démarrage c'est la première animation de la liste qui est active. btn1 descend dans la liste et btn2 remonte. L'indice de l'animation active est conservé dans la variable anim_select.
Je continu à travailler sur le projet pomme-I+. L'ordinateur dispose maintenant d'un SSD de 16Mo et d'un générateur de tonalité. Les 2 périphériques sont montés sur la même carte qui est connectée sur le VIA W65C22. Ce circuit intégré contient
2 ports de 8bits, chaque bit de ces ports peuvent-être configurés indépendemment comme entrée ou sortie.
De plus chaque port posède 2 lignes de contrôles CA1, CA2 pour le port A et CB1, CB2 pour le port B
Le VIA possède en plus 2 minuterie de 16 bits.
La minuterie TIMER1 est utilisée pour générer des tonalités en onde carrées en sortie sur la broche PB7. Cette sortie est branchée sur un ampli audio LM4861 et un petit haut-parleur est installé sur carte.
La minuterie TIMER2 est utilisée pour générer une interruption à interval de 1 milliseconde. Cette interruption incrémente la variable système MSEC.
Les lignes CB1 et CB2 sont utilisées comme interface SPI pour communiquer avec la mémoire FLASH W25Q128 qui tient lieu de SSD pour l'ordinateur.
J'ai complété version 2 de l'interface graphique de eeProg.
démonstration
2025-03-27, nouvelle version
Nouvelle version de L'application maintenant disponible GUI_V2.0R2. Le firmware de la carte NUCLEO a aussi été modifié et doit donc être reflashé avant d'utiliser cette version de l'application. FW_V2.0R1
changements
Cette version corrige un bogue mineur qui faisait afficher en double le résultat d'un view range lorsque la commande était saisie sur la ligne de commande.
Augmentation de la vitesse de communication entre le programmeur et le PC à 460800 BAUD au lieu de 115200.
2025-03-31, version 2.0R5
Plusieurs problèmes ont été corrigés et un nouveau menu a été ajoutée.
Le dialogue de sélection du port sériel comprend maintenant un contrôle édit de plus. Pour régler un problème de perte de données en réception j'ai du modifier le firmware de la carte NUCLEO et l'application pour ajouter un délais programmable entre l'envoie de chaque ligne au PC par le programmeur. Ce délais en millisecondes doit être dans l'intervalle hexadécimal {0..F}, soit de 0 à 15 millisecondes. Je n'ai ne problème de pertes de données que sur mes laptops en Windows 11. Sur mon PC configuré avec Ubuntu/Linux 24.04LTS je peux configurer ce délais à 0.
Une commande reboot a été ajoutée au menu Files, cette commande envoie un signal au programmeur pour que le firmware se réinitialise. Vous devez resélectionner l'EEPROM après cette opération.
J'ai terminé la fabrication du programmeur d'eeprom version 2.2 Cette version ajoute un embase PLCC-32 car il est de plus en plus difficile d'obtenir des circuits intégrés au format DIP.
vidéo de présentation
À faire
Je dois modifié le logiciel du programmeur pour permettre la programmation des mémoires d'une capacité allant jusqu'à 512KO tel que disponibles dans le format PLCC-32.
Je suis en train de travailler sur un ordinateur 8 bits basé sur un processeur W65C02S de Western Design Center. Ce processeur est une version CMOS du vénérable MOS 6502 qui a été utilisé dans de nombreux ordinateurs des années 70 et 80. J'ai baptisé ce projet pomme_1+ car dans sa structure il ressemble beaucoup au Apple I de Steve Wozniak. Comme le Apple I il est conçu pour communiquer avec un terminal texte. Mais dans les fait je pourrais développer un terminal graphique à la place. Il y a de la place sur la carte périphérique pour installer une carte Pi Pico qui permettrait d'avoir une sortie VGA et un espace de stockage des programmes sur le même module.
Prototype
J'ai monté le prototype sur 3 cartes Ptsolns pleine longueur collées l'une à l'autre par la tranche. La carte centrale comprend
l'oscillateur de 3.6864Mhz
Le MPU W65C02S
Le sélecteur d'adresse
La carte de droite contient
Une mémoire RAM de 32Ko
Une mémoire EEPROM de 8Ko
Une embase pour une mémoire supplémentaire EEPROM de 8Ko
La carte de gauche contient
Périphérique ACIA (Asynchronous Communication Interface Adapter) W65C51 qui est une interface de communication sérielle.
Un convertisseur de niveau MAX232CPE pour adapter les signaux 5 volt de l'ACIA au standard RS232.
Un espace suffisant pour ajouter un autre périphérique
Vidéo de présentation du pomme 1+
État du projet en date d'aujourd'hui
En ce qui concerne l'aspect matériel, je n'ai pas encore décidé quel genre d'interface utilisateur je vais installé, texte seulement comme le pomme I ou graphique. Il faut aussi une mémoire pour préserver les programmes.
En ce qui concerne l'aspect logiciel. Je veux dévelloper un système d'exploitation dans le style de CP/M qui serait résident dans l'EEPROM principale et ensuite adapter Microsoft BASIC qui serait résidant dans l'EEPROM optionnelle. Ce BASIC était celui utilisé dans la majorité des ordinateurs des années 70,80.
J'ai créé un Front end graphique pour le programmeur d'EEPROM que j'ai présenté dans mon message précédent. Pour le moment cette version ne fonctionne que sur Ubuntu/Linux.
J'avais besoin de programmer une EEPROM AT28C64B alors j'ai fabriqué un programmeur à partir de matériel que j'avais en inventaire. Comme toujours ce projet est sur github.com
Ce programmeur permet de programmer aussi les AT28C256 car c'est le même brochage à la différence que les 2 broches marqués NC sur la AT28C64B sont utilisés pour les 2 bits d'adresses supplémentaires A13 et A14 requis pour adresser 32Ko au lieu de 8Ko. Notez aussi que la carte NUCLEO_8S208RB a un jumper JP3 qui permet de sélectionner la tension d'alimention du MCU entre 3.3V ou 5V. Ça permet donc de programmer les versions AT28BV64B et AT28BV256 disponibles en format SOIC-28 qui fonctionnent à 3.3 volt. Cependant il faut souder ces componsants sur un adapteur comme celui-ci
pour les utiliser avec ce programmeur. Il est important de s'assurer que le socket ZIF peut accepter les IC DIP-28 étroits de 300mil.
1 embase DIP-28 sans force d'insertion (ZIF socket).
carte de prototypage à pastille de soudure 7x10cm
fil AWG 30 pour le filage.
montage
La carte de l'embase est conçue pour se brancher sur les connecteurs CN1 et CN9 de la carte NUCLEO_8S208RB.
Schématique
La schématique a étée dessinée dans KiCAD version 8.0.6
Utilisation
L'embase accepte les EEPROM compatibles AT28C64B de 8Ko et AT28C256 de 32Ko au format DIP-28.
Une fois la carte NUCLEO_8S208RB branchée au PC il faut utiliser un émulateur de terminal pour communiquer avec le programmeur.
Liste des commandes
L'interface reprend le format du WOZMON avec quelques différences aux niveaux des commandes. Au lieu de lire et d'écrire dans la mémoire du STM8 les opérations sont effectuées sur l'EEPROM. dans de qui suit adr et data doivent-être entrés en hexadécimal comme dans le WOZMON.
adr<RETURN> affiche le contenue de l'EEPROM à cette adresse. un point (.) suivit de <RETURN> affiche le contenu de l'adresse suivante.
adr1.adr2<RETURN> affiche le contenue de la plage mémoire à partir de adr1 jusqu'à adr2. 16 octets sont affichés par ligne.
adr: data data data ...<RETURN> écriture d'une liste d'octets dans la mémoire EEPROM à partir de l'adresse adr.
adr1Xadr2<RETURN> Efface la plage mémoire de adr1 jusqu'à adr2.
adr"chaîne de caractères ASCII<RETURN> programme la chaîne de caractères dans l'EEPROM à partir de l'adresse adr la chaîne est terminée par un 0.Il ne faut pas mettre de guillemet à la fin de la chaîne.
Il est possible d'entrer une liste de commandes de programmation dans un fichier texte et d'utililser la fonction send RAW file du terminal pour l'envoyer au programmeur. Cependant le terminal doit-être configuré pour un délais de 10msec entre l'envoie de chaque ligne. C'est le temps que ça prend à l'EEPROM pour compléter la programmation d'une ligne.
Capture d'écran d'une session
eeProg, Copyright Jacques Deschenes, 2025
version 1.0.0
#0
0000: 54 T
#.
0001: 48 H
#.
0002: 45 E
#0.2F
0000: 54 48 45 20 51 55 49 43 4B 20 42 52 4F 57 4E 20 THE QUICK BROWN
0010: 46 4F 58 20 4A 55 4D 50 20 4F 56 45 52 20 54 48 FOX JUMP OVER TH
0020: 45 20 4C 41 5A 59 20 44 4F 47 2E 00 01 02 03 04 E LAZY DOG.
#0X2F
#0.2F
0000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
#0"THE QUICK BROWN FOX JUMP OVER THE LAZY DOG.
#2C: 1 2 3 4 5 6
#32: A B C D E AA 55
#0.3F
0000: 54 48 45 20 51 55 49 43 4B 20 42 52 4F 57 4E 20 THE QUICK BROWN
0010: 46 4F 58 20 4A 55 4D 50 20 4F 56 45 52 20 54 48 FOX JUMP OVER TH
0020: 45 20 4C 41 5A 59 20 44 4F 47 2E 00 01 02 03 04 E LAZY DOG.
0030: 05 06 0A 0B 0C 0D 0E AA 55 FF FF FF FF FF FF FF
#
Ce petit circuit simple permet de détecter une inondation et de déclencher une alarme sonore.
Fonctionnement
Ce multivibrateur utilise 2 transistors, Q12N3904 qui est un petit transistor NPN d'usage général dans un boitier TO-92 et Q2 TIP32C qui est un transistor de puissance PNP dans un boitier TO-220 qui alimente le haut-parleur.
Lorsque les 2 électrodes sont mise en contact à travers un milieu conducteur comme l'eau, Q1 reçoit un courant dans sa base et entre en conduction. Le collecteur de Q1 fournie à son tour du courant à la base de Q2 qui lui aussi entre en conduction. Cependant à travers C1 et R2 il y a une rétro-action positive qui fait entrer les 2 transistors en saturation rapidement. C1 se charge et lorsqu'il a atteint sa pleine charge le courant dans la base de Q1 dimininue donc sa conduction aussi et entraîne Q2 dans la même direction. La conséquence est que le courant dans le collecteur de Q2 diminue et donc le voltage sur le haut-parleur. Encore une fois par rétro-action positive à travers C1 et R2 le voltage à la base de Q1 diminue rapidement et les 2 transistors coupent rapidement. À ce moment la tension à la base de Q1 est négative à cause de la charge qui s'est accumulée dans C1 durant la phase 1. Cependant C1 va se décharger à travers R1, R2 et les sondes. Lorsque le voltage aux bornes de C1 deviendra légèrement positif Q1 va se remettre à conduire pour débuter un nouveau cycle. La durée de la première phase est déterminée par la constante de temps (R2+résistance de la base de Q1)*C1 et la durée de la seconde phase est déterminée par la constante de temps (R1+R2+résistance entre les sondes)*C1. Avec les valeurs des composants choisis on on obtient une fréquence d'environ 990 Hertz lorsqu'on met les 2 fils de sonde en court-circuit. Cependant dans l'eau la conduction entre les 2 fils est moins bonne donc la fréquence diminue.
Aperçu du signal
Dans cette capture de l'image à l'oscilloscope la courbe en jaune est le signal sur la base de Q1 et celle en bleu est le signal aux bornes du haut-parleur. Cette capture a étée réalisé avec C1 de 4,7nF et les sondes en court-circuit. L'oscilloscope indique une fréquence 990 Hertz et un rapport cyclique près de 50%. Lorsque les sondes sont dans l'eau la résistance de décharge de C1 augmente donc la phase 2 rallonge, ce qui diminue la fréquence ainsi que le rapport cyclique.
La phase 1 est lorsque les transistors sont en saturation et que C1 se charge et la phase 2 celle ou ils sont bloqués et C1 se décharge.
Dans ces conditions l'alimentation draine 100ma à 3 volts.
démonstration
Dans ce démo on voit que la fréquence lorsque les 2 fils sont en court-circuit est plus élevée que lorsque les fils sont dans l'eau. Ceci est du au fait que la résistance de l'eau s'ajoute à celles de R1 et R2.
Le traceur de cable est un outil très utile lorsqu'on travaille sur les réseaux cablés ou les systèmes téléphoniques. On s'en sert pour identifier un cable dans le panneau de jonction à partir de la prise murale dans un local. Comme tous les fils des prises murales aboutissent dans ce panneau et que la plupart du temps ils ne sont pas indentifiés cet outil a été inventé dans le but de simplifier cette identification. Il est constitué de 2 modules.
Un générateur de tonalité. Généralement il émet 2 tonalités en alternance rapide pour que le signal soit facilement reconnaissable à travers le bruit.
Une sonde qu'on balait le long des barettes du panneau de jonction. Il n'y a pas de contact physique entre la sonde et les cables. La détection se fait par coupable électromagnétique.
Lorsque la sonde s'approche du bon cable on entend la tonalité du générateur. La sensibilité est habituellement de 3 à 4 centimètres mais ça dépend de la résistance de terminaison de la ligne. Si la ligne est ouverte en extrémité le signal est plus fort que lorsqu'elle est en court-circuit.
Le générateur de tonalité
Ce module est très simple à réaliser avec une minuterie double TLC556 (2 minuteries 555 dans le même boitier 14 broches).
La première minuterie fonctionne en basse fréquence et est utilisée pour commuter les tonalités. Dans ce montage la période est d'environ 0,65 seconde. La sortie de cette minuterie est branchée à travers la résistance R10 à l'entrée CV de la deuxième minuterie. Cette entrée contrôle la fréquence en modifiant le point de bascule des 2 comparateurs de la minuterie. Dans mon montage les tonalités sont d'environ 570 et 630 hertz.
réalisation
Le montage est fait sur une plaquette à pastille de 5x7cm. Les pastilles de cuivre sont sur une seule face. La plaquette est montée dans un petit boitier en plastique de 98H x 58L x 22P mm.
La sonde
La sonde se compose d'un amplificateur et d'un préamplicateur contenu dans des boitiers différents. L'ampli est basé sur un LM386-N.
Le préamplificateur est contenu dans un tube d'aluminium de 21mm de diamètre intérieur et de 10cm de long. Le préamplificateur est branché à l'amplificateur par un connecteur mini-DIN 3 broches.
J'ai utilisé un transistor NJFET à l'entrée du préamplificateur pour avoir une impédance d'entrée maximale puisque le couplage avec le signal se fait par couplage capacitif il est important que l'impédance d'entrée soit très élevée. Un circuit avec transistor bijonction n'aurait pas une impédance d'entrée suffisante.
Les condensateurs C4, C5 ainsi que la résistance R5 forme un filtre passe-bande. J'ai utilisé ltSpice pour simuler le circuit du préamplificateur et obtenir sa courbe de réponse.
Le gain en voltage du préamplifcateur est d'environ 5DBv selon la simulation.
réalisation
Une carte identique de 5x7cm a été utilisée pour le montage de l'amplificateur. Celui-ci nécéssitant un boitier plus gros de 120H x 65L x 38P mm.
Le tube d'aluminium est récupéré d'un balais à neige pour auto et il est bouché à chaque extrémité par 2 morceaux de liège coupés dans un bouchon de bouteille de vin. Une languette de 21mm de largeur a été découpé dans une carte 5x7cm pour le préamplificateur inséré dans le tube d'aluminium. L'antenne de la sonde est un fil de cuivre calibre 14 AWG recouvert d'une gaine thermorétrécicante (shrink tubing). La longueur est arbitraire.
J'ai recommencé à travailler sur le moniteur du pomme I en ajoutant des fonctions au moniteur. Il s'agit de la version 1.4R0
Dans cette version j'ai ajouter les commandes:
xxxxS nom nnnn permet de sauvegarder la plage mémoire débutant à l'adresse xxxx et de nnnn octets dans le fichier nom.
xxxxL nom permet de charger en mémoire RAM le fichier nom à l'adresse xxxx.
La touche rapide CTRL+D permet d'afficher la liste des fichiers.
xxxxZ nnnn permet de mettre à zéro une plage mémoire à partir de l'adresse xxxx et d'une taille de nnnn octets.
Après avoir ouvert le boitier et extrait le circuit imprimé il est apparut évident que le fusible était brulé. Il ne suffit pas de le remplacer, il faut se demander pourquoi il a brûlé? Même si on ne possède aucune information sur le circuit on peut figurer que la cause la plus probable est une déficience dans le circuit de puissance. Il y a 2 composants montés sur des dissipateurs de chaleur. Il faut donc chercher à identifier ces composants et vérifier si l'un d'eux ou les 2 ne serait pas la cause de la défectuosité.
Circuit imprimé, fusible F1 et TRIAC retiré. Le pont redresseur est monté sur le petit dissipateur de chaleur et le boitier orange est un relais.
J'ai d'abord porté mon attention sur le composant au format TO-220 monté sur le plus gros dissipateur de chaleur. Sur le circuit imprimé c'est inscrit in sur la broche de gauche, out sur la broche du centre et g sur la broche de droite. Je croyais qu'il s'agissait d'un régulateur de tension pour alimenter le circuit intégré. l'ohmètre indiquait un court circuit entre les broches in et out. Je l'ai donc retiré du circuit. L'indication ne me disait rien, je m'attendais à quelque chose comme 7805 pour un régulateur linéaire de 5 volt, mais ce n'était pas ça.
composant mystère
SanRex?T8E6?. Recherche dans l'internet, rien! pas de datasheet sur le site du fabriquant! Examen du circuit imprimé, je vois que ce composant est branché au neutre de l'alimentation 120 VAC à travers une résistance de puissance de 0,1 ohm qui arrive sur sa broche in et que sa broche out va sur une broche de l'autre composant de puissance monté sur un dissipateur de chaleur. Ce composant avec ces 4 broches ressemble à un pont redresseur que je me dis. Vérification de l'étiquette du moteur, c'est un moteur qui fonctionne à 120VDC. Ça fait du sens, le AC doit-être redressé pour alimenter le moteur et il faut contrôler sont alimentation et le composant que j'ai retiré ne peut-être qu'un TRIAC dans ce cas car il est monté du côté AC du pont redresseur et on utilise normalement un TRIAC pour contrôler une alimentation AC en puissance.
120V/60hertz convertie en DC
Je suis donc au prise avec un TRIAC inconnu que je dois remplacer. L'étiquette à l'arrière de la déchiqueteuse indique que l'appareil consomme 3 ampères. Le fusible est de 5 ampères. Donc un TRIAC capable de passer un courant 8 ampères (paramètre It(rms)) et d'un voltage de coupure répétif maximum (paramètre Vdrm) de 600VAC devrait faire l'affaire. Il me reste à vérifier comment est alimenté le gate du TRIAC. Reverse ingeneering du circuit. Je constate qu'il est alimenté directement par le micro-contrôleur HT46R47 par la broche GPIO PA5 à travers la résistance R4 de 200 ohm. J'ai trouvé le feuillet de spécification du microntrôleur dans l'internet et j'ai pu vérifier que les GPIOs peuvent sourcer un courant (paramètre Ioh) maximum de 10mA lorsque le MCU est alimenté à 5Volt. Donc il me fallait un TRIAC avec les paramètres suivants:
Vdrm (repetitive peak off state voltage) minimum de 400VAC pour avoir une marge de sécurité.
It(rms) (non repetitive on state current) minimum de 5 ampères pour avoir une marge de sécurité.
Igt (gate trigger current) maximum de 5mA pour avoir une marge fonctionnelle.
J'ai arrêté mon choix sur le BT127-600D.
Vdrm 600 volt
It(rms) 8A
Igt maximum 5mA
De plus le gate est conçu pour être branché directement à un microcontrôleur comme indiqué dans le feuillet de spécifications: This very sensitive
gate "series D" triac is intended to be interfaced directly to microcontrollers, logic integrated circuits and other low power gate trigger circuits.
Composants commandé et reçus. Fusible et TRIAC installé appareil réparé.
Un coup parti je n'allais pas m'arrêter là. Comme le circuit imprimé est simple face qu'il y a peu de composants j'ai décidé de faire le reverse engineering du circuit.
Il s'agit d'un appareil conçu pour l'Amérique du nord et fonctionne donc sur une alimentation secteur de 120VAC. Il y a 2 protections contre les accidents réalisées par les microswitch SW1 et SW2. La première (schredder on bin) coupe l'alimentation lorsque la déchiqueteuse est soulevée du bac de réception. La deuxième (emergency key) coupe l'alimention lorsque la clé rouge est retirée de sa fente.
Au point de vue électrique, il y a 2 protections:
Le fusible F1 de 5 ampères a bien joué son rôle lorsque le TRIAC a flanché pour devenir court-circuit.
Le fusible F2 est une protection contre la surchauffe du moteur et ouvre le circuit au cas ou il y a surchauffe. Le microcontrôleur mesure le courant qui passe à travers la résistance de 0,1 ohm et lorsque le TRIAC est commandé mais qu'aucun courant n'est détecté dans le circuit le MCU en détuit que F2 est possiblement ouvert et indique une surchauffe en allumant la LED over heat.
Il y a 2 opto-coupleurs.
Paper detection est installé en travers de la fente de réception des feuilles et informe le MCU qu'il faut démarrer le moteur. Tant qu'il y a détection de papier le moteur tourne.
bin full detection est installé au fond de l'unité de déchiquetage et lorsque le bac est plein la LED full s'allume.
photo détecteur bac plein
Le relais avec contacts DPDT sert à inverser la rotation du moteur lorsque l'appareil et en mode REV. Cette fonction est ulitisée lorsqu'il y a bloquage de l'appareil et qu'on veut faire ressortir les feuilles bloquées.
L'alimentation du MCU est régulée par la zener diode ZD3. Une seule diode 1N4007redresse la tension AC, donc le redresseur fonctionne en demi-phase ce qui nécessite un bon filtrage assuré par plusieurs condensateurs. Il y a les 2 électrolytics E3 et E4 de 470µF/16V ainsi que les condensateurs céramiques montés en surface C5 et C6.
Le relais nécessite 24VDC pour contrôler sa bobine. Cette alimentation est fournie par les composants D5 diode redresseuse. E2 électrolytique de 220µF/35V et régulé par 2 zener en série ZD1 et ZD2.
La bobine du relais est contrôlée à travers le transistor Q3 de type PNP qui lui-même est contrôlé par le transistor Q1 de type NPN. C'est la sortie GPIO PA2 du MCU qui contrôle la base de Q1.
Le MCU possède 4 entrées de convertion analogique/numérique.
AN0 utilisée par l'optocoupleur qui détecte un bac plein.
AN1 mesure le courant à travers la résistance de 0,1 ohm. Le MCU allume la LED over heat s'il n'y pas de de courant.
AN2 pas utilisée.
AN3 utilisée par l'optocoupleur qui détecte la présence de feuille dans la fente.
Cette image nous montre la polarité du gate et de A2 par rapport à l'électrode A1, aussi nommée MT1. selon les différents modes d'opérations. Dans le cas de cette déchiqueteuse le TRIAC est utilisé dans les modes (cadrants) 2,3. Si on regarde la schématique on constate que le Vdd du MCU est connecté au neutre de l'alimentation secteur et que Vss est négatif par rapport au neutre. Bien que j'ai oublié de l'indiqué sur la schématique l'électrode du TRIAC du côté de la résistance est A1 et celle du côté de F2 est A2. Ceci est nécessaire pour que le MCU puisse contrôler le TRIAC car comme on le voie sur l'image dans les cadrants 2 et 3 G doit-être négatif par rapport à A1 pour faire entrer le TRIAC en conduction. Donc lorsque le MCU veut bloquer le TRIAC il met la GPIO PA5 à Vdd et lorsqu'il veut déclencher la conduction du TRIAC il envoie une impulsion négative sur la broche.
Pour qu'un TRIAC demeure en conduction il faut qu'un courant minimum circule entre A1 et A2. Comme en courant alternatif le voltage repasse à zéro à toutes les demi-période il faut que le MCU envoie une impulsion sur le gate au début de chaque demi-cycle, c'est à dire 120 fois par seconde. Dans le but de synchroniser ces impulsions avec le fréquence du secteur la ligne est monitorée au point A par le MCU sur l'entrée PA4 à travers les résistances R10 et R11.