programmation moteur pas à pas+interruption

:slight_smile:
bonjour , nouveau sur le site car je débute sur arduino et je tente de programmer la marche d'un moteur pas à pas.
j'utilise un easydriver et n'ai besoin que de 2 port de sortie.
les programmes style stepper avec un tour en avant , un tour en arrière fonctionne parfaitement.
j'ai donc voulu faire mon propre programme avec un potentiomètre pour la vitesse, un bouton reset, un capteur de point zero, le tout gérant un disque rotatif.
le but est simple: si j'appuie sur reset , le moteur fait tourner le disque jusqu'à détecter le point zéro (avec variation de la vitesse par potentiomètre)

voici mon programme:
int reset=0; // bouton reset

void setup() {
pinMode(3, OUTPUT); //step
pinMode(2, OUTPUT); //dir
pinMode(5, INPUT); //zero
pinMode(6, INPUT); //reset
digitalWrite(3, LOW);
digitalWrite(2, LOW);
Serial.begin(9600);
}

void loop() {

int vitesse = analogRead(A0); // lecture du potentiometre
if (digitalRead(6)== 1) { reset = 1; } // active le mode reset
if (reset=1) {
digitalWrite(3, HIGH);
delayMicroseconds(100+vitesse);
digitalWrite(3, LOW);
delayMicroseconds(100+vitesse);
delay(5);
if (digitalRead(5)== 1) { reset = 0; }// desactivation du rest si position zéro
}
}

:disappointed_relieved: rien ne va plus.....
la lecture du potentiomètre ne fonctionne pas, le reset et le point zéro n'ont pas d'influence, et le moteur tourne tout seul.

si je comprend pourquoi, grace à vous, je peut continuer mon programme et m'en sortir tout seul....le but étant de faire un plateau tournant au 1/10eme de degré, ordre donné par un pc, dans un sens comme dans l'autre.
merci d'avance pour vos réponses XD

Salut, pleins de choses à dire !

Premièrement, le code on le met etre des balises code (le bouton #)

Ensuite :

On ne met pas le numéro de pin en plein milieu du code, on met soit des préprocesseur soit des variables sinon c'est illisible

fabdos28:
if (reset=1) {

il manque un =, là tu donne à reset la valeur 1

fabdos28:
if (digitalRead(6)== 1) { reset = 1; } // active le mode reset

En général, on met == HIGH et non 1

fabdos28:
int reset=0; // bouton reset

Dans ton code, reset prend toujours la valeur 0 ou 1, pourquoi utiliser un int (2 octets) alors qu'un boolean (1 octet) suffirait ?

Après, je ne connais pas le fonctionnement d'un moteur pas à pas et tu n'as pas fourni de schéma donc je ne peux pas plus t'aider :wink:

Viproz:
On ne met pas le numéro de pin en plein milieu du code, on met soit des préprocesseur soit des variables sinon c'est illisible

Vu la taille du code et la simplicité du code, c'est pas forcement ce qui dérange le plus xD

Viproz:

fabdos28:
if (digitalRead(6)== 1) { reset = 1; } // active le mode reset

En général, on met == HIGH et non 1

[/quote]

Moi je le fais tout le temps, au moins ça veut dire qu'il a compris que HIGH = 1 = True

Viproz:

fabdos28:
int reset=0; // bouton reset

Dans ton code, reset prend toujours la valeur 0 ou 1, pourquoi utiliser deux octets avec un int (2 octets) alors qu'un boolean (1 octet) suffirait ?

[/quote]

1 octet = byte boolean = 1 bit

Sinon avec la remarques sur les "==" de Viproz je pense que ça marchera, avec un simple "=", même dans une condition, tu forces reset à 1 en permanence :wink:

B@tto:
1 octet = byte boolean = 1 bit

Malheureusement non, "A boolean holds one of two values, true or false. (Each boolean variable occupies one byte of memory.)"

Oh flûte j'en apprend une ! Je viens de faire le tour de différents langage que je pratique et j'avais jamais noté ce genre de blague, la palme au VB.NET : 1 byte = 1 byte 1 boolean = 2 bytes :s

Salut,
Merci pour vos commentaires.
Je me suis fait avoir comme un bleu : toujours metre == dans une comparaison. :grin:

Mon code n'est pas fini. Je pense qu'il y auras d'autre question :wink: