Que doit-être le comportement des ports digitaux en mode analogique ?

Bonjour,

J'ai des soupçons que ma carte Funduino UNO ne fonctionnerait pas correctement. Pour le vérifier, j'ai fait un petit montage pour tester les port digitaux en mode écriture analogique "analogWrite" et en utilisant la lecture d'un potentiomètre de 10 Kohm pour me fournir une valeur variable à appliquer à des DELs.

const int POTENTIOMETRE_1_PORT = A0;

const int DEL_2 = 2;
const int DEL_3 = 3;
const int DEL_4 = 4;
const int DEL_5 = 5;
const int DEL_6 = 6;
const int DEL_7 = 7;
const int DEL_8 = 8;
const int DEL_9 = 9;
const int DEL_10 = 10;
const int DEL_11 = 11;
const int DEL_12 = 12;

pinMode (POTENTIOMETRE_1_PORT, ENTREE);
  
pinMode (DEL_2, SORTIE);
pinMode (DEL_3, SORTIE);
pinMode (DEL_4, SORTIE);
pinMode (DEL_5, SORTIE);
pinMode (DEL_6, SORTIE);
pinMode (DEL_7, SORTIE);
pinMode (DEL_8, SORTIE);
pinMode (DEL_9, SORTIE);
pinMode (DEL_10, SORTIE);
pinMode (DEL_11, SORTIE);
pinMode (DEL_12, SORTIE);

Potentiometre1Valeur = (analogRead (POTENTIOMETRE_1_PORT) / 4);
Serial.print ("Pot = ");
Serial.print (Potentiometre1Valeur);
Serial.println ();

Serial.print (" Digital 2 On ");
analogWrite (DEL_2, Potentiometre1Valeur);
delay (UneSeconde);
Serial.print (" Digital 2 Off ");
analogWrite (DEL_2, 0);
Serial.println ();
…

Et voici les résultats avec une valeur de potentiomètre / 4, donc de 0 à 255 pour la sortie :

De 1 et plus, les ports suivants s'activent : 5, 6, 9, 10. Les autres restent éteintes.
De 128 et plus, les ports suivants s'activent : 2, 4, 5, 6, 7, 8, 9, 10, 12. Les autres restent éteintes.
De 255 et plus, les ports suivants s'activent : 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Donc tous allumées.

Mon interprétation est qu'au minimum :

Les ports PWM 3 et 11 ont un problème, car ils ne fonctionnent pas comme les ports PWM 5, 6, 9 et 10. Ils ne fonctionnent pas en mode analogique de 0 à 255, mais pour certiens de 0 à 127 Off et de 128 à 255 On, mais pour le port 11, c'est de 0 à 1022 Off et 1023 On.

Suis-je dans l'erreur ?

Est-ce que tous les ports PWM devaient varier leur puissance progressivement de 0 à 255 avec la commande "analogWrite" ?

Merci d'avance d'éclairer ma lanterne et mes DELs ;- ) .

L'ami René
Code source en pièce joint. J'utilise une télécommande type MP3 et un capteur infrarouge pour activer la carte contrôleur Fuinduino UNO, une petite gâterie.

TestPortDigitalPotentiometreDELsUNO_MP3.zip (4.91 KB)

Salut,

Toutes les pins ne sont pas PWM. PWM signifie qu'elles sont reliées à un timer. seules les pins 3, 5, 6, 9, 10 et 11 sont reliées physiquement à un timer. Les fonctions analogWrite d'arduino ne sont pas tout à fait au point, et il est possible que selon les pins, le comportement attendu ne soit pas tip top. C'est une vilaine fonction assez mal documentée, et le code correspondant est mal écrit.

http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.AnalogWrite

de plus, tu utilises des variables int (16 bits signés) pour des valeurs attendues en 8 bits non signé, il est possible que la transition int -> byte te fasse du n'importe quoi. en théorie, si ton int reste dans la plage 0 -> 255, ça ne devrait pas poser de problèmes, en théorie...

C'est dommage que tout le monde utilise par défaut des variables int sur un CPU 8 bits...

Bonjour Super_Cinci,

Et un grand merci pour ton aide et les informations.

Je suis bien d'accord avec « C'est dommage que tout le monde utilise par défaut des variables int sur un CPU 8 bits... » et il y a bien d'autres cas similaires, ex. : les adresses des ports d'Aduino (des int au lieu de byte).

Je ne demande qu'a apprendre les bons us et coutumes. Dons je pourrais utiliser comme type de constante variable pour les ports Arduino des « byte » et pour la lecture/écriture analogique des « int ».

Je profite de l'occasion, est que je peu demander du courent négatif (ex. : « analogWhrite (9, -255) ») ?

Encore merci !

L'ami René

Le type byte est une "invention" arduino.
Le problème avec le type int (ou uint) c'est qu'il n'a pas de longueur normalisée : tout dépends du compilateur.

Pour maîtriser la taille d'un entier il existe une façon de faire normalisée :
Au lieu du type "byte" on peut avantageusement écrire :
int8_t pour un entier signé sur 8 bits
uint8_t pour un entier non signé sur 8 bits.

Le gros avantage par rapport au type byte est que l'extension est facile :
int16_t, uint16_t, pour des entiers définis sur deux octets
int32_t, uint32_t, pour des entiers définis sur quatre octets

Bonjour 68tjs,

Un grand merci pour l'astuce ! Je ne connaissais pas. Pour une facilité de conversion automatique, dommage qu'il n'y est pas de « int10_t » pour la gestion de 0 à 1023, même si cela prenait en mémoire deux octets !

Ils devraient normaliser tout le spectre de int1, int2, int3, ... int64 et au passage, se débarrasser du «_t ». J'en aurais le pouvoir, je le ferais !

L'ami René

LamiRene:
Ils devraient normaliser tout le spectre de int1, int2, int3, ... int64 et au passage, se débarrasser du «_t ». J'en aurais le pouvoir, je le ferais !

Fausse bonne idée, le _t est un suffixe désignant un type déclaré par "typedef", c'est une convention en langage C/C++.
Sans ce "_t" on pourrez croire qu'il s'agit d'un type natif du compilateur ce qui n'est pas le cas (voir <stdint.h>).

Bonjour skywodd,

Je comprends bien, il y a des conventions déjà établies et un historique derrière ces conventions.

Mais si comme moi vous imaginiez, partant d'une feuille blanche, définir ce que seraient les conventions d'un nouveau langage de programmation, en biffant les manques ou incohérences du passé des autres langages !!!

J'ai le droit de rêver. :wink:

L'ami René

Rebonjour,

Mon problème reste entier, est-ce que ma carte Funduino UNO fonctionne correctement ou pas.

Je pose la question différemment.

Je suis nouveau avec Arduino et ma carte semble avoir un comportement aléatoire et a l'occasion se bogue au point de figé et de devoir la déconnecté et reconnecté pour la réactivée, le bouton « Reset » n'aillent pas donné de résultat. Et cela même avec un montage très simple, comme avec une DEL et/ou un bouton. J'ai noté un problème flagrant en faisant l'apprentissage des ports en mode « analogWrite » et « digitalWrite ».

Je cherche un moyen de tester avec certitude qu'il y a vraiment un problème et demander un remplacement de ma carte défectueuse (DAO), s'il y a lieu.

Pourriez-vous me soumettre un code source et une image du montage associé pour tester les différentes composantes d'une carte Arduino UNO ?

Pour information, de base, j'ai un kit Funduino Atmega-328p DIY Maker Learning Kit for Arduino (dx:213324).

Merci d'avance pour votre aide !

L'ami René