Roue à filtre photo motorisée et pilotée par Arduino

Bonjour à tous,

Je me permets de passer sur ce forum car après 2 semaines de recherche et de consultation de tutoriaux je suis toujours aussi perdu avec l’Arduino et surtout je ne trouve pas de sketch correspondant à mon besoin.

Donc pour la petite histoire je suis astrophotographe amateur, j’ai un télescope et tout ce qui va avec et je fais des photos des étoiles, galaxies, nébuleuses et autres.

Pour réaliser une photo, j’ai une caméra CCD avec capteur noir et blanc devant laquelle se trouve une roue à filtre. C’est un boitier dans lequel est placé un disque percé de 5 emplacement correspondant à chacun de mes filtres colorés.
Donc, je fais tourner avec mon doigt le disque pour placer le bon filtre devant le capteur et je lance mes photos.

Ce que je voudrais c’est automatiser la rotation de ce disque par l’intermédiaire d’un moteur PaP et Arduino comme dans cette vidéo:

Pour ce faire j’ai commandé un moteur 28BYJ-48, un driver ULN2003 et un Arduino Nano, et j’ai trouvé les schémas de câblage mais voila LE GROS PROBLÈME est que mes compétences s’arrêtent là. J’ai tout pour faire mais pas le savoir en programmation.

Je me tourne donc vers vous en espérant tomber sur le DIEU de la programmation Arduino lol ou du moins une âme charitable qui pourrait me développer un bout de code pour faire tourner cette fameuse roue.

J’ai trouvé un joli sujet à concernant le moteur que j’ai acheté mais là aussi j’y pers mon latin et meme en essayant de parler un bon anglais je n’ai pas eu de réponse de ce coté.

Le sketch initiale devrait être capable, à l’allumage de l’Arduino, de prendre la position de départ du stepper comme home/référence puis de le faire tourner d’un certain nombre de pas.
Par la suite, si le projet se concrétise, je rajouterais un ou des capteurs à effet hall pour vraiment affiner la prise du home et le placement de chaque logement de filtre en face du capteur.
Mais dans un premier temps et pour ne pas m’embrouiller de trop, je veux juste tester la précision du moteur.

Je ne suis pas riche mais s’il faut faire un don paypal pour le développement je suis ouvert à propositions.

Merci pour votre lecture et j’espère avoir des retours positifs?

Mathieu

[EDIT]
en continuant mes investigations j’ai trouvé un sketch qui à l’air de correspondre plus ou moins à ma demande mais je vois dans les commentaires l’utilisation d’un capteur à effet hall, serait il possible de m’expliquer et de modifier ce sketch pour le faire réagir comme demandé plus haut, prendre le 0 au démarrage puis tourner la roue en direction du filtre demandé par le plus court chemin possible.

FilterWheel_v100_ULN2003.ino (12 KB)

Salut à tous,

J’ai trouvé mon bonheur sur un blog, je repasse donc par là pour faire profiter ceux qui serait intéressé et les autres qui comme moi ne connaissent pas du tout l’Arduino.

Pour faire fonctionner le code il faut

moteur 28BYJ-48 avec son driver ULN2003
Librairie AccelStepper
le driver Ascom disponible sur demande
> #include <AccelStepper.h>
> #define HALFSTEP 8 // 28BYJ-48 needs halfstep 8 to run properly
> #define LED A3
> int CurrentFilter = 0;
>
> // Motor pin definitions
> #define motorPin1 8 // IN1 on UL2003
> #define motorPin2 9 // IN2 on UL2003
> #define motorPin3 10 // IN3 on UL2003
> #define motorPin4 11 // IN4 on UL2003
>
> // Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
> AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
>
> void setup() {
> stepper1.setMaxSpeed(1900.0);
> Serial.flush();
> Serial.begin(9600); // Baud rate, make sure this is the same as ASCOM driver
> }
>
>
> void loop() {
> String cmd;
> if (Serial.available() >0) {
> cmd = Serial.readStringUntil(’#’); // Terminator so arduino knows when the message ends
> if (cmd==“GETFILTER”) {
> Serial.print(CurrentFilter); Serial.println("#"); // Similarly, so ASCOM knows
> }
> else if (cmd==“FILTER0”) MoveFilter(0);
> else if (cmd==“FILTER1”) MoveFilter(1);
> else if (cmd==“FILTER2”) MoveFilter(2);
> else if (cmd==“FILTER3”) MoveFilter(3);
> else if (cmd==“FILTER4”) MoveFilter(4);
> }
> }
>
>
> void MoveFilter(int pos) {
> CurrentFilter = pos; // Note that the position is always 0 when powered on so have filters oriented properly
> switch (CurrentFilter) {
**> case 0: **
> analogWrite(LED,1023);
> stepper1.run();
> stepper1.setAcceleration(900.0);
> stepper1.setSpeed(1900);
> stepper1.runToNewPosition(0);
> Serial.print(CurrentFilter); Serial.println("#");
> analogWrite(LED,0);
> break;
**> **
**> case 1: **
> analogWrite(LED,1023);
> stepper1.run();
> stepper1.setAcceleration(900.0);
> stepper1.setSpeed(1900);
> stepper1.runToNewPosition(6200);
> Serial.print(CurrentFilter); Serial.println("#");
> analogWrite(LED,0);
> break;
**> **
> case 2:
> analogWrite(LED,1023);
> stepper1.run();
> stepper1.setAcceleration(900.0);
> stepper1.setSpeed(1900);
> stepper1.runToNewPosition(12400);
> Serial.print(CurrentFilter); Serial.println("#");
> analogWrite(LED,0);
> break;
> case 3:
> analogWrite(LED,1023);
> stepper1.run();
> stepper1.setAcceleration(900.0);
> stepper1.setSpeed(1900);
> stepper1.runToNewPosition(18600);
> Serial.print(CurrentFilter); Serial.println("#");
> analogWrite(LED,0);
> break;
**> **
> case 4:
> analogWrite(LED,1023);
> stepper1.run();
> stepper1.setAcceleration(900.0);
> stepper1.setSpeed(1900);
> stepper1.runToNewPosition(24800);
> Serial.print(CurrentFilter); Serial.println("#");
> analogWrite(LED,0);
> break;
>
> }
>
> }
Avec ce code il faut placer manuellement la roue à filtre sur sa position 0 au démarrage du système car il n’y a pas de capteur à effet hall implémente dans l’immédiat pour le home. Ca va venir…
Ensuite il faut tester la position de la roue, vitesse de rotation et accélération pour votre système en modifiant les valeurs entre les parenthèses ici.
> stepper1.setAcceleration(900.0);
> stepper1.setSpeed(1900);
> stepper1.runToNewPosition(24800)
++