Go Down

Topic: realizzazione di un ascensore a 3 piani  (Read 5111 times) previous topic - next topic

Claudio_FF

#15
Mar 17, 2018, 08:48 pm Last Edit: Mar 17, 2018, 09:27 pm by Claudio_FF
Quote from: simonsdec
riesco a comandare ciò che sto dicendo con la funzioni if else?
Quello che si fa normalmente è questo:
  • Si leggono gli ingressi (applicando un opportuno anti rimbalzo hard/soft se sono ingressi sporchi come i contatti meccanici).
  • In base alla situazione attuale (stato) e ai valori letti, si decide quali operazioni svolgere (compreso il comando delle uscite e l' eventuale aggiornamento della situazione attuale).
  • La situazione attuale (stato) si mantiene in apposite variabili usate per quello scopo (che vanno all'inizio impostate in modo da permettere una partenza regolare all'accensione o ad un reset).

Detto questo sono da decidere:
  • In quali situazioni (e sotto situazioni) si può trovare il sistema.
  • A quali eventi deve reagire in ogni situazione.
  • Quali operazioni deve compiere ad ogni reazione.

Tutto questo si fa con if/else e variabili usate opportunamente (come indicatori di stato, contatori ecc)

Il funzionamento/avanzamento del sistema è formato dalla continua rapida ripetizione di tutti i punti detti.

Se oltre a questo c'è anche da tenere conto del trascorrere del tempo (o si devono realizzare temporizzazioni), in ordine di precisione crescente si possono usare:
  • Piccoli delay nel loop principale per rallentarlo ad una frequenza nota (in modo da poterne contare "i passaggi".
  • La funzione millis per leggere il contatore di millisecondi interno.
  • Un modulo orologio RTC esterno.
* * * *    if non è un ciclo   * * * *

* * * Una domanda ben posta è già mezza soluzione. * * *

simonsdec

ho fatto un flowchart tramite un'applicazione di windows ma non riesco a girarvelo provo a riassumervelo qui:

                   LOW         PulsantPiano0          HIGH
                  ATTENDI                                  Rileva la posizione del ascensore
                                                            piano0               piano1                      piano2
                                                              end                  sali di tot passi          sali di tot passix2
                                                                                           end                          end

quello che voglio che il mio sistema faccia è nel caso si spinga il pulspiano0 deve rilevare subito la posizione del ascensore,in base ai 3 finecorsa una volta rilevata grazie ai passi del motore passo passo che comanderò con la funzione stepper.h gli dirò di andare al piano0 sempre dallo stato memorizzato prima della spinta del pulsante .
Quindi poi per progettare dovrò capire bene quanti giri del mio motore servano per far arrivare al piano l'ascensore
è buona come idea???
in più penso di aggiungere i 2 led bicolori

brunello22

Quote
dovrò capire bene quanti giri del mio motore servano per far arrivare al piano l'ascensore
è buona come idea???
A parte il fatto che non serve uno Stepper, ma basta un semplice motore DC possibilmente con riduttore......

Che te ne importa di sapere quanti step deve fare........  hai dei sensori di finecorsa per ogni piano, quindi fai avanzare il motore fino a che non scatta il finecorsa

simonsdec

con il motore dc non riesco a capire come farlo avanzare.... mi sembrava più semplice l'utilizzo dello stepper mettendo tutti i casi possibili che mi dava il finecorsa e i pulsanti
pensi che mi complico la vita?

simonsdec

ragazzi mi serve il vostro aiuto avrei un paio di problemi con lo stepper
1) come imposto la massima velocità del motore passo passo? ho provato vari setting dagli esempi ma sembra abbastanza lento... consigli?
2) come gli dico di fermarsi ? Ogni volta mi tocca staccare il cavo usb sennò

brunello22

Se non alleghi lo sketch la vedo dura risponderti


simonsdec

#21
Mar 21, 2018, 07:07 pm Last Edit: Mar 21, 2018, 07:13 pm by simonsdec
Code: [Select]

/*
 * MotorKnob
 *
 * A stepper motor follows the turns of a potentiometer
 * (or other sensor) on analog input 0.
 *
 * http://www.arduino.cc/en/Reference/Stepper
 * This example code is in the public domain.
 */

#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 100

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);

// the previous reading from the analog input
int previous = 0;

void setup() {
  // set the speed of the motor to 30 RPMs
  stepper.setSpeed(30); //questo valore solitamente lo metto a 100
}

void loop() {
  // get the sensor value
  int val = analogRead(0);

  // move a number of steps equal to the change in the
  // sensor reading
  stepper.step(val - previous);

  // remember the previous value of the sensor
  previous = val;
}

brunello22


simonsdec

ho uno step motor da 5v
fa circa 35 giri al minuto e ho visto un video su youtube che lo fa girare al max e penso vada minimo al doppio del mio
altra cosa un led dei 4 sul driver non si accende nonostante sia collegato.... speriamo non si sia fulminata una delle 4 bobine

brunello22

Ah, ho capito quale stepper hai.....

qui trovi tutto quello che c'è da sapere  , anche il fatto che hai definito male i pin
  https://arduino-info.wikispaces.com/SmallSteppers

simonsdec

grazie mille risolto il problema va alla grande!

simonsdec

ragazzi ho provato a fare uno sketch ma non mi sente il motore
secondo voi per quale motivo?
questo è il codice
Code: [Select]

#include <Stepper.h>
//---------------------------------------------------COLLEGAMENTI-----------------------------------------------//
int pulsante0pin=1;
int pulsante1pin=2;
int pulsante2pin=3;
int microswitch0=4;
int microswitch1=5;
int microswitch2=6;
//--------------------------------------------------- VARIABILI LED----------------------------------------------//
int LED_PT_R=14;
int LED_PT_V=15;
int LED_P1_R=16;
int LED_P1_V=17;
int LED_P2_R=18;
int LED_P2_V=19;
//--------------------------------------------------VARIABILI PER PULSANTI--------------------------------------//
int val0=0;
int val1=0;
int val2=0;
//--------------------------------------------------VARIABILI E PASSI DEL MOTORE---------------------------------//
int Steps2Take;
#define StepsPerMotorRevolution 32
#define StepsdaZeroaDue 94*94
#define StepsdaZeroaUno 68*68
#define StepsdaUnoaDue  64*64
Stepper small_stepper(StepsPerMotorRevolution,8,9,10,11);
//=================================================================================================================
void setup() {

pinMode(pulsante0pin,INPUT);
pinMode(pulsante1pin,INPUT);
pinMode(pulsante2pin,INPUT);
pinMode(microswitch0,INPUT);
pinMode(microswitch1,INPUT);
pinMode(microswitch2,INPUT);
pinMode(LED_PT_R,OUTPUT);
pinMode(LED_PT_V,OUTPUT);
pinMode(LED_P1_R,OUTPUT);
pinMode(LED_P1_V,OUTPUT);
pinMode(LED_P2_R,OUTPUT);
pinMode(LED_P2_V,OUTPUT);
Serial.begin(9600);
StepMotor.setSpeed(10);
//=================================================================================================================
}
/*costruzione dei blocchi if else in modo tale che l'ascensore arrivi nel piano desiderato*/
void loop () {
val0 = digitalRead(pulsante0pin); // caso in cui l'ascensore si trova al piano 1 e deve andare al piano 0
if ((val0 == HIGH) && (microswitch1 == HIGH)) { // se il pulsante piano0 è spinto ed è spinto anche il microswitch piano 1 l'ascensore dovrà scendere di tot passi
  Steps2Take = -StepsdaUnoaDue; //ascensore scendi di 64x64 passi
  small_stepper.setSpeed(700);//alla velocità di 700
}
else if ((val0 == LOW) && (microswitch1 == HIGH)) {
  small_stepper.setSpeed(0);
  delay(5000);
}
if ((val0 == HIGH) && (microswitch2 == HIGH)) {
   Steps2Take =  -StepsdaZeroaDue;
   small_stepper.setSpeed(700);
}
else if ((val0 == LOW) && (microswitch2 == HIGH)) {
  small_stepper.setSpeed(0);
  delay(5000);
}
if ((val0 == HIGH) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val0 == LOW) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
val1 = digitalRead(pulsante1pin);
if ((val1 == HIGH) && (microswitch0 == HIGH)) {
  Steps2Take = StepsdaZeroaUno; //salita 0-1
  small_stepper.setSpeed(700);
}
else if ((val1 == LOW) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val1 == HIGH) && (microswitch2 == HIGH)) {
  Steps2Take = -StepsdaUnoaDue; //scendi da 2 a 1
  small_stepper.setSpeed(700);
}
else if  ((val1 == LOW) && (microswitch2 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val1 == HIGH) && (microswitch1 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
else if ((val1 == HIGH) && (microswitch1 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
val2 = digitalRead(pulsante2pin);
if ((val2 == HIGH) && (microswitch0 == HIGH)) {
  Steps2Take = StepsdaZeroaDue; //salire da 0 a 2 
  small_stepper.setSpeed(700); 
}
else if ((val2 == LOW) && (microswitch0 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val2 == HIGH) && (microswitch1 == HIGH)) {
   Steps2Take = StepsdaUnoaDue; //sali dal piano 1 al piano 2
   small_stepper.setSpeed(700);
}
else if ((val2 == LOW) && (microswitch1 == HIGH)) {
  delay(10000);
  small_stepper.setSpeed(0);
}
if ((val2 == HIGH) && (microswitch2 == HIGH)) {
delay(10000);
  small_stepper.setSpeed(0);
}
if ((val2 == LOW) && (microswitch2 == HIGH)) {
delay(10000);
  small_stepper.setSpeed(0);
}

brunello22

perchè vedo solo

Code: [Select]
small_stepper.setSpeed(700);


dopo manca il codice per muovere lo stepper, ad esempio

Code: [Select]
small_stepper.step(Steps2Take);



simonsdec

si avevo notato prima di leggere il tuo messaggio che mancava il corrispettivo pezzo del codice,
aggiungendolo a tutte le mie condizioni noto che stranamente il motore non accenna ad accendersi mentre con altri pezzi di codice ad esempio quello che mi hai postato tu giorni fa va tranquillamente....il che mi fa pensare che non senta per niente ne pulsante ne microswitch e così facendo non accende il motore....possibile?
Anche se il cablaggio l'ho ricontrollato più volte ma niente

brunello22

cominciamo dall'inizio


Code: [Select]
if ((val0 == HIGH) && (microswitch1 == HIGH)) {

Questo, come tutti gli altri devono diventare


Code: [Select]
if ((val0 == HIGH) && ( digitalRead (microswitch1) == HIGH)) {

Go Up