lundi 7 juillet 2014

Le retour du projet.

Après un long moment d'absence sur le blog, je reviens vers ce projet.

Le bricolage autour d'un bac trouvé à Ikea et d'un morceau d'imprimante ne convenait pas à une diffusion possible de ce modèle de machine. J'ai donc décidé de reprendre le design des différentes fonctions pour les adapter à un mode de production, plus simple et plus accessible.

Voici les premières pistes que j'envisage.

AutoLab V3 printable + lasercut

AutoLab V3 printable + lasercut 01

AutoLab V3 printable + lasercut 06



dimanche 11 mars 2012

Mélangeur magnétique

Je vais avoir besoin d'un mélangeur pour l'eau du bain marie. Histoire d'uniformiser la chaleur dans le volume total. Il existe des systèmes dans le commerce qui sont principalement utilisés dans les laboratoires, Ils se composent de deux parties, un moteur qui entraine un aimant et d'un barreau magnétique.







Pour mon système d'entrainement, j'ai simplement collé sur un ventilateur de PC un aimant récupéré dans un vieux disque dur et j'utilise 5 billes aimantées comme barreau magnétique pour l'instant. Le montage électronique qui pilote le tout est similaire à celui que j'utiliserai dans l'Autolab, il se compose d'un transistor NPN (2N2222) d'une résistance (la valeur reste à déterminer), d'une alimentation 12V, d'un ventilateur et de 5 billes magnétiques. Le bouton poussoir n'étant là que pour simuler le signal qui sera envoyé par l'Arduino au travers du transistor qui agira comme un interrupteur.

DIY Stirring System test


On peut voir dans la vidéo ci dessous que le système fonctionne bien, j'ai plus qu'à prévoir le système de fixation du ventilateur sous ma cuve à bain marie.







jeudi 23 février 2012

Sonde thermique numérique avec l'Arduino

J'ai enfin reçu mes sondes thermiques numériques! je les avais commandé début octobre 2011... mais le colis s'est visiblement perdu, ou a été fouillé par les mains des différents transporteurs... L'enveloppe des deux sondes qui est arrivée hier était ouverte, clairement quelqu'un a regardé ce que contenait le paquet.

Après avoir passé pas mal de temps à vouloir faire fonctionner des sondes analogiques type PT100 ou autre thermistances qui ont une résistance variable en fonction de la température. Souvent ces thermistances ont une courbe de réponse non linéaire. La PT100 (100 Ω à °C) couramment utilisée me paraissait un bon choix. Or je n'ai jamais réussit à avoir une lecture correcte de la température, j'avais souvent une lecture erronée de plusieurs degrés. Je me suis donc ensuite orienté vers des capteurs numériques. Une solution était d'utiliser un capteur LM35, le composant coûte aux alentours des 2 euros/pièce.
Les codes arduino pour interpréter les résultats de la sondes étant facilement trouvable sur le net. Il me restait un petit problème à résoudre, l'étanchéité de ladite sonde. Il existe un tuto sur Instructable qui nous montre comment procéder. 
Mais ce n'est toujours pas cette sonde que j'ai reçu. J'ai en effet trouvé dans une boutique chinoise ebay, une sonde elle aussi numérique mais étanche. Cette sonde est la DS18B20, elle existe en format T0-92 (comme la photo précédente) mais aussi en version encapsulée.

En dehors du fait qu'il m'a fallut batailler avec le vendeur pendant 4 mois pour les recevoir, ça valait le coup.

Une petite recherche sur google avec pour mots clés DS18B20 + arduino, je suis tombé là dessus : 

Le montage à effectuer est très simple, il suffit de rajouter une résistance de 1K à la sonde.


// --- Programme Arduino ---
// Copyright X. HINAULT - Créé le 10/04/2010
// www.mon-club-elec.fr 

//  Code sous licence GNU GPL : 
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License,
//  or any later version.
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see .
//  

// --- Que fait ce programme ? ---
/* test simple de la mesure de la température à l'aide d'un capteur
de température One-wire de type DS18B20 et affichage du résultat
dans la fenêtre Terminal série.  */

// --- Fonctionnalités utilisées ---
// Utilise la connexion série vers le PC 
// Utilise un ou plusieurs capteurs One Wire 

// --- Circuit à réaliser ---
// Connexion série entre la carte Arduino et le PC (utilise les broches 0 et 1)  
// Connecter  sur la broche 2 la broche de données du capteur One Wire

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include // librairie pour capteur OneWire

// --- Déclaration des constantes ---

// --- constantes des broches ---

const int broche_OneWire=2; //declaration constante de broche 

//---- code d'instruction du capteur
const int modeLecture=0xBE;
const int lancerMesure=0x44;

// --- Déclaration des variables globales ---
byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
byte adresse[8]; // Tableau de 8 octets pour stockage du code d'adresse 64 bits du composant One Wire

int tempet=0; // variable pour resultat de la mesure
float tempetf=0.0; // variable pour resultat de la mesure

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
OneWire  capteur(broche_OneWire);  // crée un objet One Wire sur la broche voulue


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission 


// XXXXXXXXXXXXXXXXXXXXXX Détection du capteur présent sur la broche XXXXXXXXXXXXXXXXXXXXXXX 
Serial.println("**** Detection du capteur **** ");

while (capteur.search(adresse)== false) // tant qu'aucun nouveau capteur est détecté
{

  // la fonction search renvoie la valeur FAUX si aucun élément 1-wire est trouvé. 

  Serial.println("Aucun capteur 1-wire present sur la broche ! "); // affiche message + saut de ligne
  delay (1000); // pause 1 seconde
}

//la suite est exécutée seulement si un capteur est détecté

  // la fonction search renvoie la valeur VRAI si un élément 1-wire est trouvé. 
  // Stocke son code d'adresse 16 bits dans le tableau adresse[8]
  // adresse envoyé à la fonction correspond à l'adresse de début du tableau adresse[8] déclaré ...   

  Serial.print ("1 capteur 1-wire present avec code adresse 64 bits : ");


  //--- affichage des 64 bits d'adresse au format hexadécimal
   for(int i = 0; i < 8; i++) { // l'adresse renvoyée par la fonction search est stockée sur 8 octets

    if (adresse[i]<16) Serial.print('0'); // pour affichage des O poids fort au format hexadécimal
    Serial.print(adresse[i], HEX); // affiche 1 à 1 les 8 octets du tableau adresse au format hexadécimal
    Serial.print(" ");
  }

  Serial.println();

  //---- test du type de capteur ---- 
  // le type du capteur est donné par le 1er octet du code adresse 64 bits
  // Valeur 0x28 pour capteur type DS18B20, 0x10 pour type DS18S20, 0x22 pour type DS1820
  if (adresse[0]==0x28)
  {
    Serial.println ("Type du capteur present : Capteur temperature DS18B20.");
  }
  else
  {
    Serial.println ("Le capteur present n'est pas un capteur de temperature DS18B20.");
  }


  //----- contrôle du code CRC ----
  // le dernier octet de l'adresse 64bits est un code de contrôle CRC 
  // à l'aide de la fonction crc8 on peut vérifier si ce code est valide
  if (capteur.crc8( adresse, 7) == adresse[7]) // vérification validité code CRC de l'adresse 64 bits
  // le code CRC de l'adresse 64 bits est le 8ème octet de l'adresse (index 7 du tableau)
  {
    Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : VALIDE !");
  }
  else
  {
    Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : NON VALIDE !");   
  }

  //------- message final détection ---- 
  Serial.println("----- fin de la recherche du capteur ----");
  Serial.println("");

  //--- la phase de détection n'est pas obligatoire avec un seul capteur ---
  //---- il est possible d'utiliser uniquement la fonction skip --- 
  //---- le résultat semble plus hasardeux cependant... 
  // capteur.skip(); 

  // une fois le capteur détecté, son code adresse 64 bits est stocké dans le tableau adresse[8]
  // on va à présent adresser des instructions au capteur et lire le résultat obtenu
  // successivement il faudra : 
  //    * envoyer l'instruction de lancement de la mesure
  //    * attendre 1 seconde 
  //    * envoyer l'instruction de lecture du résultat
  //    * envoyer les instructions de lecture



} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// XXXXXXXXXXXXXXXXXXXXXX Lancement d'une mesure et lecture du résultat XXXXXXXXXXXXXXXXXXXXXXX 

  Serial.println("**** Acquisition d'une mesure de la temperature **** ");

  // avant chaque nouvelle instruction, il faut : 
  //    * initialiser le bus 1-wire
  //    * sélectionner le capteur détecté
  //    * envoyer l'instruction 

//--------- lancer une mesure --------
  capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(lancerMesure,1); // lance la mesure et alimente le capteur par la broche de donnée

//-------- pause d'une seconde ----- 
delay(1000);     // au moins 750 ms
           // il faudrait mettre une instruction capteur.depower ici, mais le reset va le faire


//---------- passer en mode LECTURE ------------- 
  capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
  capteur.select(adresse); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
  capteur.write(modeLecture,1); // passe en mode lecture de la RAM du capteur

// ----------- lire les 9 octets de la RAM (appelé Scratchpad) ----

for ( int i = 0; i < 9; i++) {           // 9 octets de RAM stockés dans 9 octets
    data[i] = capteur.read();             // lecture de l'octet de rang i stocké dans tableau data
  }

// ----- affichage du contenu des différents octets ----------- 
Serial.println("");
Serial.println("---- lecture de la RAM du capteur ---- ");
Serial.print("Octet 0 (Resultat poids faible)="), Serial.println(data[0],BIN);
Serial.print("Octet 1 (Resultat poids fort)="), Serial.println(data[1],BIN);
Serial.print("Octet 2 (Alarme haute)="), Serial.println(data[2],BIN);
Serial.print("Octet 3 (Alarme basse)="), Serial.println(data[3],BIN);
Serial.print("Octet 4 (Registre de configuration)="), Serial.println(data[4],BIN);
Serial.print("Octet 5 (Reserve)="), Serial.println(data[5],BIN);
Serial.print("Octet 6 (Reserve)="), Serial.println(data[6],BIN);
Serial.print("Octet 7 (Reserve)="), Serial.println(data[7],BIN);
Serial.print("Octet 8 (code CRC mesure)="), Serial.println(data[8],BIN);


//----- test de validité des valeurs reçues par contrôle du code CRC  ----

Serial.println("");
Serial.println("---- test de controle de validite des donnees recues ---- ");

  // le dernier (9ème) octet de la RAM est un code de contrôle CRC 
  // à l'aide de la fonction crc8 on peut vérifier si ce code est valide
  if (capteur.crc8( data, 8) == data[8]) // vérification validité code CRC des valeurs reçues
  {
    Serial.println ("Verification du code CRC de ce resultat : VALIDE !");
  }
  else
  {
    Serial.println ("Verification du code CRC de ce resultat  : NON VALIDE !");   
  }

//----- caclul de la température mesurée (enfin!) ---------
Serial.println("");
Serial.println("---- calcul de la temperature ---- ");

//---- extraction du résultat de la mesure à partir des registres de la RAM ---
data[1]=data[1] & B10000111; // met à 0 les bits de signes inutiles
tempet=data[1]; // bits de poids fort
tempet=tempet<<8;
tempet=tempet+data[0]; // bits de poids faible

Serial.print ("Mesure brute =");
Serial.println (tempet);

// --- en mode 12 bits, la résolution est de 0.0625°C - cf datasheet DS18B20
tempetf=float(tempet)*6.25;
tempetf=tempetf/100.0;

Serial.print ("Mesure Finale =");
Serial.print (tempetf,2);
Serial.println (" Degres Celsius. ");


while(1); // stoppe loop

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

//*************** Autres Fonctions du programme *************

// --- Fin programme ---



Le programme ci dessus est beaucoup trop complexe pour mes besoins, je le synthétiserai lors de la rédaction de mon programme global. Il est parfaitement fonctionnel et précis. L'eau bouillante est bien à 100°C (100,20°C donné par la sonde) et la glace à 0,20°C. Je vais continuer à faire des tests pour voir si la température qu'elle me retourne correspond bien à celle que je pourrais mesurer avec les thermomètres que j'ai chez moi.



jeudi 2 février 2012

Sketchup Spire

Je continue à dessiner des pièces qui seront imprimable, la Huxley se monte tranquillement!!

Voici donc le support de l'axe de rotation de la spire dans la cuve paterson, il se compose de 6 pièces identiques qui s'emboitent les unes dans les autres. Il faut encore que je travaille sur le système d'engrenages, que je les élargisse pour avoir la capacité de les imprimer correctement et qu'ils soient fonctionnels.

Printable parts

Là, une vue de deux pièces
Printable part X2

Et là les mêmes deux pièces vues de côté.
Printable part X2

mardi 24 janvier 2012

Sketchup : Support de remplissage

Je rêve devant les imprimantes 3D qui deviennent de plus en plus accessible, normalement il devrait y en avoir deux opérationnelles sur Marseille dans l'année. Au rythme où avance la conception de la machine, j'espère bien pouvoir avoir accès à cette technologie.

Je commence donc à penser à des pièces un peu techniques qui seraient donc imprimées.

Ci dessous deux vues du système de remplissage de mes bidons qui contiendront mes chimies. La buse, en gris dans l'image, est là pour éviter les projections de liquide à la sortie du tuyau. Ne connaissant pas encore la position exacte de mes bidons, j'ai dessiné les pièces de manière à pouvoir ajuster l'orientation et la position de cette "tête".

refill head system2


refill head system

samedi 21 janvier 2012

Les pompes.

Ça fait un bon moment que le problème des pompes me tracasse. L'idée de départ étant d'avoir les contenants à chimies amovibles pour améliorer la manutention lors de la mise en place ainsi que lors du nettoyage / rangement. Pour pouvoir faire cela, il faut que mes pompes soient capables d'aspirer un contenu d'une hauteur de 50cm maximum. Il m'aurait fallut des pompes auto amorçantes ou péristaltiques mais vu le nombre nécessaire au fonctionnement de la machine, cela aurait fait un sacré budget. Du coup, en choisissant la forme visible ici (c'est à dire des cuves à produits avec le bouchon vers le bas et ouvertes dans le fond), j'exploite la gravité du liquide pour amorcer mes pompes. Il m'est maintenant possible d'utiliser des pompes centrifuges telles que les pompes de liquide lave glace de voiture.







Une de mes contraintes était aussi de pouvoir transférer le volume utile (un peu plus que 500mL) dans un minimum de temps. Lors d'un développement qui doit durer 6 minutes, il m'est impossible d'avoir un transfert du révélateur qui dure 1 minute.

J'ai donc fait le test suivant avec une bouteille de 750 mL presque pleine.




moins de 12s pour vider la bouteille est à mon avis acceptable. je n'ai plus qu'à aller écumer les casses auto de marseille et attendre mes colis en provenance de HK...
Affaire à suivre.

vendredi 20 janvier 2012

Adaptation de la cuve Paterson

Voici comment je vais adapter la cuve paterson à ma machine.

Il va me falloir percer la cuve le plus près possible du fond pour réduire le volume de produit restant après drainage.
IMG_7870

en sortie ça ressemblera à ça :
IMG_7875

IMG_7877

La vanne est là pour empêcher toute entrée de lumière dans la cuve une fois chargée.
Il faudra ensuite raccorder le système à la machine en le vissant au flexible ci dessous, lui même raccordé à la pompe.

Fond de cuve paterson

mardi 17 janvier 2012

Un apperçu de ce que sera la machine

La structure est construite autour d'un bac en plastique trouvé chez Ikea. Pour l'instant je vais construire autour de ce volume. Idéalement il faudrait optimiser ce bac.
Sur les modeles ci dessous, sont visibles les 5 bacs qui contiendront les chimies. Il faut qu'ils aient une capacité supérieure à 500mL qui est le volume utile pour un traitement 120/220 et qu'ils puissent rentrer dans la largeur du bac. J'ai trouvé que les réservoirs des produits pour  nettoyer les vitres correspondaient assez bien à ma contrainte. recharge-nettoyant.jpg
Au dessus de ces bouteilles, se trouve le système de déplacement de la tête de remplissage. Cette partie est détaillé dans ce précédent post.

Bac AutoLab + Stepper

Bac AutoLab + Stepper2

mardi 20 septembre 2011

Fritzing Project

Je viens de mettre en ligne le projet sur le site de fritzing.
Fritzing project


Il vous est possible de télécharger le projet .fzz ainsi que le code en .pde
voici à quoi ressemble ce dernier :


/*
 Aruino Mega LCD Shield by Effixe
 ommentaires, demande d'infos ou envie de participer à mon projet http://diyautolab.blogspot.com/
 effixe@gmail.com
 Le projet Fritizing lié à ce shield peut etre téléchargé sur le site de fritzing dans la section projets. (http://fritzing.org/projects/)
 
Le circuit:
 LCD : 
 * LCD RS pin to digital pin 48
 * LCD Enable pin to digital pin 46
 * LCD D4 pin to digital pin 44
 * LCD D5 pin to digital pin 42
 * LCD D6 pin to digital pin 40
 * LCD D7 pin to digital pin 38
 * LCD R/W pin to ground

  4 push buttons
  Button 01 (prev) to digital pin 41
  Button 02 (next) to digital pin 39
  Button 02 (exe) to digital pin 43
  Button 02 (cancel) to digital pin 37
 */

#include  // librairie Ecran LCD

// Identification des boutons du shield
const int B_Prev = 41;
const int B_Next = 39;
const int B_Exe = 43;
const int B_Cancel = 37;

// Initialisation du LCD
LiquidCrystal lcd(48, 46, 44, 42, 40, 38); //Arduino Mega Shield 


void setup () {
lcd.begin(16,2);  //initialisation affichage LCD 16x2 lignes
  // Parametres des boutons
  pinMode(B_Prev, INPUT);
  pinMode(B_Next, INPUT);
  pinMode(B_Exe, INPUT);
  pinMode(B_Cancel, INPUT);
  }
  
  
void loop() {
  
    if (digitalRead(B_Prev)==HIGH) { // bouton de gauche
    lcd.clear();
    lcd.print("  Hello World   ");
    }
    
    if (digitalRead(B_Next)==HIGH) {  //  bouton de droite
    lcd.clear();
    lcd.print("  Bonjour Monde ");
    }
    
    if (digitalRead(B_Exe)==HIGH) { // bouton du bas
    lcd.clear();
    lcd.print("Buenos dias mundo");
    }
    
    if (digitalRead(B_Cancel)==HIGH) { // bouton du haut
    lcd.clear();
    lcd.print("Buongiorno Monda");
    }
}

lundi 19 septembre 2011

Arduino Mega LCD Shield fonctionnel!

j'ai enfin récupéré les connections pour rendre le shield empilable avec l'arduino méga.
Je n'ai pas trouvé la même chose compatible avec le bloc de 36 broches de l'arduino mega, j'ai donc utilisé 8  Connecteurs mâle(long)/femelle 8 points pour Arduino

Voici donc le shield en action! 

Arduino Mega LCD Shield_bb

Je vais préparer les fichiers pour importer sur le site de fritzing le design et une base de code nécessaire pour afficher un classique Hello World en 4 langues histoire de montrer comment utiliser les 4 boutons.  



jeudi 8 septembre 2011

Gravure de la platine du LCD Shield

Voici donc la platine issue du précédent post, la gravure a été faite avec la même technique que le  précédent shield, impression laser transférée sur le cuivre puis oxydée avec du perchlorure de fer.
Cette fois ci le transfert s'est bien passé seule une petite zone de la face du dessus a eut un problème (mais sans influence sur le fonctionnement de la platine par chance).
Face du dessus :
Arduino Mega LCD Shield Top view

Face du dessous :
Arduino Mega LCD Shield Bottom View

lundi 5 septembre 2011

Arduino Mega LCD Shield

Un petit design d'une carte fille pour l'Arduino Mega.
Un afficheur LCD 16x2, 4 boutons poussoir et un potentiomètre pour faire varier le contraste de l'écran.
Cette semaine je passe à la réalisation

Artduino Mega LCD Shield_bb


cette fois-ci, je vais mieux exploiter la fonction double face des pcb, ce que je n'avais pas fait lors du précédent shield. En jaune le tracé de la vue de dessus et en orange la face d'en dessous. Globalement l'alimentation est sur la face du dessous et toutes les connections avec l'arduino sur la face du dessus.

Artduino Mega LCD Shield_pcb

dimanche 21 août 2011

Arduino Mega design

Je reprend le projet petit à petit après l'avoir délaissé un temp.
J'ai donc décidé de refaire un shield pour l'arduino mega qui comprendrait les différents éléments que j'ai testé plus bas, comme la puce L293 qui me sert à contrôler un moteur pas à pas. Pour l'instant dans la conception de la machine, je pense n'en avoir besoin que d'un seul mais je m'en suis rajouté une puce de plus au cas où...
AutoLab Bread Board View

la vue de developpement ci dessus est un peu difficile à comprendre mais à priori tout est bien connecté.
Voici la vue de la platine :
AutoLab PCB View
Avec en jaune les circuits de la face de dessus et en orange les circuits de la face de dessous.
Il me reste encore un peu de place pour pouvoir ajouter des éléments si j'en ai besoin.

Avec la nouvelle version de Fritzing, il y a une fonction commander son circuit imprimé (Order PCB) qui pointe vers cette adresse : fritzing-fab
Le site nous propose d'envoyer notre design et de le réaliser, franchement au vue des finitions et du temps que je pourrais passer dessus à le faire, je pense que je vais tenter de la faire réaliser.
ci dessous un exemple de la finition qu'ils proposent.



mardi 14 juin 2011

Moteur pas à pas.

Bon, globalement les articles précédents étaient des mises à jour sur ce que j'avais déjà produit pendant l'année. Un des points qui me posait quelques problèmes était le système qui devait répartir le contenu de ma cuve de développement dans les différents bouteilles qui contenaient les produits (ce ne sont pas des produits à usage unique).
J'avais construit un système basé sur le contrôle d'un moteur DC piloté à l'aide d'un HBridge. Mais le système manquait cruellement de précision. Je suis donc passé au contrôle de Moteur pas à pas (wiki) récupéré sur une imprimante Epson C62 HS (5 euros dans une brocante) qui contenait deux moteurs pas à pas.




Le branchement et la programation de ce type de moteur est bien plus compliquée qu'un simple switch ON/OFF, il faut envoyer une séquence de signal alternativement sur les deux bobines qui compose ce type de moteur. Pour pouvoir gérer ces moteurs de manière plus simple qu'avec mon HBridge fait avec 4 NPN, je me suis commandé une puce (qui contient 2 Hbridge nécéssaire au fonctionnement d'un moteur pas à pas.

Pour le branchement, après avoir identifié le circuit du moteur, j'ai suivi ce tuto : driving-a-bipolar-stepper-motor-forward-and-backward-with-l293d



// Arduino Code:
//declaration of PINS that connected the wire to motor
int blanc4 = 2;
int jaune3 = 3;
int blanc2 = 4;
int jaune1 = 5;
int B_init0 = 50;  //push button to stop init position
int prod = 0;  //what king of chemical is in use (0 for junk)
int distance = 0;

//debug Leds //
int LedRefill = 41;
int LedInit = 32;
//this is the time to wait in every single step
int delayTime = 3;

//set the pin for OUTPUT
void setup() {
  pinMode(blanc4, OUTPUT);
  pinMode(jaune3, OUTPUT);
  pinMode(jaune1, OUTPUT);
  pinMode(blanc2, OUTPUT);
  pinMode(B_init0, INPUT);
  pinMode(LedRefill, OUTPUT);
  pinMode(LedInit, OUTPUT);

// Init position //
  while (digitalRead(B_init0) == LOW) {
     initialisationPosition();
     digitalWrite(LedInit, LOW);
  }
 
}

void loop() {

      for (int i=0;i<6;i++){ 
        prod = i;
        delay(500);
        Refill(distance);
        delay(500);
      }
}

// Functions //

void initialisationPosition(){ 
    digitalWrite(LedInit, HIGH);
      backward(10);
}
 


void Refill(int distance){
    distance = prod*(380/5-2);
    forward(distance);
    digitalWrite(LedRefill, HIGH);
    delay(1000);
    digitalWrite(LedRefill, LOW);
    backward(distance);
    }
    
    
void forward(int steps){
  for(int i=0;i
// in every phase 2 wires is up and 2 is down
    digitalWrite(blanc4, LOW);
    digitalWrite(jaune3, HIGH);
    digitalWrite(blanc2, HIGH);
    digitalWrite(jaune1, LOW);
    delay(delayTime);
 
    digitalWrite(blanc4, LOW);
    digitalWrite(jaune3, HIGH);
    digitalWrite(blanc2, LOW);
    digitalWrite(jaune1, HIGH);
    delay(delayTime);
 
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, LOW);
    digitalWrite(jaune1, HIGH);
    delay(delayTime);
 
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, HIGH);
    digitalWrite(jaune1, LOW);
    delay(delayTime);}
}

void backward (int steps){
  for(int i=0;i
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, HIGH);
    digitalWrite(jaune1, LOW);
    delay(delayTime);
 
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, LOW);
    digitalWrite(jaune1, HIGH);
    delay(delayTime);
 
     digitalWrite(blanc4, LOW);
     digitalWrite(jaune3, HIGH);
     digitalWrite(blanc2, LOW);
     digitalWrite(jaune1, HIGH);
     delay(delayTime);
 
     digitalWrite(blanc4, LOW);
     digitalWrite(jaune3, HIGH);
     digitalWrite(blanc2, HIGH);
     digitalWrite(jaune1, LOW);
     delay(delayTime);
  }
  


}
On peut voir dans le code la séquence des pins à activer pour avoir un mouvement dans un sens forward() et dans l'autre backward().
J'ai vu qu'il y avait d'autres solutions pour avoir le meme résultat. Pour l'instant avec ce code adapté à mes besoins, ça fonctionne. J'irai voir un peu plus tard si j'ai moyen d'optimiser tout ça.

J'ai donc programmé une boucle qui dit de déplacer la tête de 6 étapes en s'arretant à chaque étape et en activant une LED rouge pendant 1 seconde puis retour à la position 0 pour toujours savoir où se trouve la tête (la position 0 sera l'endroit où se trouvera le collecteur vers l'évier pour éviter toute fuite au dessus d'un de mes bacs). Le contrôle de cette LED étant exactement le même signal que pour l'activation d'un transistor NPN, donc si la LED s'allume, la pompe s'activera.

Je vais maintenant reporter le circuit de la platine de développement sur fritzing pour commencer à designer la carte fille de l'Arduino Mega.

vendredi 10 juin 2011

Arduino LCD + 4 push Buttons SHIELD

Après avoir dessiné le circuit imprimé à l'aide de Fritzing,
N'ayant pas d'insoleuse pour PCB, j'ai employé une autre technique. Je me suis imprimé les deux faces du circuit sur du papier photo (en miroir).

J'ai utilisé à peu près la meme technique ce dans cette vidéo.



LCD + 4 push buttons Aduino Shield
LCD + homemade LCD shield + 4 push buttons

My first Arduino Shield

 Le transfert de l'encre cuite n'a pas bien fonctionné sur la face du dessus (au niveau des résistances) mais par chance, cette zone n'était pas nécessaire, les connections se font majoritairement sur la face du dessous.
Cette platine est destinée uniquement au développement du système de menu. Comme un ami me donne un coup de main dans la programmation de cette partie, je lui ai fait cette platine pour qu'il puisse utiliser le système sans avoir à se prendre la tête sur les connections.
 Il est donc possible de réaliser des circuits imprimés sans avoir de matos en particulier (mis à part l'imprimante laser et du perchlorure de fer pour l'oxydation du cuivre)