Go Down

Topic: Testeur de continuite (Read 919 times) previous topic - next topic

balby64

Dec 29, 2017, 07:21 pm Last Edit: Dec 30, 2017, 12:26 pm by balby64
Bonjour,
dans un but professionnel j'ai besoin de faire un testeur de continuité, pour ce, j'ai 10 câble connecté entre eux de cette manière :
1 > 3-4-5
2 > 6-7-8-9-10

De ce fait, je veux vérifié que tout les câbles ne soit pas sectionné, ou bien soudé entre eux.
J'ai connecter tout les câbles sur l'arduino (d'un coter, de l'autre ils sont soudés).

Le code fonctionne bien (c'est mon premier code solo d A a Z et j'ai commencer qu'avec le câble 1, 2 et 3)
Avec le code ci dessous, c'est que si je débranche le câble 3 et donc met la variable valS3 à 0 la led verte reste allumé. Je dois reseter l'arduino pour que la rouge s'allume.

Auriez vous une solution ?

Code: [Select]
//Pin alloue au cablage sur les entre/sortie digital de l'arduino
int M1 = 1; // Master 1
int M2 = 2; // Master 2
int S3 = 3; // Slave 3 qui est le cable 3, etc ...
int S4 = 4;
int S5 = 5;
int S6 = 6;
int S7 = 7;
int S8 = 8;
int S9 = 9;
int S10 = 10;
int valS3 = 0; //Stockage des valeurs recu en input. Nul par defaut.
int valS4 = 0;
int valS5 = 0;
int valS6 = 0;
int valS7 = 0;
int valS8 = 0;
int valS9 = 0;
int valS10 = 0;
int ledR = 12; // Anode led rouge
int ledV = 13; // Anode led verte

void setup() {
  pinMode(M1, OUTPUT); //Definis en sortie pour le courant dans le premiere boucle (connecté a 3-4-5)
  pinMode(M2, OUTPUT); //Definis en sortie pour le courant dans la seconde boucle (connecté a 6-7-8-9-10)
  pinMode(ledR, OUTPUT); //Led en sortie
  pinMode(ledV, OUTPUT); // Led en sortie
  pinMode(S3, INPUT); // Lecture du Slave 3
  digitalWrite(M1, HIGH); //+5v master 1, premiere boucle
  digitalWrite(M2, HIGH); // +5v master 2, seconde boucle
  valS3 = digitalRead(S3); //Lecture-ecriture de la variable sur l'etat de Slave3

}

void loop()
{
  while (1)
  {
    if (valS3 == 0) { //Si l'etat est a 0
      digitalWrite(ledR, HIGH);
      digitalWrite(ledV, LOW);
    }
    if (valS3 == 1) {
      digitalWrite(ledV, HIGH);
      digitalWrite(ledR, LOW);

    }
  }
}





Merci d'avance gentil bidouilleur =)

J-M-L

#1
Dec 30, 2017, 03:05 am Last Edit: Dec 30, 2017, 03:08 am by J-M-L
Normal Vous ne mettez jamais à jour valS3 dans la loop()...ce n'est fait qu'une seule fois dans le setup() (donc quand vous (re)démarrez votre arduino)

(Les pins sont généralement déclarées en const byte plutôt qu'en int)

==== PS ====
corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code] // votre code ici [/code].

ça doit ressembler à cela:
Code: [Select]
// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

infobarquee

bonjour,
normal, si tu ne lis l'état que dans le setup, comment veux tu avoir l'info sans faire un reset?
Code: [Select]
  valS3 = digitalRead(S3); //Lecture-ecriture de la variable sur l'etat de Slave3

vire ce while qui ne sert a rien et mets la ligne citée dans le loop au lieu du setup, ca fonctionnera nettement mieux.
AUCUNE AIDE PAR MP

68tjs

Un programme "arduino" est un vrai programme C/C++ , même si dans l'IDE tu n'écris (au minimum) que deux fonctions setup() et loop().

Ce qui veut dire que la lecture d'un tuto basique de C/C++ qui explique la structure d'un programme C/C++ est hautement recommandé.

C'est l'IDE qui fait la transformation et qui transmet au compilateur un programme qui "ressemble" à ça :
(désolé pour l'absence de balises code mais sur ma tablette le site arduino c'est service minimum)

/* déclarations, inclusions diverses
      blabla
fin déclarations */

main()
{
   init() ;
   setup() ;
  while(1)
  {
     loop() ;
  }
}

main est un nom réservé, c'est la première fonction qui s'exécute dans un programme C/C++ .
Dans l'ordre main lance init(), setup() puis la boucle while.
init() est la fonction d'initialisation de divers registres du micro, son rôle est d'assurer une cohérance avec les fonctions arduino, par exemple c'est dans init qu'est fixé la fréquence de PWM ou le timer 0 qui permet la mesure du temps).

Comme la condition dans la boucle while est toujours vérifiée il est impossible d'en sortir et le programme y est piégé -> dès qu'on sort de la fonction loop() on y réentre.
C'est pour cela qu'il est impossible de repasser dans setup().

Note
S'il n'y avait pas de boucle infinie cela ne fonctonnerai pas avec un microcontrôleur car une fois la fonction loop exécutée le programme s'arreterait et il faudrait un reset pour le relancer.
Quand il y a un système d'exploitation  (windows, linux,mac).c'est lui qui joue le role de boucle infinie (en bien plus complexe).

J-M-L

#4
Dec 30, 2017, 11:04 am Last Edit: Dec 30, 2017, 11:16 am by J-M-L
main est un nom réservé, c'est la première fonction qui s'exécute dans un programme C/C++ .
Pas tout à fait vrai. main à des contraintes mais n'est pas réservé.
 Si vous lisez à vos heures perdues  la doc standard doc à la page 66 vous verrrez

Quote
6.6 Start and termination [basic.start]
6.6.1 main function [basic.start.main]
1 A program shall contain a global function called main. Executing a program starts a main thread of execution (4.7, 33.3) in which the main function is invoked, and in which variables of static storage duration might be initialized (6.6.2) and destroyed (6.6.4). It is implementation-defined whether a program in a freestanding environment is required to define a main function. [ Note: In a freestanding environment, start-up and termination is implementation-defined; start-up contains the execution of constructors for objects of namespace scope with static storage duration; termination contains the execution of destructors for objects with static storage duration. -- end note ]
2 An implementation shall not predefine the main function. This function shall not be overloaded. Its type shall have C++ language linkage and it shall have a declared return type of type int, but otherwise its type is implementation-defined. An implementation shall allow both
(2.1) (2.2)
3 The function main shall not be used within a program. The linkage (6.5) of main is implementation-defined. A program that defines main as deleted or that declares main to be inline, static, or constexpr is ill-formed. The main function shall not be declared with a linkage-specification (10.5). A program that declares a variable main at global scope or that declares the name main with C language linkage (in any namespace) is ill-formed. The name main is not otherwise reserved. [ Example: Member functions, classes, and enumerations can be called main, as can entities in other namespaces. -- end example ]
-- a function of () returning int and
-- a function of (int, pointer to pointer to char) returning int
as the type of main (11.3.5). In the latter form, for purposes of exposition, the first function parameter is called argc and the second function parameter is called argv, where argc shall be the number of arguments passed to the program from the environment in which the program is run. If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings (ntmbs s) (20.4.2.1.5.2) and argv[0] shall be the pointer to the initial character of a ntmbs that represents the name used to invoke the program or "". The value of argc shall be non-negative. The value of argv[argc] shall be 0. [ Note: It is recommended that any further (optional) parameters be added after argv. -- end note ]
(désolé pour l'absence de balises code mais sur ma tablette le site arduino c'est service minimum)
Tenez comme c'est Noël - un petit cadeau: voilà une paire de tags (neufs, jamais utilisés - je ne recule pas devant la dépense !) pour votre tablette :) :)

Il suffit d'ajouter les code tags autour du code:
[code] // votre code ici [/code].

Et magie de Noël, ça ressemblera à cela:
Code: [Select]
// votre code ici

Petit truc:

Je ne sais plus si vous êtes apple ou pas. Je suis Apple (et Linux) et Sur mon mac je définis des raccourcis claviers dans les préférences  - par exemple j'associe au mot tagsfr!! mon petit baratin sur l'usgage des codes (en français) et par la magie d'icloud ça se synchronise automatiquement avec mon iPad et iPhone et donc je peux taper cela aussi quand je suis en vadrouille - ce qui m'arrive Très souvent.

En associant code!! aux tags de code ça me les insère aussi, vous pouvez faire pareil pour [url=http://....]xxx[/url] ou encore [tt]xxx[/tt] ou [img]xxx[/img] ou [color=red]xxx[/color] etc... j'ai fait cela au début mais à force je connais la syntaxe des tags par cœur et c'est aussi simple de les taper :)

et Un autre tag à connaître pour que ce que l'on tape ne soit pas interprété c'est nobbc

 [nobbc] ici les tags ne sont plus interprétés [i] [u] [url] [sup]... et qu'on termine avec [/nobbc]
(Tapé sur ma tablette)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

balby64

MErci messieurs pour vos réponse, j'ai bien compris ce que vous tentiez de m'expliqué.
Cependant avec ce code :
Code: [Select]

//Pin alloue au cablage sur les entre/sortie digital de l'arduino
const byte M1 = 1; // Master 1
const byte M2 = 2; // Master 2
const byte S3 = 3; // Slave 3 qui est le cable 3, etc ...
const byte S4 = 4;
const byte S5 = 5;
const byte S6 = 6;
const byte S7 = 7;
const byte S8 = 8;
const byte S9 = 9;
const byte S10 = 10;
int valS3 = 0; //Stockage des valeurs recu en input. Nul par defaut.
int valS4 = 0;
int valS5 = 0;
int valS6 = 0;
int valS7 = 0;
int valS8 = 0;
int valS9 = 0;
int valS10 = 0;
const byte ledR = 12; // Anode led rouge
const byte ledV = 13; // Anode led verte

void setup() {
  pinMode(M1, OUTPUT); //Definis en sortie pour le courant dans le premiere boucle (connecté a 3-4-5)
  pinMode(M2, OUTPUT); //Definis en sortie pour le courant dans la seconde boucle (connecté a 6-7-8-9-10)
  pinMode(ledR, OUTPUT); //Led en sortie
  pinMode(ledV, OUTPUT); // Led en sortie
  pinMode(S3, INPUT); // Lecture du Slave 3
  digitalWrite(M1, HIGH); //+5v master 1, premiere boucle
  digitalWrite(M2, HIGH); // +5v master 2, seconde boucle

}

void loop()
{
  while (1) {
    valS3 = digitalRead(S3); //Lecture-ecriture de la variable sur l'etat de Slave3
    if (valS3 == 0) { //Si l'etat est a 0
      digitalWrite(ledR, HIGH);
      digitalWrite(ledV, LOW);
    }
    else; {
      digitalWrite(ledV, HIGH);
      digitalWrite(ledR, LOW);

    }
  }
}


Il faut maintenant que je mette le câble S3 a la masse afin qu'il comprenne bien qu'il n'est plus connecté.
De plus, une fois a la masse la led verte reste allumé :/
Une fois rebranché dans sa boucle, la led rouge s'éteind bien.

PS :
Je viens de me commander un petit bouquin sur l'arduino 'l'arduino pour les nuls", je trouve ces bouquins plutôt bien fait, il m'avait bien aider sous java.
Et je me commencer les cours de c/c++ sur openclassroom.


J-M-L

#6
Dec 30, 2017, 01:07 pm Last Edit: Dec 30, 2017, 01:08 pm by J-M-L
Virez le while(1) puisque la loop() va boucler pour vous

Utilisez HIGH and LOW au lieu de 0 et 1 pour les lecture numérique des pins, ce sera plus compréhensible

Lisez bien le bouquin c++ vous verrez que le point virgule dans votre code
if (valS3 == 0) { //Si l'etat est a 0
      digitalWrite(ledR, HIGH);
      digitalWrite(ledV, LOW);
    }
    else; { // <== OOOPS
      digitalWrite(ledV, HIGH);
      digitalWrite(ledR, LOW);

    }


va vous jouer un mauvais tour :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

infobarquee

Quote
Virez le while(1) puisque la loop() va boucler pour vous
+1 et déjà dit dans mon post #2
Quote
vire ce while qui ne sert a rien et mets la ligne citée dans le loop au lieu du setup, ca fonctionnera nettement mieux.
AUCUNE AIDE PAR MP

68tjs

Quote
Tenez comme c'est Noël - un petit cadeau: voilà une paire de tags (neufs, jamais utilisés - je ne recule pas devant la dépense !) pour votre tablette :) :)
Dis toi bien que cela fait longtemps que j'ai essayé.
Sur mon modèle androïd ( déjà qu'avec gogole les limites de l'acceptable sont dépassées il est hors de question d'avoir de l'apple, question de principe {1} )  je n'ai  pas accès aux icônes.
{1} Si IBM n'avait pas rendu le PC open hardware  depuis l'origine, les ordinateurs seraient encore à plus de 5000 €, voir les téléphones à plus de 1000 € (qui ont du mal a se vendre parait-il)..

Pour mettre les balises code il faut pouvoir quitter le mode machin whyyouseeis.....  ou un bidule comme ça et je n'y ai pas accès, ce qui fait que les balises sont considérées comme du texte vulgaire.

Info complémentaire : je ne suis accro ni à la tablette ni au smartphone (écran trop petit pour mes vieux yeux et mes gros doigts).  Je fais un effort mais si ça veut pas  je n'en fais pas une maladie (mon smartphone est plus souvent sur étagère que dans ma poche et des fois il est chargé mais ce n'est pas gagné :smiley-mr-green: ).

J'ai une réserve sur l'utilisation de HIGH et LOW préférentiellement à 0 et 1
D'un coté on a du "visuel" avec les niveaux physiques de l'autre on a de la logique.
En logique un niveau 1 peut correspondre à niveau physique HAUT ou BAS c'est uniquement une question de convention: l'exemple le plus connu  est celui de l'I2C. Le ou câblé fondamental pour l'I2C n'existe que si le 1 logique est fixé à l'état bas, sinon on aurait un NAND.
HIGH et LOW ne sont pas normalisés ce sont des définitions dans arduino.h.
En fait chaque méthode a ses avantages et inconvénients, tout dépend de la personne qui code.
Et puis 1 ou 0 c'est plus vite écrit que HIGH ou LOW. :smiley-mr-green:

J-M-L

#9
Dec 30, 2017, 06:23 pm Last Edit: Dec 30, 2017, 06:26 pm by J-M-L
HIGH et LOW c'est arduino et c'est ce que retournent digitalRead() ou qu'on doit passer à digitalWrite() si on veut être cohérent (on n'est pas obligé de l'etre Cependant :) )


Ca fait longtemps que dans mes préférences du forum j'ai désactivé le mode wysiwyg (tiens c'est pas apple qui a vulgarisé ce terme ? OK piqué sans doute à Xerox :) )

Vous savez que dans les Apple c'est UNIX qui tourne?

Vous savez que IBM a viré plus de 100,000 PC de ses employés et les a remplacés par des Mac? (Source http://www.applemust.com/ibm-saving-up-to-50m-by-using-macs-not-pcs/) en économisant 50 millions de $ au passage ou que GE en vire 330,000, que Walmart la société la plus 'pingre' des us basucle aussi sur 100,000 mac

Vieux débat - mais je pense qu'un Mac ou iBidule au final est moins cher et plus productif que les Windows et autres Androideries... d'autant plus vrai quand on a de gros doigts ou une mauvaise vue :)

Mais chacun fait comme il veut bien sûr :)

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

infobarquee

je pense qu'il est plus instructif dans ce post de parler de
Code: [Select]
else; { // <== OOOPS
et de
Quote
vire ce while qui ne sert a rien et mets la ligne citée dans le loop au lieu du setup, ca fonctionnera nettement mieux.
que de parler de raccourcis clavier, apple, ibm, xeros et autres termes qui n'ont rien a voir avec la question.
non?
AUCUNE AIDE PAR MP

J-M-L

#11
Dec 30, 2017, 07:16 pm Last Edit: Dec 30, 2017, 07:16 pm by J-M-L
Tout à fait :)

Mais si je ne peux pas taquiner 68tjs de temps en temps on va s'ennuyer (je sais ce qu'il pense du Mac :) )
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

68tjs

#12
Dec 30, 2017, 07:31 pm Last Edit: Dec 30, 2017, 07:32 pm by 68tjs
Quote
HIGH et LOW c'est arduino et c'est ce que retournent digitalRead() ou qu'on doit passer à digitalWrite() si on veut être cohérent (on n'est pas obligé de l'etre Cependant :) )
Non ce que retourne la fonction digitalRead() c'est 1 ou 0 -> c'est lecture du registre PINX.
Un octet est constitué de 1 et 0 donc je suis cohérent :smiley-mr-green: .

Je te conseille cette excellente lecture :
http://www.dicosmo.org/HoldUp/HoldUpPlanetaire.pdf

Quote
et de
Quote
Quote
vire ce while qui ne sert a rien et mets la ligne citée dans le loop au lieu du setup, ca fonctionnera nettement mieux.
Tout à fait et le but de mes propos originaux était de rappeler la véritable structure d'un programme arduino.
Notamment de l'emplacement et du rôle de la boucle infinie while(1) qui n'a strictement rien à faire là  où l'auteur du sujet l'a placée.

Je réagis d'après mon expérience personnelle et au début clairement je ne comprenais pas bien comment cela se passait.
C'est en lisant des tuto de C et en essayant d'utiliser Eclipse (par curiosité) que j'ai découvert cette structure qui n'est jamais indiquée chez Arduino et pourtant  qu'est ce que cela m'a aider par la suite.





J-M-L

Non ce que retourne la fonction digitalRead() c'est 1 ou 0 -> c'est lecture du registre PINX.
Un octet est constitué de 1 et 0 donc je suis cohérent :smiley-mr-green: .
Euh voici le code source
Code: [Select]
int digitalRead(uint8_t pin)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);

if (port == NOT_A_PIN) return LOW;

// If the pin that support PWM output, we need to turn it off
// before getting a digital reading.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);

if (*portInputRegister(port) & bit) return HIGH;
return LOW;
}


Donc ils retournent bien HIGH ou LOW qui certes sont remplacés par le preprocesseur par 1 et 0 mais qui sait ça pourrait changer un jour :)


Sinon oui à l'époque J'ai lu ce papier quii traite de la théorie du complot de Microsoft - c'est pour ça qu'Apple c'est mieux :)

(Bon il a eu tout faux - micorosift à complètement raté le virage internet et la mobilité - c'est plutôt de Google que je me méfie vu qu'ils ne vivent que de la vente des informations qu'ils collectent sur vous - c'est pour cela que je préfère payer mon iGadget un peu plus cher)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up