Ma Machine à Cocktails Automatisée

Bonjour et bonsoir les gens :grinning:

Depuis cet été, je passe pas mal de temps à fabriquer ma machine a cocktails, j'essaye, je teste, je change, je crame des arduino, c'est toute une aventure !

Voici quelques photos pour mieux visualiser le projet :

De face, avec le Rpi tactile qui indiquera le menu des futurs cocktails à choisir.
Il y a les 2 distributeurs diffèrents.

Au début je partais sur un nema14 avec une tige filetée, mais cela ne me convient pas, alors je pars sur un servo moteur assez puissant pour presser le distributeur ( la pièce n'est pas encore faite ).
Il y aura un détecteur de présence de verre ( RP-S40-ST )


Vu de l'arrière avec le Rpi à gauche, l'arduino au centre et les pompes à droite.

C'est un Atmega 2560 + Cnc Shield v3 + Dv8825
Je préfére le 2560 que le Uno car cela me laisse davantage de broches à disposition.

Voici la photo de coté

J'ai commencé un code, au début un code pour tester les pompes, puis un second pour tester mon axe Y avec un arrêt endstop. Les deux codes se téléversent bien et les actions fonctionnent correctement.
Par contre, quand j'assemble les deux ensemble, ça se téléverse bien, j'ai mes pompes qui s'actionnent, mais pas mon axe Y, le chariot ne se déplace pas.
Comment peux t on faire pour que tout fonctionne ?
Cordialement

//step pins
#define Y_stp 3

//direction pins
#define Y_dir 6

//endstop pins
#define Y_lim 10


void setup() {

 pinMode(Y_stp,OUTPUT);
 pinMode(Y_dir,OUTPUT);
 pinMode(Y_lim, INPUT);

 pinMode(23,OUTPUT);
 pinMode(25,OUTPUT);
 pinMode(27,OUTPUT);
 pinMode(29,OUTPUT);
 
}

void loop() 
{

  if( digitalRead(Y_lim) == HIGH){
    digitalWrite(Y_stp,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(Y_stp,LOW); 
    delayMicroseconds(500); 
    
   }

 digitalWrite(23,HIGH);

 digitalWrite(25,HIGH);

 digitalWrite(27,HIGH);
 
 digitalWrite(29,HIGH);

 delay (1000);

 digitalWrite(23,LOW);
 delay(1000);

 digitalWrite(23,HIGH);
 delay(1000);

 digitalWrite(25,LOW);
 delay(1000);

 digitalWrite(25,HIGH);
 delay(1000);

 digitalWrite(27,LOW);
 delay(1000);

 digitalWrite(27,HIGH);
 delay(1000);

 digitalWrite(29,LOW);
 delay(1000);

 digitalWrite(29,HIGH);
 delay(1000);
}

Les deux codes pour les 2 actions sont bloquantes car elles utilisent des delay.
Cela veut dire que chacune d'elles nécessite tout le temps machine.

Il faut regarder du côté des deux codes des exemples que l'on voit partout:
blink with delay -> avec des instructions delay, tout le temps dispo est utilisé
blink without delay -> avec des instructions micros: on boucle plus vite que ce qui est utile, du coup les boucles sont rapides et de temps en temps on fait un changement.

Un exemple de fusion de deux programmes:
http://arduino.dansetrad.fr/Initiation/millis.php

Tes deux parties ressemblent au blink with delay. Quand il tourne on fait une fois le premier code, une fois le second. Le premier code dure 1ms, le second dure 9s. Il fait donc 1 cycle du premier type (on avance 1 pas), puis il fait le second code (un cycle de pompe).

Si mais maximum un pas toutes les 9s... C'est très lent.

Pour les mouvements de ton moteur pas à pas, faire ça "à la main" ne donne que rarement des déplacements fluides. Il est préférable d'utiliser une bibliothèque comme StepperDriver.

Cordialement
jpbbricole