Partage
  • Partager sur Facebook
  • Partager sur Twitter

lecture tension sur Trinket 5V

ATtiny85

26 avril 2016 à 18:04:17

Salut à tous!!

J'avais fait un prog (pour une arduino Mega) qui lisait des tensions sur un pin analogique input, et faisait varier une LED RGB en fonction de la tension lue (par palliers)

Je sais que sur l'Arduino MEGA, avec son ATmega 2560, une tension de 5V correspond au "code" 1023 et 0V à 0. J'avais donc converti mes tensions palliers en "code" avec une regle de 3.

Ca marchait très bien.

J'ai maintenant miniatirisé le système en remplaçant l'Arduino MEGA par un "trinket 5V" de chez Adafruit. lien: https://www.adafruit.com/product/1501

Le MC n'est plus un ATmega2560, mais un ATtiny85. Savez-vous si c'est le même code pour la lecture des tensions?

j'ai bien trouvé le datasheet de l'ATtiny85, mais je ne trouve pas l'info: http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf

Merci beaucoup d'avance pour le coup de main!

A+

Benjamin

  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2016 à 23:08:50

L'ADC de l'ATtiny85 est capable de faire une résolution de 10bits, comme celui des autres arduino.

La lib arduino étant plutôt bien faite, il me semble qu'il existe aussi analogRead sur ATtiny85.

Du coup, le code devrait être le même, sauf éventuellement en ce qui concerne les numéros de pins.

-
Edité par lorrio 26 avril 2016 à 23:09:11

  • Partager sur Facebook
  • Partager sur Twitter
27 avril 2016 à 0:04:09

Ah ok! l'erreur doit venir d'autre part alors! Je vais creuser!

Merci!!!

Bonne soirée!

  • Partager sur Facebook
  • Partager sur Twitter
27 avril 2016 à 0:59:33

Bon ça ne fonctionne toujours pas.

Voyez-vous une erreur dans ma logique??

voici mon schémas de branchement sur le trinket:

J'ai ensuite fait un relevé de Résistances à différentes températures sur ma sonde pour établir une droite moyenne.

La résistance en Y, la t° en X:

J'obtiens l’équation suivante: R = (-20 * Temp)+1880

Donc:  Temp = -(R-1880)/20

J'écris ensuite le code suivant:

// Branchements
int pinR = 4; // PWM 4
int pinG = 1; // PWM 1
int pinB = 0; // PWM 0
const int Vpin = 3; // Analogique pin 3

// Variables
int Vin; // tension en V au bornes du pin analogique du capteur
int Vbase; // tension d'alim du pont de tension en V
int Rbase; // resistance fixe du pont de tension
int R; // resistance de la sonde 
int Code; // Valeur entre 0 et 1023 lue au pin de l'arduino
int Temp; // Temperature moteur



 
void setup() {
    pinMode(pinR, OUTPUT);
    pinMode(pinG, OUTPUT);
    pinMode(pinB, OUTPUT);
    pinMode(Vpin, INPUT);

 Rbase = 355;  
 Vbase = 5;
      
}

void loop() {

 
  Code = analogRead(Vpin); // on lit le code au pin Input compris entre 0 et 1023
  Vin = (1023*Code)/5; // du code, on definit une tension en V en fonction de ce code
  R = (Vin*Rbase)/(Vbase-Vin); // de la tension, on definit une resistance via pont de tension
  Temp =  (- (R-1880)/20); // de la resistance, on definit la temperature via la courbe obtenue par le relevé empirique

if (Temp>90)
// LED clignotante Rouge
{
    analogWrite(pinR, 255);
    analogWrite(pinG, 0);
    analogWrite(pinB, 0);
    delay(200);
     analogWrite(pinR, 0);
    analogWrite(pinG, 0);
    analogWrite(pinB, 0);
    delay(200);   
}

else if (Temp>80)

// LED Rouge constant pendant 1 seconde puis relancer boucle
{
    analogWrite(pinR, 255);
    analogWrite(pinG, 0);
    analogWrite(pinB, 0);
    delay(100);
}

else if (Temp>70)

// LED Violet constant pendant 1 seconde puis relancer boucle
{
    analogWrite(pinR, 255);
    analogWrite(pinG, 0);
    analogWrite(pinB, 255);
    delay(100);
}

else if (Temp>60)

// LED Verte constant pendant 1 seconde puis relancer boucle
{
    analogWrite(pinR, 0);
    analogWrite(pinG, 150);
    analogWrite(pinB, 0);
    delay(100);
}

else if (Temp>50)

// LED verte clignotant puis relancer boucle
{
    analogWrite(pinR, 0);
    analogWrite(pinG, 150);
    analogWrite(pinB, 0);
    delay(200);
     analogWrite(pinR, 0);
    analogWrite(pinG, 0);
    analogWrite(pinB, 0);
    delay(200);   
}

else if (Temp>40)

// LED bleu constant pendant 1 seconde puis relancer boucle
{
    analogWrite(pinR, 0);
    analogWrite(pinG, 0);
    analogWrite(pinB, 255);
    delay(100);
}

else 

// LED clignotante Bleu
{
    analogWrite(pinR, 0);
    analogWrite(pinG, 0);
    analogWrite(pinB, 255);
    delay(200);
     analogWrite(pinR, 0);
    analogWrite(pinG, 0);
    analogWrite(pinB, 0);
    delay(200);   
}

}

Et pourtant, mon voyant clignote toujours rouge, quel que soit la résistance de la sonde. (que j'ai remplacé par un potard pour les tests).

Une idée d'ou cela peut venir?

Un énorme merci d'avance!

Benjamin

  • Partager sur Facebook
  • Partager sur Twitter
27 avril 2016 à 8:28:30

L'ADC de l'arduino donne une valeur entre 0 et 1023 quand la tension varie entre 0.0 et 5.0V.

En faisant Vin = (1023 * Code) / 5, tu vas donc te retrouver avec une valeur entre 0 et 209306, ce qui ne correspond pas vraiment à une tension...

Tu as inverser les 2 chiffres car en théorie, tu aurais du avoir : Vin = ( Code * 5 ) / 1023

Par contre, le type int ne peut pas contenir des nombre à virgule et il est aussi limité à des valeurs entre -32768 et +32767.

Le plus simple (mais pas le plus optimisé d'un point de vue temps d'exécution) serait de faire tout les calculs en float.

Et donc de passer une bonne partie de tes variables en float (et non int) et rajouter la virgule sur les constantes (exemple: 1023 deviendrait 1023.0)

-
Edité par lorrio 27 avril 2016 à 8:28:54

  • Partager sur Facebook
  • Partager sur Twitter
27 avril 2016 à 9:58:10

Super Lorrio Merci! Quel con, j'ai merdé dans un équation de gamin...! 

J'ai remplacé les int par des float et ça marche!

Par contre nouveau souci: ca marche, mais les températures de changement de paliers de sont pas du tout précises.

Je pense qu'il s'agit de mon relevé de t°, qui avec seulement 6 valeurs, ne me permet pas de déduire la droite précise de la Résistance de la sonde en fonction de la t° du moteur.

Je suis donc reparti pour une série de relevé beaucoup plus complète et large: de 100° à 20° de 2 en 2 environ. 

Et la, stupéfaction!! En superposant mon nouveau relevé de résistances avec la droite que j'ai utilisé dans le programme, je me rends compte que ma courbe n'est pas une droite... et que ma CNT n'est pas linéaire, mais logarithmique :s 

Savez-vous comment calculer la t° en fonction de la R avec une CNT logarithmique???? (en equation mathématique, mais surtout en langage arduino??)

Un enorme merci d'avance!!!

  • Partager sur Facebook
  • Partager sur Twitter
27 avril 2016 à 10:24:17

voici la courbe issue de mon relevé:

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
27 avril 2016 à 10:42:06

A partir des trois points de ton relevé, il suffit de résoudre un système de trois inconnus pour retrouver les 3 coeffs de la formule de S-H

https://fr.wikipedia.org/wiki/Relation_de_Steinhart-Hart#Coefficients_de_Steinhart-Hart

-
Edité par Anonyme 27 avril 2016 à 10:45:22

  • Partager sur Facebook
  • Partager sur Twitter
27 avril 2016 à 11:21:22

Une CTN n'a jamais été linéaire mais toujours logarithmique.

Par contre, tu peux la linéariser en 2 ou 3 droite pour avoir quelque chose de relativement correcte.

Dans ton code, tu auras alors quelque if/else pour utiliser les différente droite de linéarisation en fonction de la valeur mesurée.

Mais plutôt que chercher à vouloir absolument linéariser/modéliser ta CTN, pourquoi ne pas faire directement tes if/else avec les valeur de l'ADC ???

En clair, pourquoi ne pas faire un code de ce genre :

if ( Code > 730 ) { // ADC=730 => T=20°C

} else if ( Code > 800 ) { // ADC=800 => T=30°C

}

Il te suffit ensuite de relever le resultat de analogRead pour tes différentes température afin de les utiliser dans ton code.

  • Partager sur Facebook
  • Partager sur Twitter
28 avril 2016 à 0:33:31

diralark a écrit:

A partir des trois points de ton relevé, il suffit de résoudre un système de trois inconnus pour retrouver les 3 coeffs de la formule de S-H

https://fr.wikipedia.org/wiki/Relation_de_Steinhart-Hart#Coefficients_de_Steinhart-Hart

-
Edité par diralark il y a environ 13 heures


En admettant que je trouve ces 3 coeffs, (je vais y travailler, j'ai vraiment tout à apprendre en maths...), comment puis-je écrire l’équation qui correspond en langage Arduino et compatible ATtiny85 ? on peut directement utiliser des fonction log??

PS: Pour l'instant, j'ai fait au plus simple: J'ai monté mon pont de tension, mis ma sonde dans de l'eau avec un thermomètre de labo à côté, mis un Voltmètre entre la masse et le fil qui va normalement au pin analogic input de l'Arduino et mesuré les tensions au températures qui m’intéressent ( 30, 40, 50, 60, 70, 80 et 90° donc assez facile à obtenir à la casserole!)

Ensuite une règle de 3 dans un tableau excel pour les avoir entre 0 et 1023 à la place de 0 et 5V, et une série de "if else" sur le Analog Read du pin du capteur.

Ce n'est pas de la grande science, mais ça a l'avantage de marcher, de ne pas être trop complexe, et de gommer les imprécisions de mon calcul theorique (variation de tension du pont, marge d'erreur de la résistance, etc...)

J'ai ensuite monté le tout sur la moto et ça fonctionne très très bien!

Mais pour la beauté du geste, j'aimerais bien aller au bout de mon idée de départ et réussir à tout paramètrer dans le prog, ne serais-ce que pour apprendre!

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 avril 2016 à 9:48:20

Avant tout, je te conseille de faire un programme C dédié pour le calcul de A B et C :

Y1 = 1/T1

Y2=1/T2

Y3=1/T3

L1= ln(R1)

L2=ln(R2)

L3=ln(R3)

a = ( (L2-L3)/(L1-L2) ) * (L2³-L1³) + (L2³-L3³)

b = Y2 - Y3 - ((L2-L3)/(L1-L2)) * (Y1-Y2)

C = b/a

B = [ 1/(L1-L2) ] * [ Y1 - Y2 - (L1³-L2³)* C ]

A = Y1 - L1.B - L1³.C

Parce que faire ça avec un papier et crayon.. o_O

Un bon exercice de programmation et qui pourra te resservir plus tard pour caractériser n'importe quel autre CTN

-
Edité par Anonyme 28 avril 2016 à 20:24:08

  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2016 à 13:59:00

Salut Lorrio,

Il me semble que cette library n'est pas compatible avec la petite trinket :s J'ai deja eu le souci avec pas mal de library comme celle pour les servo etc...

Salut Diralak,

Bon comme ça, je n'y comprends rien du tout!!!!! Je vais me concentrer la dessus ce soir, et tenter de calculer quelque chose!

Oui c'est un bon exercice. D'autant plus que je suis en train de faire un nouveau projet avec des CTN. Pour faire fonctionner une soufflerie entre 2 zones d'un bâtiment (RDC et combles) en fonction de la t° des 2 zones pour faire descendre la chaleur des combles en bas lorsqu'ils sont plus chauds que le RDC.

  • Partager sur Facebook
  • Partager sur Twitter