Go Down

Topic: Utiliser un interrupteur à 3 positions sur 1 broche analogique  (Read 610 times) previous topic - next topic

kamill

non. Il y a une résistance de pulldown de 10k. Tu dois lire 0.

Tastycoole

non. Il y a une résistance de pulldown de 10k. Tu dois lire 0.
Oui, quand la broche du commutateur tout à gauche est  relié (c'est à dire à rien), je lis 0, mais ça ne réponds pas à ma question, si je rajoute une résistance sur la broche tout à droite qui est reliée au +5V, est ce que la valeur seraient plus stable ? Pourtant quand je fais des tests en communiquant les valeurs au PC, c'est très stable...

kamill

A droite il y a une résistance de 0 Ω (environ  :D ). Tu dois lire 1023.

dbrion06

Quote
Autre chose, mais moins gênant, j'ai essayer de créer une variable couleurRouge pour ne pas répéter : pixels.ColorHSV(0, 255, 100) à chaque fois mais ça ne fonctionne pas du tout !!
Quote
Une solution critiquable (emploi de macros) et laide est :

#define ROUGE 0,255,100
#define BLEU 0,0,255
#define VERT 255,0,0

le préprocesseur (testé) transforme
pixels.ColorHSV(ROUGE);
en
pixels.ColorHSV(0,255,100);



68tjs

Tu n'as toujours pas expliqué ce que tu appelais "saut de tension".

J'ai sorti ma boule de cristal qui m'a donnée l'explication qu'elle trouvait la plus probable.
Pas de chance elle doit être fêlée puisque c'est autre chose.

Je ne l'a ressors pas, j'attends ton explication.
Nature ?
Amplitude ?
Qu'est ce qui tourne dans les parages ,


Quote
Je pense que le problème vient plutôt de l'électronique que du programme mais je ne vois pas comment le résoudre...
Qu'as tu fais pour lever le doute ?
Soit c'est un saut de tension, soit c'est une erreur du programme  --> soit clair s'il te plait.
Si tu sais pas  n'emploies pas des mots au hasard parce que quand tu parles de saut de tension on se tourne vers le matériel et après on apprend que ce peut être logiciel.

Et pour le résoudre ce n'est vraiment pas compliqué :
TU SEPARES LES PROBLÈMES
Tu enregistre une version simplifiée de ton programme où tu ne garde que la lecture des tensions, tu affiches sur moniteur tout ou seulement les valeurs qui s'écartent de ± x% de la valeur "normale".
Et tu vois bien si tu as des "sauts" ou pas.

Tastycoole

Tu n'as toujours pas expliqué ce que tu appelais "saut de tension".

J'ai sorti ma boule de cristal qui m'a donnée l'explication qu'elle trouvait la plus probable.
Pas de chance elle doit être fêlée puisque c'est autre chose.

Je ne l'a ressors pas, j'attends ton explication.
Nature ?
Amplitude ?
Qu'est ce qui tourne dans les parages ,

Qu'as tu fais pour lever le doute ?
Soit c'est un saut de tension, soit c'est une erreur du programme  --> soit clair s'il te plait.
Si tu sais pas  n'emploies pas des mots au hasard parce que quand tu parles de saut de tension on se tourne vers le matériel et après on apprend que ce peut être logiciel.

Et pour le résoudre ce n'est vraiment pas compliqué :
TU SEPARES LES PROBLÈMES
Tu enregistre une version simplifiée de ton programme où tu ne garde que la lecture des tensions, tu affiches sur moniteur tout ou seulement les valeurs qui s'écartent de ± x% de la valeur "normale".
Et tu vois bien si tu as des "sauts" ou pas.

Merci :)

N'étant pas un professionnel, j'utilise les mots que je peux afin de poser mon problème !!

pour eclairer ma boule de cristal, j'ai une question simple :

Est ce que je peux brancher l'usb (afin d'avoir acces au moniteur série) + l'alimentation externe (powerbank 5V) sur la broche Vin de l'arduino ou non ?? Si je ne peux pas faire ça, je ne peux pas "VOIR" le problème car il n'apparait pas quand je fais une version simplifié du programme sans brancher mes 74 leds et je ne peux pas alimenter ces leds directement avec l'arduino.


Si je peux faire ça, je pourrais apporter des infos mais c'est bien mon problème pour l'instant, et si tu lis mon programme tu comprends bien que les "saut de tension" sont une interprétation du programme qui ne correspond pas à la position des boutons. Je sais que c'est parce que la valeur lue pas le pin analogique n'est pas bonne mais je ne comprend pas pourquoi? et pourquoi au bout de plusieurs secondes surtout ?

 

dbrion06

Quote
Est ce que je peux brancher l'usb (afin d'avoir acces au moniteur série) + l'alimentation externe (powerbank 5V) sur la broche Vin de l'arduino ou non ??
Oui (l'arduino a toutes les protections pour ça).
Mais vous devriez scinder les problèmes en problèmes plus petits, que vous resolvez au fur et à mesure...(recommandé par Descartes)

A noter que la console série peut sortir des valeurs ou des courbes (peuvent inspirer davantage certains)

Tastycoole

Je teste ça tout à l'heure, je reposterai le bon code et un screen du problème des valeurs lues :)

Tastycoole

Quote
Autre chose, mais moins gênant, j'ai essayer de créer une variable couleurRouge pour ne pas répéter : pixels.ColorHSV(0, 255, 100) à chaque fois mais ça ne fonctionne pas du tout !!
Quote
Une solution critiquable (emploi de macros) et laide est :

#define ROUGE 0,255,100
#define BLEU 0,0,255
#define VERT 255,0,0

le préprocesseur (testé) transforme
pixels.ColorHSV(ROUGE);
en
pixels.ColorHSV(0,255,100);



mon idée était plutôt de faire une constante couleurRouge = pixels.ColorHSV(0,255,100)
et ensuite de pouvoir faire : pixels.Color(32, couleurRouge);

mais non ^^

dbrion06

Quote
mon idée était plutôt de faire une constante couleurRouge = pixels.ColorHSV(0,255,100)
et ensuite de pouvoir faire : pixels.Color(32, couleurRouge);
C'est très laid, ce que je vous conseille, mais tentez une macro

(notez, si vous osez, la syntaxe: pas de = ni de point virgule)

Code: [Select]
#define couleurRouge pixels.ColorHSV(0,255,100)
 pixels.Color(32, couleurRouge);

se traduit, une fois étendue par le préprocesseur, en
 pixels.Color(32, pixels.ColorHSV(0,255,100));


68tjs

Quote
Si je ne peux pas faire ça, je ne peux pas "VOIR" le problème car il n'apparait pas quand je fais une version simplifié du programme sans brancher mes 74 leds
Tu donnes la réponse, si le problème n'apparait pas que le reste du matériel n'est pas branché c'est que cela vient du matériel. Ne mets pas tes 74 dels d'un seul coup et regarde à partir de combien tu as des défauts.

Quote
Je sais que c'est parce que la valeur lue pas le pin analogique n'est pas bonne mais je ne comprend pas pourquoi? et pourquoi au bout de plusieurs secondes surtout ?
Il y a un moment où il faut mettre les mains dans le cambouis, chose qui n'est pas réservée aux professionnels et que les amateurs peuvent parfaitement faire en se documentant sur le fonctionnement du convertisseur analogique numérique, la datasheet du microcontrôleur  c'est ch***t à lire mais on ne fait pas mieux.

La stabilité de la mesure analogique est au mieux celle de la référence de tension.
Avec les cartes de bases arduino il y a 3 possibilités :
- position par défaut à l'alumage la tension de référence est la tension Vcc soit 5V ± x%
- position par programmation 1 : tension de référence interne 1,1V ± 10 %
- position par programmation 2 : tension appliquée sur la borne Aref qui doit être comprise entre Vcc et 1,1V

Je suppose que tu n'a rien changé et que tu es en position par défaut. Donc s'il advenait que la tension Vcc baisse brutalement sous l'effet d'un trop grand appel de courant et s'il y a simultanément une mesure en cours elle sera fausse.
C'est une parmi d'autre explications possible.

Je n'ai toujours pas vu si le saut est une augmentation ou une baisse de tension.
Si l'utilisation du moniteur et de l'USB pose problème tu peux t'en sortir avec le matériel.

Par programmation:
1) détecter un saut
2) tester si le saut est négatif ou positif

Par matériel :
3) remplacer le moniteur USB par deux diodes connectée à des pins, une rouge si le saut est négatif, une verte si le saut est positif. Il doit bien rester 2 pins numériques de libre !
Remarque : les pins dites faussement analogiques sont en réalité et de base des pins numériques, elles ne deviennent analogiques que par l'appel à la fonction analogRead().

Tastycoole

Tu donnes la réponse, si le problème n'apparait pas que le reste du matériel n'est pas branché c'est que cela vient du matériel. Ne mets pas tes 74 dels d'un seul coup et regarde à partir de combien tu as des défauts.
Les 74 les sont soudées donc je ne peux pas faire avec moins.


La stabilité de la mesure analogique est au mieux celle de la référence de tension.
Avec les cartes de bases arduino il y a 3 possibilités :
- position par défaut à l'alumage la tension de référence est la tension Vcc soit 5V ± x%
- position par programmation 1 : tension de référence interne 1,1V ± 10 %
- position par programmation 2 : tension appliquée sur la borne Aref qui doit être comprise entre Vcc et 1,1V

Je suppose que tu n'a rien changé et que tu es en position par défaut. Donc s'il advenait que la tension Vcc baisse brutalement sous l'effet d'un trop grand appel de courant et s'il y a simultanément une mesure en cours elle sera fausse.
C'est une parmi d'autre explications possible.

Je n'ai toujours pas vu si le saut est une augmentation ou une baisse de tension.
Si l'utilisation du moniteur et de l'USB pose problème tu peux t'en sortir avec le matériel.

Par programmation:
1) détecter un saut
2) tester si le saut est négatif ou positif

Par matériel :
3) remplacer le moniteur USB par deux diodes connectée à des pins, une rouge si le saut est négatif, une verte si le saut est positif. Il doit bien rester 2 pins numériques de libre !
Remarque : les pins dites faussement analogiques sont en réalité et de base des pins numériques, elles ne deviennent analogiques que par l'appel à la fonction analogRead().

Voila mon nouveau code :

Code: [Select]


#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define PINLED 7 // PIN connectée à la led
#define NUMPIXELS 74 // Combien de pixels ?

#define BUTTON1_PIN A1 // Pin du bouton
#define BUTTON2_PIN A2 // Pin du bouton
#define DELAYVAL 1000 // délai de pause entre chaque led

// Creation de l objet pixel avec les infos du dessus en attributs
Adafruit_NeoPixel pixels(NUMPIXELS, PINLED, NEO_GRB + NEO_KHZ800);

int sensorValue1 = 0;
int sensorValue2 = 0;
int valeurTotale = 0;
int valeurPrecedente = 0;


void setup() {

 #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif                                      // END of Trinket-specific code.

pixels.begin();  // Initialisation de l objet pixel (obligatoire)
pixels.fill(pixels.ColorHSV(0, 255, 100),0, 1);
pixels.show();
delay(1000);
pixels.clear();
pixels.show();

Serial.begin(9600);
}

void loop() {
 

sensorValue1 = analogRead(BUTTON1_PIN);
sensorValue2 = analogRead(BUTTON2_PIN);
valeurTotale = (sensorValue1/2 + sensorValue2) ;
Serial.print("B1 = ");
Serial.print(sensorValue1);
Serial.print(" B2 = ");
Serial.print(sensorValue2);
Serial.print("                                          valeurTotale = ");
Serial.println(valeurTotale);

if (valeurTotale != valeurPrecedente)
{


if (valeurTotale == 0)   // B1=0 B2=0
{           
  // pixels.clear();
  pixels.show();
  valeurPrecedente = valeurTotale;
 
}
else if (799 < valeurTotale && valeurTotale < 811 ) // B1=0 B2=1
{

pixels.setPixelColor(36, pixels.ColorHSV(0, 255, 100));
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;
}
else if (995 < valeurTotale && valeurTotale < 1007 ) // B1=0 B2=2
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 24, 13);
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1017 < valeurTotale && valeurTotale < 1029 ) // B1=0 B2=3
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 0, 37);
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (397 < valeurTotale && valeurTotale < 409 ) // B1=1 B2=0
{

pixels.setPixelColor(73, pixels.ColorHSV(0, 255, 100));   
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1202 < valeurTotale && valeurTotale < 1214 ) // B1=1 B2=1
{

pixels.setPixelColor(36, pixels.ColorHSV(0, 255, 100));
pixels.setPixelColor(73,pixels.ColorHSV(0, 255, 100));
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1398 < valeurTotale && valeurTotale < 1410 ) // B1=1 B2=2
{

pixels.setPixelColor(73,pixels.ColorHSV(0, 255, 100));
pixels.fill(pixels.ColorHSV(0, 255, 100), 24, 13);
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1420 < valeurTotale && valeurTotale < 1432 ) // B1=1 B2=3
{

pixels.setPixelColor(73,pixels.ColorHSV(0, 255, 100));
pixels.fill(pixels.ColorHSV(0, 255, 100), 0, 37); 
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (495 < valeurTotale && valeurTotale < 507 ) // B1=2 B2=0
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 61, 13); 
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1300 < valeurTotale && valeurTotale < 1312 ) // B1=2 B2=1
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 61, 13);
pixels.setPixelColor(36, pixels.ColorHSV(0, 255, 100)); 
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1496 < valeurTotale && valeurTotale < 1508 ) // B1=2 B2=2
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 61, 13); 
pixels.fill(pixels.ColorHSV(0, 255, 100), 24, 13); 
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1518 < valeurTotale && valeurTotale < 1528 ) // B1=2 B2=3
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 61, 13);
pixels.fill(pixels.ColorHSV(0, 255, 100), 0, 37);   
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (506 < valeurTotale && valeurTotale < 518 ) // B1=3 B2=0
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 37, 37);
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1311 < valeurTotale && valeurTotale < 1323 ) // B1=3 B2=1
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 37, 37);
pixels.setPixelColor(36, pixels.ColorHSV(0, 255, 100)); 
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1507 < valeurTotale && valeurTotale < 1519 ) // B1=3 B2=2
{

pixels.fill(pixels.ColorHSV(0, 255, 100), 37, 37);
pixels.fill(pixels.ColorHSV(0, 255, 100), 24, 13); 
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}
else if (1527 < valeurTotale && valeurTotale < 1541 ) // B1=3 B2=3
{
pixels.fill(pixels.ColorHSV(0, 255, 100));   
pixels.show();
pixels.clear();
valeurPrecedente = valeurTotale;

}

}
    delay(DELAYVAL); // Pause before next pass through loop
}





Je n'ai effectivement rien changé donc je suis par défaut.

J'ai donc pu lire depuis le moniteur les valeurs lues par la carte (pendant, et bizarrement tout fonctionne à merveille...

Le problème est que dès que l'USB n'est pas branché (donc pas de moniteur), les 2 commutateurs étant en position 3, donc toutes leds allumées, le dernier anneau passe sur 2 donc comme si le commutateur1 était en position 2 (au lieu de lire 1534, l Arduino doit lire 1501).
J'ai testé avec un multimètre et je peux enfin te dire qu'il y a une baisse de tension sur les 2 commutateur, elle oscille entre 3,50 et 3,70V.
J'ai donc retesté la tension en branchant l'USB et elle est totalement stable mais à 4,70V cette fois ci... (toujours position 3-3)

Donc je pense que tu as raison sur le fait que c'est la demande de courant des leds qui doit causer cette baisse de tension et que grâce à l'USB il y a assez de jus...

J'aimerais vraiment éviter d'utiliser une seconde alimentation pour résoudre ce problème, est ce qu'il y aurait une autre solution ?

68tjs

Par "instinc de vieil électronicien en retraite" je sépare dès que je le peu la puissance de la commande.
Remarque importante : Les circuits intégrés 5V ont un fonctionnement garanti dans la gamme 5V ± 5%, il faut donc bien régler les alimentation si des circuits intégrés sont répartis entre les deux alimentation.


Une baisse de puissance sur les dels fera baisser la luminosité globale mais le système continura à fonctionner.
Une baisse de puissance sur l'électronique de commande (un microcontroleur c'est de l'électronique numérique) fera capoter le système.
 Reste à savoir si la baisse de 3,5 V est à comprendre comme le 5V baisse jusqu'à ne plus faire que 3,5V ou le 5V baisse de 3,5V et ne fait plus que 1,5V et à ce moment le micro reboote.


Tastycoole

La baisse n'est présente que sur le circuit du commutateur, j'ai essayé en les branchant directement les commutateur sur le power bank et c'est la même chose...

Et il n'y a vraiment rien de régulier dans ces baisses de tensions... les commutateurs peuvent rester en position max + les leds toutes allumées pendant 20-30 secondes sans que rien ne se produise, parfois 5 secondes .... c'est totalement aléatoire ...

Tastycoole

Est ce que mettre un condensateur sur le circuit qui alimente mes commutateurs afin de supprimer les baisses de tensions est possible ?
Ou je me trompe totalement ?...

Go Up