Buongiorno community, avrei bisogno di un piccolo aiuto sul codice da caricare in Arduino per la gestine del mio progetto. Descrivo brevemente cosa stò realizzando ed allego una parte di codice che ho testato fin'ora solo per movimentare il motore passp-passo in senso orario e antiorario, giusto per iniziare a prendere dimestichezza con la scheda e con il suo codice.
Il progetto è composto da 2 dispositivi:
-
il primo, è accoppiato alla ghiera di messa a fuoco dell'obiettivo e contiene il motore passo-passo 28BYJ-48 + il driver del motore ULN2003 + il potenziometro di posizione;
-
il secondo, è il dispositivo di controllo ed è costituito dal potenziometro di posizionamento + interruttore A + interruttore B + scheda Arduino nano.
Tutto il sistema è alimentato dalla batteria della telecamera NP-F970 che fornisce una tensione di 7.2V.
Le specifiche del progetto sono 2:
-
la prima, il motore passo-passo deve azionare sia in senso orario sia in senso antiorario la ghiera di messa a fuoco e bloccarsi quando ha raggiunto il finecorsa meccanico della ghiera ovvero quando è terminata la rotazione disponibile per la messa a fuoco;
-
la seconda, con gli interruttori A e B bisogna impostare 2 punti all'interno del range di escursione della ghiera in modo tale da parzializzare il movimento solo da A verso B e viceversa, gli interruttori sono ON/OFF 2 posizioni quindi sulla posizione di OFF questi due punti verrebbero resettati permettendo così l'escursione massima della ghiera come descritto nella prima specifica.
//declare variables for the motor pins
int motorPin1 = 8; // Blue - 28BYJ48 pin 1
int motorPin2 = 9; // Pink - 28BYJ48 pin 2
int motorPin3 = 10; // Yellow - 28BYJ48 pin 3
int motorPin4 = 11; // Orange - 28BYJ48 pin 4
// Red - 28BYJ48 pin 5 (VCC)
int motorSpeed = 0; //variable to set stepper speed
int potPin = 2; //potentiometer connected to A2
int potValue = 0; //variable to read A0 input
//////////////////////////////////////////////////////////////////////////////
void setup() {
//declare the motor pins as outputs
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
Serial.begin(9600);
}
//////////////////////////////////////////////////////////////////////////////
void loop(){
potValue = analogRead(potPin); // read the value of the potentiometer
Serial.println(potValue); // View full range from 0 - 1024 in Serial Monitor
if (potValue < 500){ // if potentiometer reads 0 to 499 do this
motorSpeed = 1; //scale potValue to be useful for motor
clockwise(); //go to the ccw rotation function
}
else if (potValue > 560) { //value of the potentiometer is 561 - 1024
motorSpeed = 1; //scale potValue for motor speed
counterclockwise(); //go the the cw rotation function
}
else
stopwise();
}
//////////////////////////////////////////////////////////////////////////////
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed)
void counterclockwise (){
// 1
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(motorSpeed);
// 2
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay (motorSpeed);
// 3
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(motorSpeed);
// 4
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(motorSpeed);
// 5
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(motorSpeed);
// 6
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, HIGH);
delay (motorSpeed);
// 7
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(motorSpeed);
// 8
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(motorSpeed);
}
//////////////////////////////////////////////////////////////////////////////
//set pins to ULN2003 high in sequence from 4 to 1
//delay "motorSpeed" between each pin setting (to determine speed)
void clockwise(){
// 1
digitalWrite(motorPin4, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, LOW);
delay(motorSpeed);
// 2
digitalWrite(motorPin4, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, LOW);
delay (motorSpeed);
// 3
digitalWrite(motorPin4, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, LOW);
delay(motorSpeed);
// 4
digitalWrite(motorPin4, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin1, LOW);
delay(motorSpeed);
// 5
digitalWrite(motorPin4, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin1, LOW);
delay(motorSpeed);
// 6
digitalWrite(motorPin4, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin1, HIGH);
delay (motorSpeed);
// 7
digitalWrite(motorPin4, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, HIGH);
delay(motorSpeed);
// 8
digitalWrite(motorPin4, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, HIGH);
delay(motorSpeed);
}
void stopwise (){
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
Mi piacerebbe migliorare questo codice implementando la lettura del potenziometro di posizione + il controllo sugli interruttori A e B.
Ovviamente nei prossimi giorni metterò in condivisione altre immagini dello stato di avanzamento così se qualche appassionato di ripresa video volesse costruirsi un dispositivo simile già un pò di lavoro è fatto !!!
Grazie a tutti.
Francesco G.