[Simulation] Pins inactifs ?

Hello,

Récemment, j’ai créé un programme pour - en gros - activer un servomoteur et une led RGB à l’aide d’un clavier matriciel.

J’ai tenté de faire une simulation avec Proteus/Isis pour vérifier si tout se passait bien et apparemment il y a un petit souci avec les pins que j’ai associé à ma led.

Quand je lance la simulation, j’obtiens ceci :

Comme vous pouvez le voir, les pins sensés alimenter les broches G et B de ma led sont inactifs.

Voici le programme correspondant :

// On ajoute 3 librairies à notre code :
#include <Password.h> 
#include <Keypad.h>    
#include <Servo.h> 

// On crée une variable associée à notre servomoteur :
Servo servo;
// On définit le mot de passe qui déverrouillera la valise :
Password password = Password("1234");

const byte ROWS = 4; // Il y a 4 Lignes sur notre clavier
const byte COLS = 3; // ... et 3 Colonnes.

// On définit les touches du clavier :
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};
// On associe les lignes et les colonnes du clavier à leurs PINs respectifs :
byte rowPins[ROWS] = { 8, 9, 10, 11 };
byte colPins[COLS] = { 5, 6, 7 };

// On initialise le clavier :
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){

// On initialise les 3 couleurs de la led RGB en sorties :
pinMode(A5,OUTPUT);         // Rouge    
pinMode(A6,OUTPUT);         // Vert    
pinMode(A7,OUTPUT);         // Bleu

// On associe le Pin 12 à notre servomoteur :
servo.attach(12);
// On ajoute une fonction qui permet d'analyser les saisies du clavier :
keypad.addEventListener(keypadEvent); 
}

void loop(){
  
// Création de la variable eKey, qui prendra pour valeur la touche apppuyée :
char eKey = keypad.getKey();
}
void keypadEvent(KeypadEvent eKey){

// On définit les différentes options de saisie du clavier en cas d'appui sur un bouton :
switch (keypad.getState()){
case PRESSED:
switch (eKey){  case '*': guessPassword(); break;  // En cas d'appui sur la touche "*", on lance le void guessPassword.
                case '0': password.reset(); break; // On appuie sur "0" pour réinitialiser sa saisie.
                case '#': password.reset(); 
                          digitalWrite(A7,HIGH);
                          servo.write(95);
                          delay(1500);
                          digitalWrite(A7,LOW); break;
                default: password.append(eKey);}   // Si on appuie sur un chiffre, il s'ajoute à la saisie.
                          }
                                  }

void guessPassword(){

// Si le mot de passe est juste, on allume la led en vert durant 2.5 secondes
// et on effectue une rotation du servomoteur de 180° :
if (password.evaluate()){
                         digitalWrite(A6,HIGH);
                         servo.write(-90);
                         delay(1500);
                         digitalWrite(A6,LOW);
                         password.reset();
                        }

// Sinon, on allume simplement la led en rouge durant 2.5 secondes :
else {
      digitalWrite(A5,HIGH);
      delay(1500);
      digitalWrite(A5,LOW);
     }
                    }

Le servomoteur et le clavier fonctionnent.
Vous avez une idée de ce qui peut provoquer ce problème ?

Merci.

pepe:
Bonjour

A6 et A7 sont des entrées analogiques, uniquement. Elles ne peuvent pas servir de sortie numérique.

Il semblerait pourtant que oui. Cf. la doc, en bas de la page :

The analog input pins can be used as digital pins, referred to as A0, A1, etc.

Selon Locoduino, pepe a raison :

Quasiment toutes les broches d’un Arduino peuvent être programmées en entrée ou sortie numérique (et non les deux en même temps). Par exemple, sur l’Arduino Uno, il s’agit d’une part des broches numérotées de 0 à 13 mais également des broches A0 à A5.

Exact A6 et A7 sont purement analogiques.

L'explication est dans le boîtier, dans le multiplexeur analogique et dans les ports numériques du micro
Il suffit de lire la datasheet.

Boîtier :
Celui de la UNO au format DIP ne comporte que 28 pins.
Celui de la nano/mega CMS comporte 32 pins --> 4 de plus

Multiplexeur analogique :
Le micro n'a qu'un seul CNA.
C'est un multiplexeur qui lui fourni 1 parmis 8 entrées analogiques sauf que dans le boîtier DIP il manque deux broches pour sortir A6 et A7.

Micro :
Pour avoir une E/S numérique il faut de la place dans les Ports digitaux et ceux du 328p sont PLEINS, pas de place pour y relier les deux entrées A6 et A7 qui restent donc purement analogique.

Note : il existe depuis plus d'un an un atmega328pB qui possède 1 port numérique de plus et donc A6 et A7 sont maintenant analogiques ET numériques.
Il possède aussi 1 timer de plus soit 2 PWM suplémentaires et deux interfaces série.
Mais Arduino l'a snobé.

Mince je n'avais jamais fait gaffe que le nano avait deux ports analogiques en plus (d'où ma réponse erronée)