Valeur d'une photodiode avec un moteur pas à pas

Bonjour à tous !

je fabrique en ce moment un appareil qui est un triple spectromètres tout pas en un ( spectrophotomètre, spectromètre uv-vis et spectromètre raman )
mais je me heurte à un problème !

en effet j'ai un miroir qui doit tourner grâce à un moteur pas à pas, et en même temps je doit effectuer une lecture de la valeur d'une photodiode de type OPT101 sur la quelle est focalisé le faisceau diffracté émit par une led de puissance ( 30 watt en 6 volts ) et par un miroir de type "gratting" ( miroir de diffraction )
la partie électronique optique et mécanique ne pose pas trop de problème mais je me heurte à un autre problème plus ennuyeux : en effet suivant ce que je code j'ai soit le moteur qui tourne soit la valeur de la photodiode mais jamais les deux en même temps !!
j'ai essayé plusieurs combinaison, et je ne trouve pas la solution !!

j'ai réussis en câblant deux arduino mega, mais par un soucis de simplification, j'ai opté sur un seul arduino, mega et là çà ne fonctionne pas !!

est ce que c'est possible d'effectuer deux actions en même temps ( lecture de la valeur de la photodiode et mise en route du moteur pas à pas ) ?? Ou suis je condamné à utiliser deux arduino donc deux programmes ( un pour le déplacement du miroir et l'autre pour la lecture de la photodiode ) ?? ( je suis "obligé" d'utiliser un mega car j'ai monté un écran 3.5 pouces dessus et sinon je pense rajouter un nano juste pour le déplacement du miroir si je n'ai pas le choix )

je vous montre le programme que j'ai fait, et qui n'est pas fini mais peut être j’oublie un truc ??

merci de votre future aide !!

  [code]
// programme pour photodiode opt101 pour spectromètre 
// avec écran lcd tft 3.5 pouces

#include <TFT_HX8357.h> // Hardware-specific library

TFT_HX8357 tft = TFT_HX8357();  

const float opt101Pin = A0;  // capteur photodiode type opt101
float opt101Value = 0;

const int enaPin = 4;  // enable du driver de moteur pas à pas
int enaState = 0;

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution

Stepper myStepper(stepsPerRevolution, 5, 6);

const int ledPin = 2;  // relais led
int ledState = 0;

const int marchePin= 7; // interupteur de mise en route
int marcheState = 0;

const int relais1Pin = 3;  // relais principale pour !mise en route
int relais1State = 0;


void setup() {
  
 Serial.begin(9600);  // initialisation port série
 
 pinMode(enaPin,OUTPUT);
 
  pinMode(marchePin,INPUT_PULLUP);
  
  pinMode(ledPin,OUTPUT);
  
  pinMode(relais1Pin,OUTPUT);

  tft.begin();
  tft.setRotation(1);
      tft.fillScreen(TFT_BLACK);
      tft.setTextSize(2);

}

void loop() {
   
  marcheState = digitalRead(marchePin);
  
if (marcheState == HIGH){
  
  digitalWrite ( enaState, HIGH );  // mise en route du moteur
  
 tft.setTextColor(TFT_WHITE, TFT_BLACK);
       tft.setCursor(80, 20);
    tft.print("spectrometre optique diy");
     tft.drawRect(0, 0, 480, 120, TFT_RED);
     
     tft.setTextColor(TFT_BLUE,TFT_BLACK);
      tft.drawString("valeur photodiode",60, 60, 2);
       opt101Value = analogRead(opt101Pin);
     float tension = opt101Value * (5.0 / 1023.0);
     tft.setTextColor(TFT_WHITE, TFT_BLACK);
    tft.setCursor(320, 70);
     tft.print(tension);   

   Serial.print("valeur photodiode = ");  // message de la valeur de la photodiode
    Serial.println(tension);    // lecture valeur photodiode
    
 digitalWrite(relais1Pin,LOW);
  
 digitalWrite(ledPin,LOW);
          
  } else {
  
  digitalWrite ( enaState, HIGH);  // mise en route du moteur

  digitalWrite(relais1Pin,HIGH);  // relais marche 

  digitalWrite( ledPin,HIGH);
  

  myStepper.setSpeed(10);  //   réglage vitesse moteur pas à pas lent (déplacement du gratting )
 Serial.println("clockwise");  // tourne dans un sens
  myStepper.step(500);         // effectue 500 pas ( 1/16 de pas x 500 )
  
    myStepper.setSpeed(100);  // vitesse rapide

  Serial.println("counterclockwise");  // moteur tourne dans l'autre sens
  myStepper.step(-500);   // effectue 500 pas ( 1/16 de pas x 500 )
    

  }   


}

[/code]

est ce que c'est possible d'effectuer deux actions en même temps

techniquement non, vous n'avez qu'un seul processeur donc il va faire soit une chose, soit une autre mais pas les 2 en même temps (à part quelques fonctions hardware)

Ou suis je condamné à utiliser deux arduino donc deux programmes

Non plus :slight_smile: c'est la bonne nouvelle... comme votre arduino pédale quand même assez vite, il peut donner l'impression de faire plusieurs choses en même temps...

Dans l'absolu quand on veut faire 2 choses à la fois, il faut utiliser la technique de "blink without millis" (ou lire les tutos d'eskimon notamment celui qui parle d'introduire le temps) et si vous lisez l'anglais il y a ce bon post à lire,

Notez qu'une N° de pin n'est pas un nombre décimal ni n'a besoin de 2 octets, un seul suffit...

const float opt101Pin = A0;  // capteur photodiode type opt101
...
const int enaPin = 4;  // enable du driver de moteur pas à pas

on préfère la notation donc

const byte opt101Pin = A0;  // capteur photodiode type opt101
const byte enaPin = 4;  // enable du driver de moteur pas à pas
const byte ledPin = 2;  // relais led
const byte marchePin = 7; // interupteur de mise en route
const byte relais1Pin = 3;  // relais principale pour !mise en route

Je vous conseille aussi de regarder la librairie AccelStepper qui est plus performante et complète.

Si j'ai bien compris vous souhaitez que le moteur fasse 500 x 1/16 de pas dans un sens puis dans l'autre, constamment à vitesse plein pot et quand vous appuyez sur le bouton vous voulez voir les valeurs lues mais sans interrompre le mouvement, c'est ça ? (suivant ce que vous voulez faire on n'aura pas forcément besoin de millis(), juste de traiter les choses dans le bon ordre - dans votre code par exemple le else empêchera le moteur de recevoir ses ordres quand le "bouton marchePin" est relâché)

Bonjour

Il est aussi possible de délaisser la librairie de gestion du moter pas à pas , piloter dans une boucle les signaux de commande du driver et ainsi pouvoir intercaler entre deux pas la lecture de la photodiode.
S'il s'agit d'un simple mouvement de va et vient à vitesse constante la valeur ajoutée de la librairie parait faible.

makerfree2:
...
en effet j'ai un miroir qui doit tourner grâce à un moteur pas à pas, et en même temps je doit effectuer une lecture de la valeur d'une photodiode de type OPT101 sur la quelle est focalisé le faisceau diffracté émit par une led de puissance ( 30 watt en 6 volts ) et par un miroir de type "gratting" ( miroir de diffraction )
la partie électronique optique et mécanique ne pose pas trop de problème mais je me heurte à un autre problème plus ennuyeux : en effet suivant ce que je code j'ai soit le moteur qui tourne soit la valeur de la photodiode mais jamais les deux en même temps !!
j'ai essayé plusieurs combinaison, et je ne trouve pas la solution !!

bonjour
en complement des reponses de J-M-L
est tu sur de bien te poser les bonnes questions de priorité et donc de bien "ordonnancer" l'acquisition/restitution ? :grin:

connu :

  • Un arduino basique sous son environnement basique permet d'echantilloner la conversion AD "embarquée" à ~ 10k échantillons/s
  • L'amplitude de deplacement/positionnement issu de ton pap est de +/- 500 pas (géré en microstep de 1/16)
    soit 1000 µpas pour un cycle

questions :

tu souhaite acquerir la valeur issu de l'OPT101 :

  • a chaque µpas ?
  • aux etats finis (depart/arrivée)

Accessoirement et incidemment :wink: , je pense pour ta petite "manip" que tu aurais aussi interet à utiliser une des references internes de ton mega pour augmenter la dynamique de mesure.

analogReference(type)

type :
INTERNAL1V1
INTERNAL2V56

al1fch:
Bonjour

Il est aussi possible de délaisser la librairie de gestion du moter pas à pas , piloter dans une boucle les signaux de commande du driver et ainsi pouvoir intercaler entre deux pas la lecture de la photodiode.
S'il s'agit d'un simple mouvement de va et vient à vitesse constante la valeur ajoutée de la librairie parait faible.

Bonjour Al1
Je rédigeais pendant que toi tu commentais/questionnais aussi dans le ... meme sens :grin:

merci bien pour ces réponses qui me guident un peu vers ce que je souhaite !!

et oui, je voudrais que chaque µ pas j'ai une valeur que je visualise sur le traceur série !!

bon, il y a encore beaucoup de code à faire, mais je ne suis pas pressé !! et j'aime bien faire çà !!

je reste connecté si jamais il y a encore d'autres idées intéressantes !

et j'ai enfin compris que les "const byte" sont plus adapté que les const int donc merci aussi pour çà !!

@ bientôt !!

makerfree2:
merci bien pour ces réponses qui me guident un peu vers ce que je souhaite !!

et oui, je voudrais que chaque µ pas j'ai une valeur que je visualise sur le traceur série !!

bon, il y a encore beaucoup de code à faire, mais je ne suis pas pressé !! et j'aime bien faire çà !!

je reste connecté si jamais il y a encore d'autres idées intéressantes !

et j'ai enfin compris que les "const byte" sont plus adapté que les const int donc merci aussi pour çà !!

@ bientôt !!

Tu utilise quoi comme driver de PAP
A4988 ?
DRV8827 ?
autre?
Quel moteur PAP , utilise tu ? ref ?

j'utilise un HY-DIV268N-5A c'est un driver de commande de moteur pap de 5Ampères maxi, et avec le bon radiateur en alu qui va avec !
de plus ce driver est fixé par deux vis M4 sur une plaque alu ( qui fait office de banc optique ) de 500x200x10mm avec adjonction de pâte thermique

il est alimenté en 13.5 volts , et le Arduino est alimenté en 8 volts et le driver ( fait maison ) de led est alimenté en 13.5volts rabaissé en 5.8 volts sous maxi 3A environ ( la LED est une CREE HXP70 6500K fixé sur un radiateur alu qui, lui, prend en sandwich un Peltier 12706 drivé à 13.5 volts également avec un ventilo 12volts ( alimenté en 13.5v )de 92x92

voilà voilà !!

loups, un oubli le moteur est un nema17 !!

makerfree2:
j'utilise un HY-DIV268N-5A c'est un driver

:grin:
ok
et... le moteur PAP utilisé c'est quoi exactement ? datasheet ? :smiley:

makerfree2:
loups, un oubli le moteur est un nema17 !!

NEMA17 , c'est une pseudo notion/norme essentiellement de facteur de forme (notions mecaniques)

Caractéristiques references/exactes (électriques) du moteur ?

bonne question !!

en fait, j'avais acheté ce moteur sur ebay il y a longtemps, avec le driver qui va bien, et je sais que j'ai commandé cet ensemble moteur/driver, car ils allaient ensemble

j'ai, par contre, réglé les dip switch pour atteindre 1.2Ampères/phase et çà marche bien, aucuns problèmes concernant ce montage !!

et il est réglé sur 1/16 de pas par impulsion !

mais comme je l'ai dit il n'y a pas de soucis concernant le montage et l'électronique "maison"

j'ai un blog, mais le montage n'est pas encore effectué ni chiffré et testé donc voici un lien :

http://frontdelest.over-blog.com/2019/02/premier-pas-vers-la-spectro-triple.html

c'est sommairement expliqué mais pour cet appareillage je vais faire un ou deux sujets pour bien montrer les procédés utilisés par le montage/expérimentation/fabrication etc...