projet "fou" une horloge avec comme aiguille 2 hélices d'avions

avec une carte arduino et 2 moteurs pas à pas

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

bonjour à tous je suis nouveaux sur le site et dans le monde de la programmation c++ et pourtant pas tout jeune

je résume; je possède: une carte artuino uno un stepper motor RB Dfr 539 deux moteur 42 STH 38-27 le programme tourne avec les calculs de reduc ect aprés de multiples essais et recherches Mais j'ai le fameux delay dans le programme et je voudrais pouvoir stopper la boucle pour effectuer une remise à l'heure. le tous avec une télé commande Et cela ne marche pas. oui le delay est de trop, mais il me le faut.

alors, je vous demande conseille et surtout de simple conseille car je le rappelle , je n'ai qu'un mois expérience en langage c++

MERCI :ange:

+0 -0
Auteur du sujet

et oui les amis le delay qui prend tu temps ah ah avec do…while , sa prend pas non plus et zut il me faudrait une solution pour arrêter le void loop avant peut être dans setup mais non prendre millis ??

+0 -0
Auteur du sujet

voila mon petit code fait maison a finir avec votre aide

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <IRremote.h>
#include <IRremoteInt.h>


#include <Stepper.h>


int RECV_PIN = 11;

int M1DIR = 4;
int M1STEP = 5;
int M2DIR = 7;
int M2STEP = 6;

int duree_pas;//durée du pas en micro seconde
int nombre_pas;//nombre de pas 200 par tour

long int res_val;
IRrecv irrecv (RECV_PIN);
decode_results results;



void setup() {
Serial.begin(9600);
irrecv.enableIRIn();

 pinMode(M1DIR,OUTPUT);
 pinMode(M1STEP,OUTPUT);
 pinMode(M2DIR,OUTPUT);
 pinMode(M2STEP,OUTPUT);

}

void loop() {
 if (irrecv.decode(&results)) {

  res_val = results.value;
  Serial.println(results.value,HEX);


  if ( results.value== 0xFF30CF){// touche 1 démarrage de l'horloge

  digitalWrite(M1DIR,1);

int n;
for (n=0;n<=23;n++){//moteur minute
  digitalWrite(M1STEP,1);
  delayMicroseconds(nombre_pas  / 1);

  digitalWrite(M1STEP,0);
  delayMicroseconds(nombre_pas / 1);
  n = n +1;
 delay (670);//résultat calcule reducteur

} 

digitalWrite(M2DIR,1);

  digitalWrite(M2STEP,1);//moteur heure
  delayMicroseconds( nombre_pas/1);

  digitalWrite(M2STEP,0);
  delayMicroseconds( nombre_pas/1);


}if(results.value==0xFF906F){//touche EQ pour arrêt qui marche pas

digitalWrite (M1STEP,0);
digitalWrite (M2STEP,0);
}
   while (results.value==0xFF18E7){//touche2 mise à l'heure rapide


   digitalWrite(M1DIR,1);

int i;
for (i=0;i<=23;i++){
  digitalWrite(M1STEP,1);
  delayMicroseconds(nombre_pas  / 1);

  digitalWrite(M1STEP,0);
  delayMicroseconds(nombre_pas / 1);
  i= i+1;

delay (1);
}

digitalWrite(M2DIR,1);

  digitalWrite(M2STEP,1);
  delayMicroseconds( nombre_pas/1);

  digitalWrite(M2STEP,0);
  delayMicroseconds( nombre_pas/1);
}
    irrecv.resume();
 }}

merci d'avance pour vos bon conseilles

Édité par Arius

+0 -0

Salut,

Tu peux mettre ton code en forme comme ça.

1
2
3
4
5
6
7
8
9
```c
#include <stdio.h>

int main(void)
{
   puts("Hello word");
   return 0;
}
```

Qui donne

1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
   puts("Hello word");
   return 0;
}

Il y a aussi cpp plutôt que c pour avoir la coloration syntaxique du C++.

EDIT : pas la peine de faire un nouveau message, édite ton code précédent pour mettre ton code en forme.

Édité par Karnaj

Je fais un carnage si ce car nage car je nage, moi, Karnaj ! - Tutoriels LaTeX - Contribuez à un tutoriel Ruby

+0 -0

Ce n'est pas du C++ mais du C (ça n'a pas d'importance, mais c'est toujours mieux d'être préçis).
Quelques remarques au premier coup d’œil :
Le code est plutôt mal indenté, ce qui le rend difficilement lisible pour nous. Tu peux aussi le découper en plus de fonction.
Pour tes constantes M1DIR etc… tu peux utiliser soit l'instruction préprocesseur #define M1DIR 4, ce qui t'économiseras de la mémoire, soit le mot clé du C++ const const int M1DIR = 4; pour t'assurer que cette variable ne soit pas modifié par la suite. Car ce code n'est pas "propre": on aime pas trop les variables globales.

oui le delay est de trop, mais il me le faut.

nico108

Pourquoi ?
Je n'ai jamais programmé une arduino, alors je peux louper des choses. Mais j'ai de l'expérience en programmation temps réel et j'ai déjà fait joujou avec une raspberry pi.

Au final, je n'ai pas saisi ton problème (sûrement à cause de mon manque d'expérience avec les arduino), et je ne suis probablement pas le seul. Peux-tu expliciter ?

Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison - Coluche

+0 -0
Auteur du sujet

Bonjour leroivi ainsi qu'à vous tous. pardon encore pour mes fautes de débutant. j'apprend depuis peux l'existence de la programmation, en leader, graf7 et c. Et je suis comme un enfant dans un magasin de jouets.j'ai l'impression d'avoir perdue de longue années.

Pour en revenir à un de mes problèmes leroivi. Le petit code mal ordonné (encore pardon)doit faire tourner 2 pap bipolaire avec une cadence et un rapport (de 12) pour donner des minutes pour M1 et heure pour M2. Pour l'instant, il est fiable et testé sur 96h. Mais, avec une ambition peut-être un peux grande, je voudrais en plus pouvoir commander les 2 moteurs avec une télé commande pour faire; un stop, un RUN, une mise a l'heure rapide en modifient le delay de 670 pour avancer les deux aiguilles plus vite toute en conservant le même rapport. Pour conclure pour l'instant, non leroivi tu as beaucoup plus d'expérience que moi et encore merci.

+0 -0

Il n'y a aucun problème, ce sont des remarques pas des reproches, nul besoin de s'excuser, on a tous commencé de zéro un jour.

Ton programme ne fonctionnera pas tout simplement car le langage C est un langage séquentiel. Ainsi les instructions s'exécutent dans l'ordre dans lequel tu les as écrites. Or, pour compter tes minutes, tu rentres dans une boucle, et tu y reste jusqu'à que l'heure soit finie. Pour avoir l'effet du reste de ton code il faudrait que tu appui pile lorsque l'heure se termine.

Les interactions avec l'utilisateur en C se font rarement en testant les boutons dans une boucle. Arduino doit avoir mis en place un système semblable à celui des microcontrôleur, à savoir un système d'interruption. Malheureusement, tu vas devoir éplucher de la doc parce que je ne sais pas comment il est mis en place sur arduino, mais ce système va associer une fonction à exécuter lors de l'évènement "appui sur le bouton" dans laquel tu vas simplement modifier ta variable de delay, puis le programme reviendra à l'instruction qu'il devait exécuter. Il faut que les fonctions d'interruption soit le plus court possible pour ne pas rater d'autres évènements.

EDIT: et là pour le coup, tu vas avoir besoin des variables globales.

Édité par leroivi

Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison - Coluche

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte