Thermomètre frileux

Robert5111

New Member
Bonjour

J`ai construit, le printemps dernier , un thermomètre "analogique" géant ,pour l`extérieur, piloté par un DS1620 + picaxe 08M + servomoteur pour l`affichage analogique .
Le thermomètre est autonome et fonctionne à piles , l`autonomie est d`environ
cinq mois .Dès la conception , j`avais séparé les alimentations du circuit de commande et celui du servomoteur,pour éviter les interférences.Le servomoteur lui, actionne
une aiguille en aluminium de 22 pouces de long et est piloté directement par un picaxe 08m.

Rien n`est parfait en ce bas monde , et les problèmes ont commencer à se manifester à l`automne dernier. En effet, dès que la température extérieure approche 0 degré celcius ,
le sermomoteur " perd la boule" et va se positionner sur sa butée supérieure.
D`après les specs. le servomoteur est capable d`opérer correctement sous le point de congélation, ainsi que l`électronique qui pilote le servomoteur.

Se pourrait-il que le signal de positionnement du servomoteur, provenant du picaxe 08m , dérive suffisamment à basse température , pour dépasser ses plages de fonctionnement ?
L`horloge du picaxe n`est pas régularisé par un crystal externe , peut-être est-ce la cause du problème.
Pour voir les détails de la construction, aller sur YOUTUBE et pitonner AUTOCINEMATON
et sélectionner le vidéo "AMAZING BIG SERVO THERMOMETER " ou http://www.youtube.com/watch?v=cwNTKGG3BmA
Enfin , si vous avez des idées , ou éprouvez des problèmes semblables , ne vous gênez pas.
J`aimerais bien que le thermomètre fonctionne aussi par temps froid , temps froid qui dure
plus de cinq mois par année , ici au Canada.
 
Last edited:

buldo

New Member
Se pourrait-il que le signal de positionnement du servomoteur, provenant du picaxe 08m , dérive suffisamment à basse température , pour dépasser ses plages de fonctionnement ?

si tu fais un reset sur ton picaxe par temps froid que ce passe-t-il ?
 

Robert5111

New Member
Bonjour

Si je fais un reset <= 0`c , le servo va aller hors plage .
Si je fais un reset > 0`c , le servo fonctionne à nouveau normalement.

Ici , une précision , pour économiser les piles le servomoteur est alimenté
à 6V cc pendant 500msec , à tous les dix minutes , et cela à condition d`un
changement de température , depuis la lecture précédente.
 

PieM

Senior Member
Bonjour,

Etant donné que les valeurs du DS1620 sont codées sur 9 bits, je pense que votre problème vient plutôt de là !
Le bit n°9 concerne le signe. si vous n'en tenez pas compte, une température légèrement négative est vue comme un température très élevée.
 

Robert5111

New Member
Le 9e bit

Bonjour

Le picaxe 08M envoie les données sur 8 bits ,( shiftout_LSBfirst) et enregistre les données série provenant du DS1620 sur 9 bits (shiftin_LSBpre). Comme vous le voyez , je tiens
compte du 9e bit . Pour vérifier la plage de température négative , je simule une temp. de
-10c par exemple, et le servo positionne l`aiguille au bon endroit .Comme ce test se fait
à température ambiante de 20`c , cela prouve que le programme opère correctement.
J`ai des problèmes de positionnements autour du point de congélation ( et plus bas ).
J`ai fait aussi d`autres tests pour localiser le problème , comme par exemple mettre le
boîtier de contrôle au congélateur et le servomoteur à température de la pièce.Dans
ce cas , j`ai reproduit le malfonctionnement ; c`est donc dans la partie électronique
où se situe le problème ( circuits alimentations , relais ,picaxe 08M, DS1620 ).
C`est pourquoi je suspecte le PICAXE 08M , mais vérifier les signaux à basse température
n`est pas aisé. Enfin, il me reste aussi à vérifier si des piles alka. refroidit à 0c ont encore
assez d`énergie pour alimenter correctement un servomoteur .
 
Last edited:

PieM

Senior Member
Bonjour,

La simulation ne prouve rien du tout.
En simulation, vous donnez une valeur de température qui est traduite par le Picaxe en un pulse pour le servo. C'est différent que de lire la valeur issue du ds1620 et l'interpréter en valeur de température; ça vous ne le simulez pas.

Le problème est de savoir ce que lit effectivement le picaxe en provenance du capteur, et si c'est traduit correctement en température.

Mais je ne connais pas votre programme, et ma boule de cristal est en panne :rolleyes:
 

Robert5111

New Member
Bonjour
La simulation démontre que le programme pilote correctement le servomoteur dans la région
négative du thermomètre , en admettant bien sûr que le Picaxe lit bien le paramètre
de température transmis par le DS1620. Pour ce qui est de ce dernier point , vous avez
raison , en assumant qu`il y a peut-être un problème à ce niveau . D`ici peu , je ferai parvenir
le programme avec les annotations , pour y voir plus clair... ( Dans la boule de cristal ).
 

PieM

Senior Member
Bonjour,

... enregistre les données série provenant du DS1620 sur 9 bits (shiftin_LSBpre). Comme vous le voyez , je tiens compte du 9e bit
Ben non, on ne voit rien !
La commande Shiftin LSBpre doit préciser le nombre de bits reçus, qui est de 8 par défaut .
Si vous devez recevoir 9 bits, le 9e va se trouver sur un second byte, et en position 7, car vous vous êtes en lsb.
 

Robert5111

New Member
Petit train va loin.......le 9e wagon mal garé

Bonjour
Je crois que vous avez mis le doigt sur le bobo.........

La réponse du DS1620 sur 9 bits , est enregistré dans W0

'LSB W0 (B1) bit8 lsb Valeur registre de T du DS1620
' W0 (B1) bit9 Valeur registre de T du DS1620
' W0 (B1) bit10 Valeur registre de T du DS1620
' W0 (B1) bit11 Valeur registre de T du DS1620
' W0 (B1) bit12 Valeur registre de T du DS1620
' W0 (B1) bit13 Valeur registre de T du DS1620
' W0 (B1) bit14 Valeur registre de T du DS1620
' W0 (B1) bit15 msb Valeur registre de T du DS1620

' W0 (B0) bit0 lsb Flag <0 Celcius provenant du DS1620 (9e bit)
' W0 (B0) bit1
' W0 (B0) bit2
' W0 (B0) bit3
' W0 (B0) bit4
' W0 (B0) bit5
' W0 (B0) bit6
'MSB W0 (B0) bit7 msb <--le 9e bit se retrouve ici ?!

Là est mon erreur , le train de 9 bits ayant en tête le bit de poids faible
"entre" dans le byte B1 par le côté msb de B1 , le 9`bit "entre" dans le registre
B0 par le côté msb (bit7). J`ai mal charger le 9e bit sur le registre B0.
Dans ce cas , il suffirait de " patcher " le programme en copiant le bit 7 vers le bit0 ,
pour placer le 9e bit au bon endroit ,si je comprends bien !
(Où décaller le bit7-->bit0 en 7 étapes supplémentaires)
Ho là là là là
 
Last edited:

PieM

Senior Member
Bonjour,

(Où décaller le bit7-->bit0 en 7 étapes supplémentaires)
ça se fait en une seule étape : il suffit de diviser B0 par 128 (2^7) ;)

Je pense qu'il y a une autre erreur:
Si on considère w0, il est formé de deux bytes b0 et b1, mais le LSB de w0 est bit0 (LSB de b0) et non bit8 (LSB de b1).
 
Last edited:

Robert5111

New Member
Histoire de bits

Bonjour

J`ai vérifier à la page 48 du volume 1 la composition de W0:

B0 = bit7: bit6: bit5: bit4: bit3: bit2: bit1: bit0
B1 = bit15: bit14: bit13: bit12: bit11: bit10: bit9: bit8

comme W0=B0,B1= bit7:bit6:bit5:bit4:bit3:bit2:bit1:bit0---bit15: bit14: bit13: bit12: bit11: bit10: bit9: bit8

Le msb de W0 est bit7 et son lsb est bien bit8 et non bit0 ?

Où est l`erreur ?
 

PieM

Senior Member
Bonjour,

Où est l`erreur ?
Elle est là :
Il est dit :

Therefore the most significant byte of w0 is b1, and the least significant byte of w0 is b0.
In addition bytes b0 and b1 (w0) are broken down into individual bit variables.
These bit variables can be used where you just require a single bit (0 or 1) storage
capability.
b0 = bit7: bit6: bit5: bit4: bit3: bit2: bit1: bit0
b1 = bit15: bit14: bit13: bit12: bit11: bit10: bit9: bit8

Ce qui se traduit par:

w0 = b1: b0 et non b0 :b1
d'où w0 = bit15: bit14: bit13: bit12: bit11: bit10: bit9: bit8:bit7: bit6: bit5: bit4: bit3: bit2: bit1: bit0

ce qui correspond à une certaine idée qu'on peut se faire de la logique ... :rolleyes:

En résumé, mais toujours sans connaître votre programme, faites un shiftin de 8 bits dans la variable b0 et de 1 bit dans b1.
Il est inutile de faire un décalage dans b1 : il suffit de savoir si bit 15 est à 1.
auquel cas il faut calculer le complément à 2 de b0, pour avoir le nombre de demi degrés en dessous de 0°C, puisque la résolution du DS1620 est de 0.5°C.
 

Robert5111

New Member
On repart du bon pied !

Ma documentation à ce sujet n`était pas exacte et c`est peut-être la cause de mes
problèmes de manipulations de bits . Parfois, ça ne prends pas grand chose pour
prendre le champs .Je corrige ma documentation et je vous reviens plus tard avec le programme corrigé ( 9e bit au bon endroit ) . Débugger un programme , sans jamais l`avoir
vu , faut le faire ! Merci encore.
 

Robert5111

New Member
' Le 9e bit est ..acquitté !.. et le programmeur condamné !

Le problème n`étant toujours point résolu , et après quelques " séjours " de mon contrôleur au congélateur , j`ai pu finalement localiser le problème.
Le servomoteur fonctionne bien à basse température , sauf dans les cas de froid extrême ou il a tendance à " figer " .Un peu de lubrifiant devrait faire l`affaire.
La communication entre le picaxe et le DS1620 était parfaite et le 9e bit traité
correctement.Comme vous vous en douter , une bête erreur de calcul de conversion est à
l`origine du problème .L`interpréteur Basic du Picaxe ne calcule pas comme nous et il faut
respecter sa convention, cad de gauche à droite sans aucune priorité pour les divisions ou
multiplications .Cela devient un peu mêlant quand on utilise d`autres sortes de microcontrôleur, avec des conventions de calcul différentes.

Donc:
Signal_Servo=ref0 + degC*2 ->traité par le Picaxe comme ref0 + degC PUIS multiplie par 2.

Corrigé par

degC=degC*2
Signal_Servo=ref0 + degC

Erreur bête , d`autant plus qu`aucune erreur de syntaxe n`est signalée , ce qui est normal dans ce cas .
 

PieM

Senior Member
Bonjour,

au lieu de :

Signal_Servo=ref0 + degC*2 , il suffisait d'écrire:

Signal_Servo= degC*2 + ref0 :)
 

Robert5111

New Member
Le goût de la simplicité volontaire

Ha oui ! Bien sûr , c`est encore plus simple .(Pourquoi je n`y ai pas penser ? )
Merci encore.
 
Top