Affichage des articles dont le libellé est Arduino. Afficher tous les articles
Affichage des articles dont le libellé est Arduino. Afficher tous les articles

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 !



samedi 23 mars 2013

Préparation du système paramétrable

Le principe de la double goutte d'eau est le suivant :
  • On ouvre la vanne pour produire la première goutte
  • On fait une pause
  • On ouvre la vanne pour faire la seconde goutte
  • On refait une pause
  • On déclenche l'appareil photo
  • On déclenche le flash 
Voici un schéma rapide de la timeline :

Pour commencer, les deux gouttes feront la même taille, donc le temps d'ouverture de l'électrovanne sera le même : t1. Le temps séparant les deux gouttes est t2. La dernière pause, t3, va jusqu'au déclenchement du flash. Comme la prise de vue se fait dans le noir, on déclenchera l'appareil photo juste avant le flash, la vitesse d'obturation faisant durer la prise de vue jusqu'après le flash (sinon, ça ne servirait pas à grand chose...)

Plutôt que de faire des essais-erreurs et de réalimenter à chaque fois le micro-controller, je pense paramétrer le système avec trois potentiomètres pour régler les trois durées : t1, tet t3. Et pour pouvoir recréer les conditions, on va les afficher sur un écran LCD. Il nous faudra aussi deux boutons poussoir, un pour lancer le mécanisme, et un autre pour vidanger la vanne.

Vue que la taille de ma plaque de montage sans soudure est un peu petite, j'ai juste fait le montage avec trois potentiomètres et un seul interrupteur.

Voilà ce que ça donne :

J'ai réorganisé le câblage de l'écran LCD (par rapport aux tutoriaux Arduino) histoire de ne pas croiser les connexions inutilement. En outre pour éviter d'utiliser un potentiomètre pour le contraste, je l'ai remplacé par une resistance 1 kΩ, après avoir fait un test avec un potentiomètre. La deuxième resistance est une 220 Ω pour le rétro-éclairage de l'écran LCD. La résistance du bouton poussoir est une 10 kΩ.

Et voici le code qui affiche les valeurs des entrées analogiques et l'état du switch :

#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 switchPin = 12;

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

  // Le switch est une entrée
  pinMode(switchPin, INPUT);
}

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

  // 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(switchPin) == HIGH) {
    lcd.print("ON");
  }
  else {
    lcd.print("OFF");
  }

  // Petite pause
  delay(10);
}



  

dimanche 10 mars 2013

Bon ça n'a rien à voir, mais...

Un vieux rêve vient de se réaliser... J'ai enfin réussi mon premier chenillard... Alors, je sais, que ça fait des années que ça doit être le premier exercice d'électronique et que d'utiliser un micro-controller pour ça revient certainement à utiliser une pelleteuse pour écraser une mouche, mais n'empêche que, moi, ça m'a donné de l'émotion...

Voilà ce que ça donne :


Bon, juste pour l'info, voici le schéma :

Les resistances font 220 Ω et le condensateur fait 100 µF. Voici le programme qui permet de faire varier la vitesse du chenillard en fonction du potentiomètre 10 kΩ :

// Branchement du potentiomètre
const int potPin = A0;

// Branchement de la premère led
const int minLed = 2;
// Branchement de la dernière led
const int maxLed = 9;

// Vitesse minimale
const int minPace = 20;
// Vitesse maximale
const int maxPace = 100;

// Vitesse courante
int pace = 0;

// Sens du chenillard
int sens = 1;
// Led actuellement allumée
int led = minLed;

// Dernière valeur en millisecondes
unsigned long previousTime = 0;

void setup() {
  // Mise en place des sorties pour toutes les led
  for (int x = minLed; x <= maxLed; x++) {
    pinMode(x, OUTPUT);
  } 
}

// Mise à jour de la vitesse depuis le potentiomètre
int updatePace() {
  int potVal = analogRead(potPin);

  pace = map(potVal, 0, 1023, minPace, maxPace);
}

void loop() {
  // Mise à jour de la vitesse
  updatePace();

  unsigned long currentTime = millis();

  // Si on a dépassé le temps d'allumage de la dernière led
  if (currentTime - previousTime > pace) {    
    // On note quand est-ce qu'on fait le changement
    previousTime = currentTime;

    // On éteint la led en cours
    digitalWrite(led, LOW);

    // On sélectionne la prochaine led
    led += sens;

    // Si c'est la dernière ou la première led
    if ((led == maxLed)||(led == minLed)) {
      // On change le sens
      sens = -sens;
    }

    // On allume la led en cours
    digitalWrite(led, HIGH);
  }

  // On fait une micro-pause
  delay(5);
}