Installation Artistique - Leds-Moteur-photos au collodion Humide.

Bonjour les amis cela fait bien longtemps que je n’étais pas venue pour poster une demande d’aide. Tellement longtemps que j’ai dû recréer un compte tout beau tout neuf :wink:

Je joue toujours avec des leds, mais maintenant je fais intervenir des moteurs, et oui on grandi !

Dans l’idée, je bosse sur une installation que je dois rendre mi mars, dans laquelle je fais intervenir du ruban led qui éclaire les champs de plaques de verres qui ont reçu une photographie au collodion humide. Et à la manière d’un affichage en plexi dans une pizzeria qui indique la promo du jour en jaune fluo, mes photos donnent à voir des visages et ce sont les sels d’argents qui créent l’image.

Je vous pose un petit schéma qui à l’avantage de synthétiser tout ce que je pourrais expliquer en 50 lignes difficilement compréhensibles. `

Mon problème du moment se situe dans le setup, où j’aimerai comprendre comment faire qu’à cette étape du programme mon moteur fasse reculer le rail qui contient le rubanLed jusqu’au switch et le fasse ensuite avancer. Cette action ne doit se produire qu’au démarrage de l’arduino, le matin, par la personne de la galerie. J’ai besoin de cette mise à “zéro”, par ce que le soir l’arduino sera coupé comme ça.

Le ptit bout de code sur lequel je bosse :

/*     Simple Stepper Motor Control Exaple Code      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *
 *  Modifié pour le projet PaysagesDePortraits
 *  Dans la configuration matérielle du 17/01/17 
 *  la valeur 4000 dans la boucle for est égale à 1 cm
 *  Merci à LaurentM et Martin pour leur coups de mains 
 */


int buttonPin = A3; //fonctionne sur CoolEn de la cnc shield
int buttonState = 0; 

const int stepPin = 2; 
const int dirPin = 5; 
const int en = 8;

const int pot = A2;
const int del = 700;

void setup() {

  pinMode(buttonPin, INPUT_PULLUP);

  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);

  pinMode(pot,INPUT);
  pinMode(en, OUTPUT);
  digitalWrite(en, LOW);
  Serial.begin(9600);
  delay(500);

////////////////////////////////////////WORK-IN-PROGRESS////////////////////////
///////////////////faire en sorte de demander au moteur de tourner//////////////
////////////////// jusqu'a ce qu'il rencontre le limit switch pour//////////////
////////////////// ensuite tourner dans le sens inverse pour un  ///////////////
////////////////// certain nombre de pas. Cela doit se faire une //////////////
////////////////// fois au démarrage de l'installation et ainsi  ///////////////
////////////////// etre sur de la bonne position du rubanLed qui ///////////////
////////////////// est déplacé par le moteur en translation.    //////////////

 do{
  digitalWrite(dirPin,LOW); // Va dans un sens...
 // for(int x = 0; x < 4000; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(del);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(del);   
  }
 while(buttonState == LOW);  //...tant que le bouton est levé
 
   if (buttonState == HIGH) {    // Si le bouton est appuyé...
    digitalWrite(dirPin,HIGH);   // tourne d'un cm dans l'autre sens
  for(int x = 0; x < 4000; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(del); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(del);
   }

   }
}

void loop() {

  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);

  avancer1mm();
  reculer1mm(); // et ainsi de suite dans le délire créatif ! ! 

}


void avancer1cm () {
  digitalWrite(dirPin,HIGH); 
  for(int x = 0; x < 4000; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(del); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(del); 
  }
}


void reculer1cm () {
  digitalWrite(dirPin,LOW); 
  for(int x = 0; x < 4000; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(del);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(del);
  }
}


void avancer1mm () {
  digitalWrite(dirPin,HIGH); 
  for(int x = 0; x < 400; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(del); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(del); 
  }
}


void reculer1mm () {
  digitalWrite(dirPin,LOW); 
  for(int x = 0; x < 400; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(del);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(del);
  }
}

Et pour ceux qui on envie de voir à quoi cela peut ressembler c’est par ici

A bientôt et bonne journée :wink:

hello
dans le setup, tu déplace ton moteur vers la came de prise origine machine
mais
on suppose que buttonState est l'image du fdc

1/ tu testes buttonState

2/ tu ne lis jamais le fdc pour renseigner buttonState

3/ton entree fdc est en pullup donc fdc non activé, la lecture de l'entree fdc te donnera HIGH
et toi, tu demande au moteur de se deplacer tant que fdc = LOW

donc, ton moteur ne doit pas se déplacer

Bonjour et merci dfgh pour ta réponse.
Par contre j'ai rien compris... La faute à mon manque de culture dans le domaine.

Fdc ? C'est quoi ?

Déjà que je suis pas à l'aise mais là je me sens con...

Par contre mon moteur tourne, et rien ne se passe quand j'appuie sur le bouton.

fdc = fin de course ou switch

veux tu faire un test avec ce setup

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(pot,INPUT);
  pinMode(en, OUTPUT);
  digitalWrite(en, LOW);
  Serial.begin(9600);
  delay(500);

////////////////////////////////////////WORK-IN-PROGRESS////////////////////////
///////////////////faire en sorte de demander au moteur de tourner//////////////
////////////////// jusqu'a ce qu'il rencontre le limit switch pour//////////////
////////////////// ensuite tourner dans le sens inverse pour un  ///////////////
////////////////// certain nombre de pas. Cela doit se faire une //////////////
////////////////// fois au démarrage de l'installation et ainsi  ///////////////
////////////////// etre sur de la bonne position du rubanLed qui ///////////////
////////////////// est déplacé par le moteur en translation.    //////////////

  do{reculer1mm ();}while(digitalRead(buttonPin) == HIGH);
  for(int x = 0; x < 40; x++) {avancer1mm ();} //avance de 4cm
   }

Tu mérite bien ton Karma !
Ça fonctionne parfaitement.

Je peux commencer à potasser la suite, le déclenchement de la séquence par le PIR.

Merci dfgh et à bientôt :wink:

Un jour une question ^^

Aujourd’hui petit souci pour faire clignoter une led en même temps que le moteur tourne…

L’idée est de faire varier en intensité le rubanLed qui se trouve dans le profilé qui est mis en mouvement par le moteur.

J’ai bien essayé de faire un " do blink while sequence" mais c’est pas comme ça que ça marche…

/*     Simple Stepper Motor Control Exaple Code      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *
 *  Modifié pour le projet PaysagesDePortraits
 *  Dans la configuration matérielle du 17/01/17 
 *  la valeur 4000 dans la boucle for est égale à 1 cm
 *  Merci à LaurentM, à Martin et à dfgh du forum Arduino pour vos coups de mains !
 */

//////////// bouton/////////////////

int buttonPin = A3; //fonctionne sur CoolEn de la cnc shield
int buttonState = 0; 

//////////// moteur/////////////////

const int stepPin = 2; 
const int dirPin = 5; 
const int en = 8;
//const int pot = A2;  // potard pour test
const int del = 700;

////////////capteur PIR/////////////

int sensorValue = analogRead(A0);

///////////leds////////////////////

int led = 9;

void setup() {

  pinMode(led, OUTPUT);

  pinMode(buttonPin, INPUT_PULLUP);

  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);

  //pinMode(pot,INPUT);
  pinMode(en, OUTPUT);
  digitalWrite(en, LOW);
  Serial.begin(9600);
  delay(500);


  do{
    reculer1mm ();
  }
  while (digitalRead(buttonPin) == HIGH);
  for(int x = 0; x < 10; x++) {
    avancer1mm ();
  } 
}

void loop() {

  int sensorValue = analogRead(A0);

  //Serial.println(sensorValue);
  //delay(1); 

  if (sensorValue >  100) { // valeur 100 pour filtrer les valeurs inférieures qui foutent le bordel
    do {
      Blink();      //Clignote
    }
    while (sequence();    //tant que la sequence joue (si c'était aussi simple^^) 
  }  

  }



void sequence() {
  avancer1mm();
  reculer1mm();
  avancer1cm();
  reculer1cm();
  avancer1mm();
  reculer1mm();
  avancer1cm();
  reculer1cm();
}

void Blink() {
  digitalWrite(led, HIGH);   
  delay(1000);               
  digitalWrite(led, LOW);    
  delay(1000);
}

void avancer1cm () {
  digitalWrite(dirPin,HIGH); 
  for(int x = 0; x < 4000; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(del); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(del); 
  }
}


void reculer1cm () {
  digitalWrite(dirPin,LOW); 
  for(int x = 0; x < 4000; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(del);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(del);
  }
}


void avancer1mm () {
  digitalWrite(dirPin,HIGH); 
  for(int x = 0; x < 400; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(del); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(del); 
  }
}


void reculer1mm () {
  digitalWrite(dirPin,LOW); 
  for(int x = 0; x < 400; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(del);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(del);
  }
}

Bonne journée et à bientôt.

hello
sauf erreur,
le sensor PIR ne retourne pas une valeur analogique mais une info tout ou rien.

donc lorsque le sensor detecte un spectateur, le système se met en marche.
le moteur fait avancer le ruban de leds.

tu veux utiliser Blink (clignoter les leds) mais tu parles aussi de "moduler" les leds( faire varier leur luminosité)?
si c'est bien moduler, c'est en fonction de quoi ( une fonction RND ?)
si c'est le blink que tu veux, comment le vois tu?
le moteur se déplace d' 1 mm , s’ arrête, la lampe s'allume, une pose de x secondes, la led s’éteint le moteur se déplace à nouveau etc ?
ou les leds clignotent en permanence, moteur en mouvement ou pas?

comment sont alimentées les leds

peux tu préciser tous ces points

Le PIR dans la console me donne une valeur entre 0 et 667 (environ) et effectivement, c'est 0 ou 667, sauf que parfois, j'ai des 4, des 7 qui viennent tout perturber.

Donc l'idée avec les variations vs blink, c'est dans un premier temps de réussir avec le blink et ensuite je passerais aux FADE.

Pour l'installation, je veux que le moteur joue la séquence et en même temps le rubanLed joue la sienne propre.

Pour la partie PIR-Moteur-Leds :
1 - le PIR attends
2 - Le PIR capte un spectateur
3 - le moteur joue, le rubanLed aussi.

Les ruban leds seront alimentés en 12v c'est le pwm via un mosfet qui donnera la valeur d'intensité de l'arduino vers le rubanLed. Cette partie je l'utilise déjà sur de petits cadres lumineux : AmbroGIF

ok, ta sequence :
avancer1mm();
reculer1mm();
avancer1cm();
reculer1cm();
avancer1mm();
reculer1mm();
avancer1cm();
reculer1cm();
mets combien de temps pour s'executer ?
si plus de 1 seconde,
combien mets avancer/reculer de 1mm?
et
combien mets avancer/reculer de 1cm?

La séquence écrire est provisoire.

Elle met plus d’une seconde pour s’exécuter.
Du coup avancer/reculer 1cm met 10 et des poussières à se jouer et 10 fois moins en 1mm