Stepduino proto 1 (Chris)

Stepduino proto 1 (Chris)

Messagede Christian » 03 Jan 2012 13:23

Bonjour à tous,
J'arrive au bout de mon proto, du moins côté "hard".
Reste maintenant à développer des programmes complets.

Edit 20.1.12 : Attention, correction ! Prévoyez dès maintenant un déplacement du fil (jaune ici) opto pin D2 vers A2 !! (analogique 2)
Ceci pour libérer les pins D2 et D3, utilisées par les interruptions programmables (capt. de fin de course / stop d'urgence).
A corriger aussi dans le code ci-dessous !


stepduino_carte_proto1.jpg
Exif et Meta MicroCartouche stepduino_carte_proto1.jpg (156.57 Kio) Vu 16326 fois


stepduino_carte_proto2.jpg
Exif et Meta MicroCartouche stepduino_carte_proto2.jpg (145.44 Kio) Vu 16325 fois


stepduino_carte_proto3.jpg
Exif et Meta MicroCartouche stepduino_carte_proto3.jpg (158.02 Kio) Vu 16323 fois



J'ai réalisé un petit programme test (très simple), il peut déjà servir en l'état pour faire du stacking semi assisté !
On choisi la distance des pas (foulée) puis on avance chaque foulée en appuyant sur un bouton. On shoot avec un autre.
(noter aussi en début de code l’assignation de toutes les E/S (pin) utilisées pour ce proto)
Nb: Ce montage est configuré pour l'instant en pas entier.
Comparé au mode 1/16ème de pas (microsteping) il y a aussi beaucoup plus de vibrations entre les pas.

stepduino_proto1.jpg
Exif et Meta MicroCartouche stepduino_proto1.jpg (102.67 Kio) Vu 16315 fois


stepduino_proto2.jpg
Exif et Meta MicroCartouche stepduino_proto2.jpg (103.61 Kio) Vu 16317 fois



Le code :
/!\ Voir correction à faire (Pin Opto) en tête de message /!\
et remplacer
const int PinShoot = 2; // Pin optocoupleur shoot
par
const int PinShoot = 16; // Pin optocoupleur shoot (Pin A2 en digital = 16 !)

Edit du 13.02.12 : Modif programme test, ne relâche plus le moteur entre les pas + ajout compteur et divers.
(Faire un Reset pour libérer le moteur et remettre le compteur à zéro. Pensez aussi à régler la fréquence moteur si vous avez des problèmes de précision !)

Code: Tout sélectionner
/*******************************************************
* Stepduino proto
* Ch.Aubert, Janv. 2012
*
********************************************************/


/************* Librairie(s) à inclure ****************/
#include <LiquidCrystal.h>

/****************   Définir des caractères spéciaux LCD (8 caractères max) ********************/
// Flèche haut
byte Char_UP[8] = {
  B00000, B00000, B00100, B01110, B11111, B00000, B00000, B00000};
// Flèche bas
byte Char_DOWN[8] = {
  B00000, B00000, B11111, B01110, B00100, B00000, B00000, B00000};
// Flèche droite
byte Char_RIGHT[8] = {
  B00000, B00000, B10000, B11000, B11100, B11000, B10000, B00000};
// Flèche gauche
byte Char_LEFT[8] = {
  B00000, B00000, B00001, B00011, B00111, B00011, B00001, B00000};
// Select
byte Char_SELECT[8] = {
  B00000, B00000, B01110, B01110, B01110, B01110, B00000, B00000};
// Car.vide (pour avoir un index zéro dans mes tableaux)
byte Char_NONE[8] = {
  B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000};
/****************  Fin caractères spéciaux LCD ********************/


/************* Définition des broches (pins) du LCD 5 boutons DFRobot  ****************/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const int PinLCDBacklight = 10; // broche LCD Backlight
const int PinBouton = A0; // broche analogique (A0) utisé pour les 5 boutons

/************* Définition des autres E/S ****************/
const int PinDir = 11;  // DIR
const int PinStep = 12; // STEP
const int PinEnable = 13; // ENABLE (est partagé avec le Led 13 de l'Arduino !)
const int PinBuzzer = 17; // Pin analogique 3 = 17 !!
const int PinShoot = 2; // Pin optocoupleur shoot
//const int PinShoot = 16; // A2  Pin optocoupleur shoot : Pin analogique 2 en digital = 16 !

// A4 et A5 à réserver si LCD I2C (2 broches) est employé !
// D2 et D3 à réserver pour les IRQ (int. programmables, bouton stop et détect. fin de course. Modif à faire pour l'opto en D2!)

/************* Constantes programme ****************/
//Moteur PAP
const int Const_DefautPas = 10; // Foulée par défaut (nb. de pas à la fois, ou distance pas)
const int Const_TempFoulee = 300; // Temporisation entre les foulées de pas
const int Const_tempo_bouton = 200; // Temporisation appui bouton

// APN
const int Const_ShootPressDelay = 100; // Délais "bouton" Shoot
const int Const_InterPictureDelay = 500; // Délais entre PDV

// Définition et numérotation des boutons
const int btnRIGHT = 1;
const int btnUP = 2;
const int btnDOWN = 3;
const int btnLEFT = 4;
const int btnSELECT = 5;
const int btnNONE = 6;


/************* Variables ****************/
byte  lcd_key = 0;
int  adc_key_in = 0;
unsigned int dPas = Const_DefautPas;
int compteur = 0;


/************* Setup ****************/
void setup()
{
  // Moteur PAP
  pinMode(PinEnable, OUTPUT); // broche Enable en sortie
  digitalWrite(PinEnable, HIGH); // On met un niveau haut sur Enable pour relacher le moteur !!
  pinMode(PinStep, OUTPUT); // Dir et Step en sortie
  pinMode(PinDir, OUTPUT);
  digitalWrite(PinStep, HIGH);
  digitalWrite(PinDir, HIGH);

  // initialiser la LCD library, 16 caractères, 2 lignes
  lcd.begin(16, 2);
  // Création des caractères (symboles) LCD personnalisés. à placer après "LCD.begin"  (ou .init) sinon ça bug !!
  lcd.createChar(1, Char_RIGHT); //  Flèche droite
  lcd.createChar(2, Char_LEFT);  // Flèche gauche
  lcd.createChar(3, Char_UP); // Flèche haut
  lcd.createChar(4, Char_DOWN); // Flèche bas
  lcd.createChar(5, Char_SELECT); // Carré select
  pinMode(PinLCDBacklight, OUTPUT); // Broche LCD backlight en sortie
  digitalWrite(PinLCDBacklight, HIGH); // Retro-éclairage actif (par défaut il est déjà mais je le justifie ici)

  // APN (opto)
  pinMode(PinShoot, OUTPUT); // Pin Optocoupleur en sortie
  //pinMode(PinFocus, OUTPUT); // Pin opto en sortie (si focus installé)
  //pinMode(PinLedArduino, OUTPUT); // Déjà utilisé par PinEnable !

  // Buzzer
  pinMode(PinBuzzer, OUTPUT);
  //tone(PinBuzzer, 2500, 25); // Bip

  // LCD Accueil
  lcd.setCursor(0,0);      // placer le curseur à la première ligne, première position
  lcd.print("Stepduino proto "); // texte d'accueil
  lcd.setCursor(0,1);            // placer le curseur au début de la seconde ligne
  lcd.print("Le Naturaliste");
  delay(1500);
  lcd.clear();

} // end setup


/************* Boucle principale ****************/
void loop()
{

  lcd_key = read_LCD_buttons();  // lire la valeur du bouton (->fonction)

  switch (lcd_key)               // selon le bouton appuyé ...
  {
  case btnRIGHT: // tourner à DROITE (en fonction des branchements de votre moteur !)
    // paramètre fonction Go_PAP : Sens de rotation (0 ou 1), distance pas (foulée), temporisation moteur
   //(règle la fréquence : Plus on augmente la temp. plus on diminue la fréq. !)
    // Sens de rotation : 0 = LOW, 1=HIGH
    // Attention, chez moi en pas entier et au_dessous d'une temporisation moteur de 1000 us
    //le moteur n'arrive plus à faire de grandes foulée (>10) !!
    Go_PAP(1, dPas, 3000);   
    compteur++;
    LCD_ligne_1();   
    delay(Const_TempFoulee);
    //digitalWrite(PinEnable, HIGH); // On relache le moteur (on peut le tourner à la main)
    break;

  case btnLEFT: // tourner à GAUCHE  (en fonction des branchements de votre moteur !)
    Go_PAP(0, dPas, 3000); 
    compteur--;
    LCD_ligne_1();
    delay(Const_TempFoulee);
    //digitalWrite(PinEnable, HIGH); // On relache le moteur (on peut le tourner à la main)
    break;

  case btnUP:
    LCD_ligne_1();
    dPas ++; // augmenter foulée de pas
    if (dPas <= 1) dPas = 1;
    delay(Const_tempo_bouton); // tempo bouton
    break;

  case btnDOWN:
    LCD_ligne_1();
    dPas --; // diminuer foulée de pas
    if (dPas <= 1) dPas = 1;
    delay(Const_tempo_bouton); // tempo bouton
    break;

  case btnSELECT:
    takePicture(); // SHOOT !!   
    delay(Const_InterPictureDelay); // Délais entre PDV
    break;

  case btnNONE:
    LCD_ligne_1();
    lcd.setCursor(0,1); // placer le curseur au début de la seconde ligne
    lcd.print("Re");
    lcd.write(2); // fl.gauche
    lcd.print(" Av");
    lcd.write(1); // fl.droite
    lcd.print(" Shoot");
    lcd.write(5); // select
    break;
  }

} // end loop


/************* Sous programmes ****************/


///// Tourner PAP ////////
void Go_PAP(boolean dir_pap, int dist_Pas, int freq_mot) {
  digitalWrite(PinEnable, LOW); // active le moteur (il ne sera plus possible de le tourner à la main et l'ampérage sera à son MAX !!
  digitalWrite(PinDir, dir_pap); // Tourne à gauche ou à droite
  for(int j = 1; j <= dist_Pas; j++) { // foulée de pas
    digitalWrite(PinStep, LOW);
    delayMicroseconds(10); // à ajuster selon moteur, on peut essayer de diminuer à 2 us
    digitalWrite(PinStep, HIGH);
    delayMicroseconds(freq_mot); // temporisation à ajuster selon moteur (contrôle la fréquence, la vitesse et le couple)
  }   
} // end func


// Shoot Reflex
void takePicture() {
  //digitalWrite(PinFocus, HIGH); // (si focus installé)
  //delay(FocusPressDelay); // (si focus installé)
  tone(PinBuzzer, 2500, 25); // Bip
  digitalWrite(PinShoot, HIGH);
  delay(Const_ShootPressDelay);
  digitalWrite(PinShoot, LOW);
  //digitalWrite(PinFocus, LOW); // (si focus installé)
}

// Affichage LCD ligne 1
void LCD_ligne_1 () {
  lcd.setCursor(0,0);  // placer le curseur à la première ligne, première position
  lcd.write(3); // fl.haut
  lcd.write(4); // fl.bas
  lcd.print(" dPas=");
  lcd.print(dPas);
  lcd.print(" #");
  lcd.print(compteur);
  lcd.print("                "); 
}


/************* Fonctions ****************/

//  Lire la valeur A/D retournée selon le bouton choisi
int read_LCD_buttons()
{
  adc_key_in = analogRead(PinBouton);   
  if (adc_key_in > 1000) return btnNONE; // On commence par la valeur la plus probable : Aucun appui sur bouton !
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 195)  return btnUP;
  if (adc_key_in < 380)  return btnDOWN;
  if (adc_key_in < 555)  return btnLEFT;
  if (adc_key_in < 790)  return btnSELECT;   
  return btnNONE;  // si aucun appui sur bouton, on retoune la constante btnNONE ...
} // end func.




Réf :
Carte de puissance moteur : viewtopic.php?f=282&t=10443#p52627
Ecran LCD 5 boutons : viewtopic.php?f=283&t=10242
Carte proto + optocoupleur : viewtopic.php?f=285&t=10421

Code plus abouti (pour LCD DFRobot) : Voir viewtopic.php?f=284&t=11092
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Stepduino proto (Chris)

Messagede Fredlab » 03 Jan 2012 22:27

Hello

:chap:

Je reprends le mien dès que j'ai 5 minutes.
Encore merci pour toutes ces explications.
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: Stepduino proto (Chris)

Messagede Fredlab » 03 Jan 2012 22:30

Une question : la carte de puissance, tu penses la mettre où ?
- un boitier spécial entre l'Arduino et le moteur ?
- dans le boitier avec l'Arduino ? avec des branchements genre Cinch pour l'alim du moteur, le contrôle du moteur, le déclencheur souple ?
- soudée sur la plaque de prototypage ? (ça tient ?)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar de l’utilisateur
Fredlab
membre
membre
 
Messages: 9616
Inscription: 27 Juin 2010 13:42
Localisation: Auxonne (21)
Prénom: Frederic

Re: Stepduino proto (Chris)

Messagede pierre4fun » 04 Jan 2012 08:08

Christian,

Impressionnant !
Du travail de pro 8-)

Ma carte moteur vient de chine....elle ne devrait pas tarder.

J'ai hâte de tester ton oeuvre.


Merci.
Amicalement, Pierre
pierre4fun
membre
membre
 
Messages: 733
Inscription: 28 Oct 2009 20:18
Prénom: Pierre
Skype: pierre4fun

Re: Stepduino proto (Chris)

Messagede Christian » 05 Jan 2012 10:13

Re bonjour,
Merci pour vos appréciations !

FrdLab a écrit:Une question : la carte de puissance, tu penses la mettre où ?
- un boitier spécial entre l'Arduino et le moteur ?
- dans le boitier avec l'Arduino ? avec des branchements genre Cinch pour l'alim du moteur, le contrôle du moteur, le déclencheur souple ?


Bon, me connaissant cela risque de rester dans la forme proto un certain temps ! :roll: :lol:
(c'est pas plus mal car il faut tester passablement de choses en réel !)
Mais je prévois quand même un montage fini dans un boîtier.
Pour le module de puissance, je compte le monter sur une plaque cuivrée à bande (j'en ai qui trainent chez moi), ceci sur des supports de broches. Comme cela il restera déposable. cf schéma.
Il faut aussi faire attention que ce module soit bien ventilé ! (et donc il est plus sûr de le déporter de l'Arduino, mais en le gardant dans le boîtier car les fils logiques ne doivent pas être trop longs !)
Pour les prises, je pense à du Din 6 contacts pour le moteur et du mini jack stéréo pour le reflex. L'accu moteur sera certainement en externe.

C'est juste un exemple pour le driver Pololu, non vérifié et non abouti !!
(il faudrait au passage couper les pistes pour les strap mode de pas !)
carte_moteur.jpg
Exif et Meta MicroCartouche carte_moteur.jpg (129.16 Kio) Vu 16177 fois
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Stepduino proto (Chris)

Messagede Christian » 07 Jan 2012 14:07

La programmation avance bien ! :abeille:

menu_stepduino_001.jpg
Exif et Meta MicroCartouche menu_stepduino_001.jpg (236.85 Kio) Vu 16142 fois
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Stepduino proto (Chris)

Messagede pierre4fun » 10 Jan 2012 21:04

Pour la suite, un système de guidage qui semble intéressant:
http://www.photomacrography.net/forum/v ... 9687#99687
Amicalement, Pierre
pierre4fun
membre
membre
 
Messages: 733
Inscription: 28 Oct 2009 20:18
Prénom: Pierre
Skype: pierre4fun

Re: Stepduino proto (Chris)

Messagede Christian » 11 Jan 2012 14:36

Merci Pierre pour le lien !
Je pensais aussi me tourner vers ce genre de solution si mon guidage d'occase (DelTron) ou autres ne me satisfaisaient pas.
(mais c'est quand même pas mal de boulot, alors si on peut faire plus simple ... !)

Autrement, puisque Daniel posait ailleurs des questions sur la consommation de ce proto, voici quelques informations.
Notez aussi la possibilité d'alimenter l'Arduino par l'alim moteur (à travers le driver). En effet, cette carte possède deux régulations !
Il suffit donc de connecter la sortie VDD du driver (à droite, côté sortie moteur) sur une pin 5V de l'Arduino. En revanche je n'ai pas vérifié si on peut connecter en plus l'USB, donc vérifiez ce point avant toute chose !! Je n'ai pas vérifié non plus si d’éventuels parasitages se faisaient sentir. (mais en principe ces deux régulations sont prévu pour !)
Quant au backlight du Lcd, il se règle très facilement de 0 à 254 par une commande PWM (très pratique).

Edit: Il ne faut pas brancher en même temps l'USB et l'alim ext. 5V comme proposé : Pensez-y !

Ces mesures de consommation incluent bien sûr l'Arduino lui même (Arduino + LCD + Driver)

consom1.jpg
Exif et Meta MicroCartouche consom1.jpg (187.27 Kio) Vu 15996 fois


consom2.jpg
Exif et Meta MicroCartouche consom2.jpg (168.11 Kio) Vu 15998 fois


Pour rappel : Moteur PAP utilisé = 1.2A/phase, que j'ai réglé ici à env. 0.7A max (cf viewtopic.php?f=282&t=10443 )

consom3.jpg
Exif et Meta MicroCartouche consom3.jpg (157.17 Kio) Vu 15995 fois
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Re: Stepduino proto 1 (Chris)

Messagede pierre4fun » 11 Jan 2012 21:00

Super Christian!

Faire l'économie d'une alimentation est une bonne chose :)

Merci.
Amicalement, Pierre
pierre4fun
membre
membre
 
Messages: 733
Inscription: 28 Oct 2009 20:18
Prénom: Pierre
Skype: pierre4fun

Re: Stepduino proto 1 (Chris)

Messagede Christian » 16 Jan 2012 16:12

Bon, et bien contrairement à ce que je disais plus haut, j'ai mis en boîte ce Stepduino beaucoup plus vite que prévu ! :)
J'en ai profité pour ajouter un module Solarox (pilotage de Led) et un potentiomètre 10 tours. De cette manière je rejoins presque complétement mon premier montage (machine infernale). Cela me donne aussi un boîtier propre et "universel" pour mon microscope.
Pour le montage du module de puissance j'ai utilisé un shield en rab (proto shield) qui était de toute façon mal adapté à un empilage (j'ai donc tout récupéré, Leds y compris). Je vous donnerai plus de détails sur le montage de cette carte.

J'ai aussi bien avancé le code et je me suis mis au pilotage du moteur par microsteping (16ème de pas), c'est très efficace et intéressant ! (plus de détails et publication de cette première version sous peu)



Le boîtier est une récup d’emballage de kit électronique !
(son look transparent donne un aspect un peu "geek" qui ne me déplait pas :D )
Le module Solarox peut facilement et rapidement être remplacé par un autre (plus ou moins puissant)

stepduino__solarox_1.jpg
Exif et Meta MicroCartouche stepduino__solarox_1.jpg (165.14 Kio) Vu 15833 fois


Pour la sortie APN je n'avais malheureusement pas de prise femelle pour boîtier, j'ai mis en attendant une récup de câble (mini jack stéréo).
Il y a bien sûr une entrée USB, de l'autre côté.

stepduino__solarox_2.jpg
Exif et Meta MicroCartouche stepduino__solarox_2.jpg (149.83 Kio) Vu 15820 fois
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar de l’utilisateur
Christian
Coadmin
Coadmin
 
Messages: 4790
Inscription: 28 Aoû 2007 20:54
Localisation: Entre Alpes et Jura
Prénom: Christian

Suivante

Retourner vers Projet StepDuino et autres projets à base d'Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités