bonjour,
j'ai récupéré une optique motorisée de caméra de surveillance, il y avait a l'origine un boitier de commande qui a disparue.
sur les 3 commande : zoom , point , iris ,ce sont des moteur DC avec un potentiomètre de 5k pour la position.
j' ai une Nano avec un shield HW130 (2x L193D) , pour le zoom c'est un asservissement en vitesse et ça fonctionne , deux trois perfectionnement a ajouter sans doute.
pour le focus et l'iris c'est une autre histoire, impossible de stabiliser la commande, ça oscille d'un coté et de l'autre de la consigne quoi que je fasse.
voici une des nombreuses versions testé
// arduino UNO
// ADS 1115 multiplexeur analogique 4 entrées/sorties
// DollaTek L293D Motor Drive Shield
#include <AFMotor.h>
#include "Variables.h"
#include "ADS1X15.h" // ADS1115
ADS1115 ADS(0x48); // ADDR relier au 0V
AF_DCMotor Zoom(1);
AF_DCMotor Focus(2);
AF_DCMotor Iris(3);
void setup() {
Serial.begin(115200); //
ADS.begin();
ADS.setMode(0); // mesures en continu (0 = CONTINUOUS, 1 = SINGLE)
ADS.setDataRate(7); // vitesse de mesure de tension, de 0 à 7
ADS.readADC(0); // lecture à vide, pour envoyer les paramètres
pinMode(2, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP);
// active les moteurs
Zoom.setSpeed(200);
Zoom.run(RELEASE);
Focus.setSpeed(200);
Focus.run(RELEASE);
Iris.setSpeed(200);
Iris.run(RELEASE);
// determine la vitesse du Focus et de l'Iris
Focus.setSpeed(70);
Iris.setSpeed(80);
setpoint = 90;
myPID.SetMode(AUTOMATIC);
}
void loop() {
//////////// ZOOM ////////////
Z = ADS.readADC(0); // lecture du pot de Zoom via le multiplexeur
SZ = analogRead(A0); // lecture du pot de Speed Zoom
LZ = analogRead(A1); // lecture de la Limite du Zoom
SZ = map(SZ, 0, 1023, 0, 255); // maping de la valeur de speed (0,255)
int invZoom = digitalRead(2);
if (invZoom == 0) {
SENSZOOM();
}
if (invZoom == 1) {
Z = map(Z, 26600, 0, 0, 26600); // inverse la valeur du pot de Zoom
SENSZOOM();
}
//////////// FOCUS ////////////
F = ADS.readADC(1);
LF = analogRead(A2);
F = map(F, 25500, 0, 863, 52);
int invFocus = digitalRead(2);
if (invFocus == 0) {
SENSFOCUS();
}
if (invFocus == 1) {
Z = map(Z, 26600, 0, 0, 26600); // inverse la valeur du pot de Focus
SENSFOCUS();
}
}
void SENSZOOM() {
//////////// DEZOOM ///////////
if (Z <= 12000) { // si déZoom 12774
CZ = map(Z, 12000, 0, 0, SZ); // 12774: millieux de la valeur maxi (multiplexeur) 25550
Zoom.run(BACKWARD); // fait tourner le moteur dans la sens indiqué
Zoom.setSpeed(CZ); // determine la vitesse du moteur
if (LZ <= 190) { // 176 - 990
Zoom.run(RELEASE);
}
}
////////////// ZOOM ///////////
if (Z >= 13520) { // si Zoom 12775
CZ = map(Z, 13520, 25550, 0, SZ); // valeur maxi 276000
Zoom.run(FORWARD);
Zoom.setSpeed(CZ);
if (LZ >= 970) {
Zoom.run(RELEASE);
}
}
}
void SENSFOCUS() {
//////////// FOCUS ////////////
if (F < LF) {
Focus.run(FORWARD); // vers le mini
if (LF == F) {
Focus.run(RELEASE);
}
if (LF >= 60) { // limite mini
Focus.run(RELEASE);
}
if (F > LF) {
Focus.run(BACKWARD); // vers le maxi
if (LF == F) {
Focus.run(RELEASE);
}
if (LF >= 800) {
Focus.run(RELEASE);
}
}
}
void IRIS() {
}