j'ai cablé une carte nano every avec 2 servos moteurs, une paire de led et un potentiomètre (casque iron man). Le programme téléversé (encore merci aux contributeurs du forum !) fonctionne à savoir que les servos se déclenchent bien et les led s'allument quand j'actionne un bouton poussoir.
Mais, et le hic est là, je pensais que l'intensité lumineuse des led changeait si je jouait avec le potentiomètre une fois le circuit allumé, ce qui n'est pas le cas : il faut que j'éteigne et réallume le circuit (bouton poussoir) pour que la nouvelle mesure de résistance s'applique (je vois alors bien une différence de luminosité suite au mouvement du potentiomètre par rapport à la situation avant cycle d'extinction/réallumage).
J'espère avoir été clair...
Le programme :
#include <ServoEasing.hpp>
#include "ServoEasing.h"
ServoEasing servoTop;
ServoEasing servoBottom;
const int action_pin = 2;
const int ledPin = 6;
const int potPin = A0;
int location = 31;
int bottom_closed = 107;
int top_closed = 167;
int bottom_open = 20;
int top_open = 20;
int value;
int maxBrightness;
void setup()
{
pinMode(action_pin, INPUT_PULLUP);
pinMode(potPin, INPUT);
servoTop.attach(9);
servoBottom.attach(10);
setSpeedForAllServos(190);
servoTop.setEasingType(EASE_CUBIC_IN_OUT);
servoBottom.setEasingType(EASE_CUBIC_IN_OUT);
synchronizeAllServosStartAndWaitForAllServosToStop();
}
void loop()
{
value = analogRead(potPin);
maxBrightness = map(value, 0, 1023, 0, 255);
int proximity = digitalRead(action_pin);
if (proximity == LOW)
{
if (location > bottom_open) {
servoTop.setEaseTo(top_open);
servoBottom.setEaseTo(bottom_open);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = bottom_open;
delay(10);
analogWrite(ledPin, 0);
} else {
servoTop.setEaseTo(top_closed);
servoBottom.setEaseTo(bottom_closed);
synchronizeAllServosStartAndWaitForAllServosToStop();
location = bottom_closed;
delay(50);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness / 5);
delay(100);
analogWrite(ledPin, maxBrightness / 2);
delay(100);
analogWrite(ledPin, maxBrightness / 3);
delay(100);
analogWrite(ledPin, maxBrightness);
delay(100);
}
}
}
Si vous avez des idées pour que les modifications du potentiomètre s'appliquent sans avoir à éteindre/réallumer le bouton d'état, je suis preneur !
Il faut prendre l'habitude d'indenter le code correctement cela en facilite la lecture. Il suffit de faire ctrl+t dans l'IDE.
Tu lis bien le potentiomètre en permanence et tu recalcules maxBrightness en même temps mais tu ne modifies la luminosité des LEDs que lorsque proximity est au niveau haut bas.
Je n'en sais rien tu n'expliques pas ce que cela devrait faire et dans quelles conditions.
Il y a manifestement 2 modes de fonctionnement suivant l'état de proximity.
Actuellement:
proximity == HIGH : tu ne fais rien
proximity == LOW et location < bottom_open : tu changes l'état des LEDs
proximity == LOW et location > bottom_open : tu éteints les LEDs
Qu'est-ce qui devrait se passer lorsque proximity est à l'état haut?
Qu'est-ce qui devrait se passer lorsque proximity est à l'état bas?
Proximity est un bouton poussoir qui, une fois appuyé (donc état bas pendant quelques dixièmes de secondes), modifie l'état général du casque : visière remontée et lumières éteintes ou visière en place descendue et lumières des yeux allumées, normalement variables par le potentiomètre après séquence d'allumage (la série de commandes "analogWrite(ledPin, maxBrightness / n").
Plutôt quand proximity = low (i.e. quand j'appuie sur le bouton poussoir) mais aussi (cumulatif) quand location est en position closed (2ème boucle conditionnelle, si je ne me trompe pas).
Or en position closed, il ne se passe rien quand je bouge le potentiomètre (les led sont bien allumées mais à luminosité constante).
Écoute, le besoin n'est pas clair.
Détaille, étape par étape, ce que tu voudrais que le circuit fasse.
Au démarrage le casque est dans quelle position, pour moi, il est dans un état indéterminé car tu ne positionnes pas les servos dans le setup()?
Partant d'un état connu que devrait faire une action sur le bouton? De ce que je crois comprendre, si le casque est ouvert un appui le ferme, si il est fermé un appui l'ouvre.
Comment devrait fonctionner les LEDs? De ce que je comprends, les LEDs ne s'animent que lors de la fermeture et la séquence se termine avec les LEDs au max fixé par le potentiomètre. Lorsque tu ouvres le casque, elles s'éteignent.
Lorsque le bouton est relâché, tu ne fais rien.
Écoute, le besoin n'est pas clair.
Détaille, étape par étape, ce que tu voudrais que le circuit fasse.
Au démarrage le casque est dans quelle position, pour moi, il est dans un état indéterminé car tu ne positionnes pas les servos dans le setup()?
oui, allumage dans un état quelconque.
Partant d'un état connu que devrait faire une action sur le bouton? De ce que je crois comprendre, si le casque est ouvert un appui le ferme, si il est fermé un appui l'ouvre.
oui c'est ça (on joue sur la variable proximity qui est cablée sur le pin D2).
Comment devrait fonctionner les LEDs? De ce que je comprends, les LEDs ne s'animent que lors de la fermeture et la séquence se termine avec les LEDs au max fixé par le potentiomètre. Lorsque tu ouvres le casque, elles s'éteignent.
Lorsque le bouton est relâché, tu ne fais rien.
oui c'est ça. Seulement, le changement de réglage du potentiomètre à l'état casque fermé ne permet pas de faire varier l'intensité (= ce que je voudrais) par l'intermédiaire de la valeur Maxbrightness.
Autrement dit, je souhaiterais que Maxbrightness varie quand je bouge le potentiomètre en position casque fermé mais ce n'est pas le cas : là elle se fixe à la valeur lue lors de la fermeture du casque (activation du bouton poussoir, proximity = low) et ne varie pas quand je manipule le potentiomètre (qui fonctionne, vérifié au multimètre).
Actuellement les LEDs ne sont modifiées que si proximity est LOW et le casque se ferme.
Il faut donc que tu ajoutes une condition dans tes if pour modifier l'état des LEDs lorsque le casque est fermé.
Le problème c'est que si tu veux modifier la luminosité des LEDs lorsque le casque est fermé et proximity == LOW (selon ta réponse au #7) tu tombes dans la condition qui fait ouvrir le casque. C'est la raison pour laquelle je proposais de modifier l'état des LEDS lorsque proximity == HIGH.
Il manque des accolades autour de ce bloc de code.
analogRead() et map() sont inutiles puisque tu les fais déjà au début de loop().
En l'état, la seule ligne qui est dans le else c'est value = analogRead(potPin); le reste est exécuté dans tous les cas. Ce qui veut dire que les LEDs changent de luminosité quelque soit l'état ouvert ou fermé du casque.
Si tu veux que cela n'arrive que lorsque le casque est fermé il faut remplacer les lignes ci-dessus par ça.
else if (location == bottom_closed)
analogWrite(ledPin, maxBrightness);
delay(100);