lundi 20 mai 2013

Behind the magic !

Bon, après ce titre un peu pompeux, voici les éléments mis en place pour réaliser ces clichés.

Tout d'abord le côté électronique :

On y voit, l'écran LCD permettant d'afficher les valeurs des 3 potentiomètres. Le bouton poussoir sous l'écran servira à vidanger l'électro-vanne. L'autre bouton poussoir, sert à déclencher le système. Les trois potentiomètres serviront à faire varier, la durée d'ouverture de l'électro-vanne pour faire une goutte, le délai entre deux gouttes, et le délai jusqu'au flash qui va figer la photo.

Les fils jaune et orange sont reliés au flash, et les gris et blanc à l'appareil photo.

Pour l'électro-vanne, il n'y a bien que deux fils qui sont reliés au circuit, mais je n'ai pas modélisé ici son alimentation externe. L'électro-vanne a trois bornes, notées DC, R et GND. Voici le schéma livré avec l'électro-vanne, incluant le nom des bornes :

La diode n'est pas sur le schéma électronique car je l'ai directement connectée aux bornes de l'électro-vanne.

Passons à la partie programmation. Voici le programme utilisé pour faire une photo :

#include <LiquidCrystal.h>

// Instanciation de l'écran LCD
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

// Connexions des trois potentionmètres et du bouton poussoir
const int p1Pin = A2;
const int p2Pin = A1;
const int p3Pin = A0;
const int purgePin = 12;

const int vannePin = 8;
const int apnPin = 9;
const int flashPin = 10;

const int photoPin = 11;

const int pausePostFlash = 100;

void setup() {
  // Initialisation de l'écran (16 caractères sur 2 lignes)
  lcd.begin(16, 2);

  // La purge est une entrée
  pinMode(purgePin, INPUT);
  // La vanne est une sortie
  pinMode(vannePin, OUTPUT);
  // L'appareil photo est une sortie
  pinMode(apnPin, OUTPUT);
  // Le flash est une sortie
  pinMode(flashPin, OUTPUT);
  // La photo est une entrée
  pinMode(photoPin, INPUT);
}

void goutte(int dureeGoutte) {
  // On ouvre la vanne
  digitalWrite(vannePin, HIGH);
  // On attend
  delay(dureeGoutte);
  // On ferme la vanne
  digitalWrite(vannePin, LOW);
}

void takePhoto(int dureeGoutte, int intervalle, int delaiFlash) {
  // Ouverture
  digitalWrite(apnPin, HIGH);

  // Première goutte
  goutte(dureeGoutte);

  // Intervalle
  delay(intervalle);

  // Deuxième goutte
  goutte(dureeGoutte);

  // Attente jusqu'au flash
  delay(delaiFlash-intervalle);

  // Flash
  digitalWrite(flashPin, HIGH);
  // On attend
  delay(1);
  // On ferme la vanne
  digitalWrite(flashPin, LOW);

  // Attente jusqu'à la fermeture
  delay(pausePostFlash);

  // Fermeture
  digitalWrite(apnPin, LOW);  
}

void loop() {
  // On lit les valeurs des trois potentiomètres
  int p1 = analogRead(p1Pin);
  int p2 = analogRead(p2Pin);
  int p3 = analogRead(p3Pin);

  p1 = map(p1, 0, 1023, 0, 100);
  p2 = map(p2, 0, 1023, 0, 100);
  p3 = map(p3, 0, 1023, 100, 500);

  // Si la photo est prise
  if (digitalRead(photoPin) == HIGH) {
    takePhoto(p1, p2, p3);
  }
  else {
    // On efface l'écran
    lcd.clear();

    // Affichage des valeurs des trois potentiomètres
    lcd.setCursor(0, 0);
    lcd.print("P1:");
    lcd.print(p1);

    lcd.setCursor(8, 0);
    lcd.print("P2:");
    lcd.print(p2);

    lcd.setCursor(0, 1);
    lcd.print("P3:");
    lcd.print(p3);

    // Affichage de l'état du bouton poussoir
    lcd.setCursor(8, 1);
    if (digitalRead(purgePin) == HIGH) {
      lcd.print("ON");
      digitalWrite(vannePin, HIGH);
    }
    else {
      lcd.print("OFF");
      digitalWrite(vannePin, LOW);
    }

    // Petite pause
    delay(50);
  }
}


Les valeurs pour les potentiomètres sont mappées pour que les deux premiers donnent une valeur entre 0 et 100 et le troisième entre 100 et 500. Il faut se méfier en modifiant ces valeurs, car pour simplifier mes tests je fais une pause entre la deuxième goutte et le flash d'une durée de delaiFlash-intervalle. Si cette valeur devient négative, le système paraîtra bloqué...

Voilà... C'est tout pour le moment. Je ne sais pas quand je recommencerais, mais je pense que les prochaines séances seront plus faciles à mettre en place !



Aucun commentaire:

Enregistrer un commentaire