La sortie d'une carte arduino peut être affectée low ou high selon le code digitalWrite qui lui a été assigné.
Souhaitant qu'une sortie n'ai qu'un état bas afin d'activer un périphérique dont l'entrée nécessite cet état, alors que cette entréel est polarisée à plus ou moins 2 volts lorsqu 'elle n'est pas activée, dans ce cas je codifie digitalWrite(pin,LOW);
Les 2 volts représentant certainement un pullup interne à l'entrée de ce périphérique.
Pour désactiver, je suis sensé repasser à HIGH ma sortie carte arduino. Mais dans ce cas un 5 volts sera injecté sur l'entrée du périphérique.
Si je ne me trompe pas, au démarrage ou après reset, l'état d'une sortie arduino s'il n'est pas imposé dans le set up, est à collecteur ouvert. Comment retrouver ce même état , après avoir auparavant affecté une sortie à l'état bas dans le loop? à part LOW ou HIGH , y a t il une écriture spécifique à une sortie collecteur ouvert?
Bonjour,
Au reset les pins ne sont pas en collecteur ouvert mais en entrée, donc en haute impédance.
Pour ton problème, il suffit de mettre la pin en entrée et ça va le faire.
Il faudrait préciser de quel périphérique tu parles.
Un périphérique dont l'entrée injecte deux volts en permanence est quand même particulier.
Sans cette information on ne peut faire que des suppositions.
Appliquer 5 V directement sur le périphérique fait courir le risque de le détruire si on n'en connait pas plus.
C'est pour cette raison que le message "Règles du forum francophone" a été épinglé en tête de forum.
Pour aider, pas pour embêter.
De quelle carte Arduino tu parles ?
Dire seulement carte arduino ne veut strictement rien dire si le nom du modèle n'est pas précisé.
Tout dépend du microcontrôleur qui l'équipe.
Les cartes de base, équipées avec des micros d'architecture avr n'ont pas de sorties en collecteur ouvert.
Juste une exception sur les sorties qui deviennent I2C (SDA et SCL) et uniquement quand l'I2C est activée.
Les cartes équipée avec des micro Microchip/ARM ((série des MKR avec samd21) ont peut-être la possibilité de passer une sortie en collecteur ouvert, c'est à vérifier sur la datasheet du micro.
D'autres fabricants de micros comme STMicroelectronic avec sa série STM32 fournissent cette possibilité d'avoir une sortie en collecteur ouvert.
Avec un avr pour avoir un vrai collecteur ouvert la seule solution est de le faire à l'extérieur de la carte en ajoutant un transistor monté en émetteur commun ou en source commune.
Ce montage inverse il faut donc prendre en compte ce fait dans la logique de commande et surtout vérifier qu'il n'y a pas de risque à la suite de la déclaration en mode OUTPUT.
Voici le contexte d'utilisation , la carte arduino envisagée étant une nano v3. Atmel 328 ch340
Le périphérique, un module enregistrement, dont l'entrée départ enregistrement RL est activée en étant reliée à la masse. Sinon, on y mesure 1.6 à 2 volts. Effectivement, un BC 547 résoudrait de suite le problème. N'y ayant pensé à temps, et mon module interface étant passé en commande fabrication pcb , pour l'heure la pin sortie affectée est reliée directement à la broche RL du module recoder. Ma question était de savoir si je pouvais contourner logiciellement cet omission, car 5 volts sur RL pourrait détruire le module recorder.
lien du module recorder:
https://fr.aliexpress.com/item/4000160070654.html?spm=a2g0s.9042311.0.0.27426c37pIy9wi
Selon Kamill, mettre la sortie en entrée. Ne l'ayant jamais vu encore nul part, je n'aurais jamais pensé, ni osé essayé !
ça compile effectivement, mais n'est-ce pas suicidaire? ( pour la carte)
N'est-ce pas contradictoire, finalement la pin 4 devient à la fois entrée et sortie!!
const int activation = 4;
const int commande = 2;
void setup() {
pinMode( activation, OUTPUT);
pinMode( commande, INPUT_PULLUP);
}
void loop() {
if (commande == LOW)
{digitalWrite(activation, LOW); // sortie vers entrée périphérique
}
else
pinMode(activation,INPUT); // conversion en entrée de la sortie pour obtention état haute impédance.
}
Selon Kamill, mettre la sortie en entrée. Ne l'ayant jamais vu encore nul part, je n'aurais jamais pensé, ni osé essayé !
ça compile effectivement, mais n'est-ce pas suicidaire? ( pour la carte)
N'est-ce pas contradictoire, finalement la pin 4 devient à la fois entrée et sortie!!
Kamill a parfaitement raison et c'est le mode le plus sécurisant.
Considère que, derrière la pin du boîtier, tu as un aiguillage.
Si l'aiguillage est pour le mode entrée le signal est dirigé vers un voltmètre qui présente une impédance d'entrée extrêmement forte et donc aucun courant ne pénètre --> il ne peut rien se passer.
Si l'aiguillage est en mode sortie il délivre un signal qui peut être 0V ou la tension d'alimentation du micro soit Vcc qui est 5V.
Pour éviter tout problème le concepteur du micro (Atmel/Microchip) a prévu que pendant la phase de démarrage toutes les E/S soient positionnées en mode entrée.
Pour ton problème :
J'ai essayé de trouver la datasheet du circuit intégré.
Sur la photo du site marchand, j'ai lu quelque chose comme PH250Q0B ou PH25080B.
Je n'ai rien trouvé sous ce nom. Si tu as le module entre tes mains essaye de lire ce qui est marqué dessus et fait une recherche avec la référence suivie du mot datasheet.
Si tu trouves une datasheet et si tu ne comprends pas tout, donnes nous un lien cliquable.
Sur les dessins, il est clair que seule une mise à la masse est prévue.
Si tu as des transistors sous la main, au vu des photos, il sera relativement facile de faire un câblage volant.
C'est le lot de toutes les premières versions de circuit imprimé d'avoir quelques "perchoirs à mouche" pour réparer les erreurs, bienvenue au club
.
N'oublie surtout pas de placer une résistance en série la sortie de le carte et la base du transistor.
Si cela peut t'être utile pour calculer la valeur de la résistance de base :
https://forum.arduino.cc/index.php?topic=100727.0
Fixage d'un niveau au passage au mode OUTPUT.
Une idée vient de me traverser le cerveau (attention, c'est douloureux
)
C'est un registre qui fait passer une E/S soit en entrée, soit en sortie.
La fonction arduino qui s'occupe de ce registre est pinMode ().
C'est un autre registre qui fixe si la sortie doit être à 1 ou à 0.
La fonction arduino qui s'occupe de ce registre est digitalWrite()
Idée :
Par habitude on fait toujours un pinMode avant un digitalWrite.
Il devrait être possible quand on veut être certain d'avoir un niveau bien précis au lancement d'un programme de faire l'inverse et de commencer par faire un digitalWrite() suivi d'un pinMode().
En manipulant directement les registres cela doit fonctionner, mais avec les fonctions Wiring/Arduino avec tout leurs dispositifs anti-conneries ?
Tel que tu l'as fait
if (commande == LOW)
{digitalWrite(activation, LOW); // sortie vers entrée périphérique
}
else
pinMode(activation,INPUT); // conversion en entrée de la sortie pour obtention état haute impédance.
La sortie ne passe qu'une fois à LOW, ensuite la pin dès que tu appelles pinMode(activation,INPUT) la pin ne repasse plus en OUTPUT.
Ce qu'il faut faire
if (commande == LOW)
pinMode(activation, OUTPUT); // sortie vers entrée périphérique
else
pinMode(activation, INPUT); // conversion en entrée de la sortie pour obtention état haute
Ce n'est pas la peine de faire un digitalWrite(activation,LOW) car LOW est la valeur par défaut d'une pin en sortie.
A expérimenter si les niveaux obtenus sont suffisant pour lancer une action sur le module.
Mettre une diode shottky de préférence : anode sur module et cathode sur broche Arduino configuré en sortie.
PinX à 0 .. entrée module à 0
Pinx à 5V .. entrée module à 2v?
Mettre une diode shottky...
Pas d'accord, la solution de @kamill est meilleure et suffisante. Pourquoi faire compliqué quand on peut faire simple?
N'a pas été vérifié le courant nécessaire pour mettre son entrée à l'état bas. Si c'est inférieur à 20mA, tout est bon.
Par habitude on fait toujours un pinMode avant un digitalWrite.
Par habitude, on ne met pas de commentaires dans les sources....
Les deux sont des mauvaises habitudes
Je pense que cela vient des débuts de programmation. Expliquer ce qui se passe si on met d'abord la broche à l'état haut avant de mettre la pin en sortie, n'est pas trivial du tout. On commence par expliquer l'inverse qui est compréhensible et qui fonctionne dans 99% des cas. Et après on ne revient plus dessus.
Il devrait être possible quand on veut être certain d'avoir un niveau bien précis au lancement d'un programme de faire l'inverse et de commencer par faire un digitalWrite() suivi d'un pinMode().
En manipulant directement les registres cela doit fonctionner, mais avec les fonctions Wiring/Arduino avec tout leurs dispositifs anti-conneries ?
Cela fonctionne bien évidemment si on utilise l'accès direct, mais cela fonctionne aussi avec digitalWrite() et pinMode(). Dans le cas d'une entrée avec une pullup externe, si on fait:
pinMode(13,OUTPUT); // En premier sans réfléchir
digitalWrite(13,HIGH);
A l'initialisation, la broche est à l'état haut par la pullup externe
Le pinMode, fait passer la broche à l'état bas
Le digitalWrite refait passer la broche à l'état haut.
On a une impulsion de 4µs à l'état bas.
E faisant l'inverse:
digitalWrite(13,HIGH); // Prépare le pinMode
pinMode(13,OUTPUT);
Il n'y a plus d'impulsion négative
Bien évidemment avant la mise sous tension, la broche impose un état bas. Quand on allume l'arduino avec les premières lignes, la broche passe à l'état haut à la mise sous tension et a une impulsion basse des 4µs à l'appel de setup( ), 5,5s après. Si on appuie sur reset, l'impulsion arrive environ une seconde près. Il n'y a pas cette impulsion avec le deuxième code.
Conclusion pour @bisontin
Si on se moque un peu de ce qui se passe à la mise sous tension, ou si Arduino est sous tension avant le périphérique, la solution de @Kamill est la meilleure
Si le fait qu'Arduino non alimenté impose un état bas sur l'entrée du périphérique pose un problème, il faut alors un MOSFET.
Très intéressant ce que dit Vileroi pour de futures applications.
Dans le cas présent, la carte Nano gérera également l'alimentation du recoder, via un TC427.
Donc, le recorder sera toujours alimenté après la nano. De ce fait, l'entrée RL ne pourra être active, tant que l'alimentation du recorder ne sera elle même active.
Pouvant donc appliquer la solution de Kamill , la consommation d'entré RL non mesurée, relevant de toute évidence de celle d'une porte logique, donc infime. Mieux, avant toute modification, je commencerais par mesurer cette consommation d'entrée RL.
Les fonctions digitalMachinChose ne font pas que régir les registres sinon je n'aurai pas posé la question.
Ces fonctions sont truffées d'anticonneries du genre vérifier que le digitalWrite ne s'applique pas à une pin qui aurait préalablement été positionnée par exemple pour la PWM ou le SPI. Et dans ce cas que fait l'anticonnerie ? Couper le SPI ? Empêcher de quitter le SPI ?
DONC sans avoir fait examen préalable du code des fonctions pinMode et digitalWrite ou digitalRead, ce que je n'ai pas fait et que je n'ai aucune envie de faire, il est pour moi impossible d'affirmer quoi que ce soit.
Sur ce projet si l'enregistrement démarre sans qu'on lui en envoi l'ordre à cause d'un état intermédiaire, ce sera sans conséquence.
Mais si dans le prochain projet cet état intermédiaire déclenche le démarrage intempestif d'un moteur cela pourra mettre la sécurité en question.
C'est une bonne habitude à prendre que de vérifier l'existence d'états intermédiaires intempestifs.
Edit :
Les fonctions non officielles digitaFastWrite et digitalFastRead (et s'il existe pinFastMode ), sont dépourvu de contrôles anticonneries et, a mon très humble avis, serait préférables aux fonctions officielles.
DONC sans avoir fait examen préalable du code des fonctions pinMode et digitalWrite ou digitalRead, ce que je n'ai pas fait et que je n'ai aucune envie de faire, il est pour moi impossible d'affirmer quoi que ce soit.
Tout à fait d'accord. Mais si je l'affirme, c'est que j'ai déjà eu ce problème avec un moteur pas à pas sur la broche STEP qui ne doit pas avoir d'impulsion parasite positive à la mise sous tension.
Maintenant pour écrire ce que j'ai dit au dessus, j'ai effectivement fait les essais exprès. Programme+analyseur logique.
Maintenant utiliser l'accès direct par les fonctions de digitalWriteFast.h permet d'avoir une double sécurité (la pratique comme je l'ai fait et la logique d'analyse. En plus on sait au moins ce qu'elle font.
Pas d'accord, la solution de @kamill est meilleure et suffisante. Pourquoi faire compliqué quand on peut faire simple?
N'a pas été vérifié le courant nécessaire pour mettre son entrée à l'état bas. Si c'est inférieur à 20mA, tout est bon.
ah ces électroniciens, cherchent toujours à mettre du hardware partout!
cela dit, la diode (ou le mosfet) évite une éventuelle impulsion de 5v sur le module.
Mais si les relevés à l'analyseurs n'en montre pas, la solution soft est de loin la meilleure.
cela dit, la diode (ou le mosfet) évite une éventuelle impulsion de 5v sur le module.
Ben cela me semble être une bonne idée que d'éviter d'appliquer 5 V sur une entrée dont on ne sait rien.
C'est bien le but du contact sec ou du collecteur ouvert.
Cela vaut la peine de tester avec une diode, c'est plus simple que ma proposition de câbler un transistor en volant.
AMHA, il faut une shottky prévue pour 1 A minimum si on ne veut pas être gêné par sa résistance série.
Même une diode classique avec un Vd = 0,8 V pourrait peut-être fonctionner, en tout cas si tu en as de dispo il faut faire le test.
J'avoue que je ne comprend pas cette histoire d'appliquer 5V.
Dans la méthode que j'ai proposé, la pin est soit en sortie à 0V, soit en entrée (donc équivalent à une haute impédance). Comment est ce qu'on pourrait appliquer du 5V?
Je confirme. La pin en sortie a deux transistor dont l'un est toujours bloqué (canal P) et l'autre est donc à drain ouvert. Mettre un transistor à drain ouvert ou un collecteur ouvert pour éviter un transistor à drain ouvert est idiot, sauf si le courant le justifie.
La diode se justifie si le périphérique délivre plus de 5V, ce qui n'est pas le cas ici.
Quand on écrit un "0" le transistor du bas est en court-circuit et la sortie est au potentiel de Vss soit la masse.
L'autre possibilité est d'écrire un "1" et dans ce cas, c'est le transistor du haut qui est court-circuité et la sortie est au potentiel de Vdd soit 5V.
Toi tu proposes d'écrire un "0" en permanence et d'inverser le mode entrée/sortie, soit court-circuit ou haute impédance.
La lisibilité du programme va en prendre un coup.
Cerise sur le gâteau, il n'y aura pas intérêt de faire des erreurs d'inattention lors de la mise au point du programme.
Notre demandeur fera son choix.
Merci de vos nombreuses interventions et intérêt à la question posée.
L'essai avec transistor est parfait, le plus sûr certainement en cas de doute. merci 68tjs.
Celui avec diode, est tout aussi concluant. Réalisé avec une 1N4148, le seuil est suffisant pour déclencher l'enregistrement. Le 5 volts issu de la pin sortie en mode HIGH, est bloqué par la diode.Merci à Leptro.
Reste la solution de Kamill que je veuille tester également, auparavant, juste une précision :
Vu que dans la boucle loop l'état de la pin est tantôt input, tantôt output. je suppose ne pas devoir le déclarer dans le set up afin d'éviter toute contradiction. La seule déclaration en début de code de la pin affectée cont int activation = 4; est-elle suffisante ?
Tu n'as rien à déclarer dans le setup. Il suffit juste de définir le numéro de pin.