Photographie 360 avec plateau rotatif


Messages recommandés

yop

 

Merci, pas besoin de traduire, je parle 6 langues.. ça devrait aller  :-)  (comme il se la pète !!)

Merci pour l'info, je vais étudier cela..

 

++

GEN

Modifié par Gen
  • Like 1
  • Haha 1
Lien à poster
Partager sur d’autres sites

Re,

 

Je me permets de m'incruster, mais là dans le cas présents, il te faut donc un câble d'un coté mini usb (ap) vers l'appareil de gen?

Le jack osef il est propriétaire au contrôleur que tu utilise?

Ou j'ai pas piger le concept :p

 

Si tu veux contrôler l'appareil photo c'est miniusb<->usb

 

Lien à poster
Partager sur d’autres sites

yop

 

les connecteurs, c'est pas le problème, on met ce que l'on veut sur le contrôleur.

je regarde le comment du pourquoi cela déclenche.. je suis en mode bouffage d'infos pour le moment

 

je vous re dès que j'aurai commencé.

Par contre, ce que je peux déjà dire, c'est que l'encodeur rotatif me gonfle grave.. je crois que je vais passer en mode clavier déporté ou télécommande IR

 

++

GEN

Lien à poster
Partager sur d’autres sites

yop

 

J'ai laissé tombé le rotatif qui ne me satisfaisait pas entièrement, je passe donc sur télécommande IR

j'ai fait les premiers tests et ça tourne comme une horloge suisse

DSC_0209.JPG

 

++

GEN

  • Like 2
Lien à poster
Partager sur d’autres sites

Yop

 

Tadaahhh, c'est bouclé au niveau informatique.

Juste un binss, le moteur que j'ai acheté ne fonctionne pas.. il est grippé. J'ai contacté le vendeur.

Entre temps j'en ai commandé un autre ici en Espagne, ça devrait prendre 2 à 3 jours

 

voici les tofs

DSC_0264.JPG

DSC_0265.JPG

DSC_0266.JPG

 

couleur led

vert = au travail

rouge = au repos

bleu = en paramétrage

 

le dernier setup est toujours gardé en mémoire automatiquement.

voila un bébé de terminé.. Je ferai une vidéo dès que je reçois le moteur de remplacement

Si qlq'un est intéressé par le proto, je le vend prix coutant.. mais il faudra me donner les spécifications techniques pour l'enclenchement de l'apn

IR ou contact etc..

 

++

GEN

  • Like 1
Lien à poster
Partager sur d’autres sites

Yep @Gen ! 

Du beau boulot que tu nous as fais la !! Tu va mettre quoi comme plateau, ou comme support pour mettre le sujet ? 

 

J'ai pas trouver plus d'info concernant le déclenchement a par ce site http://axotron.se/blog/time-lapse-shutter-release-based-on-arduino/ qui pourra peu être aider un peu :D ou pas ... 

 

Personnellement j'ai pas besoin de déclencheur comme il se fais via mon rail, je pourrais alors manuellement lancer la séquence de stacking, faire tourner de x degré le plateau, relancer la meme séquence de stacking, refaire tourner de x degré jusqu'a avoir les 360 degré ou moins.

 

Tu peu faire tourner avec la télécommande le plateau ? Genre tu clique il tourne de x degré , sans partir dans une séquence , juste faire tourner le plateau ? Ou alors faire 2 clique et il fais un tour entier, je sais pas si c'est possible , mais tu vois dans l'idée :mdr:  

 

A plouche !

Lien à poster
Partager sur d’autres sites

Yop.

 

je ne m'occupe pas de la partie mécanique, l'acquéreur mettra ce qu'il voudra : plateau, pince, griffe , aiguille, etc..

non j'ai rien prévu, mais je peux rajouter cette fonctionnalité de tourner à la demande hors séquence

 

++

GEN

Lien à poster
Partager sur d’autres sites

Yep !

 

Ok pas de soucis pour la partie mécanique, donc y'aura juste un 'embout' avec un filetage qui dépasse du boitier, et on pourra y mettre ce qu'on veux ?

 

J'avais pas penser , mais est-ce que tu peu régler la vitesse de rotations si tu ajoute la fonctionnalité de faire des tour complet ? 


++

Lien à poster
Partager sur d’autres sites

yop

 

Tu pourras mettre ce que tu veux sur l'embout qui est un méplat.

Bien entendu il faudra en limiter le poids ou changer de moteur (c'est compatible moteur de 5 à 12V)

 

ben tu regles le nombre de prise * le nombre de pas et ça fait un tour complet.. Pourquoi réinventer la roue à couper le beurre LOL

 

++

GEN

  • Like 1
Lien à poster
Partager sur d’autres sites

Yop

 

Re @Xtremeride

J'ai rajouté un menu manuel.

il permet par une pression sur les flèches gauche/droite, d'avancer ou de reculer du nombre de pas programmés et en appuyant sur OK de faire un tour complet

 

Bon.. fini de jouer, je retourne m'occuper du proto, voir ce qu'ont donnés les tests

@++

 

GEN

  • Like 1
Lien à poster
Partager sur d’autres sites

yop.

 

Voici le code rotaryPlate.pdf  (code et librairies)

Téléchargez le, renommez le en Zip et procédez au décompactage.

L'éditeur utilisé : ATOM

 

 

#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <Stepper.h>
 
#define I2C_LCD_ADDRESS   0x3F  //0x27
#define R_LED             2
#define G_LED             3
#define B_LED             4
#define IR_PIN            7
#define MOTOR_INPUT1      8
#define MOTOR_INPUT2      9
#define MOTOR_INPUT3      10
#define MOTOR_INPUT4      11
 
#define RED               1
#define GREEN             2
#define BLUE              3
#define NONE              4
 
int positionX[12] = {14,19,14,19,14,19, 0, 6, 7,12,13,19};
int positionY[12] = { 0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3};
const int LCDROWS   = 4;
const int LCDCOLS   = 20;
const int NBSTEPS   = 48 * 64 ;
 
 
IRrecv              irDetect(IR_PIN);
LiquidCrystal_I2C     LCD(I2C_LCD_ADDRESS,LCDCOLS,LCDROWS);
Stepper             MOTEUR(NBSTEPS,MOTOR_INPUT1,MOTOR_INPUT2,MOTOR_INPUT3,MOTOR_INPUT4);
 
decode_results irIn;
 
int NBPRISES,ANGLE,PAUSE;
int menuPos_X;
int menuPos_Y;
bool run = false;
unsigned long previousMillis;
String introPage[4]  = {"TURN IT AROUND  V1.0", "    by Gentronik    ", "                    ", " gentronik@inbox.ru "};
String mainPage[4]   = {"NB DE PRISES :      ", "VALEUR ANGLE :      ", "PAUSE M/SEC  :      ", " START  STOP  RESET "};
String manuelPage[4] = {"    MODE MANUEL     ", "Utilisez les fleches", "ou le bouton OK pour", "executer un cycle   "};
 
byte selLeft[8]   = { B10000, B11000, B11100, B11110, B11100, B11000, B10000, B00000 };
byte selRight[8]  = { B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 };
 
 
void trigger()
{
  /* C'est ici que vous devez introduire le code correspondant au type
     de déclenchement de votre appareil
     n'oubliez pas la partie électronique et choisissez une pin de libre
     sur l'arduino */
}
 
 
 
void loadMemory()
{
  NBPRISES = memRead(10);
  ANGLE    = memRead(14);
  PAUSE    = memRead(18);
}
 
 
void memWrite(int address, long value)
{
  byte four  = (value & 0xFF);
  byte three = ((value >> 8) & 0xFF);
  byte two   = ((value >> 16) & 0xFF);
  byte one   = ((value >> 24) & 0xFF);
  EEPROM.write(address, four);
  EEPROM.write(address + 1, three);
  EEPROM.write(address + 2, two);
  EEPROM.write(address + 3, one);
}
 
long memRead(long address)
{
  long four  = EEPROM.read(address);
  long three = EEPROM.read(address + 1);
  long two   = EEPROM.read(address + 2);
  long one   = EEPROM.read(address + 3);
  return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) +
         ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}
 
int charToInt(char input)
{
    return input - '0';
}
 
void LCD_Initialization()
{
    LCD.init();
    LCD.createChar(4, selLeft);
  LCD.createChar(5, selRight);
    LCD.backlight();
    LCD.setCursor(0,0);
}
 
void displayScreen(String theArray[], int length)
{
    LCD.clear();
    for(int i = 0; i <= length - 1; i++)
    {
        LCD.setCursor(0,i);
        LCD.print(theArray);
    }
}
 
void displayHorizontalSelection(int pos)
{
  switch(pos)
  {
    case 1: LCD.setCursor( 0,3); LCD.write(4); LCD.setCursor( 6,3); LCD.write(5); break;
    case 2: LCD.setCursor( 7,3); LCD.write(4); LCD.setCursor(12,3); LCD.write(5); break;
    case 3: LCD.setCursor(13,3); LCD.write(4); LCD.setCursor(19,3); LCD.write(5); break;
  }
}
 
void displaySelection(int x, int y, bool blink = false)
{
  for (int i = 0; i<= 11; i++)
  {
    LCD.setCursor(positionX,positionY);
    LCD.print(" ");
  }
  switch(y)
  {
    case 0 :  case 1 : case 2:
      LCD.setCursor(14,y);
      LCD.write(4);
      LCD.setCursor(19,y);
      LCD.write(5);
      break;
    case 3:
      displayHorizontalSelection(x);
      break;
  }
}
 
 
char decodeIR()
{
  switch(irIn.value)
  {
    case 0xFF629D:   return 'U';  break;
    case 0xFF22DD:   return 'L';  break;
    case 0xFF02FD:   return 'O';  break;
    case 0xFFC23D:   return 'R';  break;
    case 0xFFA857:   return 'D';  break;
    case 0xFF6897:   return '1';  break;
    case 0xFF9867:   return '2';  break;
    case 0xFFB04F:   return '3';  break;
    case 0xFF30CF:   return '4';  break;
    case 0xFF18E7:   return '5';  break;
    case 0xFF7A85:   return '6';  break;
    case 0xFF10EF:   return '7';  break;
    case 0xFF38C7:   return '8';  break;
    case 0xFF5AA5:   return '9';  break;
    case 0xFF42BD:   return '*';  break;
    case 0xFF4AB5:   return '0';  break;
    case 0xFF52AD:   return '#';  break;
    default:                      break;
  }
}
 
String formatNumberInXdigits(int number, int nbDigit)
{
    String stringNumber = String(number);
    while(stringNumber.length() < nbDigit)
    {
        stringNumber = "0"+stringNumber;
    }
    return stringNumber;
}
 
void displayData()
{
  LCD.setCursor(15,0);
  LCD.print(formatNumberInXdigits(NBPRISES,4));
  LCD.setCursor(15,1);
  LCD.print(formatNumberInXdigits(ANGLE,4));
  LCD.setCursor(15,2);
  LCD.print(formatNumberInXdigits(PAUSE,4));
}
 
 
void runLed(int color)
{
  switch(color)
  {
  case RED:
    digitalWrite(R_LED, HIGH);
    digitalWrite(G_LED, LOW);
    digitalWrite(B_LED, LOW);
    break;
  case GREEN:
    digitalWrite(R_LED, LOW);
    digitalWrite(G_LED, HIGH);
    digitalWrite(B_LED, LOW);
    break;
  case BLUE:
    digitalWrite(R_LED, LOW);
    digitalWrite(G_LED, LOW);
    digitalWrite(B_LED, HIGH);
    break;
  case NONE:
    digitalWrite(R_LED, LOW);
    digitalWrite(G_LED, LOW);
    digitalWrite(B_LED, LOW);
    break;
  }
}
 
void rainbow()
{
    for(int i = 0 ; i<= 3; i++)
    {
      runLed(RED);
      delay(200);
      runLed(GREEN);
      delay(200);
      runLed(BLUE);
      delay(200);
    }
    runLed(RED);
}
 
 
 
void setup()
{
  pinMode(R_LED,OUTPUT);
  pinMode(G_LED,OUTPUT);
  pinMode(B_LED,OUTPUT);
  Serial.begin(9600);
  Wire.begin();
  MOTEUR.setSpeed(9);
  loadMemory();
  LCD_Initialization();
  irDetect.enableIRIn();
  displayScreen(introPage,4);
  rainbow();
  LCD.clear();
  displayScreen(mainPage,4);
  displayData();
  menuPos_X = 1;
  menuPos_Y = 3;
  displaySelection(menuPos_X,menuPos_Y);
 
}
 
void go_UP()
{
  menuPos_Y--;
  if(menuPos_Y < 0){menuPos_Y = 0;}
  displaySelection(menuPos_X,menuPos_Y);
}
 
void go_DOWN()
{
  menuPos_Y++;
  if(menuPos_Y >3){menuPos_Y = 3;}
  displaySelection(menuPos_X,menuPos_Y);
}
 
void go_LEFT()
{
  if(menuPos_Y == 3)
  {
    menuPos_X--;
    if(menuPos_X < 1){menuPos_X = 1;}
    displaySelection(menuPos_X,menuPos_Y);
  }
}
 
void go_RIGHT()
{
  if(menuPos_Y == 3)
  {
    menuPos_X++;
    if(menuPos_X > 3){menuPos_X = 3;}
    displaySelection(menuPos_X,menuPos_Y);
  }
}
 
 
void modifyValue(int field)
{
  int newValue = 0;
  int counter = 0;
  int memoryPos[3] = {10,14,18};
  int multiplicator[4] = {1000,100,10,1};
  bool stayInLoop = true;
  run = false;
  runLed(BLUE);
  LCD.blink();
  LCD.setCursor(15,field);
  while(stayInLoop)
  {
    if (irDetect.decode(&irIn))
    {
      char entry = decodeIR();
      Serial.print(entry);
      switch(entry)
      {
        case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
        newValue = newValue + ((charToInt(entry)) * multiplicator[counter]);
        counter++;
        LCD.print(entry);
        if(counter==4)
        {
          LCD.noBlink();
          memWrite(memoryPos[field], newValue);
          if(field==0){NBPRISES = newValue;}
          if(field==1){ANGLE    = newValue;}
          if(field==2){PAUSE    = newValue;}
          for(int i = 0; i<= 2; i++)
          {
            LCD.setCursor(15, field);
            LCD.print("    ");
            delay(200);
            LCD.setCursor(15, field);
            LCD.print(formatNumberInXdigits(newValue,4));
            delay(300);
          }
          stayInLoop = false;
        }
        break;
        case '*':
          LCD.noBlink();
          loadMemory();
          displayData();
          stayInLoop = false;
          break;
      }
      irDetect.resume();
    }
  }
  runLed(RED);
}
 
 
void execute_treatement()
{
 
  switch(menuPos_Y)
  {
    case 0 : case 1: case 2: modifyValue(menuPos_Y); break;
    case 3 :
      if(menuPos_X == 1){if(NBPRISES>0){run = true;}}
      if(menuPos_X == 2){run = false;}
      if(menuPos_X == 3)
      {
        run = false;
        loadMemory();
        displayData();
        menuPos_X = 1;
        menuPos_Y = 3;
        displaySelection(menuPos_X,menuPos_Y);
      }
      break;
  }
}
 
 
bool doTreatement(char movementCommand)
{
  switch(movementCommand)
  {
    case 'L':
      runLed(GREEN);
      MOTEUR.step(0-ANGLE);
      trigger();
      runLed(RED);
      break;
    case 'R':
      runLed(GREEN);
      MOTEUR.step(ANGLE);
      trigger();
      runLed(RED);
      break;
    case 'O':
      runLed(GREEN);
      MOTEUR.step(NBSTEPS);
      runLed(RED);
      break;
    case '#':
      return false;
      break;
  }
  return true;
}
 
 
void run_Once()
{
  bool stayInLoopRun_once = true;
  displayScreen(manuelPage,4);
  irDetect.resume();
  while(stayInLoopRun_once)
  {
 
    if (irDetect.decode(&irIn))
    {
      if(!doTreatement(decodeIR()))
      {
        stayInLoopRun_once = false;
      }
      irDetect.resume();
    }
  }
  displayScreen(mainPage,4);
  displayData();
  menuPos_X = 1;
  menuPos_Y = 3;
  displaySelection(menuPos_X,menuPos_Y);
}
 
 
void doRequest(char order)
{
  switch(order)
  {
    case 'U': go_UP()   ; break;
    case 'D': go_DOWN() ; break;
    case 'L': go_LEFT() ; break;
    case 'R': go_RIGHT(); break;
    case 'O': execute_treatement(); break;
    case '#': run_Once();break;
  }
}
 
void loop()
{
  if (irDetect.decode(&irIn))
  {
    doRequest(decodeIR());
    irDetect.resume();
  }
 
  if(run)
  {
    runLed(GREEN);
    MOTEUR.step(100);
    if(millis() >= (previousMillis + PAUSE))
    {
      trigger();
      NBPRISES--;
      LCD.setCursor(15,0);
      LCD.print(formatNumberInXdigits(NBPRISES,4));
      previousMillis = millis();
    }
    if(NBPRISES == 0)
    {
      run = false;
    }
  }
  else
  {
    runLed(RED);
  }
}

 

 

 

Menu principal :

flèches gauche/droite/haut/bas = déplacement dans menu

OK = sélection

* = annulation saisie

# = passage menu manuel

 

Menu manuel

fleche droite/gauche = 1 déplacement dans le sens choisi d'un angle programmé dans le menu principal

OK = un tour complet

# = retour menu principal

 

Voila les pinpins, vous avez tout sous la main pour réaliser vos montages, vous pouvez changer de moteur pour des charges lourdes

Le proto est à vendre prix coutant car j'ai fait ce montage juste pour le fun et vous donner une base de travail

 

câblage :

BTN reset fil1 => RST / fil2 =>GND

ECRAN LCD I2C = GND => GND / VCC =>VCC / SDA => SDA / SCL => SCL

RECEPTEUR IR = VCC => VCC / GND => GND / Signal =>D7

LED TRICOLORE = GND => GND/ R => D2 / G => D3 / B => D4

PLATINE MOTEUR = GND => GND / VCC =>VCC / IN1 => D8 / IN2 => D9 / IN3 => D10 / IN4 => D11

Légende VIOLET = Arduino

 

branchements

IR.jpg

 

de haut en bas

-Signal

-VCC

-GND

 

 

 

ledRGB.png

ATTENTION : vous devez mettre entre le GND de l'arduino et le GND de la led (-), une résistance de 470 Ohms 1/4W

 

la télécommande utilisée : https://www.ebay.fr/itm/Kit-recepteur-IR-Telecommande-Infrarouge-Arduino-infrared-receiver-remote/183280020112?hash=item2aac572a90:m:m3husYwULJegcY-DGH7eg0A

telecommande.jpg

 

le kit moteur : https://www.ebay.fr/itm/28BYJ-48-Moteur-pas-a-pas-module-ULN2003-DIY-Arduino-4-phases-Stepper-Motor-5V/263231276522?hash=item3d49ce85ea:m:m2pBlD64WMxeBAT454xFN0Q

 

moteur.jpg

 

Après, il vous faudra : un arduino UNO, une alimentation 5V/3A, boîtier, câbles dupont, câble secteur, afficheur LCD 4x20 I2c, bouton interrupteur, bouton poussoir etc etc..

 

Prix : +/- 50€ en fonction de vos sources d'approvisionnement et des divers frais de port.

On est bien loin des prix pratiqués dans le commerce. Libre à vous de mettre un autre moteur plus puissant et d'arranger cela suivant vos besoins

 

Si vous avez des questions n'hésitez pas à la poser ou laisser un com

N-JOY !

++

GEN

 

Modifié par Gen
  • Like 4
Lien à poster
Partager sur d’autres sites

Yopla ! 

ben t'as pas chômer ce weekend ! Merci beaucoup pour ton temps @Gen ! c'est vraiment cool de ta part !! Le tour complet c'était au cas ou pour faire une vidéo et aussi pour placer le sujet ca aide beaucoup! Merci :D 

Par contre au niveau du méplat, je vois pas comment fixer quelque chose sans jeux et parfaitement centré comme y'as rien pour visser. Il existe des pièces avec un trou méplat a fixer directement dessus ? Parce que 0,01mm de décalage et encore moins et c'est le drame :mdr: . 

En terme de poids tu as une idée du max avec ton moteur ? J'ai chercher dans les spécifications mais y'as rien de précisé.

 

Que pense tu de ce moteur ? l'alimentation c'est du 12/24v par contre. C'est le type de moteur utiliser sur mon rail. https://www.ebay.com/itm/Nema-14-0-9deg-400-steps-rev-High-Precision-Stepper-Motor-0-4A-15-6oz-in-11Ncm-/231400432268


Une excellente journée a toi ! et aux autres qui passent par ici :D !

 

Lien à poster
Partager sur d’autres sites

yop

 

un disque de plexi et travailler le centre soigneusement à la dremel et si il y a du jeu, un peu de colle à chaud et le tour est joué

Dans les 100/200 gr sans problème

 

ben le moteur que tu présentes c'est plus du cheap cost, on tombe dans le sérieux là :-)

 

++

GEN

Lien à poster
Partager sur d’autres sites
  • 1 mois après ...

Yop,

 

A la limite pour faire de la vidéo ca pourrais aller, histoire de se faire la main pour un début. Mais j'ai besoin de quelque chose de pilotable et avec une grande précision. Mais j'avais deja penser a ses présentoir quand je débutais les 360.

 

Plouche

Lien à poster
Partager sur d’autres sites
  • 3 mois après ...

Hello @cypriens ,

 

Non toujours pas trouver mon bonheur, il existe bien quelque chose mais pas dans mes moyens.... J'ai laisser un peu tomber pour me consacrer qu'au stacking. Je garde en tête ce projet pour quand j'aurais un peu plus d'argent. Il y a aussi une connaissance en chine qui travail sur un système similaire avec 4 axe, j'espère que ca va vite sortir et à moindre coup.

Je reviendrais par ici quand j'aurais trouver une solution ;) 

A bientot !

  • Like 1
Lien à poster
Partager sur d’autres sites