EDIT: Aggiornamento scritto in vari giorni e riprese...
Finalmente sono riuscito a farmi dare un disegnino della siviera che via via sta venendo realizzata, BRUTALMENTE col paint ci ho disegnato sopra quella cosa color rosso-nera che dovrebbe essere il motore e quella riga marrone è la cinghia che collega il motore al riduttore, in ogni caso in "settimana" dovrei avere qui da me il tutto assemblato.
Sebbene non siano indicate in questo disegno, in realtà poi la siviera non verrà appesa ma ci
saranno 4 gambe sarà un piedistallo.
La parte di recipiente, anche se non è ancora stata ultimata nelle lavorazioni, prendendola in mano per i perni e facendola ribaltare, si dimostra ben bilanciata, resta alla posizione che la metti senza fare grossi sforzi, oltre quello di sopportare il peso stesso.
Mentre aspettavo "i meccanici", che 2 mesi fa' mi avevano detto "in settimana ci siamo...", mi è arrivato per le mani un potenziometro di precisione con una porzione rovinata in decenni di lavoro, che però montandolo adeguatamente, considerando i pochi gradi di movimento che servono qui, si riesce a riciclare.
Da qui nasce l'idea di abbandonare il motore passo passo, per passare ad un motore tradizionale. Il problema persiste per il dimensionamento, non vorrei fargli mettere un motore sbagliato.
Ora come ora per le mie prove ora sto usando "in mano" un motoriduttore recuperato qualche decennio fa, per verificare i movimenti.
Velocemente ho buttato giù uno schemino dei collegamenti ed un paio di righe di codice.
Vista la semplicità ho optato per non diventare troppo matto e realizzare su millefori con l'aiuto di un arduino pro mini che già girava per casa.
Il circuito risultante è
Il codice seguente è per arduino, ho aggiunto qualche commento.
Brevemente: I pulsanti P1-P2-P3 servono per fare ruotare la siviera in senso orario; antiorario; salvare posizione esclusivamente quando si è nel programma di azzeramento.
Il potenziometro su A0 è fissato in asse con la siviera, mentre quello si A1 serve per regolare la velocità massima.
- Codice: Seleziona tutto
int startCiclo = 4;
int stopCiclo = 5;
int uscitaPWM = 6;
int releInversione = 7;
int pinLed = 13;
int pinPosizione = A0;
int pinPulsanti = A2;
int pinVelocita = A1;
int positionMinima=200;
int positionMassima=824;
int position0=400; int position1=700; int currentPosition; int ptr; bool isrunning=false;
bool firstRun=true;
int verso0;
int verso1;
int distance0;
int distance1;
int speed4;
unsigned int decToBin;
unsigned int nalto;
unsigned int nbasso;
void setup() {
pinMode(startCiclo, INPUT_PULLUP);
pinMode(stopCiclo, INPUT_PULLUP);
pinMode(releInversione, OUTPUT);
pinMode(pinLed, OUTPUT);
delay(100);
int valP5=digitalRead(startCiclo);
int valP6=digitalRead(stopCiclo);
if(valP5==LOW && valP6==LOW){
azzeramento();
}
digitalWrite(releInversione, LOW);
delay(200);
int eer0=EEPROM.read(0); int eer1=EEPROM.read(5); int eer2=EEPROM.read(10); int eer3=EEPROM.read(15); int eer4=EEPROM.read(20); if(eer0 == 1){
position0= eer1 | ( eer2 << 8 );
position1= eer3 | ( eer4 << 8 );
}
}void loop() {
currentPosition = analogRead(pinPosizione);
int valP5=digitalRead(startCiclo);
int valP6=digitalRead(stopCiclo);
if(valP5==LOW){
isrunning=true;
}
if(valP6==LOW){
isrunning=false;
}
verso0 = position0 - currentPosition;
verso1 = position1 - currentPosition;
distance0=abs(verso0);
distance1=abs(verso1);
if (isrunning==true){ if (firstRun==true){
if ( verso0 > 0) {digitalWrite(releInversione, LOW);}
if (verso0 < 0) {digitalWrite(releInversione, HIGH);}
int speed1 = analogRead(pinVelocita);
int speed2 = map(speed1, 0, 1024, 0, 127);
int speed3 = 127;
if ( distance0 < 50 ){speed4=map(distance0, 0, 50, 20, 127);}
else {speed4 = speed3 + speed2;}
if ( distance0 !=0){analogWrite(uscitaPWM,speed4);}
else {analogWrite(uscitaPWM,0);
for(int i=0; i<5; i++){
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);}
firstRun=false;
ptr=1;
}
} else{ if(ptr==1){ if ( verso1 > 0) {digitalWrite(releInversione, LOW);}
if (verso1 < 0) {digitalWrite(releInversione, HIGH);}
int speed1 = analogRead(pinVelocita);
int speed2 = map(speed1, 0, 1024, 0, 127);
int speed3 = 127;
if ( distance1 < 50 ){speed4=map(distance1, 0, 50, 20, 127);}
else {speed4 = speed3 + speed2;}
if ( distance1 !=0){analogWrite(uscitaPWM,speed4);
} else {analogWrite(uscitaPWM,0);
for(int i=0; i<3; i++){
digitalWrite(13, HIGH);
delay(250);
digitalWrite(13, LOW);
delay(250);
ptr=0;
}
}
} if(ptr==0){
if ( verso0 > 0) {digitalWrite(releInversione, LOW);}
if (verso0 < 0) {digitalWrite(releInversione, HIGH);}
int speed1 = analogRead(pinVelocita);
int speed2 = map(speed1, 0, 1024, 0, 127);
int speed3 = 127;
if ( distance0 < 50 ){speed4=map(distance0, 0, 50, 20, 127);}
else {speed4 = speed3 + speed2;}
if ( distance0 !=0){analogWrite(uscitaPWM,speed4);}
else {analogWrite(uscitaPWM,0);
for(int i=0; i<5; i++){
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);}
firstRun=false;
ptr=1;}
} } } else{ analogWrite(uscitaPWM,0); }}void azzeramento(){
int a=0;
while(a<3){
int speed1 = analogRead(pinVelocita);
int speed2 = map(speed1, 0, 1024, 0, 127);
int speed3 = 127 + speed2;
int pulsanteN=letturaPulsanti();
delay(1);
int currentPosition = analogRead(pinPosizione);
switch(pulsanteN){
case 0:
analogWrite(uscitaPWM,0);
break;
case 1:
digitalWrite(releInversione, LOW);
delay(50);
if(currentPosition < positionMassima){
analogWrite(uscitaPWM, speed3);}
break;
case 2:
digitalWrite(releInversione, HIGH);
delay(50);
if(currentPosition > positionMinima){
analogWrite(uscitaPWM, speed3);}
break;
case 3:
if (a==0){ decToBin=currentPosition;
nalto=decToBin >> 8;
nbasso=decToBin & 0xff;
EEPROM.update(5, nbasso); EEPROM.update(10, nalto); }
else if (a==1){ decToBin=currentPosition;
nalto=decToBin >> 8;
nbasso=decToBin & 0xff;
EEPROM.update(15, nbasso); EEPROM.update(20, nalto); }
else if (a==2){EEPROM.update(0, 1);} delay(200);
for (int i=0; i<3; i++){
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
a++;
break;
case 4:
break;
} } }int letturaPulsanti(){
int vaip = analogRead(pinPulsanti);
if (vaip > 1000) return 0; if (vaip < 25) return 1; if (vaip < 202) return 2; if (vaip < 328) return 3; if (vaip < 422) return 4; }