Faire fonctionner 2 moteurs pas-à-pas bipolaires simultanément : comment faire?

Bonjour,
je suis élève en terminale S, je suis dans une équipe et nous avons pour projet de créer un parasol solaire automatique qui est censé tourner en fonction de la position du soleil. J'ai pour tâche de faire la programmation sur Arduino. J'arrive à faire fonctionner avec les capteurs de luminosité le moteur1 qui agit sur le nord et le sud, problème, je n'arrive pas à faire tourner le moteur2 qui agit en fonction de l'exposition à la lumière des capteurs est et ouest. Quelqu'un pourrait-il me filer un coup de main?
Voici le programme, et merci d'avance :slight_smile:

ok_vert_et_hor2.ino (10.1 KB)

Bonjour;
Je suis pas spécialiste en arduino ni très scientifique mais votre projet m’intéresse.

Que veux tu dire par "il ne fonctionne pas" (le moteur deux).

Comment détectez vous la position du soleils?
L'axe de rotation du soleils reste sensiblement le même est-ouest.
Ce qui change c'est l'axe d'inclinaison d’ensoleillement en fonction de l’évolution des saisons dans l'année.

Voire le principe du cadrant solaire.

Bonjour Manumanu,

ce que je veux dire par là, c'est que le moteur 2 ne tourne pas en même temps que le moteur 1. Lorsque le moteur 1 tourne, le moteur 2 ne tourne pas et inversement.
C'est soit l'un ou l'autre et j'aimerais que les 2 tournent.
La position du soleil est détectée par 4 capteurs de luminosité nord-sud-est-ouest et mes moteurs tournent en fonction de ces capteurs.

Salut,

Bin oui avec des delay() + while() on a le tiercé gagnant pour un code bloquant.

Il faut utiliser millis() et utiliser des fonction rendre le tout plus lisible et efficace.

int moteurHpins[]={8,9,12,13};
int moteurVpins[]={2,3,4,7};
byte moteurSequence[]={0b1010,0b0110,0b0101,0b1001};

void setup() {

for(int i=0;i<4;i++) {

pinMode(motorHpins[i],OUTPUT);
pinMode(motorVpins[i],OUTPUT);
}

}

void loop() {

lireCapteurs();

if(capt_est>capt_ouest) moteurH(1);
else moteurH(0);

if(capt_sud>capt_nord) moteurV(1);
else moteurV(0);

}

void moteurH(byte sens) {

static start=0;
static step=0;

if(millis()>start+200) {

if(sens && step<3) step++;
elseif(sens) step=0;
elseif(step>0) step--;
else step=3;

start = millis();

analogWrite(speedpin,255)

for(int i=0;i<4;i++) {

digitalWrite(motorHpins[i],moteurSequence[step] & 1<<i);

}

}

}

void moteurV(byte sens) {

static start=0;
static step=0;

if(millis()>start+200) {

if(sens && step<3) step++;
elseif(sens) step=0;
elseif(step>0) step--;
else step=3;

start = millis();

analogWrite(speedpin,255)

for(int i=0;i<4;i++) {

digitalWrite(motorVpins[i],moteurSequence[step] & 1<<i);

}

}

}

void lireCapteurs() {

  capt_sud=analogRead(lum1);
  capt_nord=analogRead(lum2);
  capt_est=analogRead(lum3);
  capt_ouest=analogRead(lum4);

}

Bonjour,

tu utilises la fonction "delay" dans ton programme .....

Cela a pour conséquence d’arrêter le programme pour un temps déterminé et de ne plus exécuter d'instruction.

De plus, lorsque tu rentres dans une boucle de gestion d'un moteur, tu n'en sors qu'a la fin du traitement de ce moteur d'ou ta remarque....

Donc, deux pistes :

  1. utilisation de millis() au lieu de delay()

  2. utilisation de if{} plutôt que while{}

dépêchez vous les jeunes, le mois de juin est TRES court ...

Pierre

B@tto : Je me suis fait griller sur la ligne :wink: mais au moins, nous sommes d'accord :slight_smile:

De mon point de vu il n'y a qu'une position qui vas varier vraiment, c'est la rotation solaire. est-Ouest

L'inclinaison solaire haut-bas elle restera la même sur une journée et changera en fonction des saisons donc sensiblement la même que le jour précédent. la correction de position se fera de jour en jour donc les deux mouvements en même temps ne me semble pas utile.

Pour le programme tu as tes réponses.

bonjour,
en fait, c'est ni plus ni moins qu'un tracker solaire.
déjà tes deux moteurs ne pourront tourner en même temps puisque l'arduino ne fait que du mono tache.
donc ils vont tourner chacun leur tour et donner l'impression d'être ensemble.

manumanu:
De mon point de vu il n'y a qu'une position qui vas varier vraiment, c'est la rotation solaire. est-Ouest

L'inclinaison solaire haut-bas elle restera la même sur une journée et changera en fonction des saisons donc sensiblement la même que le jour précédent. la correction de position se fera de jour en jour donc les deux mouvements en même temps ne me semble pas utile.

Pour le programme tu as tes réponses.

je ne suis pas certain de ton avis.

manumanu:
De mon point de vu il n'y a qu'une position qui vas varier vraiment, c'est la rotation solaire. est-Ouest

L'inclinaison solaire haut-bas elle restera la même sur une journée et changera en fonction des saisons donc sensiblement la même que le jour précédent. la correction de position se fera de jour en jour donc les deux mouvements en même temps ne me semble pas utile.

De toute manière toute la gestion par LDR est inutile puisqu'il y a déjà des tables (comme celle postée par infobarquee) qui permettent de savoir où il faut pointer.

Ca n'empêche pas que c'est un bon exercice :wink:

Bonjour tous!

C'est vrais que c'est plus parlant par un graphe. d'étude.
Vous allez me dire que je suis têtu mais ...
Ce qui me conforte à dire qu'a chaque levé de soleil il vas corrigé son orientation depuis l'azimut et décrira un "arc" de cercle. La correction sera infime de jours en jours.
Le graphe est super il faudrait une représentation en 3D de la courbe.( j'en cherche une ).

J'ai trouvé ça c'est basique mais ça représente mon point de vu.

Merci à tous pour vos réponses,
j'ai par contre un problème dans le programme avec static start=0
ça me marque ISO C++ forbids declaration of 'start' with no type

Ben oui, static ne défini pas un type, c'est un modificateur de type. Il faut écrire:

static int start=0;

ou de manière générale

static <type> start=0;