Jeu de lumière à miroir type scanner

Bonjour,

j'ai 40 ans me passionne pour l’électronique et le bricolage mais question codage je suis plus que nul puisque ma seule connaissance de l'arduino ce limite au réglage dans le code de mon imprimante delta; par contre je vais m'empresser de lire vos tuto.

Du coup je vous explique mon projet/besoin histoire de voir si cela est réalisable avec ces petits boitiers, d'avance je m'excuse si cela a déjà était évoqué mais je n'ai rien trouvé...

j'ai récupéré des vieux jeux de lumière qui à l'origine se compose d'un miroir qui tourne sur 360° sur un axe, j'ai amélioré le système pour qu'il fonctionne au rythme de la musique et avec un jeu de miroir le faisceau et renvoyé sur 180° mais cela reste du basic.

Je voudrais savoir s'il était possible d'arranger ça avec un Arduino, dans mon esprit j'imagine deux servo-moteur un pour la verticale qui ferait bouger le miroir sur 45° et l'autre pour l’horizontale qui ferait un déplacement sur 140°, le tout avec des mouvements aléatoire et si possible une vitesse modifié en fonction du BPM (d’après ce que j'ai lu cette partie risque de ne pas être possible) ou à minima une mise en route par le son (donc micro) en gros ce que l'on appelle scanner.

Est ce que tous ceci est réalisable avec un arduino Nano ?
Connaissez vous un montage qui s'en approche ?

Je sais que les scanner travaille avec des moteurs PAP, mais cela obligerait à avoir en plus un capteur de fin de course pour qu'il connaisse son point de départ et cela augmenterait la taille de l'ensemble mobile.

Voilà pour le début pas beaucoup de question mais je pense importante pour mon petit esprit.

Merci

Est ce que tes servomoteurs bougent assez vite par rapport au rythme max de la musique ?

Christian_R:
Est ce que tes servomoteurs bougent assez vite par rapport au rythme max de la musique ?

C'est une très bonne question, j'aurais tendance à te dire oui 0.12 sec pour 60° ce qui ferait un déplacement max 0.28 sec et sinon on fera avec.

Côté arduino, oui. Faire bouger deux servos, ça devrait aller :wink: On peut leur faire faire bien plus que ça.

Christian a raison, il faut les servos qui correspondent à ton besoin.
A cette vitesse tu peux les faire bouger sur 180 bpm à mon avis sans trop de mal :wink:

Des jeux de lumière à base d'arduino, on en trouve. J'ai vu des projets proches plusieurs fois, sans trop chercher... Mais souvent la lumière varie ou change de couleur en rythme. Mais ça doit te libérer le problème de la détection du rythme.

Ensuite, la commande ressemblera à:

détecter le bpm
à chaque bpm, bouger les servos selon des variables pseudoaléatoires.

Pour avancer plus loin, il faut plus d'infos.
Est-ce que ton jeu de lumière envoie une impulsion quand ça fait boumboum ou faut-il créer un détecteur bpm?
Si ça devient très technique côté jeu de lumière, je risque de décrocher, mais dans l'absolu, je vais suivre le fil...

Je sais bien qu'on peu faire bien plus que deux servos, mais je n'ai pas vu de tel montage encore...des jeux de lumière il n'en manque pas, mais comme tu dis, souvent ce sont juste des variations de lumières et les quelques effet que j'ai trouvé avec des servos sont qu'ils partent d'un point 0 et augmente la rotation en fonction du signal jusqu’à un point défini pour redescendre à l'affaiblissement du signal donc pas super non plus.

Actuellement mon circuit est un pseudo aléatoire basé sur des portes Nand et le PWM est lui en fonction du la puissance du signal mais je souhaiterais supprimer cette platine donc passer 100% arduino.

Pour résumer ce qui est à créer:

1 Détection du BPM ou signal par un micro

2 mouvement des servos pas forcement à chaque boum :slight_smile:

voila pas plus, la lumière elle reste fixe et n'est pas géré, je suis vraiment débutant donc je ne veux pas trop en mettre après pourquoi pas encore plus mais pour un début je ne veux pas trop m’éparpiller dans des choses trop complexe.

Le capteur de fin de course n'est pas obligatoire sur des moteurs pas à pas, si on les positionne à la main au départ dans une position de référence connue.

Pour faire varier la couleur il existe des LED à 4 pattes (GND, Red, Green, Blue) dont la couleur est modulable à volonté, à voir si c'est assez lumineux pour le projet.

Quand à détecter le BPM ça me semble tout à fait faisable, c'est très lent par rapport au processeur de a carte.

pagpatrice:
Bonjour,

j'ai 40 ans me passionne pour l’électronique et le bricolage mais question codage je suis plus que nul puisque ma seule connaissance de l'arduino ce limite au réglage dans le code de mon imprimante delta; par contre je vais m'empresser de lire vos tuto.

Du coup je vous explique mon projet/besoin histoire de voir si cela est réalisable avec ces petits boitiers, d'avance je m'excuse si cela a déjà était évoqué mais je n'ai rien trouvé...

j'ai récupéré des vieux jeux de lumière qui à l'origine se compose d'un miroir qui tourne sur 360° sur un axe, j'ai amélioré le système pour qu'il fonctionne au rythme de la musique et avec un jeu de miroir le faisceau et renvoyé sur 180° mais cela reste du basic.

Je voudrais savoir s'il était possible d'arranger ça avec un Arduino, dans mon esprit j'imagine deux servo-moteur un pour la verticale qui ferait bouger le miroir sur 45° et l'autre pour l’horizontale qui ferait un déplacement sur 140°, le tout avec des mouvements aléatoire et si possible une vitesse modifié en fonction du BPM (d’après ce que j'ai lu cette partie risque de ne pas être possible) ou à minima une mise en route par le son (donc micro) en gros ce que l'on appelle scanner.

Est ce que tous ceci est réalisable avec un arduino Nano ?
Connaissez vous un montage qui s'en approche ?

Je sais que les scanner travaille avec des moteurs PAP, mais cela obligerait à avoir en plus un capteur de fin de course pour qu'il connaisse son point de départ et cela augmenterait la taille de l'ensemble mobile.

Voilà pour le début pas beaucoup de question mais je pense importante pour mon petit esprit.

Merci

Bonsoir et bienvenu
Sur ce forum tu trouveras "surement de l'aide" 8)

Il y a des pratiquants tres pointus dans des domaines particulièrement spécifiques. ;D

Il y a donc ici des spécialistes "de la lumière scénique" :smiley: (pas moi ;D )

Tu souhaite partir pour "retrofit" d'une base de travail " = ta recup
Expose déjà le maximum d'info (refs, photos, infos, ... etc)
Avec un peu de temps , de reflexion, de travail , tu risque au pire de te retrouver avec des vieux machins finalement utilisable en DMX :grin:

Le DMX ne m'intéresse pas particulièrement :wink: c'est juste pour quelques fêtes familiale et m'occuper les jours de pluie :).

je vous ferez des photos ce soir.

Hier soir j'ai joué avec Tinkercad, j'ai utilisé la fonction RANDOM, le résultat n'était pas top, du coup j'ai créé une liste de mouvement, c'était bien mieux, il me reste à trouver comment prendre aléatoirement dans cette liste pour voir ce que cela donne.

J'ai un peu plus réfléchi et en effet il me serait possible d'utiliser un moteur PAP pour l'axe Horizontal en utilisant une fin de course donc à voir...

Par contre, connaissez vous un simulateur un poil mieux que Tinkercad car la liste de composant est un peu limité ?

pagpatrice:
j'ai utilisé la fonction RANDOM, le résultat n'était pas top,

Pour avoir de l'aléatoire, il faut utiliser randomseed en amont du random

Ou la bibliothèque TrueRandom

kammo:
Pour avoir de l'aléatoire, il faut utiliser randomseed en amont du random

merci, pense que je suis un vrai débutant :D, je vais tester

Ou la bibliothèque TrueRandom

merci, je vais chercher des infos mais n'ayant rien de réel pour tester ...

bon voilà 2 videos de l'actuel

Bon, j'ai fait le tour de mon bazar, j'ai découvert une carte avec un atmega168AU fonctionnant sur horloge interne (pas de quartz) et quelques uln2003, j'ai aussi un usb to TTL qui traîne, donc je pense que ce weekend je vais voir si je peux me connecter au méga, si j'y arrive j'aurais au moins de quoi tester des codes en réel.
j'ai pas encore trouvé un code pour un moteur PAP mais je vais commencer à chercher après niveau servo j'ai ce qu'il faut...

pagpatrice:
niveau servo j'ai ce qu'il faut...

Avec <Servo.h> c'est vraiment simple

Oui, je suis tombé sur ce site:
https://codebender.cc/sketch:317788#Random%20Servo%20Simple.ino
Le fonctionnement me semble pas mal, du coup j'ai ajouté un deuxième servo et j'ai joué avec les valeurs pour comprendre un peu comment ça fonctionne, le problème de tinkercad c'est qu'il n'y a pas de mmoteur PAP n'y de détecteur sonore donc je suis limité; c'est pour ça que je veux voir si j'arrive à récupérer celui que j'ai sur cette vieille carte (portail automatique d'origine).

Donc mon premier test, c'est du copier coller mais bon ça m'a permis de comprendre certains trucs :slight_smile:

#include "Servo.h"               // Implements easy to use servo controls

Servo ServoOne;                  // Generates an instance of a servo object
Servo Servo2;
int ServoPosition = 0;           // Variable to be used to assign position of servo
int ServoPosition2 = 0;
void setup()                     // Initialize
{
  ServoOne.attach(9);            // Assigns pin 9 as a servo
  Servo2.attach(10);
  randomSeed(analogRead(0)); // initialise le générateur de nombre aléatoire en lisant broche analogique
}

void loop()// Main loop
{
  ServoPosition = random(30,150); // Generates a random number and stores it in ServoPosition
  ServoPosition2 = random(40,80);
  ServoOne.write(ServoPosition); // Commands servo to spin to position
  Servo2.write(ServoPosition2);
  delay(1000);                   // Delays for 1000 ms
}

Euh le sujet étant devenu bien précis ne serait-il pas temps de respecter les "Règles du forum francophone" et changeant le titre du premier message ?

Ne pas oublier que les titres servent à faire des recherches sur le forum.

Merci.

68tjs:
Euh le sujet étant devenu bien précis ne serait-il pas temps de respecter les "Règles du forum francophone" et changeant le titre du premier message ?

Ne pas oublier que les titres servent à faire des recherches sur le forum.

Merci.

Oui tu as raison, en fait je voulais ouvrir un nouveau sujet mais vu que sur ce forum les titres sont éditable c'est mieux.

Bon, plus j'avance et plus j'ai l’impression de reculer...

D'abord il met impossible de flascher mon 168p donc j'ai laissé tombé cette partie, ensuite, j'ai réussi à ajouter un détecteur sonore dans mon code, il y a encore une partie du code que je ne comprend pas mais le test fait sur tinkercad fonctionne, les servos bouge plus vite en fonction du volume.

N'étant pas exactement ce que je recherche, j'ai pas mal lu et j'ai mis en favoris une quantité énorme de site :confused:, le seul code que j'ai trouvé avec un vrai détecteur de BPM et celui-là:

// Arduino Beat Detector By Damian Peckett 2015
// License: Public Domain.

// Our Global Sample Rate, 5000hz
#define SAMPLEPERIODUS 200

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
    // Set ADC to 77khz, max for 10bit
    sbi(ADCSRA,ADPS2);
    cbi(ADCSRA,ADPS1);
    cbi(ADCSRA,ADPS0);

    //The pin with the LED
    pinMode(2, OUTPUT);
}

// 20 - 200hz Single Pole Bandpass IIR Filter
float bassFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = sample / 9.1f;
    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7960060012f * yv[0]) + (1.7903124146f * yv[1]);
    return yv[2];
}

// 10hz Single Pole Lowpass IIR Filter
float envelopeFilter(float sample) { //10hz low pass
    static float xv[2] = {0,0}, yv[2] = {0,0};
    xv[0] = xv[1]; 
    xv[1] = sample / 160.f;
    yv[0] = yv[1]; 
    yv[1] = (xv[0] + xv[1]) + (0.9875119299f * yv[0]);
    return yv[1];
}

// 1.7 - 3.0hz Single Pole Bandpass IIR Filter
float beatFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = sample / 7.015f;
    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7169861741f * yv[0]) + (1.4453653501f * yv[1]);
    return yv[2];
}

void loop() {
    unsigned long time = micros(); // Used to track rate
    float sample, value, envelope, beat, thresh;
    unsigned char i;

    for(i = 0;;++i){
        // Read ADC and center so +-512
        sample = (float)analogRead(0)-503.f;

        // Filter only bass component
        value = bassFilter(sample);

        // Take signal amplitude and filter
        if(value < 0)value=-value;
        envelope = envelopeFilter(value);

        // Every 200 samples (25hz) filter the envelope 
        if(i == 200) {
                // Filter out repeating bass sounds 100 - 180bpm
                beat = beatFilter(envelope);

                // Threshold it based on potentiometer on AN1
                thresh = 0.02f * (float)analogRead(1);

                // If we are above threshold, light up LED
                if(beat > thresh) digitalWrite(2, HIGH);
                else digitalWrite(2, LOW);

                //Reset sample counter
                i = 0;
        }

        // Consume excess clock cycles, to keep at 5000 hz
        for(unsigned long up = time+SAMPLEPERIODUS; time > 20 && time < up; time = micros());
    }  
}

Par contre là c'est du Chinois, ça fait clignoter une LED mais je ne vois pas comment m'en servir pour augmenter ou diminuer des vitesse de servos ou moteurs, il reste encore pas mal de trucs que je pige pas, bon en même temps je démarre de 0 :frowning: ; j'aurais peut être dû commencer par plus simple :smiley:

Pour le moteur, la encore j'ai trouvé quelques trucs mais n'ayant rien pour tester c'est pas évident de plus je n'ai pas encore trouvé comment ajouter une fin de course qui servirait de position HOME (pour avoir une référence de position).

Donc je patauge un peu; de plus je ne me suis toujours pas décidé sur la mécanique au choix :

Soit 2 servos, 1 pour faire bouger le miroir de gauche à droite et un servo pour haut et bas, avantage pas de fin de course mais un poil plus de mecanique.

Soir un moteur PAP pour la gauche et la droite et un servo pour le haut et bas mecanique plus simple mais çà impose une fin de course par contre la gestion de la vitesse devrait être plus facile, enfin je pense...

Voilà ou j'en suis.

Bonsoir,
après pas de recherche, de code erreurs et tout un tas de chose je pense tenir le bout d'une première étape mais n'ayant toujours rien pour tester je vous demande un peu d'aide histoire de voir si dans le code rien ne vous choque ou voir si vous trouvez des erreurs (je suis sur qu'il y en a...

Donc le code est un regroupement de plusieurs pompé à gauche et à droite, j'en ai un peu modifié certains en enlevant des fonctions qui ne intéressé pas par exemple; j'ai essayé de suivre l'ordre logique dans le déroulement des fonctions ce qui m'a pris pas mal de temps.

Pour la mécanique :

  • un moteur PAP pour les mouvements gauche et droit
  • un servo pour les mouvements haut et bas

Pour le cablage sur un NANO avec driver A4988:

  • pin A0- entrée micro electret ( enfin AOP)
  • pin 7 - switch fin de course
  • pin 8 - driver direction
  • pin 9 - driver pas
  • pin 10 -driver enable
  • pin 11 - servo
#include "AccelStepper.h" 
#include "Servo.h"              

// Our Global Sample Rate, 5000hz
#define SAMPLEPERIODUS 200

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// AccelStepper Setup

    AccelStepper stepper(1, 9, 8);    // 1 = Easy Driver interface
                                      // NANO Pin 9 connected to STEP pin of Driver
                                      // NANO Pin 8 connected to DIR pin of Driver
                                    
// Define the Pins used

    #define home_switch 7             // Pin 7 connected to Home Switch (MicroSwitch)
    Servo ServoOne;                   // Generates an instance of a servo object
    int ServoPosition = 0;            // Variable to be used to assign position of servo
    
// Stepper Travel Variables

    long TravelX;                     // Used to store the X value entered in the Serial Monitor
    int move_finished=1;              // Used to check if move is completed
    long initial_homing=-1;           // Used to Home Stepper at startup



void setup() {
  // Set ADC to 77khz, max for 10bit
    sbi(ADCSRA,ADPS2);
    cbi(ADCSRA,ADPS1);
    cbi(ADCSRA,ADPS0);

    pinMode(10, OUTPUT);
    pinMode(home_switch, INPUT_PULLUP);
    delay(5);                         // Wait for Driver wake up
    
//  Set Max Speed and Acceleration of each Steppers at startup for homing

    stepper.setMaxSpeed(100.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
    stepper.setAcceleration(100.0);  // Set Acceleration of Stepper
 

// Start Homing procedure of Stepper Motor at startup

    while (digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated   
    stepper.moveTo(initial_homing);  // Set the position to move to
    initial_homing--;  // Decrease by 1 for next move if needed
    stepper.run();  // Start moving the stepper
    delay(5);
}

    stepper.setCurrentPosition(0);   // Set the current position as zero for now
    stepper.setMaxSpeed(100.0);      // Set Max Speed of Stepper (Slower to get better accuracy)
    stepper.setAcceleration(100.0);  // Set Acceleration of Stepper
    initial_homing=1;

    while (!digitalRead(home_switch)) { // Make the Stepper move CW until the switch is deactivated
    stepper.moveTo(initial_homing);  
    stepper.run();
    initial_homing++;
    delay(5);
}
  
    stepper.setCurrentPosition(0);
    stepper.setMaxSpeed(1000.0);       // Set Max Speed of Stepper (Faster for regular movements)
    stepper.setAcceleration(1000.0);  // Set Acceleration of Stepper
  
    ServoOne.attach(11);              // Assigns pin 9 as a servo
    randomSeed(analogRead(0));        // initialise le générateur de nombre aléatoire en lisant broche analogique

}

//BPM

// 20 - 200hz Single Pole Bandpass IIR Filter
float bassFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = sample / 9.1f;
    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7960060012f * yv[0]) + (1.7903124146f * yv[1]);
    return yv[2];
}

// 10hz Single Pole Lowpass IIR Filter
float envelopeFilter(float sample) { //10hz low pass
    static float xv[2] = {0,0}, yv[2] = {0,0};
    xv[0] = xv[1]; 
    xv[1] = sample / 160.f;
    yv[0] = yv[1]; 
    yv[1] = (xv[0] + xv[1]) + (0.9875119299f * yv[0]);
    return yv[1];
}

// 1.7 - 3.0hz Single Pole Bandpass IIR Filter
float beatFilter(float sample) {
    static float xv[3] = {0,0,0}, yv[3] = {0,0,0};
    xv[0] = xv[1]; xv[1] = xv[2]; 
    xv[2] = sample / 7.015f;
    yv[0] = yv[1]; yv[1] = yv[2]; 
    yv[2] = (xv[2] - xv[0])
        + (-0.7169861741f * yv[0]) + (1.4453653501f * yv[1]);
    return yv[2];
}

void loop(){

//BPM
  
    unsigned long time = micros(); // Used to track rate
    float sample, value, envelope, beat, thresh;
    unsigned char i;

    for(i = 0;;++i){
// Read ADC and center so +-512
    sample = (float)analogRead(0)-503.f;

// Filter only bass component
    value = bassFilter(sample);

// Take signal amplitude and filter
    if(value < 0)value=-value;
    envelope = envelopeFilter(value);

// Every 200 samples (25hz) filter the envelope 
    if(i == 200) {
// Filter out repeating bass sounds 100 - 180bpm
    beat = beatFilter(envelope);

// Threshold it based on potentiometer on AN1
    thresh = 0.02f * (float)analogRead(1);

// If we are above threshold
    if(beat > thresh) digitalWrite(11, HIGH);
    else digitalWrite(11, LOW);
    if(beat > thresh) digitalWrite(10, LOW);
    else digitalWrite(10, HIGH);

//Reset sample counter
    i = 0;
}

// Consume excess clock cycles, to keep at 5000 hz
    for(unsigned long up = time+SAMPLEPERIODUS; time > 20 && time < up; time = micros());
}  
 
// stepper
 
    if (stepper.distanceToGo() == 0)
{  
// Random change to speed, position and acceleration
// Make sure we dont get 0 speed or accelerations
    delay(1000);
    stepper.moveTo(rand() % 400);
    stepper.setMaxSpeed((rand() % 400) + 200);
    stepper.setAcceleration((rand() % 200) + 100);
}
    stepper.run();  // Actually makes stepper move
  
// servo
{
   ServoPosition = random(30,150); // Generates a random number and stores it in ServoPosition
   ServoOne.write(ServoPosition); // Commands servo to spin to position
   delay(1000);                   // Delays for 1000 ms
}
}

le code d'origine du detecteur BPM est ici
et celui du Homing

si je ne me suis pas trompé un seuil est réglé grâce à un potentiomètre, au dessus de ce seuil le servo et le moteur bouge aléatoirement et en dessous tout est à l'arrêt.

mes premières question:

  • y a t il un moyen de remplacer les digitalWrite des lignes 141 à 143 directement avec les lignes 156 à 172 car j'ai un peu l'impression que ça va clocher non ?
  • pour finir, l’idéal serait de remplacer le seuil par quelques chose du genre:

à 130 BPM = vitesse haute
<130 et > 100= vitesse moyenne
< à 100 = vitesse lente

Donc il me reste du travail, mais avant de continuer je voudrais savoir si je suis sur la bonne route.

Merci

edit: correction erreurs code
re-edit: en fait je me demande si cette façon de procéder est la bonne, remplacer ce code de détecteur de BPM par un compteur d’impulsion style rythme cardiaque ? avec un filtre bien calculé sur la source cela ne serait pas plus simple ?

Bonsoir,
Me re-voila, j'ai eu peu de temps mais j'ai un peu bossé, j'ai revu mon code en entier car j'ai préféré commencer simple pour ne pas mettre la charrue avant les bœufs.

C'est pas le code du siecle mais cela fonctionne presque comme je voudrais, le presque c'est que je n'arrive pas à sortir de la boucle comme je voudrais:
lorsque le son est détecté (sortie numérique) ma boucle démarre bien mais lorsque je coupe le son elle fini toutes les instructions (jusque là c'est normal) j'ai essayé de mettre une condition "if" avec un "break", ça fonctionne trop bien du coup si j'ai à un moment un son faible je sort de la boucle; du coup je voudrais mettre un "delay" à cette condition afin de sortir de la boucle aprés un tmps de silence pour éviter les sortie intempestive et là je coince donc si vous avez une petite astuce...

Autre chose y a t-il un moyen de mettre toutes ces instructions dans un tableaux voir même deux serait l’idéal gauche et droite vu face au miroir (inférieur à 300 et supérieur à 300 du stepper) et de piocher aléatoirement les instructions un coup dans le tableaux 1 (gauche) et le coup suivant dans le tableaux 2 (droite), bon pour ça je pense qu'il y a un cap à franchir.

merci

#include <VarSpeedServo.h> 
#include <AccelStepper.h>
VarSpeedServo myservo;  // create servo object to control a servo 
                        // a maximum of eight servo objects can be created 
 
const int servoPin = 10; // the digital pin used for the servo
// Define a stepper and the pins it will use
AccelStepper stepper(1,9,8); // Defaults to AccelStepper::DRIVER 9, 8
void setup()
{ 

  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  myservo.write(30,255,true); // set the intial position of the servo, as fast as possible, wait until done  
    stepper.setMaxSpeed(7000.0);
    stepper.setAcceleration(7000.0);
    stepper.runToNewPosition(-600);
    stepper.setCurrentPosition(0);
}
void loop(){
  if (digitalRead(2)==1)
    {stepper.runToNewPosition(10);
    myservo.write(10,75,true);}// write(degrees 0-180, speed 1-255, wait to complete true-false)
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(600);
    myservo.write(40,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(100);
    myservo.write(20,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(50);
    myservo.write(10,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(500);
    myservo.write(45,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(450);
    myservo.write(55,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(550);
    myservo.write(30,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(150);
    myservo.write(15,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(200);
    myservo.write(30,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(0);
    myservo.write(10,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(250);
    myservo.write(40,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(420);
    myservo.write(20,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(120);
    myservo.write(5,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(530);
    myservo.write(45,55,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(120);
    myservo.write(10,75,true);}
   
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(10);
    myservo.write(25,75,true);}
    
    if (digitalRead(2)==1)
    {stepper.runToNewPosition(450);
    myservo.write(25,45,true);}
    }

Edit: nouveau code, j'ai contourné mon problème de pause en ajoutant la condition avant chaque mouvements, je ne sais pas si c'est l’idéal mais ça fonctionne exactement comme je voulais

video ici