probleme de raz

Bonjour

Je viens vous demander de l'aide car mon programme tourne très bien mais ou je but depuis un temps infini sur:

En fin de compte je veux me servir du bouton M/A pour arrêter le système ( sa marche sauf RAZ )

pendant le cycle si besoin et en fin de cycle avec une RAZ d'office pour pouvoir redémarrer le cycle juste avec appuis sur M/A.

J'ai essayé plein de façon différente vu sur la toile j'ai essayé avec circuit RC et autre mais impossible
sans déconnecter entres raz!

Donc j'ai vu que la bibliothèque Watchdog : qui permets un RESET physique ( comme si j’appuie sur le RESET )

include < avr/wdt.h>

// ...
wtd_enable(WDTO_15MS);
for(;;);

Mon Problème impossible de trouver cette bibliothèque Watchdog sur la toile donc je suis preneur de vos idées et vous en remercie


parti pour essais raz

if ( digitalRead(pinBp) == LOW ) //essais raz
{
i=10000;

digitalWrite( pinEndStopY , LOW ); // led jaune
digitalWrite ( pinRaz , LOW );


const int pinRaz= 12; // envoie raz appres appuis sur Bp marche (low puis high)
const int pinEndStopY=10;// faire implusion LOW sur END STOP
const int pinEndStopX=9; // dectection fin ce course point de position garage
const int pinBp=2; // bouton poussoir Marche/Arret
const int pinSonde=5; // Sonde de d'inisialisation point de depart haut,uno vers cnc X-DIR 16
const int pinLed=13; // Led verte initialisation
const int pinEn=8; //En commun sur CNC V3 pour activer les 2 drivers A4988 Z et Y
//Enable: Logique Inversée, permet d'activer ou désactivé le moteur.
//Etat Haut=High = Moteur actif... et axe bloqué entre les pas.
//Etat bas=Low = Axe totalement libre
const int pinStepZ=4; // Signal de PAS uno vers cnc Z STEP 15
const int pinDirZ=7; // Direction uno vers cnc Z DIR 16
//const int pinStepY=3; // Signal de PAS uno vers cnc Y STEP 15
//const int pinDirY=6; // Direction uno vers cnc Y DIR 16

// OK MAIS REGLER PROBLEME PIN BOUTON (stop)

void setup() // preparation
{

Serial.begin(9600);
Serial.println("Test avec A4988");
pinMode( pinRaz, OUTPUT );// Raz arret d'urgence
pinMode( pinEndStopY,OUTPUT );// faire implusion LOW sur END STOP
pinMode( pinEndStopX,INPUT_PULLUP );// dectection fin ce course point de position garage BOUTON ROUGE
pinMode( pinBp , INPUT_PULLUP );// bouton poussoir Marche/Arret vers cnc X-STEP 15 Led rouge
pinMode( pinSonde , INPUT ); // Sonde de d'inisialisation point de depart haut
pinMode( pinLed , OUTPUT ); // Led verte initialisation
pinMode( pinEn , OUTPUT ); // definition broche En (activation drivers)
pinMode( pinStepZ , OUTPUT ); // definition driver Z
pinMode( pinDirZ , OUTPUT ); // definition driver Z
//pinMode( pinStepY , OUTPUT ); // definition driver Y
//pinMode( pinDirY , OUTPUT ); // definition driver Y

digitalWrite ( pinRaz , HIGH );
digitalWrite( pinEndStopY , HIGH ); //
while (digitalRead(pinBp)); // On ne fait rien tant que pinBp n'est pas appuyé

}

void loop()
{
int i = 0;
//digitalWrite( pinStepZ , LOW); // Initialisation de la broche step Z

// 1es 4 boucles du programme moteur Z

//digitalWrite( pinEndStopY , HIGH ); //
//digitalRead(pinEndStopX);
digitalWrite( pinDirZ , LOW ); // Direction monte de fin de cycle
for ( i=0; i < 200; i++)
{ // Monte du moteur Z

if ( digitalRead(pinEndStopX) == LOW ) //detection garage bouton rouge
{
i=2000;
delay( 20 );
}
Serial.println( i );
digitalWrite( pinStepZ , HIGH );
delayMicroseconds(8000); //delay( 7 );
digitalWrite( pinStepZ , LOW );
delayMicroseconds(8000); //delay( 7 );
//digitalWrite( pinEndStopY , LOW ); //led jaune
}

digitalWrite( pinDirZ , HIGH); // Direction descent ralenti
for ( i=0; i < 10000; i++)

{ // Monte du moteur Z

if ( digitalRead(pinBp) == LOW ) //essais raz
{
i=10000;

digitalWrite( pinEndStopY , LOW ); // led jaune
digitalWrite ( pinRaz , LOW );
// delayMicroseconds(80000);
// digitalWrite ( pinEndStopY , HIGH );
// delayMicroseconds(80000);
//digitalWrite ( pinEndStopY , LOW );
//digitalWrite ( pinRaz , LOW );
//delayMicroseconds(80);
//digitalWrite ( pinRaz , HIGH- );

}

Serial.println( i );
digitalWrite( pinStepZ , HIGH );
delayMicroseconds(8000); //delay( 3 );
digitalWrite( pinStepZ , LOW );
delayMicroseconds(8000); //delay( 3 );

}

Serial.println("Fin de programme"); // Fin et blocage du programme

while( true ); // tant que l'expression est vrai
}

Salut leptonlibre,

tu devrais modifier ton post et mettre ton code entre balises

Si j'ai bien compris tu veut comme si tu appuyer sur le reset.. ba tu pilotes la base d'un transistor avec un sortie sur HIGH qui met le pin reset de la carte en contact avec le ground, ça devrais le faire, sans bibli!!

Mon Problème impossible de trouver cette bibliothèque Watchdog sur la toile

Quelle carte utilise-tu? Le watchdog est en place pour les ESP et caue régulièrement des problèmes. Non utilisé sur les Uno, mega

Pour un reset matériel, connecte la broche reset directement sur une autre broche N. Au démarrage, la broche N est en entrée et il ne se passe rien. Pour faire un reset, mets la broche N en OUTPUT et envoie LOW par sécurité.

Avec une Uno, Méga, pour un reset logiciel en utilisant le watchdog, mettre l'instruction
WDTCSR=8;
et 16ms après le reset est appelé.

Par exemple:

void setup()
{
  Serial.begin(115200);
  Serial.println("C'est parti");
  for (int a=10; a>=0; a--)
  {
    Serial.println(a);
    delay(1000);
  }
  WDTCSR=8;
}

void loop() {}

Va dire "c'est parti", décompte et arrivé à 0 attend 16ms, que l'on ne voit pas, et fait un reset. Le temps que tout redémarre, cela recommence.

Suite pour faire un reset directement sans attendre le watchdog, on peut utiliser l'instruction
asm("jmp 0");
Avec le programme précédent d'exemple:

void setup()
{
  Serial.begin(115200);
  Serial.println("C'est parti");
  for (uint8_t a=10; a>0; a--)
  {
    Serial.println(a);
    delay(1000);
  }
  asm("jmp 0");
}

void loop() {}

Même comportement, mais 16ms d'attente en moins

Pour rendre les choses plus claires, en début:
#define Reset asm("jmp 0")
et quand on en a besoin:
Reset;

Merci vraiment à tous je fais une réponse condensé ici car plus explicite que découpé

La partie

digitalWrite( pinDirZ , HIGH); // Direction descent ralent
for ( i=0; i < 10000; i++)

{ // Monte du moteur Z

if ( digitalRead(pinBp) == LOW ) //essais raz
{
i=10000;

digitalWrite( pinEndStopY , LOW ); // led jaune
digitalWrite ( pinRaz , LOW );
pinRaz , HIGH- );

}
Mais d’après mon résonnement cela ne peut marché car une foi la pinRaz ( LOW) le proc est bloqué à l’arrêt et attente du front montant ( pin Raz HIGH) ( se qui se passe quand appui sur bouton RAZ) pour finir cette RAZ et la pas possible avec le proc

2Terium
merci d'avoir répondu et aussi le passage en balise j'espere avoir compris !

mais je pense que le problème problème est pareil avec l' idée
Si j'ai bien compris tu veut comme si tu appuyer sur le reset.. ba tu pilotes la base d'un transistor avec un sortie sur HIGH qui met le pin reset de la carte en contact avec le ground, ça devrais le faire, sans bibli!!

le transistor étant en position d' attente reste a l’état ( LOW ) et passera jamais a l’état ( HIGH )

Pour l'instant la seul idée pour moi car je suis vraiment novice en prog et de faire un monostable RC déclenché sur front montant se qui donnerai

appuis Bp
digitalRead(pinBp) == LOW // qui est aussi le bouton fonction M/A

digitalWrite ( pinRaz , LOW ); // envois un LOW au monostable et non raz uno

digitalWrite( pinEndStopY , LOW ); // LED jaune visuel impulsion = allumé
delayMicroseconds(8000);

digitalWrite ( pinRaz , HIGH ); // envois un HIGH au monostable et non raz uno
digitalWrite( pinEndStopY , HIGH ); // LED jaune visuel impulsion = éteint

et libère sur front montant le monostable qui passe l' entée raz a
( LOW ) de ( T= RC ) puis repasse à HIGH l'entré RAz
donc le prog termine sa raz et je me retrouve en situation
départ Setup

Mais je trouve dommage de rajouter un circuit ( CD4528 ou Cd 40xx Et ou OR ) et capa et résistance en plus
Donc le but est que cette foutu de raz fonctionne sans rajout.

Je vois sur la toile que le sujet de la RAZ est pas évident car beaucoup de solution marche pas comme le
#define Reset asm("jmp 0") qui fait une RAZ incomplète car vide pas la mémoire ce qui n'est pas bon pour mon cycle.

J’espère que mon résumé est lisible pour vous et je vous remercie de votre aide et trouve rune solution pour tous de RAZ simple et efficasse.

leptonlibre, il est vrai que la solution du transistor est assé improbable, mais si on par du principe qu'exciter sa base le rend passant, ça marche.

Il sera vu comme un fil et le léger courant de base partira dans la pin reset.

Je viens de faire un test sur tinkercad, ça marche!

le code de test:

int pinTest = A0 ; 
unsigned long oldTime;
int i;

void setup(){
  
  Serial.begin(115200);
  Serial.println("*****debut_programme*****");
  
  pinMode(pinTest,OUTPUT);
  i=0;
  oldTime = 0;
}  
  
  void loop(){
    
    if( millis() - oldTime >= 50){
         
        i++;
      Serial.println(i);
      oldTime=millis();
    }
      
      if(i>10){
        
        digitalWrite(pinTest,HIGH);
        Serial.println(pinTest);
        digitalWrite(pinTest, LOW);
        Serial.println(pinTest);
        i=0;
        
      }  
        
  }

J'ai pas tester en vrai.

A plus.

Comme demandé par 2terium tu aurais pu corriger ton premier post. Je n'ai jamais vu un code présenté de manière aussi jemenfoutiste (indentation pourrie, nombreuses lignes blanches).

https://forum.arduino.cc/index.php?topic=315372.msg4034761#msg4034761

Ton problème est une faute d'orthographe :

wtd_enable(WDTO_15MS);

Plutôt :

wdt_enable(WDTO_15MS);

2terium:
leptonlibre, il est vrai que la solution du transistor est assé improbable, mais si on par du principe qu'exciter sa base le rend passant, ça marche.

Il sera vu comme un fil et le léger courant de base partira dans la pin reset.

Je viens de faire un test sur tinkercad, ça marche!

le code de test:

int pinTest = A0 ; 

unsigned long oldTime;
int i;

void setup(){
 
  Serial.begin(115200);
  Serial.println("debut_programme");
 
  pinMode(pinTest,OUTPUT);
  i=0;
  oldTime = 0;

 
  void loop(){
   
    if( millis() - oldTime >= 50){
       
        i++;
      Serial.println(i);
      oldTime=millis();
    }
     
      if(i>10){
       
        digitalWrite(pinTest,HIGH);
        Serial.println(pinTest);
        digitalWrite(pinTest, LOW);
        Serial.println(pinTest);
        i=0;
       
      } 
       
  }





J'ai pas tester en vrai.

A plus.

2terium:
leptonlibre, il est vrai que la solution du transistor est assé improbable, mais si on par du principe qu'exciter sa base le rend passant, ça marche.

Il sera vu comme un fil et le léger courant de base partira dans la pin reset.

Je viens de faire un test sur tinkercad, ça marche!

le code de test:

int pinTest = A0 ; 

unsigned long oldTime;
int i;

void setup(){
 
  Serial.begin(115200);
  Serial.println("debut_programme");
 
  pinMode(pinTest,OUTPUT);
  i=0;
  oldTime = 0;

 
  void loop(){
   
    if( millis() - oldTime >= 50){
       
        i++;
      Serial.println(i);
      oldTime=millis();
    }
     
      if(i>10){
       
        digitalWrite(pinTest,HIGH);
        Serial.println(pinTest);
        digitalWrite(pinTest, LOW);
        Serial.println(pinTest);
        i=0;
       
      } 
       
  }





J'ai pas tester en vrai.

A plus.

Désole pour

Hbachetti de pas être a la hauteur dans la présentation je pensais que les blancs étaient plus facile donc je poserais des code une foi que je seras bon.

et pour 2terium

je vais essayer de nouveau le transistor mais je le fait avec mon bouton M/A car pour démarrer mon cycle, arrêt d'urgence ou normal.
La raz me sert à initialisé tout

Le bouton rouge me sert pour simuler la position garage qui sera après un détecteur hALL.

je vais essayer de vous mettre mon programme avec les manips à faire pour donner une idée quand

Encore merci et désoler :confused: je suis meilleur sur Eagle ou freecad pour ma prusa, je viens que d'attaque la programmation sur Arduino.

bon weekend

2terium:
leptonlibre, il est vrai que la solution du transistor est assé improbable, mais si on par du principe qu'exciter sa base le rend passant, ça marche.

Il sera vu comme un fil et le léger courant de base partira dans la pin reset.

Je viens de faire un test sur tinkercad, ça marche!

le code de test:

int pinTest = A0 ; 

unsigned long oldTime;
int i;

void setup(){
 
  Serial.begin(115200);
  Serial.println("debut_programme");
 
  pinMode(pinTest,OUTPUT);
  i=0;
  oldTime = 0;

 
  void loop(){
   
    if( millis() - oldTime >= 50){
       
        i++;
      Serial.println(i);
      oldTime=millis();
    }
     
      if(i>10){
       
        digitalWrite(pinTest,HIGH);
        Serial.println(pinTest);
        digitalWrite(pinTest, LOW);
        Serial.println(pinTest);
        i=0;
       
      } 
       
  }





J'ai pas tester en vrai.

A plus.

Bonjour et merci de m'avoir permis de tester sur tinkercad
je viens de tester sur tinkercad, changer les valeurs 200 et 5 pour 1 seconde ok mais en réel sur ma carte sa marche pas même problème, processeur bloqué faut déconnecter pour terminer la raz??? attend le front montant qui débloque l' horloge du processeur pour terminer la RAZ!

De plus je veux faire une raz sur appuis du bouton M/A, pas de problème pour détecter cette appuis
et envoyer digitalWrite( pinEndStopY , LOW );sur ma pine RST

mais l’impulsion négative ne peut se faire car au niveau bas de l’impulsion le processeur stop car il faut un front montant pour terminer sa RAZ, qui se vérifie en débranchant la connexion un foi
l’instruction digitalWrite( pinEndStopY , LOW ); car reste à LOW

De plus je peux plus rien modifier apparemment

mon erreur de novice est bien vu!

The message has the following error or errors that must be corrected before continuing:
The message body was left empty.

Donc je sais plus très bien quoi faire pour résoudre mon problème de raz et fonctionnement du forum
Désolé d'avoir pas compris toute vos règles.

hello
_un test
_tu prend ta carte UNO preferée
_tu mets un cable entre D12 et l a connexion "reset" située entre "ioref" et "3.3v" sur le connecteur "POWER"
_tu regles la viteses du moniteur sur 1000000 bauds
_tu téléverses le prg suivant
_tu regardes ce qui se passe sur le moniteur

const byte cde_reset = 12;
void setup() {
  Serial.begin(1000000);
  Serial.println("setup");
  Serial.println(digitalRead(cde_reset));
  digitalWrite(cde_reset,HIGH);
  Serial.println(digitalRead(cde_reset));
  pinMode(cde_reset,OUTPUT);digitalWrite(cde_reset,HIGH);
Serial.println("fin init");
}

void loop() {
  Serial.println("debut tempo 3 secondes");
  delay(3000);
  Serial.println("fin tempo 3 secondes");
  Serial.println("reset en cours");
  digitalWrite(cde_reset,LOW); 
}

Merci Dfgh

Ma carte une UNO R3
Je vais tester ton programme et le décortique pour comprendre
Merci

Voila ton programme fonctionne très bien sur timKerCad et je le mélange avec ma soupe hihi
pour l'adapter à mon programme car il y a juste faire cette raz sur appuis de mon bouton M/A.
je sais pas comment te passer mon fichier sur timkercad pour voir que j’écoute les conseils, de toute facon mes avancé seront la. Merci

Pour faire un Reset, on peut aussi utiliser le wifi vers une autre carte ESP qui fera coller un relais grâce à un MSOFET genre ILZ44N. Le contact du relais sera en parallèle entrée RESET/masse. On est un peu plus certain de gagner le concours de la plus grosse usine à gaz.

Sinon, on peut, sans aucun matériel, utiliser l'instruction de reset qui va bien (4 octets de programme, 3 cycles d'horloge)

A moins que j'ai mal compris l'objectif. Ce n'est pas de faire logiciellement comme si on appuyait sur le bouton Reset?

hello
si j'ai pu t'aider......c'est le but du forum :slight_smile:

vileroi:
Pour faire un Reset, on peut aussi utiliser le wifi vers une autre carte ESP qui fera coller un relais grâce à un MSOFET genre ILZ44N. Le contact du relais sera en parallèle entrée RESET/masse. On est un peu plus certain de gagner le concours de la plus grosse usine à gaz.

Sinon, on peut, sans aucun matériel, utiliser l'instruction de reset qui va bien (4 octets de programme, 3 cycles d'horloge)

A moins que j'ai mal compris l'objectif. Ce n'est pas de faire logiciellement comme si on appuyait sur le bouton Reset?

bonjour

Si je veux le faire automatiquement en fin de programme ou sur appuis du bouton Marche qui doit servir

si appui pendant le cycle fait un d’arrêt d'urgence donc bloque le cycle a l'endroit ( T ) et fait une raz ou il se trouve et si on rappuie dessus retourne en position départ, puis nouvelle appuis redémarre mon cycle du début.
Je sais pas si je suis claire dans mon texte disons que je veux absolument me servir que d'un seul bouton le M/A.

J'ose pas mettre un passage de mon programme ou mettre cette routine Raz( reset ) car je me suis fait incendie mais le novice comprends, disons que dans mon cycle j'ai des allez retour de moteur pas à pas
et c'est entre pendant que je veux pourvoir stopper cela marche avec un bouton d'essai qui stoppe ma boucle et attends mon reset pour redémarrer.

j'ai cherché des programmes tout fait mes ou avec transistor mais pas efficace apparemment
(4 octets de programme, 3 cycles d'horloge)

hello
pour reprendre tes explications:

ton prg fait le setup et attend un appui sur BP.
sur appui sur BP, le prog execute sa boucle loop
1/_si tu laisses faire, en fin de loop, le prg execute la raz automatique avec la sortie 12.
la RAZ effectuée, le prg attend à nouveau un appui sur BP.

2/_si pendant l'exécution de la loop, donc pendant un déplacement moteur, tu appuies sur BP
le moteur s'arrette, et le prg attends un nouvel appui sur BP.
suite à un nouvel appui sur BP, le moteur retourne en position de départ (en origine de son axe)
et le prg exécute une RAZ avec la sortie 12

est ce bien ça?

dfgh:
hello
pour reprendre tes explications:

ton prg fait le set et attend un appui sur BP
appui sur BP, le prog execute sa boucle loop
1/_si tu laisses faire, en fin de loop, le prg execute la raz automatique avec la sortie 12.
la RAZ effectuée, le prg attend à nouveau un appui sur BP.

2/_si pendant l'exécution de la loop, donc pendant un déplacement moteur, tu appuies sur BP
le moteur s'arrette, et le prg attends un nouvel appui sur BP.
suite à un nouvel appui sur BP, le moteur retourne en position de départ (en origine de son axe)
et le prg exécute une RAZ avec la sortie 12

est ce bien ça?

oui pour mes essais mais le but c'est de me servir juste du Bp M/A pour démarrer un cycle, stopper le cycle avec le Bp et redémarrer avec le Bp
J'ai tester sur timkercad ton programme avec une parti du mien pour simuler et marche
mais avec le Bp raz , donc j'ai esseyé de changer le 12 en 2 et

if ( digitalRead(pinEndStopX) == LOW ) //avec une detection raz bouton rouge
// ( digitalRead(pinBp) == LOW ) //avec une detection raz bouton M/A marche pa

leptonlibre:
oui pour mes essais mais le but c'est de me servir juste du Bp M/A pour démarrer un cycle, stopper le cycle en urgence si besoin avec le Bp M/A et redémarrer avec le Bp M/A
un seul Bp pour gérer le programme sinon je ferai avec 2 mais dommage

J'ai tester sur timkercad ton programme avec une parti du mien pour simuler et marche
mais avec le Bp M/a ET Bp raz , donc j'ai essayé de changer le 12 en 2 et j'ai que des raz :confused:

if ( digitalRead(pinEndStopX) == LOW ) //avec une detection raz bouton rouge // marche
// ( digitalRead(pinBp) == LOW ) //avec une detection raz bouton M/A // marche pas

Donc je sais pas mais j’apprends, je voudrais te montrer mon prog essais sur timkercad mais je sais pas comment faire :confused:
Bonne semaine