Gestion Agrandisseur ancien avec ARDUINO

Les différents montages et réalisations personnelles.
Répondre
Avatar du membre
nikon38
Passionné
Passionné
Messages : 191
Enregistré le : dimanche 08 février 2009 21:20
Localisation : Grésivaudan (38)

Gestion Agrandisseur ancien avec ARDUINO

Message par nikon38 »

Bonjour,
Je viens d'en récupérer un, modèle COLORMIX Polielettronica qui était destiné à la déchetterie.

Cet agrandisseur industriel est entièrement géré par un pupitre de commande pour l'automatisation du tirage des négatifs couleurs .
La tête est équipée de deux lampes halogènes de 24 v 250 W montées en série, chaque lampe diffuse sa lumière à travers deux orifices de 22 mm de diamètre obturés par deux lames acier montées sur un moteur.
Elle est ventilée par une petite turbine indépendante (220 v) et un tuyau de 75 mm de diamètre.
au dessous on trouve la platine qui supporte les filtres dichroïques (YMC) commandés par 2 x 3 moteurs.
Le systeme fonctionne donc en synthèse soustractive, mais aussi en synthèse additive grâce à la combinaison de deux filtres activés en même temps;
magenta + cyan = bleu
jaune + cyan = vert.
jaune + magenta = rouge.
Bien entendu, une partie de l’électronique de gestion des 3 filtres est pratiquement HS, seule la carte de gestion des moteurs qui actionnent les filtres est encore fonctionnelle.
La tête n'est pas équipée de filtres dichroïques transparents, et ce sont les filtres dichroïques Y,M,C qui font office de blocage de la chaleur, c'est pour cela qu'il y à 2 lamelles obturantes pour les deux trous de passage du faisceau.
Je vais donc utiliser le système de filtrage motorisé de Y et M . (Cyan si besoin)
J'ai donc choisi de piloter l'agrandisseur avec 5 relais gérés par un arduino UNO.
La commande des moteurs est fournie par une tension de 12 V prélevée sur la sortie émetteur d'un transistor, donc remplacée par une tension 12V en sortie d'un relais.
Un transfo 48 V AC prévu pour l'éclairage des deux lampes est géré par une carte carte électronique, la commande se fait par un interrupteur on/off monté en façade du pupitre que je peut remplacer par une sortie relais.

synoptique de fonctionnement:

au départ les lames obturateur sont normalement fermées et les filtres sont désengagés.

1- Eclairage lampes (relais 1 ON)
2- ouverture obturateur et engagement filtre jaune (relais 2 et 3 ON)
3- Temporisation filtre jaune de "x" secondes
4- dégagement filtre jaune et engagement filtre magenta. (relais 3 OFF, relais 4 ON)
5- Temporisation filtre magenta de "x" secondes.
6- dégagement filtre magenta et fermeture obturateur. (relais 4 OFF relais 2 OFF)
7- extinction lampes. (relais 1 OFF)
On peut remarquer qu'il n'y à pas d'actions combinées, et j'ai choisi de programmer les temps exposition Y et M avec la fonction DELAY.
bien entendu, la combinaison des temps Y et M me permettent de faire varier le grade et l'exposition. (après tests)
J'ai donc écris un petit code arduino me permettant de piloter les 5 relais.
Je rappelle que je n'ai pas de connaissance sur la programmation Arduino, et que ce code à été en partie copié sur des fichiers exemples....

/* Programme commande exposition agrandisseur Colormix Polielecttronica
* modifié pour tirage N&B avec pilotages filtres sur sorties relais ON/OFF
*/

int relais1 = 2; //Définition de la broche digitale ou le relais est raccordé
int relais2 = 3; //Définition de la broche digitale ou le relais est raccordé
int relais3 = 4; //Définition de la broche digitale ou le relais est raccordé
int relais4 = 5; //Définition de la broche digitale ou le relais est raccordé
int relais5 = 6; //Définition de la broche digitale ou le relais est raccordé

unsigned long delaytimeY=8000; // temps exposition filtre Yellow
unsigned long delaytimeM=4000; // temps exposition filtre Magenta

void setup() {

pinMode(relais1, OUTPUT); // Relais Light
pinMode(relais2, OUTPUT); // Relay Obturateur
pinMode(relais3, OUTPUT); // Relais Yellow
pinMode(relais4, OUTPUT); // Relais Magenta
pinMode(relais5, OUTPUT); // Relais Cyan
pinMode (9, INPUT_PULLUP);
while (digitalRead(9)); // programme en attente de départ (push on)
}
void loop() {
digitalWrite(relais1, HIGH); // LIGHT ON
delay(1000); // Pose 1 seconde
digitalWrite(relais2, HIGH); // OBTU ON
delay(200);
digitalWrite(relais3, HIGH); // Filtre Y ON
delay(delaytimeY); // décompte tempo filtre Y
digitalWrite(relais3, LOW); // Filtre Y OFF
delay(100); // pose 1/10 seconde
digitalWrite(relais4, HIGH); // Filtre M ON
delay(delaytimeM); // décompte tempo filtre M
digitalWrite(relais4, LOW); // Filtre M OFF
digitalWrite(relais2, LOW); // Obtu OFF
delay(1000); // pose 1 seconde
digitalWrite(relais1, LOW); // LIGHT OFF
while (digitalRead(9)); // On ne fait rien tant que le bouton n'est pas appuyé
}

Ce code fonctionne bien, le relais filtre Jaune est actif 8 secondes et le relais Magenta 4 secondes, le filtre Cyan n'est pas utilisé.
J'aimerais pouvoir modifier les valeur des variables delaytimeY et delaytimeM de 1000 à 24000 (de 1 seconde à 24 secondes) au moyen d'un encodeur ou d'inters poussoirs avant de lancer le programme.
et bien sûr afficher les secondes de Y, M, C sur des afficheurs 7 segments.
Et c'est là que je fait appel à ceux d'entre vous qui maîtrisent bien la programmation Arduino.
Merci pour votre aide.
mathgl
Site Admin
Site Admin
Messages : 1255
Enregistré le : vendredi 26 mai 2017 10:00
Localisation : 74

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par mathgl »

Ça risque d'être difficile de coder ça pour toi...

J'y vois plusieurs difficultés :
- on est dépendant du matériel (afficheur, encodeur, boutons poussoirs, relais et de leur raccordement).
- coder prend beaucoup de temps
- déboguer en prend tout autant ;)
- je n'ai pas tes besoins spécifiques même si on a probablement des fonctions communes

Ça pourrait être intéressant d'avoir un chat pour échanger sur ces questions.

Pour pouvoir échanger sur le code, l’idéal serait d'avoir une plateforme de tests commune.

Pour mon compte pose, j'ai utilisé un lcd-keypad-shield. On trouve des boîtiers imprimables en 3d.
J'ai juste changé le LCD pour en avoir un rouge.

Par contre, il faudrait vérifier que ce soit faisable avec le nombre de ports que tu utilises ou utiliser un circuit imprimé I2C pour étendre le nombre de port. Le LCD utilise déjà un certain nombre de ports.

Le mien gère pour le moment 2 relais : agrandisseur + inactinique.
Ma prochaine étape serait de gérer des DEL (R)VB s'il me reste suffisamment de ports PWM ;)

Ça serait sympa d'avoir un compte pose standard "open source" facile à monter avec différents "drivers".
Avatar du membre
Réginald
Modérateur
Modérateur
Messages : 11570
Enregistré le : jeudi 31 juillet 2014 10:34
Localisation : Haute-savoie
Contact :

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par Réginald »

mathgl a écrit :J'ai juste changé le LCD pour en avoir un rouge.
Tu l'as trouvé où ton lcd rouge ?

C'est noir sur fond rouge ou rouge sur fond noir ?

Le peu que je trouve en rouge sur noir sont hors de prix :(
Avatar du membre
numérix
Membre de l'association
Membre de l'association
Messages : 8448
Enregistré le : lundi 10 avril 2006 20:37
Localisation : pas loin de Tours
Contact :

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par numérix »

pour la fonction compte pause je n'utilise pas delay() car pendant ce temps la on ne peut rien faire d'autre que d'attendre
j'utilise une variable ou je met le temps d'expo en millisecondes
TempsBase = 100000 par exemple
au départ de l'expo je mémorise le temps absolu donné par millis() + le temps d'expo
TopTemps = millis() + TempsBase
et dans la boucle loop un bout de code qui vérifie que le temps n'est pas écoulé :
while (millis() < TopTemps) { tant que millis() est plu petit
lcd.setCursor(4, 0);
lcd.print(int((TopTemps - millis()) / 1000));
lcd.print(" ");
analogWrite(inact, 50); // mise en veilleuse de la lampe inactinique
// sortie prématuré de l'exposition
if (digitalRead(BPev) == LOW) {
TopTemps = 0;
delay(100);
} // sortie prématurée de la boucle
delay(100);
}

comme ça un décompte est possible tout comme une sortie prématurée
mathgl
Site Admin
Site Admin
Messages : 1255
Enregistré le : vendredi 26 mai 2017 10:00
Localisation : 74

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par mathgl »

De mon côté, j'ai bani les delay.

Je fais tout (ou presque) en non blocant. Par exemple, quand j'ai besoin de vérifier depuis combien de temps un bouton est appuyé j'enregistre l'etat et le dernier changement d'état.
mathgl
Site Admin
Site Admin
Messages : 1255
Enregistré le : vendredi 26 mai 2017 10:00
Localisation : 74

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par mathgl »

Réginald a écrit : Tu l'as trouvé où ton lcd rouge ?
C'est noir sur fond rouge ou rouge sur fond noir ?
J'avais commandé sur Aliexpress (ici)
C'est du rouge sur noir.

Ça me fait penser j'avais fait une autre modification sur le keypad c'est de récupérer le bouton reset sur une entrée.
Sinon, j'avais pas assez de button pour l'utiliser correctement.
(https://www.instructables.com/LCD-Keypa ... utton-Mod/)
Avatar du membre
numérix
Membre de l'association
Membre de l'association
Messages : 8448
Enregistré le : lundi 10 avril 2006 20:37
Localisation : pas loin de Tours
Contact :

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par numérix »

mathgl a écrit :De mon côté, j'ai bani les delay.

Je fais tout (ou presque) en non blocant. Par exemple, quand j'ai besoin de vérifier depuis combien de temps un bouton est appuyé j'enregistre l'etat et le dernier changement d'état.
les delay() de mon code c'est pour palier aux problèmes de rebond des bp
Avatar du membre
Réginald
Modérateur
Modérateur
Messages : 11570
Enregistré le : jeudi 31 juillet 2014 10:34
Localisation : Haute-savoie
Contact :

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par Réginald »

mathgl a écrit :J'avais commandé sur Aliexpress (ici)
C'est du rouge sur noir.
Merci

je cherchais plutôt des comme ça ICI
histoire de pas avoir un truc trop lumineux au labo
mathgl
Site Admin
Site Admin
Messages : 1255
Enregistré le : vendredi 26 mai 2017 10:00
Localisation : 74

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par mathgl »

Normalement, ils sont ajustable en intensité avec une sortie PWM.
Les OLED sont effectivement bien plus cher... Je vois pas trop la plus-value.
Avatar du membre
numérix
Membre de l'association
Membre de l'association
Messages : 8448
Enregistré le : lundi 10 avril 2006 20:37
Localisation : pas loin de Tours
Contact :

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par numérix »

j'utilise des afficheurs LCD vert et place un filtre lee filter ambre et ça marche très bien
Avatar du membre
nikon38
Passionné
Passionné
Messages : 191
Enregistré le : dimanche 08 février 2009 21:20
Localisation : Grésivaudan (38)

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par nikon38 »

Bonsoir à la communauté,
Je ne m'attendais pas à un tel flot de réponses plus ou moins en rapport avec ma question.
A propos de la variable DELAY....

Si vous relisez le synopsis de fonctionnement des relais il ne se passe qu'une commande à la fois donc c'est pas gênant.
J'ai dailleurs fait le test avec ma carte 8 relais, chaque relais est commandé par une entrée logique au niveau 1 (5v) donc compatible avec les sorties ARDUINO, et à chaque commande de relay, une led s'allume quand le relais est actif et s'éteint quand le relais est au repos.

Je vais faire un petit schémas que je publierai demain.
Ce sera plus compréhensif.
mathgl
Site Admin
Site Admin
Messages : 1255
Enregistré le : vendredi 26 mai 2017 10:00
Localisation : 74

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par mathgl »

Le problème du delay(), c'est que ça fige l'affichage du compte à rebours et empêche la lecture des commandes (bouton poussoir par exemple).

Donc même, si tu actives les relais de façon séquentielle, tu auras besoin que le code soit non bloquant sauf si tu veux pas afficher de compte à rebours et que tu veux pas pouvoir annuler ou mettre en pause.

Cette solution rend, le code Arduino plus simple.
Avatar du membre
numérix
Membre de l'association
Membre de l'association
Messages : 8448
Enregistré le : lundi 10 avril 2006 20:37
Localisation : pas loin de Tours
Contact :

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par numérix »

+1 delay c'est bon pour quelques millisecondes pour le BP par exemple (quand on a pas envie de mettre des condos )
car oui impossible de faire autre chose pendant ce temps exemple, comment arrêter l'expo quand on s’aperçoit d'une erreur entre autre
Avatar du membre
nikon38
Passionné
Passionné
Messages : 191
Enregistré le : dimanche 08 février 2009 21:20
Localisation : Grésivaudan (38)

Re: Gestion Agrandisseur ancien avec ARDUINO

Message par nikon38 »

Bonsoir,

Je suis arrivé à programmer l'arduino comme je voulais, effectivement, sans possibilité d’arrêter le programme.

mais pour ce que je voulais c'est bon.
Bien entendu c'est du tirage en split-grade printing.
Voici mon code (pour celui qui veut bien analyser le fonctionnement)
J'utilise un afficheur 2 lignes de 16 caractères et des inters poussoirs pour incrémenter les secondes.
pour faire simple les poussoirs rajoutent 1 seconde à chaque impulsion, en cas de dépassement un reset c'est plus rapide.

// **********************************************
// Programme Gestion Agrandisseur COLORMIX 4 x 5
// ---------- (c) JoelmarC 24 aout 2021 ---------
// **********************************************

#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int BP_JAUNE = A0; // poussoir incrémentation temps filtre jaune
const int BP_MAGENTA = A1; // poussoir incrémentation temps filtre magenta
const int BP_CYAN = A3; // poussoir incrémentation temps filtre cyan
const int BP_START = A2; // poussoir départ cycle exposition

int TP_EXPO_J; // valeur temps exposition jaune
int TP_EXPO_M; // valeur temps exposition magenta
int TP_EXPO_C; // valeur temps exposition cyan


int Etat_JAUNE = 0;
int Etat_Precedent_JAUNE = 0;
int Etat_MAGENTA = 0;
int Etat_Precedent_MAGENTA = 0;
int Etat_CYAN = 0;
int Etat_Precedent_CYAN = 0;



int relais1 = 6; // Sortie commande relais LIGHT
int relais2 = 7; // Sortie commande relais OBTURATEUR
int relais3 = 8; // Sortie commande relais JAUNE
int relais4 = 9; // Sortie commande relais MAGENTA
int relais5 = 10; // Sortie commande relais CYAN

void setup() {

lcd.begin(16, 2); // écran LCD 2 lignes 16 caracteres

pinMode(BP_JAUNE, INPUT);
pinMode(BP_MAGENTA, INPUT);
pinMode(BP_CYAN, INPUT);
pinMode(BP_START, INPUT);

pinMode(relais1, OUTPUT); // Relais Light
pinMode(relais2, OUTPUT); // Relay Obturateur
pinMode(relais3, OUTPUT); // Relais Yellow
pinMode(relais4, OUTPUT); // Relais Magenta
pinMode(relais5, OUTPUT); // Relais Cyan


lcd.setCursor(0, 0); // affichage ligne haut.
lcd.print("JAUNE=");
lcd.setCursor(0, 1); // affichage ligne bas.
lcd.print("MAGENTA= ");
lcd.setCursor(9, 0); // affichage ligne haut.
lcd.print("CYAN=");



}

void loop() {

Etat_JAUNE = digitalRead(BP_JAUNE);
Etat_MAGENTA = digitalRead(BP_MAGENTA);
Etat_CYAN = digitalRead(BP_CYAN);
{
if ( digitalRead(BP_JAUNE) == HIGH) {
TP_EXPO_J++;
delay(200); // delai anti-rebond poussoir
}
if ( digitalRead(BP_MAGENTA) == HIGH) {
TP_EXPO_M++;
delay(200); // delai anti-rebond poussoir
}
if ( digitalRead(BP_CYAN) == HIGH) {
TP_EXPO_C++;
delay(200); // delai anti-rebond poussoir
}


lcd.setCursor(6, 0); // position curseur minutes jaune
lcd.print(TP_EXPO_J); // affichage minutes jaune
lcd.setCursor(9, 1); // position curseur minutes magenta
lcd.print(TP_EXPO_M); // affichage minutes magenta
lcd.setCursor(14, 0); // position curseur minutes cyan
lcd.print(TP_EXPO_C); // affichage minutes cyan


if ( digitalRead(A2) == HIGH) { // lancement du cycle exposition.

digitalWrite(relais1, HIGH); // LIGHT ON
delay(1000); // Pose 1 seconde
digitalWrite(relais2, HIGH); // OBTU ON
delay(200);
digitalWrite(relais3, HIGH); // Filtre Jaune ON
delay(TP_EXPO_J*1000); // décompte tempo filtre
digitalWrite(relais3, LOW); // Filtre jaune OFF
delay(100); // pose 1/10 seconde
digitalWrite(relais4, HIGH); // Filtre Magenta ON
delay(TP_EXPO_M*1000); // décompte tempo filtre
digitalWrite(relais4, LOW); // Filtre Magenta OFF
delay(100);
digitalWrite(relais5, HIGH); // Filtre Cyan ON
delay(TP_EXPO_C*1000); // décompte tempo filtre C
digitalWrite(relais5, LOW); // Filtre Cyan OFF
digitalWrite(relais2, LOW); // Obtu OFF
delay(1000); // pose 1 seconde
digitalWrite(relais1, LOW); // LIGHT OFF

}

}
}


Je suis actuellement en vacances et je rentre le 13 septembre, je me remets sur le projet, je ferait une vidéo du fonctionnement et je
publierai le lien.
merci
Joël
Répondre

Retourner vers « Projets et réalisations »