Salve amici forumisti, vi ringrazio innanzitutto per l'aiuto che mi avete già dato nell'altro mio topic con i vostri preziosi suggermenti.
Adesso avrei un altro problema più di natura "Software" stavolta...
Vi spiego brevemente quello che dovrei realizzare.
Il mio obiettivo è quello di costruire un Dip-coater, cioè uno strumento che permette di immergere meccanicamente dei campioni in una soluzione per depositarvi sopra un film sottile.
A tale scopo mi sono servito come vi dicevo di un motorino passo passo recuperato da un vecchio lettore CD, per avere già pronta la slitta che fa scorrere il tutto e non avere quindi problemi meccanici.
I parametri che mi occorre potere settare sono la velocità iniziale di estrazione e la decelerazione in risalita che serve ad ottenere spessori del film uniformi e tali parametri devo poterli visualizzare su un display LCD in mm/s ed in mm/s^2.
Il programma che ho elaborato è il seguente e funziona tutto alla perfezione:
#include <LiquidCrystal.h>
#define SCENDI 2
#define SALI 3
LiquidCrystal lcd(12, 13, 7, 6, 5, 4);
int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int speedPinPot = 0;
int decelPinPot = 1;
int i = 0;
int down = 0;
int up = 0;
int stop = 0;
int downDelayTime = 2;
double upDelayTime;
double decelFactor;
void setup() {
pinMode(SCENDI, INPUT);
pinMode(SALI, INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(speedPinPot, INPUT);
pinMode(decelPinPot, INPUT);
lcd.begin(20, 2);
lcd.print("Vel.iniz.");
lcd.setCursor(16, 0);
lcd.print("mm/s");
lcd.setCursor(0, 1);
lcd.print("Deceler.");
lcd.setCursor(15, 1);
lcd.print("mm/s");
}
void loop() {
int speedReadPin = analogRead(speedPinPot);
upDelayTime = (map(speedReadPin, 0, 1024, 10000, 150000)/1000.);
double velocita = (1000./upDelayTime)*0.226;
int decelReadPin = analogRead(decelPinPot);
decelFactor = (map(decelReadPin, 0, 1024, 0, 1000)/1000.);
double decelerazione = (?);
lcd.setCursor(10, 0);
if (velocita < 10)
lcd.print(" ");
lcd.print(velocita);
lcd.setCursor(10, 1);
lcd.print(decelerazione);
down = digitalRead(SCENDI);
up = digitalRead(SALI);
if (down == HIGH)
scendi();
if (up == HIGH)
sali();
}
void scendi() {
if(!stop) {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(downDelayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(downDelayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(downDelayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(downDelayTime);
i++;
if (i > 40)
stop = 1;
}
}
void sali() {
stop = 0;
int j = i;
while(i>0){
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(upDelayTime + decelFactor*(j-i));
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(upDelayTime + decelFactor*((j-i)-1));
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(upDelayTime + decelFactor*((j-i)-2));
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(upDelayTime + decelFactor*((j-i)-3));
i--;
}
}
Il problema che non riesco a risolvere è effettuare in qualche modo una conversone tra il tempo di ritardo crescente che ho imposto tra un passo ed il successivo del motorino ela decelerazione espressa in mm/s^2 da visulaizzare sul display, dove per ora visualizzo semplicemente la variabile che ho chiamato decelFactor...
inoltre avrei la necesità che questa accelerazione fosse costante mentre per come ho realizzato il programma io temo che questa non sia costante...
C'è qualcuno che potrebbe darmi una mano per favore?
GRAZIE