Capteur température et servomoteur

Bonjour à tous,

Débutant dans l'arduinisme, je me retrouve face à un problème que je n'arrive pas à régler seul. Je me suis creusé la tête toute une journée pour trouver mon erreur mais en vain.

Le projet est juste de faire bouger un servo moteur ( celui dans le starter kit arduino) selon la température via une sonde thermique ( celle également dans le starter kit).

je vous joint le code en PJ.

Je capte bien via le port série la température en degrés et un angle mais le servo ne veut pas se mouvoir grrrrr!

est-ce un problème d'échelle? je suis perdu.

J'espere que vous pourrez allumer la lanterne.

merci pour votre aide en tous cas.

Comment est câblé le servo? Une référence plus précise à nous donner.

Sinon le code est correct.

Merci pour ta réponse, je suis rassuré déjà pour le code,

Le servo est ( je lis bêtement dessus) un SM-S2309S.

Il est relié: une patte au 5v, l'autre au Ground et le dernier au pin 9. J'ai mis un condensateur de 100micro au borne de celui ci et du capteur de température.

Bonjour

Peux-tu mettre ton code entre balise afin que je puisse tester ton prog

Quel capteur de température utilises-tu ?

Oui bien sur et merci pour ton aide, voici le code,

#include <Servo.h>

Servo myServo;

int angle;
const int sensorpin = A1;
const int tempbase = 19.0;

void setup() {
  // put your setup code here, to run once:

  
myServo.attach(9);

Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  
int sensorval = analogRead(sensorpin);

Serial.print("sensor val :");
Serial.print(sensorval);

angle = map(sensorval, 0, 1023, 0, 180);
Serial.print( " angle :");
Serial.print(angle);

myServo.write(angle);
delay(20);

le capteur est un TMP36

Je maitrise pas trop certaine partie du code (notament le "myServo.attach(9);" et le "map").
Quelques idées en vrac, il me semble qu'il faut utilisé un PWM pour un servo moteur ?

Je m'attendais donc a voir un "analogwrite" dans ton code, et une conversion pour passer les degrès de rotation en 8bit (valeur possible : 0 à 254).

Je fais peut être fausse route !

pour moi le myservo.attach(9) induit une sortie en pin 9 du-dit servo,

Le map implique justement cette conversion ( mais je suis débutant donc peut être info mal comprise) c'est à dire que la valeur reçue "sensorval" est une valeur comprise entre 0 et 1023 et converti en une valeur entre 0 et 180 ( correspondant au angle disponible du servo);
D'ou le "map(sensorVal, 0, 1023, 0, 180)"

Je peux pas te confirmer pour myservo.attach.

Pour le 0° -> 180°, je pense qu'il faut quand même convertir en 0 -> 254,
254 étant la fin de course du servo et 0 le debut.
Mais sa n’empercherais pas ton servo de bouger si j'ai raison, le probleme est ailleurs !
PWM sur fil jaune du servo ?

tu pourrais m'écrire un exemple de code de ce que tu me parles? je visualise pas bien

sinon oui effectivement le fil et bien sur le PWM ( en pin 9) et l'autre bien branché sur le servo.

Merci pour tes idées en tout cas, je suis sur que c'est tout bête la solutions mais je trouve pas

Pour avancer, verifie ton cablage et fait un petit sketch juste pour controler le servo et son cablage, avec deux valeurs bidon que tu change toute les secondes :

int Rot=0 ; // valeur de la rotation
int PinServo = 9; // Pin PWM
int TempRot = 0; // Compteur temps


void setup() {
  // put your setup code here, to run once:
  pinMode(PinServo, OUTPUT);
  TempRot = millis() ;

}

void loop() {
  // put your main code here, to run repeatedly:
  if (TempRot + 300 > millis()){Rot = Rot +25 ;TempRot = millis();} // Augmente toute les 300 ms la rotation
  
  analogWrite(PinServo, Rot) ; // Envoie du signal PWM
    
  if (Rot > 200) { Rot = 0;} // RAZ du compteur à 225 pour ne pas être au dessus du seuil (0 à 249 sur PWM)
}

J'ai était un peut avare en commentaire, mais je pense que le code fonctionne...
Si ton servo change de position toutes les 300ms, sa veut dire que c'est ta déclaration qui n'est pas bonne pour le Pin PWM, sinon, soit mon code et fumeux, soit c'est ton cablage :smiley:

Pour reprendre sur le 0-254 et 0-180 :
Ton servo moteur à peut être un débattement de 0° à 180°. Mais le signal maximum envoyé par l'arduino (254) doit correspondre à la position maximum du servo (180°).
Donc tu aurais juste à modifié dans ton map le 0-180 en 0-254 pour avoir toute la course disponible du servo.

à 180 (en pwm), tu devrais être à 180° / 254 * 180 = 127,55°

Un grand merci pour ton investissement,

J'essaye cela très vite ( dans moins d'une heure) et je reviens vers toi pour te dire. Chapeau en tous cas pour le temps passé a expliquer

Attention, Lapetoire, tu fais fausse route.

Un servo standard se commande effectivement mais avec une PWM qui à une période de 20 millisecondes, soit une fréquence de 50Hz.

De plus, le signal attendu par le servo ne se base pas sur le rapport cyclique mais vraiment sur la modulation de longueur d'impulsion.

Ainsi, il faut 1ms pour positionner le servo a 0 degrés, 1,5ms pour le placer à 90 degrés puis 2ms pour le placer à 180 degrés. (Le débattement standard d'un servo étant de 180 degrés).

voir:

source wikipedia

De base la pin n°9 tourne (sauf erreur) à 490Hz. A moins de jouer sur les timers, il n'est pas directement possible de commander directement le servo à coup d'analogWrite, qui joue sur le rapport cyclique.
Heureusement, il y a la librairie Servo.h, incluse dans l'IDE Arduino qui fait le boulot et pour avoir fait des essais de mon côté, elle fonctionne avec n'importe quelle broche d'une UNO (pas testé sur d'autre carte), il n'est donc pas forcement nécessaire de choisir une broche supportant le PWM.

astajoh:
pour moi le myServo.attach(9) induit une sortie en pin 9 du-dit servo,

Oui, en fait tu crées l'objet myServo de la classe Servo (c'est du C++ en POO) et tu indiques le raccordement sur la pin n°9 de la carte arduino.

astajoh:
Le map implique justement cette conversion ( mais je suis débutant donc peut être info mal comprise) c'est à dire que la valeur reçue "sensorval" est une valeur comprise entre 0 et 1023 et converti en une valeur entre 0 et 180 ( correspondant au angle disponible du servo);
D'ou le "map(sensorVal, 0, 1023, 0, 180)"

Oui aussi

astajoh:
Merci pour ta réponse, je suis rassuré déjà pour le code,

Le servo est ( je lis bêtement dessus) un SM-S2309S.

Il est relié: une patte au 5v, l'autre au Ground et le dernier au pin 9.

Quel est le code couleur des câbles du servo, selon la datasheet, tu devrais avoir du blanc rouge noir.
Le blanc étant le signal, le rouge: VCC et noir GND.

Chez moi, j'ai Signal en Orange, VCC en rouge et GND en marron.

La norme étant de toute façon le VCC au centre, signal à gauche et GND à droite.

Pfouuu :frowning: du coup je ne sais pas quoi faire pour un projet qui me semblait pourtant simple...

juste faire bouger mon servo moteur selon la température reçu par le capteur....

je mets en PJ mon branchement du moteur ( rouge 5V, vert pin 9, et noir ground)

Merci a tous de prendre tant de temps pour cela.

Le câblage semble correct.

As tu essayé les exemples de la librairie?

Je tenterai aussi une alimentation séparée (avec mise en commun des GNDs).

je n'ai pas trouvé d'exemple dans la librairie qui correspondent à mon projet malheureusement.
Mais peut être n'ai je pas cherché au bon endroit; ce qui est passablement possible....

Pfouuu :( du coup je ne sais pas quoi faire pour un projet qui me semblait pourtant simple...

C'est très simple.

Règle de base : toujours ne faire qu'une seule chose à la fois quand on fait de la mise au point .
Sinon on est incapable de trouver l'origine des problèmes.

  1. Tu ne câble que le capteur TM36
    Il n'y a pas d'exemple dans l'IDE pour TM36 mais premièrement il n'y a rien de plus simple et deuxièmement tu pourra en trouver des dizaines ou des centaines sur le web y compris sur ce forum.
    Tu fais afficher le résultat dans le moniteur de l'IDE.

2)Tu décâble complètement le capteur et tu ne t'occupe que du servo.
Tu prend un exemple fournis avec l'IDE Arduino. Il y en a un qui s'appelle "Sweep" qui ira très bien.
Tu l’essaye, il n'y a aucune raison qu'il ne fonctionne pas sauf si tu reconnais mal les fils GND, Vcc et Commande.
Tu le modifie histoire de bien comprendre le principe.
Pour info dans l'onglet "Learning" il y a des liens vers la documentation de la bibliothèque servo.
Il serait intéressant de les lire. Ils sont en anglais mais dans le "Playground" en cherchant un peu on trouve une traduction de la documentation Arduino.

A ce niveau tu as vérifié que le capteur donne une température correcte et que le servo fonctionne.

  1. Tu conserve le capteur TMP36 et tu ajoute le servo.
    Je prend les devant sur la prochaine question : "Depuis qu'il y a le servo mon capteur est en panne la température n'est plus la même"
    On va commencer faire le câblage qu'il ne faut jamais faire comme cela tu t'en souviendra :grin: .
    Soit sans crainte le matériel ne risque rien.
    Tu ajoute le servo comme ceci :
  • Vcc en relais sur le Vcc du TMP36
  • Gnd en relais sur Gnd du TMP36
  • Commande du servo la même entrée/sortie digitale que précédemment.
    Tu écris un programme qui fait bouger le servo pendant 10 secondes et qui l’arrête 10s.
    Normalement cela doit afficher des valeurs de températures supérieures quand le servo tourne.
    Non le capteur n'est pas tombé en panne, c'est la méthode de câblage qui est pourrie !

Pourquoi ?

  • Parce que le TMP36 ne consomme aucun courant par contre le servo consomme.
  • Parce que les fils de câblage du kit sont tout fins et donc ils sont "un peu" résistif.
  • Parce que dans une résistance (celle des fils) parcourue par un courant apparaît une tension (voir la loi d'ohms --> c'est la seule à connaître).
  • Parce que le TMP36 varie de "seulement" 10 mV par degré.
    La "faible" tension provoquée par la consommation du servo dans le fil de masse est insignifiante pour un circuit numérique qui utilise des niveaux 0V ou +5V mais elle n'est pas négligeable devant les 10 mV/ °C du capteur. Elle s'ajoute à celle donnée normalement par le capteur et l'arduino ne fait que constater..

La solution :
On connecte jamais les composants les uns après les autres mais on les connecte individuellement directement sur la carte arduino. On dit qu'on fait un câblage en étoile.

Si tu retiens cette règle et que l'applique systématiquement cela t'évitera bien des problèmes futurs.
Maintenant l'affichage de la température devrait être aussi stable qu'avec le TMP36 seul.

PS : j'oubliai : en tête de forum il y a un message épinglé "Bienvenue sur le forum....." que normalement tout nouvel inscrit doit lire avant de poster et dans lequel on donne l'adresse du tuto d'Eskimon dans lequel tu trouvera tout ce dont tu as besoin.

oulala que d'info, mille merci pour ces conseils que j'ai mis a exécution, j'ai tout vérifié comme tu me l'as dit, le capteur de température et le servo sont bien branchés et fonctionnent tous les deux.

Branchés ensemble, l'un et l'autre interagissent ensemble, le seul truc c'est que la différence de température est tellement faible (meme en faisant chauffer le capteur en le serrant) que le servo n'a une amplitude que de quelques degrés, comment modifier cela, afin que les quelques degrés d'amplitude que j'ai (environ 5 degrés) se reportent sur les 180 degrés d'amplitude mobile du servo. Je pense que ce n'est "que" une question de conversion ou d'échelle mais je n'ai pas de solution ou plutôt pas encore les connaissances suffisantes pour le faire.

je vous suis reconnaissant pour temps que vous passez à me répondre et des conseils que vous prodiguez gratuitement.

Pour régler ton programme rien n'interdit de remplacer le capteur par un potentiomètre par exemple (de préférence entre 1 k et 10 k et 10 ou 20 tours si tu as).

Pour cela il faut que tu définisses la gamme de température. Avec cette gamme de température tu peux calculer les tensions que devrait donner le TMP36.

Câblage :
Potentiomètre câblé "à la hussarde" :
P1
GND -------///|////--------------Vcc
| point milieu sur une entrée analogique
Mais vu les faibles variations de tension du capteur la manip sera délicate.

Meilleur câblage avec des résistances talons qui encadrent le potentiomètre et le désensibilise.
R1 P1 R2
GND ----///////------///|////---------///////----------Vcc
| point milieu sur une entrée analogique

Si tu ne sais pas calculer R1 et R2, donne l'étendue de la gamme de température et la tension que devrait délivrer le TPM36 ainsi que la valeur du potentiomètre je t'aiderai pour le calcul de R1 et R2.

Dernier point pour cette manip il te faudra un multimètre pour régler la tension au point milieu du potentiomètre.
Si tu n'en a pas 10 à 15 € en grande surface de bricolage --> appareil indispensable.