Go Down

Topic: servo lm35 (Read 1 time) previous topic - next topic

lord H

Bonjour ,

Me revoila!! j'avais abandonner l'arduino ,c'est bête!
La dernière fois  il y'a bien longtemps , j'ai essayer de faire varier un servo avec un lm 35.
Je n'avais pas réussi , mais j'ai trouver un sketch pour bien utiliser un lm 35 , sur le site http://www.danielandrade.net/2008/07/05/temperature-sensor-arduino/.

Magnifique!!! et j'ai ajouter un fonction map servo à l'ensemble, ce qui donne des mouvements aléatoires.

Mais voila , j'aimerais plutot que mon servo prenne un temperature toute les 10 minutes et entre en mouvement à ce moment en fonction d'une deperdition de T° ou une montée de T°.
je ne vois pas ou mettre le delay pour 10 minute au servo.

Toute aide serais la bienvenue, mais peut être et surement que je ne me suis pas assez creuser la tête , en tous cas voici le sketch de Andrade avec la modif pour le servo!.

#include <Servo.h>
Servo myservo;
int pin = 0; // analog pin
int tempc = 0,tempf=0; // temperature variables
int samples[8]; // variables to make a better precision
int maxi = -100,mini = 100; // to start max/min temperature
int i;
int val;

void setup()
{
 Serial.begin(9600); // start serial communication
 myservo.attach(9);
}

void loop()
{
 
 
for(i = 0;i<=7;i++){ // gets 8 samples of temperature
 
 samples = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
 tempc = tempc + samples;
 delay(1000);
  val = analogRead(tempc);            // reads the value
 val = map(val, 0, tempc, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
myservo.write(val);                  // sets the servo position according to the scaled value


}

tempc = tempc/8.0; // better precision
tempf = (tempc * 9)/ 5 + 32; // converts to fahrenheit

if(tempc > maxi) {maxi = tempc;} // set max temperature
if(tempc < mini) {mini = tempc;} // set min temperature

Serial.print(tempc,DEC);
Serial.print(" Celsius, ");

Serial.print(tempf,DEC);
Serial.print(" fahrenheit -> ");

Serial.print(maxi,DEC);
Serial.print(" Max, ");
Serial.print(mini,DEC);
Serial.println(" Min");

tempc = 0;

delay(1000); // delay before loop
}


Luj06

Bonsoir,

euh... ce code fonctionne ? car il me semblait qu'avec la lib Servo, il fallait faire un "Servo::refresh();" assez souvent ?

quoi qu'il en soit, quand on veut utiliser une constante de temps très grande pour une temporisation sans arrêter la boucle infinie, il suffit d'utiliser des compteurs.

Code: [Select]

int count_sec = 0;
int count_min = 0;

void loop()
{
  delay(1000);
  count_sec++;

  if (count_sec >= 60) {
     count_min++;
     count_sec = 0; // reset du compteur des secondes
  }

  if (count_min >= 10) { // la valeur que tu veux attendre
      // faire la lecture de température
      // mettre à jour la consigne du servo
      count_min = 0;
  }
}


Bien sûr tu adaptes en fonction de la longueur de ta boucle avec des compteurs intermédiaires supplémentaires (pour compter 50 fois 20 millisecondes si tu réduis ta boucle à 20 ms (je sais pas pourquoi cette valeur, une idée comme ça...)

lord H

Merci de cette réponse,

bah en fait ça marche mais c'est complètement aléatoire.Mais c'est vrai que cette histoire de refresh(), la ça m'inquiète :(Je comprend pas trop )
Je vais regarder de plus près.
J'ai une vidéo mais j'ai pas compris comment on l'as met sur ce post.
En tous cas je teste rapidos ton code.

Mon but final est d'arriver a faire bouger le moteur à chaque variation de T° sur 360 ou 180 °et qu'au bout de 24 heures il revienne à sa position initiale et recommence;et je m'y prends de manière empirique n'étant pas un codeur et un débutant électronicien; comme tu as pu le voir.

++

Luj06

C'est écrit dans la doc : "refresh() : You must call this at least once every 50ms to keep the servos updated."

lord H

Un chose que j'aimerais comprendre , est ce qu'on peut donner un angle précis au servo ou même une suite d'angle , genre 10 ou  25 ou 38...bref pleins d'angles?
en fait je me perds dans les blogs, sur le servo.
Et le sketch de base , sweep ,  on comprends pas trop si c'est delay ou l'angle qu'il faut modifier.
ET ça ne m'aide pas à avancer , je bloque... :-/






lord H

En fait après avoir lu sur le site de tom igoe.
On as pas besoin du refresh si on met le servo sur le pin 9??

http://itp.nyu.edu/physcomp/Labs/Servo

Quelqu'un peut il me l'assurer??


Luj06

Ok j'ai confondu la lib "Servo" (qui fonctionne très bien sans refresh sur les ports PWM : 9, 10, 11, 3, 5, 6) et la lib "Software Servo" qui est décrite dans le playground : http://www.arduino.cc/playground/ComponentLib/Servo

Désolé :)

lord H

Pas de prob!!

Je teste ton bout de code count (pas encore fais !!!j'ai honte!), je sens que ça se précise.


Mais je me pose toujours la question d'un point 0 pour le servo et de revenir dessus à un moment .

Merci et bravo pour  ton site.

lord H

#8
Feb 02, 2009, 08:09 pm Last Edit: Feb 02, 2009, 08:11 pm by said_halbane Reason: 1
Bon ça ne se précise pas , j'avance en terre inconnu , recommence mes pseudo codes sans cesse , cherche!! Mais bon , je crois que j'ai étais très ambitieux comme beaucoup de néophytes.
Je reviens donc à plus simple , petite question, comment juste faire que mon servo tourne de la valeur de mon LM 35?
A partir de ce genre de sketch qui ne marche pas sauf pour le Lm35.

#include <Servo.h>
Servo servo1;
int potPin = 0;                             //input read pin for LM35 is Analog Pin 0
float temperature = 0;                      //variable which will be calculated in process
long val=0;                                 //variable to store the value coming from the sensor


void setup()
{
 servo1.attach(9);
 Serial.begin(9600);
 Serial.println("LM35 Thermometer    ");       //Print "LM35 Thermometer" once at start
}


void loop ()                                //loop below process
{

 val = analogRead(potPin);                 //read the value of sensor
 temperature = (5*val*100/1024);           //convert voltage to temperature
 Serial.println ((long)temperature);       //print temperature value on serial screen


 {
   servo1.write(pos);
   delay(15);
 }


 delay(20000);                               //wait for 20seconds

}                                      //End of process, go back to start of loop - ie check temp...




En fait je ne  comprend pas quand j'arrive à avoir un resultat genre le sketch suivant ce n'est pas probant le servo s'active de façon bizarre, s'arrête recommence , fais des pas , mais ça marche . le probleme c'est que je  n'arrive pas à savoir ce qu'il lit et de quelles manières.
Des deux lequel est dans la meilleurs directions, peut être aucun?


#include <Servo.h>
Servo myservo;
int pin = 0; // analog pin
int tempc = 0,tempf=0; // temperature variables
int samples[8]; // variables to make a better precision
int maxi = -100,mini = 100; // to start max/min temperature
int i;
int val;

void setup()
{
 Serial.begin(9600); // start serial communication
 myservo.attach(9);
}

void loop()
{
 
 
for(i = 0;i<=7;i++){ // gets 8 samples of temperature
 
 samples = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
 tempc = tempc + samples;
 delay(1000);
  val = analogRead(tempc);            // reads the value
 val = map(val, 0, tempc, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
myservo.write(val);                  // sets the servo position according to the scaled value


}

tempc = tempc/8.0; // better precision
tempf = (tempc * 9)/ 5 + 32; // converts to fahrenheit

if(tempc > maxi) {maxi = tempc;} // set max temperature
if(tempc < mini) {mini = tempc;} // set min temperature

Serial.print(tempc,DEC);
Serial.print(" Celsius, ");

Serial.print(tempf,DEC);
Serial.print(" fahrenheit -> ");

Serial.print(maxi,DEC);
Serial.print(" Max, ");
Serial.print(mini,DEC);
Serial.println(" Min");

tempc = 0;

delay(1000); // delay before loop
}




Luj06

#9
Feb 02, 2009, 10:01 pm Last Edit: Feb 02, 2009, 10:02 pm by julien@pobot.org Reason: 1
il faudrait mieux recommencer directement par faire tourner le servo de gauche à droite toutes les secondes par exemple, avant d'y connecter le capteur de température.

et n'oublie pas les balises [ code ] et [ /code ]

Go Up