jeudi 12 janvier 2017

Premier prototype fonctionnel

Depuis mon dernier article j'ai enfin assemblé un proto complet. D'abord une électronique après avoir commandé un nouveau lot de 10 PCB. Le premier présentait en effet quelques erreurs, une piste "oubliée", un couac sur le type de boitier du capteur de température DS18B20, ou encore des diamètres de perçages insuffisants pour passer la bonne section de fil.

Les nouveaux PCB étant arrivés j'ai procédé à l'assemblage d'une carte complète. Il faut environ une heure avec un peu d'habitude pour cette opération.

Le circuit a donc été testé, premier constat la mesure de température est inopérante, empêchant le démarrage de la lampe qui se croit en surchauffe. Après après shunter la sécurité cela démarre. Le routage des pistes semble bon, aurais-je trop chauffé les oreilles du DS18B20 au soudage ?

Toujours est il que la lampe produit désormais de la lumière.

Second souci, j'ai toujours du scintillement à certains niveaux de puissance (ni au max ni au min), bizarre. Après être passé sur une source à base d'accus 18650 le problème à disparu, je touche peut-être les limites de mon alim chinoise à 3€50 !

Je réalise maintenant le montage dans un boitier en impression 3d, la galère avec mes gros doigts de mécano ! Petit détail, je n'avais pas prévu l'épaisseur du câble qui passe entre une diode sous le pcb et le boitier, ça ramponne. Pas grave pour un premier test.

Quelques photos :

Mon pack batterie temporaire

Vue de l'arrière



Vue de l'avant

Bilan ça fonctionne, à un détail près : à forte puissance j'ai des coupures, peut-être liées à une surchauffe des drivers qui embarquent une protection thermique. Je vais essayer de brider la puissance à une valeur permettant d'éviter ces coupures.

Mon montage des drivers n'est en tout cas pas optimal, en effet ceux-ci présentent un pad thermique en face inférieur qu'il faudrait souder au pcb. L'implantation existe sur le PCB mais impossible de réaliser le soudage "à la main" cela ne serait faisable que sur un vrai soudage cms en usine. A plus court terme on peut envisager de rajouter de la pâte thermique avant de mettre le circuit en place.

Concernant la mesure de température je vais probablement refaire un proto en m'appliquant à ne pas surchauffer le DS18B20 pour valider le fonctionnement (qui était bon en proto ...).



mercredi 21 septembre 2016

Programmateur

Un petit article pour illustrer le programmateur évoqué précédemment. C'est un Arduino Nano qui sert de programmateur, la connexion avec la puce se fait soit pour une puce seule via le socket (malheureusement je n'ai pas trouvé de socket au format SOIC14 de l'ATTiny841 mais uniquement au format SOIC16, il faut donc veillez à plaquer la puce en haut en laissant libre les deux connexions inférieures du socket

Dans le cas d'une programmation in-circuit, un port au format 2x3 (pas de 2.54) permet de se connecter au circuit.

Les deux configurations ont été testées et il ne reste plus qu'à usiner le capot pour encapsuler le tout (j'ai accès à une petite fraiseuse). Le boitier d'origine vient de chez Farnell, une belle trouvaille pour les petits bricolages, environ 2€50 pour le circuit le boitier et le capot (le tout visible sur la première photo).

vendredi 16 septembre 2016

État d'avancement

Après quelques mois d'absence me revoilà sur le pont. Le projet n'est pas au point mort et voici les principaux fait:

  • Coté micro contrôleur tout est ok et validé, gestion des deux boutons plus et moins pour changer de mode, monitoring de la tension batterie et de la température avec des modes de repli prévus en cas de dépassement des seuils, clignotement lors des franchissement des seuils de tension batterie à la baisse pour informer de l'état des batteries, ...
    Tout est encore à peaufiner, notamment l'ajustement des seuils de tension et de température  ainsi que les puissances d'éclairage mais on entre là dans le détail.

  • Je me suis en parallèle lancé dans la fabrication d'un petit programmateur pour mes micro- contrôleurs ATTiny841. Il s'agit en fait juste d'empaqueter mon montage existant sur une breadboard dans un boitier bien ficelé mais cela sera nécessaire lorsque je voudrais reprogrammer une puce déjà soudée sur le PCB via le connecteur de programmation.

  • Le principal problème vient actuellement du circuit de puissance et du driver A6211. Le fonctionnement sur un PCB fabriqué sur mesure a été un échec, peut-être attribuable à de la bidouille pour rattraper quelques erreurs de conception.
    J'ai remonté un circuit complet non-cms sur une plaque de prototypage à bande et le résultat est fonctionnel mais avec du scintillement. Je pense donc refaire faire un pcb cms débuggé pour statuer sur ce point.

lundi 27 juin 2016

Réglage des seuils de niveau batterie

La loi reliant la tension à l'énergie disponible dans un accu lithium n'est pas linéaire, aussi il est nécessaire d'étudier la loi de décharge pour régler les seuils finement. L'objectif étant de découper la plage d'utilisation par tranche de 25% d'autonomie, plus une dernière tranche "sécurité" sur les dix derniers pourcents de la batterie.

Je suis donc parti d'une courbe de décharge énergie-tension, trouvé sur un forum :

Elle présente plusieurs allures suivant le courant de décharge. A pleine puissance la lampe consomme environ 20W, soit 5W par accu (je vise un montage a quatre accus en 2S2P). En considérant la tension la plus basse utilisée de 3A cela représente un courant d'environ 1.7A, sans tenir compte des rendements. Disons 2A pour être large. Sauf que la majeure partie de l'utilisation se fera à puissance bien moindre, j'ai donc retenu la loi de décharge à 1A pour la suite (et je suis probablement au dessus de la réalité).

En repartant de la décharge totale (à 3V  pour ne pas endommager les accus) j'ai donc reconstitué le tableau suivant, avec les seuils qui m'intéressent.

Décharge Énergie libérée (Wh) Tension (V)
100.00% 11 3
90.00% 9.9 3.275
75.00% 8.25 3.415
50.00% 5.5 3.585
25.00% 2.75 3.8
0.00% 0 4.15


jeudi 23 juin 2016

Programmation, suite

Gestion de la sécurité


Température

Deux seuils sont définis, le premier bride la lampe aux modes classiques 1 à 3, tandis que le second - réglé plus haut - la bride au mode de sécurité 1.

Niveau de batterie


Protection de l'accu

De la même maniere deux seuil sont définis pour surveiller la batterie. Un premier seuil bride la lampe au mode de sécurité 1 afin de privilégié l'autonomie sur le restant de batterie, tandis de que second, réglé à 3V par élément, interdit l'allumage pour protéger les accus.

Remarque : la lecture de la tension batterie m'a donné du fil à retordre, portant un simple analogRead() doit normalement retourner un entier compris entre 0 et 1023, proportionel à la tension mesurée (sur une échelle de 0 à la tension de référence, par défaut la tension d'alimentation du µC). Le fonctionnement était totalement ératique et après de nombreux essais j'ai découvert que pour une entrée analogique il fallait utiliser le numéro d'entrée analogique et pas le numéro d'entrée général. Pour être clair j'utilise la pin 10 pour mesurer la tension, celle-ci est repéré "7/A3" sur le pinout ATTinyCore et il faut exécuter un analogRead(A3) pour faire la mesure, un analogRead(7) lira l'entrée A7, qui pour moi était une sortie PWM pour le spot, d'où le fonctionnement foireux !

Information de l'utilisateur

Plusieurs seuils intermédiaires sont également définis, à chaque franchissement d'un seuil à la décharge la lampe émet plusieurs clignottement alternés sur les deux optiques suivant le niveau de décharge. Ces cligottements sont également émis au démarrage de la lampe pour informer sur l'état de charge initial, mais comme ils suivent les clignottements de mise sous tension c'est encore assez peu intuitif, je vais probablement modifier ceci.

EEPROM

Pour rappel, l'EEPROM est une mémoire non volatile qui va permettre de stocker les valeurs des intensité sur chaque mode. Celle-ci sont conservées à la mise hors tension du µC, c'est un point indispensable pour avoir des modes réglables en live. 
.La librairie dédiée a fonctionnée dès le premier essai, j'ai rédigé un cours programme qui écrit juste les valeurs dans l'EEPROM à l'aide d'une boucle for sur le nombre de modes, puis j'ai remplacé l'affectation "en dur" des valeurs de mode dans mon programme principal par une boucle de lecture dans l'EEPROM. 

Le mode "programmation" reste à écrire mais désormais toute "l'infrastructure" est prête.

Je vais probablement lancer une pré-série de circuit pour faire un vrai test en puissance nominale, pour l'instant mon montage sur breadboard ne permet pas le passage de l'intensité nominale et de plus j'ai quelques faux contacts. Je travaille sous EAGLE pour dessiner le PCB qui est quasiment prêt et devrait partir en fab prochainement.

jeudi 16 juin 2016

Programmation sur l'ATTiny841

Passé toutes ces étapes de validation, j'ai décidé de me lancer à l'écriture du premier "vrai" code implanté sur le µC définitif. 

Afin de ne pas m'encombrer de deux drivers et de tous les composants qui vont avec, j'ai juste implanté une led blanche (5mm classique, drivée en 20mA par une résistance ad-hoc) sur chaque sortie PWM. L’œil lissant naturellement la haute fréquence de clignotement cela permet un développement facilité. On se rend toutefois moins compte des variations de puissance qu'avec une led de puissance.

Je n'ai pas encore eu le temps de faire un joli schéma mais voila les grandes lignes:

Mise sous tension

Comme précisé précédemment le µC fonctionne dès sa mise sous tension. Afin de détecter le bon démarrage de celui-ci la lampe émet un rapide clignotement alterné sur les deux optiques.

Démarrage

Le démarrage se fait par un appui prolongé sur le bouton +, la lampe démarre ainsi en mode 1, appelé mode de sécurité avec 10% sur le wide et spot éteint. Cela permet d'éviter d'éblouir tout le dortoir à la mise sous tension quand on cherche un truc au réveil.

Gestion des modes classiques 1 à 3

La navigation se fait à l'aide d'appuis bref sur les boutons + et -


Mode spéciaux 4 & 5

Le passage en mode 4 se fait par double clic sur le bouton - depuis un mode classique, tandis que le passage en mode 5 se fait par double clic sur le bouton +. Au passage en mode spécial 4 ou 5, le mode classique précédent est mémorisé, de manière à retomber ensuite dessus, la sortie d'un mode spécial se fait par appui bref sur le bouton + ou le -.

Mode spécial 6

Le mode spécial 6 se comporte de manière similaire, il s'atteint depuis un mode normal par appui prolongé sur le bouton + et se quitte par un appui bref sur + ou - pour retourner au précédent mode.

Extinction

L'extinction se fait par un appui prolongé sur le bouton -, à partir de n'importe quel mode, spécial ou normal, et même en mode programmation (qui n'existe par encore, mais la structure du programme privilégie toujours l'extinction. Un moyen sûr de se retrouvé si on est perdu).

Perspectives

L'ensemble du fonctionnement décrit ci-dessus est désormais codé et fonctionnel, les points suivant doivent encore faire l'objet d'un développement pour répondre au cahier des charges initial:

Gestion de la sécurité

Le programme actuel a été prédisposé pour gérer facilement les deux critères de sécurité, à savoir la tension de batterie et la température au niveau du PCB, cependant ni la mesure de tension ni la lecture de tension n'ont actuellement été implanté. J'avais rencontré quelques soucis pour la mesure de tension sur l'Arduino Nano, principalement lié à mon inexpérience de ce langage mais je disposais de la liaison par port USB pour déboguer facilement (en transmettant la tension ou la température par l'USB via des commandes série et le moniteur série de l'IDE Arduino). Dans le cas de l'ATTiny841 je pase par un programmateur et je n'ai donc pas de liaison USB directe avec le PC, le débogage va donc se faire en quasi aveugle, avec uniquement des leds sur les sorties inutilisées. 
La mesure de tension via le bus 1-wire doit également être testée sur cet ATTiny841 (Uniquement validé sur Arduino Nano).

Mode programmation

J'envisage un mode de programmation permettant de régler les niveaux en utilisation. Pour cela j'envisage la stratégie suivante:
  • Passage en mode programmation par appui prolongé long (supérieur à 3 secondes) sur le bouton +
  • Choix de l'optique à régler : double-clic sur + pour le wide, - pour le spot
  • Réglage par palier de 5% à l'aide d'appuis brefs sur + ou -
  • Sortie du mode programmation par appui long prolongé sur bouton -
Un point essentiel reste à lever, la lecture et écriture des niveaux dans l'EEPROM du µC afin de conserver ces réglages à la mise hors tension.

mercredi 1 juin 2016

Gestion de la température

Initialement une mesure de température était prévue sur ce projet, en effet les leds ainsi que le driver A6211 sont susceptible de dissiper pas mal de puissance et ainsi de générer pas mal d'échauffement.
Nombre de frontales du commerce sont d'ailleurs d'une telle sécurité qui limite la durée d'utilisation à pleine puissance (est ce juste une temporisation ou une vraie mesure de température ?).

Je prévoyais initialement de réaliser la mesure au moyen d'un capteur DS18B20 fonctionnant sur bus 1-wire. Le bus 1-wire est un bus numérique permettant de brancher plusieurs capteurs sur la même entrée numérique du µC ce qui est très utile (pas dans mon cas car je n'en ai qu'un !). 

Par ailleurs certains µC ATMEL comportent une sonde de température interne, c'est notamment le cas de l'ATMega328 qui équipe les Arduino Nano et aussi du ATTiny841. Cette mesure est franchement imprécise, dépendante de la charge du processeur mais je m'étais fait à l'idée que pour une simple sécurité par détection de seuil cela suffirait.

Suite à la remarque d'un lecteur je me suis re-penché sur le DS18B20. Ayant le capteur à disposition je l'ai interfacé sur mon Arduino Nano de développement.

Deux bibliothèques sont à installer, "1-wire" et "DallasTemperature"; Dallas est le fabriquant du capteur.
Le codage est ainsi très simple, trois instructions suffisent à réaliser la mesure:



La transmission est faite via le port série au PC et la température monte avec le doigt sur le capteur, tout va bien je ne suis pas en hypothermie !

Le capteur est donc facile à mettre en oeuvre et permet une vrais mesure, j'y réfléchirais lors de l'implantation sur le PCB si l'encombrement est raisonnable.

Quoiqu'il en soit le température sera suivie pour éviter tout endommagement consécutif à une surchauffe.