Bonjour à tous,
Je me permet d'ouvrir ce nouveau sujet car j'ai une utilisation de l'Arduino assez peu conventionnelle et de ce fait assez peu documentée. J'ai vu un seul sujet assez similaire mais qui n'aboutit pas réellement à une solution. J'avais déjà un peu échangé à ce sujet avec des habitués du forum mais dans un autre contexte (raccorder ce projet à un autre).
Alors voilà, tout comme sur un multimètre, j'aimerais créer un testeur de continuité à partir d'une Arduino Due que j'ai à ma disposition. Ces tests seront conçus pour les 9 pins d'une carte SD. Le but étant de tester pin à pin toutes les combinaisons (pin 1 avec tous les autres, puis pin 2 avec tous les autres, etc...).
Avant de vous écrire, j'ai bien évidemment pas mal avancé sans réellement aboutir à une solution : ma première idée était de faire des mesures ohmiques, comme ce qui est fait sur le multimètre. En dessous d'une certaine valeur de résistance entre deux points (environ 40 ohms selon les multimètres et le réglage), on bip, au-dessus, on ne signale pas de court-circuit. Cependant, cela demanderait un pont diviseur de tension, des mesures analogiques, et des sorties analogiques sauf que les pins AnalogInput sont, comme leurs noms l'indiquent, incapables d'être des sorties. Réaliser cette idée me semble donc totalement infaisable. Je l'ai donc mise de côté au profit de ma deuxième idée.
La deuxième idée, que j'ai développée cette fois, consiste à connecter tous les pins de la carte SD directement aux pins digitaux. Le processus est simple : on envoie un "HIGH" (3.3V donc avec ma Due) sur un pin et on lit tous les autres. La présence d'un "HIGH" sur un autre pin signifie la présence d'un court-circuit, la présence d'un "LOW" signifie l'absence de court-circuit. Il y a plusieurs soucis avec cette méthode puisque tout est flottant, et je ne sais pas si j'attend suffisamment longtemps entre les changements d'états etc... pour que la mesure ai du sens.
Voici le code Arduino que j'ai développé et commenté :
// Déclaration du nom de mes pins SD associés aux pins digitaux
const int DT3 = 40;
const int CMD = 41;
const int Vs1 = 42;
const int Vcc = 43;
const int CLK = 44;
const int Vs2 = 45;
const int DT0 = 46;
const int DT1 = 47;
const int DT2 = 48;
void setup() {
Serial.begin(9600);
// Tous les pins en OUTPUT
pinMode(DT3, OUTPUT);
pinMode(CMD, OUTPUT);
pinMode(Vs1, OUTPUT);
pinMode(Vcc, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(Vs2, OUTPUT);
pinMode(DT0, OUTPUT);
pinMode(DT1, OUTPUT);
pinMode(Vs2, OUTPUT);
}
void loop() {
// Tester chaque broche individuellement toutes les 5 secondes
Serial.println("Pin tested: DT3");
testPin(DT3);
delay(5000);
Serial.println("Pin tested: CMD");
testPin(CMD);
delay(5000);
Serial.println("Pin tested: Vs1");
testPin(Vs1);
delay(5000);
Serial.println("Pin tested: Vcc");
testPin(Vcc);
delay(5000);
Serial.println("Pin tested: CLK");
testPin(CLK);
delay(5000);
Serial.println("Pin tested: Vs2");
testPin(Vs2);
delay(5000);
Serial.println("Pin tested: DT0");
testPin(DT0);
delay(5000);
Serial.println("Pin tested: DT1");
testPin(DT1);
delay(5000);
Serial.println("Pin tested: DT2");
testPin(DT2);
delay(5000);
}
//Fonction pour tester le pin
void testPin(int pinToTest) {
// On va placer un HIGH on met donc la broche en mode INPUT temporairement
pinMode(pinToTest, INPUT);
delay(100);
// Mettre la broche à l'état HIGH
digitalWrite(pinToTest, HIGH);
delay(100); // Attendre que le signal se stabilise
// Lire l'état de toutes les broches
int dt3State = digitalRead(DT3);
int cmdState = digitalRead(CMD);
int vs1State = digitalRead(Vs1);
int vccState = digitalRead(Vcc);
int clkState = digitalRead(CLK);
int vs2State = digitalRead(Vs2);
int dt0State = digitalRead(DT0);
int dt1State = digitalRead(DT1);
int dt2State = digitalRead(DT2);
// Afficher les résultats sur le moniteur série
Serial.print("DT3: "); Serial.println(dt3State);
Serial.print("CMD: "); Serial.println(cmdState);
Serial.print("Vs1: "); Serial.println(vs1State);
Serial.print("Vcc: "); Serial.println(vccState);
Serial.print("CLK: "); Serial.println(clkState);
Serial.print("Vs2: "); Serial.println(vs2State);
Serial.print("DT0: "); Serial.println(dt0State);
Serial.print("DT1: "); Serial.println(dt1State);
Serial.print("DT2: "); Serial.println(dt2State);
// J'attend un peu au hasard entre les opérations
delay(100);
// Remettre la broche à l'état LOW pour le prochain test
digitalWrite(pinToTest, LOW);
delay(100);
// Remettre la broche en OUTPUT
pinMode(pinToTest, OUTPUT);
delay(100);
}
Le soucis de ce programme, c'est qu'il ne me donne pas du tout les résultats auxquels je m'attendais. je m'attendais à ce que le seul court-circuit soit entre les pins Vss1 et Vss2 (c'est le cas lorsque j'essaye avec un multimètre). En réalité j'ai des "0" partout qui s'affichent dans la console :
Je sais que la mesure du pin sur lequel on envoie le "HIGH" n'a pas de sens puisqu'on ne peut pas à la fois commander la sortie d'un pin et la lire mais je m'attendais tout de même au moins à voir des HIGH sur les broches sur lesquelles j'envoie du 3.3V.
Peut-être devrais-je repasser à mon idée initiale et tout faire analogiquement ? Ou rester sur cette idée ? Qu'en pensez-vous ?
Merci d'avance pour votre aide précieuse !





