focus stacking

Bonjour tout le monde,

Dominique, 58 ans, chargé de communication dans un GRETA et passionné de photographie.

l’Arduino est pour moi le “mécano” moderne de mon enfance… c’est surtout donc une approche ludique.

Niveau de programmation proche de 0
Niveau électronique proche de 0
soit 0+0= :slight_smile:

Pas de projets très ambitieux ni sérieux, sauf l’élaboration d’un automate à “focus stacking” pour la réalisation d’images du type joint

Pour le reste c’est le plaisir de la découverte, de l’apprentissage du bricolage et de la création.

Dominique

Bonjour Dominique et bienvenue
votre image pour le plaisir des yeux :slight_smile:
f12cac80a3ce65453492dfd6bf74e7d8a4f1332a.jpg

Vous trouverez sur internet pas mal de code pour faire un rail automatisé; le challenge du focus stacking c’est la précision très fine nécessaire entre chaque pas et donc faudra une bin rigidité de l’attelage et un bon moteur pas à pas. Le pilotage du déclenchement se fait sans trop de soucis en hackant une télécommande filaire (j’ai fait ça sur mon Canon).

Bonjour,

J-M-L:
le challenge du focus stacking c’est la précision très fine nécessaire entre chaque pas et donc faudra une bin rigidité de l’attelage et un bon moteur pas à pas.

Ou s'inspirer de ça:

Et peut-être nous montrer des images qui ne donnent pas envie de se gratter? :slight_smile:

Bienvenu.

J-M-L:
Bonjour Dominique et bienvenue
votre image pour le plaisir des yeux :slight_smile:
f12cac80a3ce65453492dfd6bf74e7d8a4f1332a.jpg

Vous trouverez sur internet pas mal de code pour faire un rail automatisé; le challenge du focus stacking c’est la précision très fine nécessaire entre chaque pas et donc faudra une bin rigidité de l’attelage et un bon moteur pas à pas. Le pilotage du déclenchement se fait sans trop de soucis en hackant une télécommande filaire (j’ai fait ça sur mon Canon).

Bonjour
C’est le genre de truc à faire mis en haut dans ma “todo list” pour quand je serais “retired” :grin:

C’est surement mon coté ingé/sécu “cherche/gratte le maillon faible” :grin: , mais à chaque fois que j’entends le bruit du miroir et des rideaux qui claquent sur les reflex réputés “serieux” , je me suis souvent demandé quelle etait réellement l’endurance mecanique de l’equipage “garantie” en nb de déclenchements ?

Il existe des “normes/regles” un peu serieuses là dessus ?

Mon vieux markIII a plus de 200 000 déclenchements et fonctionne toujours très bien.
(Pour le stacking on peut relever le miroir )

J-M-L:
Mon vieux markIII a plus de 200 000 déclenchements et fonctionne toujours très bien.
(Pour le stacking on peut relever le miroir )

Bonjour J-M-L
merci pour ta réponse
J'approfondirais le "sujet" , une fois le moment... venu :grin:

:slight_smile: Merci pour vos messages et vos conseils,
Mon projet est tout de même très avancé :
un mécanisme de mise au point de microscope de récup pour l’avance fine et la stabilité
un moteur pas à pas genre Nema 17 (je crois) récupéré sur une vielle imprimante bennée
un Arduino uno + un shield moteur
quelques lignes de code glanées à droite à gauche
une télécommande hackée
du scotch, pince à linge et ficelles (la base quoi…)

C’est fonctionnel mais largement pas optimisé.
je posterais ailleurs pour l’évolution du projet et quelques conseils dont j’ai encore besoin en particulier dans la programmation.

Cordialement

Dominique

Gyrosigma:
:slight_smile: Merci pour vos messages et vos conseils,
Mon projet est tout de même très avancé :
un mécanisme de mise au point de microscope de récup pour l'avance fine et la stabilité
un moteur pas à pas genre Nema 17 (je crois) récupéré sur une vielle imprimante bennée
un Arduino uno + un shield moteur
quelques lignes de code glanées à droite à gauche
une télécommande hackée
du scotch, pince à linge et ficelles (la base quoi...)

C'est fonctionnel mais largement pas optimisé.
je posterais ailleurs pour l'évolution du projet et quelques conseils dont j'ai encore besoin en particulier dans la programmation.

Cordialement

Dominique

Comme J-M-L l'a précédemment évoqué ce genre de projet , ne vaut que par la qualité première de sa structure mécanique
SI je considèreque ta recup est de bonne/excellente qualité mecanique , le point "dur suivant" sera celui de conserver au mieux cette "qualité" avec un actuateur adéquat.
qq bonnes photos (references) de ta recup ?

Je fais des photos de présentation ce week end.

c'est quoi un "actuateur" ?

j'ai un tout petit peu de mal avec la structure du forum.
Dois je créer un Fil avec le projet et ses évolutions et dans quelle partie du forum ?
Dois je poster dans le forum général chaque "sous-partie" que je souhaite optimiser ?

Cordialement

Dominique

Gyrosigma:
Je fais des photos de présentation ce week end.

c'est quoi un "actuateur" ?

j'ai un tout petit peu de mal avec la structure du forum.
Dois je créer un Fil avec le projet et ses évolutions et dans quelle partie du forum ?
Dois je poster dans le forum général chaque "sous-partie" que je souhaite optimiser ?

Cordialement

Dominique

:grin:

La structure de ce forum n'est pas des plus ergonomiques

Tu a posté dans le "bar"

initialement pour te présenter , c'etait bien le bon endroit

Mais comme maintenant il commence à y avoir des questions/reponses interessantes sur un sujet "particulier"

Le mieux est de demandé à un modo (JF ?) :grin:

de deriver/scinder ta demande vers la section générale

Ou ouvre un nouveau topic bien explicite sur tes souhaits

Actuateur pour faire court là = moteur de positionnement

Sujet unique....

jfs:
Sujet unique....

:grin:

Bon hé bien voilà une bonne chose de faite :smiley:

Artouste:
:grin:

Bon hé bien voilà une bonne chose de faite :smiley:

Des fois y a des sujets qui prennent le chemin inverse..... y sortent du bar :wink:

revenons à nos moutons...
je passe rapidement les éléments mécano-optiques qui fonctionnaient déjà en manuel
Un bloc de mise au point d'un ancien microscope nikon Optiphot
Dessus un bon vieux soufflet macro
un objectif de microscope à un bout et un appareil photo à l'autre (voir 1ère photo)

Ensuite un moteur pas à pas de récup avec sa courroie soigneusement fixé (voir photo 2)

Enfin (photo 3) un arduino Uno et son shield moteur. 5 interrupteurs, un optocoupleur plein de fils moches

pour l'instant un code minimal pour les fonctions suivantes :
un bouton pour avancer
un bouton pour reculer
un bouton pour remettre la variable de position (t) à 0 (point de départ)
un bouton pour mémoriser la position de fin (encore dans t)
un bouton pour :
revenir à la position de départ
avancer d'une fraction de tour (pas)
pendant un certain nombre de cycle (fin - début)/pas
entre deux avances un déclenchement d'appareil photo grâce à un optocoupleur

int debut=0;
int fin=0;
int t=0;
int delaylegnth = 10;
int pas=17;
int Cycle=0;
int x=0;
int y=0;

void avance()
{
  digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, HIGH);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
  
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, LOW);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
  
  delay(delaylegnth);
  
  digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, LOW);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
    
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, HIGH);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
 
  t++;
  delay(delaylegnth);
  }

void recule()
{
    digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, HIGH);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
  
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, HIGH);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
  
  delay(delaylegnth);
  
  digitalWrite(9, LOW);  //ENABLE CH A
  digitalWrite(8, HIGH); //DISABLE CH B

  digitalWrite(12, LOW);   //Sets direction of CH A
  analogWrite(3, 255);   //Moves CH A
  
  delay(delaylegnth);
    
  digitalWrite(9, HIGH);  //DISABLE CH A
  digitalWrite(8, LOW); //ENABLE CH B

  digitalWrite(13, LOW);   //Sets direction of CH B
  analogWrite(11, 255);   //Moves CH B
 
  delay(delaylegnth); 
  t--;
  }
 
 void shoot() 
  {
  digitalWrite(10, HIGH);  // pull pin 2 HIGH, activating the optocoupler
  delay(100); // give the optocoupler a moment to activate
  digitalWrite(10, LOW);  // pull pin 10 low until you're ready to activate again
  }
  
void stack()
  {
  while(x<=Cycle-1)
  {
  while(y<=pas)
  {avance();
  y++;
  }
delay (1000);
shoot();
delay(4000);
x++;
y=0;
}
}
void setup() {
  //establish motor direction toggle pins
  pinMode(12, OUTPUT); //CH A -- HIGH = forwards and LOW = backwards???
  pinMode(13, OUTPUT); //CH B -- HIGH = forwards and LOW = backwards???
   pinMode(10, OUTPUT);
  //establish motor brake pins
  pinMode(9, OUTPUT); //brake (disable) CH A
  pinMode(8, OUTPUT); //brake (disable) CH B
  pinMode(2,INPUT_PULLUP);
  pinMode(4,INPUT_PULLUP);
  pinMode(5,INPUT_PULLUP);
  pinMode(6,INPUT_PULLUP);
  pinMode(7,INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {

 boolean etatBouton1 = digitalRead(2);
 boolean etatBouton2 = digitalRead(4);
 boolean etatBouton3 = digitalRead(5);
 boolean etatBouton4 = digitalRead(6);
 boolean etatBouton5 = digitalRead(7);
  
  if (etatBouton1==LOW)
  {avance();
  }
  else if(etatBouton2==LOW)
  {recule();
  }
  if (etatBouton3==LOW)
  {t=0;
  debut=t;}
  if (etatBouton4==LOW)
  {
  fin=t;
  Cycle=(fin-debut)/pas;
  }
  if (etatBouton5==LOW)
  {
  while(t>0)
  {
  recule();
  }
  delay (2000);
  stack();  
  }

Serial.println("valeur de t");
Serial.println(t);
Serial.println("valeur de début");
Serial.println(debut);
Serial.println("valeur de fin");
Serial.println(fin);
Serial.println("nombre de cycle");
Serial.println(Cycle);
}

Bon... tout ça c'est un premier jet et mérite d'être optimisé...

ma première question c'est l'alimentation
visiblement la carte alimente le moteur quand elle est reliée au PC... Normal ?
quand je débranche, je peux alimenter le moteur avec une pile 9V qui du coup alimente aussi la carte ... Normal ?

comment découpler les deux alim pour alimenter la carte en 5V et le moteur en 12V

Cordialement

Dominique

Gyrosigma:
revenons à nos moutons...
je passe rapidement les éléments mécano-optiques qui fonctionnaient déjà en manuel
Un bloc de mise au point d'un ancien microscope nikon Optiphot
Dessus un bon vieux soufflet macro
un objectif de microscope à un bout et un appareil photo à l'autre (voir 1ère photo)

ma première question c'est l'alimentation
visiblement la carte alimente le moteur quand elle est reliée au PC... Normal ?
quand je débranche, je peux alimenter le moteur avec une pile 9V qui du coup alimente aussi la carte ... Normal ?

comment découpler les deux alim pour alimenter la carte en 5V et le moteur en 12V

Cordialement

Dominique

Bonjour
Rassure moi
vu que tu aime bien les angles à 45° , tu ne dors pas dans un lit lui aussi à 45° ? :grin:

retour serieux :smiley:

Tu a une bonne base mecanique

ton montage mecanique est rustique/simple mais il doit etre efficace et bien amorti par la courroie

Ta carte semble etre un clone du motorshield arduino (schema )

basé sur un L298P comme driver de PAP
Le shield est alimenté par son connecteur vert Vin/GND

Le VIN sert à la fois à l'alimentation de puissance (moteurs) ET aussi à l'alimentation du uno par son PIN VIN
Attention donc à ne pas alimenter l'ensemble par une tension > a ce qu'accepte un uno sur VIN

tant que tu reste <= à 12V tu es dans les clous avec la consequence 1ere qui est que + VIn est important plus le regulateur du UNO va chauffer.

Si ton uno est connecté par USB , c'est la tension de 5V USB qui aura la priorité pour alimenter le UNO

Cette tension de 5V ne servira pas pour la puissance moteur.

Ceci etant , les shields dans un cas comme le tien c'est pratique pour s'initier, mais ce n'est pas toujours ce qu'il y a de plus optimum.

Dans un cas comme le tiens , je me dirigerais surement ensuite vers de la conduite de moteur PAP basé sur du driver capable de faire du micropas ( genre A4988 DRV8825)

Mais déjà tu devrais bien t'amuser avec ce que tu a 8)

Gyrosigma:
pour l’instant un code minimal pour les fonctions suivantes :
un bouton pour avancer
un bouton pour reculer
un bouton pour remettre la variable de position (t) à 0 (point de départ)
un bouton pour mémoriser la position de fin (encore dans t)
un bouton pour :
revenir à la position de départ
avancer d’une fraction de tour (pas)
pendant un certain nombre de cycle (fin - début)/pas
entre deux avances un déclenchement d’appareil photo grâce à un optocoupleur

salut, juste à titre d’exemple voici votre code un peu nettoyé pour définir des constantes sur les pins de façons à ce que ce soit plus lisible. j’ai aussi changé quelques types de variables pour que ce soit plus cohérent (un digitalRead par exemple ne retourne pas un booléen). J’ai aussi passé la console Série à 115200 bauds, pas de raisons d’afficher lentement :slight_smile:

const byte CH_A = 9;
const byte DIR_A = 12;
const byte PWM_A = 3;

const byte CH_B = 8;
const byte DIR_B = 13;
const byte PWM_B = 11;

const unsigned int pas = 17;
const unsigned int delaylegnth = 10;
const unsigned int delayStack = 2000;

const byte pinOptocoupler = 10;

const byte   pinBouton1 = 2;
const byte   pinBouton2 = 4;
const byte   pinBouton3 = 5;
const byte   pinBouton4 = 6;
const byte   pinBouton5 = 7;

unsigned int debut = 0;
unsigned int fin = 0;
unsigned int t = 0;

int Cycle = 0;
int x = 0;
int y = 0;


void avance()
{
  digitalWrite(CH_A, LOW);  //ENABLE CH A
  digitalWrite(CH_B, HIGH); //DISABLE CH B
  digitalWrite(DIR_A, HIGH);   //Sets direction of CH A
  analogWrite(PWM_A, 255);   //Moves CH A
  delay(delaylegnth);

  digitalWrite(CH_A, HIGH);  //DISABLE CH A
  digitalWrite(CH_B, LOW); //ENABLE CH B
  digitalWrite(DIR_B, LOW);   //Sets direction of CH B
  analogWrite(PWM_B, 255);   //Moves CH B
  delay(delaylegnth);

  digitalWrite(CH_A, LOW);  //ENABLE CH A
  digitalWrite(CH_B, HIGH); //DISABLE CH B
  digitalWrite(DIR_A, LOW);   //Sets direction of CH A
  analogWrite(PWM_A, 255);   //Moves CH A
  delay(delaylegnth);

  digitalWrite(CH_A, HIGH);  //DISABLE CH A
  digitalWrite(CH_B, LOW); //ENABLE CH B
  digitalWrite(DIR_B, HIGH);   //Sets direction of CH B
  analogWrite(PWM_B, 255);   //Moves CH B
  delay(delaylegnth);

  t++;

}

void recule()
{
  digitalWrite(CH_A, LOW);  //ENABLE CH A
  digitalWrite(CH_B, HIGH); //DISABLE CH B

  digitalWrite(DIR_A, HIGH);   //Sets direction of CH A
  analogWrite(PWM_A, 255);   //Moves CH A

  delay(delaylegnth);

  digitalWrite(CH_A, HIGH);  //DISABLE CH A
  digitalWrite(CH_B, LOW); //ENABLE CH B

  digitalWrite(DIR_B, HIGH);   //Sets direction of CH B
  analogWrite(PWM_B, 255);   //Moves CH B

  delay(delaylegnth);

  digitalWrite(CH_A, LOW);  //ENABLE CH A
  digitalWrite(CH_B, HIGH); //DISABLE CH B

  digitalWrite(DIR_A, LOW);   //Sets direction of CH A
  analogWrite(PWM_A, 255);   //Moves CH A

  delay(delaylegnth);

  digitalWrite(CH_A, HIGH);  //DISABLE CH A
  digitalWrite(CH_B, LOW); //ENABLE CH B

  digitalWrite(DIR_B, LOW);   //Sets direction of CH B
  analogWrite(PWM_B, 255);   //Moves CH B

  delay(delaylegnth);
  t--;
}

void shoot()
{
  digitalWrite(pinOptocoupler, HIGH);  // pull pin 10 HIGH, activating the optocoupler
  delay(100); // give the optocoupler a moment to activate
  digitalWrite(pinOptocoupler, LOW);  // pull pin 10 low until you're ready to activate again
}

void stack()
{
  while (x < Cycle) {
    while (y <= pas) {
      avance();
      y++;
    }
    delay (1000);
    shoot();
    delay(4000);
    x++;
    y = 0;
  }
}


void setup() {
  //establish motor direction toggle pins
  pinMode(DIR_A, OUTPUT); //CH A -- HIGH = forwards and LOW = backwards???
  pinMode(DIR_B, OUTPUT); //CH B -- HIGH = forwards and LOW = backwards???

  //establish motor brake pins
  pinMode(CH_A, OUTPUT); //brake (disable) CH A
  pinMode(CH_B, OUTPUT); //brake (disable) CH B

  pinMode(pinOptocoupler, OUTPUT);
  pinMode(pinBouton1, INPUT_PULLUP);
  pinMode(pinBouton2, INPUT_PULLUP);
  pinMode(pinBouton3, INPUT_PULLUP);
  pinMode(pinBouton4, INPUT_PULLUP);
  pinMode(pinBouton5, INPUT_PULLUP);
  Serial.begin(115200);
}


void loop() {

  byte etatBouton1 = digitalRead(pinBouton1);
  byte etatBouton2 = digitalRead(pinBouton2);
  byte etatBouton3 = digitalRead(pinBouton3);
  byte etatBouton4 = digitalRead(pinBouton4);
  byte etatBouton5 = digitalRead(pinBouton5);

  if (etatBouton1 == LOW) avance();
  else if (etatBouton2 == LOW) recule();

  if (etatBouton3 == LOW) debut = t = 0;

  if (etatBouton4 == LOW) {
    fin = t;
    Cycle = (fin - debut) / pas;
  }

  if (etatBouton5 == LOW) {
    while (t > 0) recule();
    delay(delayStack);
    stack();
  }

  Serial.print(F("t = ")); Serial.println(t);
  Serial.print(F("debut = ")); Serial.println(debut);
  Serial.print(F("fin = ")); Serial.println(fin);
  Serial.print(F("Nombre de cycles = ")); Serial.println(Cycle);
}

Merci Artouste et J-M-L :slight_smile:

Bon, pour mon problème d'alimentation , il faut donc que je me passe de ma "motor shield" si je veux une indépendance de mon système.
Je vais regarder du coté du DRV8825 ou A4988 ça me semble prometteur.

Merci mille fois J-M-L pour le nettoyage du code, je vais regarder ça en détail pour bien comprendre comment ça marche...

Une nouvelle question de "super débutant" : pour l'instant, j'ai mon "bac à sable" pour tester tout le machin.
Quand je voudrait passer à la réalisation finale, je n'ai aucune idée de comment faire... Il faudra que je sacrifie mon arduino ? il existe je suppose des "plaques" pour souder les composants ? chez qui trouve t'on tout ce dont on a besoin pour ce genre de finalisation de projet ?

Cordialement

Dominique

Commandez quelques arduino pro mini ou Nano ou micro en Asie, ça coûte environ 1€ pièce.. pas un gros sacrifice sans doute, et montez Tout cela sur une carte perforée

J’ai quasiment pas changé le code - juste défini les pins etc