Motori passo passo e limit switch per un mangianastri di carta

Ciao a tutti, avrei in mente di creare un progetto con Arduino, l'idea è quella di realizzare una sorta di mangianastri per avvolgere e svolgere una bobina di carta, vi allego una immagine per provare a spiegare meglio, quindi pensavo di utilizzare due motori passo passo (con 2 L298N) con due limit switch per invertire il senso.

Vorrei fare in modo che uno dei due motori ruoti in senso orario e quando ha avvolto quasi tutto il rotolo faccia pressione sul relativo finecorsa interrompendo la rotazione, e attivando l'altro motore che ruoterà in senso antiorario invertendo anch'esso la rotazione quando il nastro sarà stato tutto avvolto dalla sua parte e cosi all'infinto ...

Iniziando a pensarci sembra più difficile da spiegare che da fare, io al momento ho acquistato i componenti che mi servono, e ho iniziato a far girare un motore facendo dei test... che ne dite è un'idea impossibile ?

grazie

Buongiorno,
prima di tutto, essendo il tuo primo post, nel rispetto del regolamento, ti chiedo di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) e tu hai posto la stessa/simile domanda in area di lingua Inglese, per di più ... scrivendo in Italiano, che è altrettanto proibito.

Il tuo thread nell'area di lingua Inglese è stato quindi cancellato e ti prego di continuare qui senza aprire ulteriori thread.

Grazie,

Guglielmo

Io comincerei a mettere una rotellina ai finecorsa :wink: altrimenti si pianta la carta

Grazie Guglielmo, ho provveduto a presentarmi nella sezione apposita, per quanto riguarda il cross-posting all'inizio avevo trovato la sezione in italiano e dopo averla trovata non sono riuscito ad eliminare il post... l'importante è che ora è tutto risolto !!! spero di essere comunque il benvenuto ! :slight_smile: :slight_smile: :slight_smile:

robuswalk:
spero di essere comunque il benvenuto ! :slight_smile: :slight_smile: :slight_smile:

Naturalmente, ci mancherebbe :slight_smile: :slight_smile: :slight_smile:

Guglielmo

Ho iniziato con un codice semplice, come posso aggiungere qui la possibilità che alla pressione del limit switch inverto il senso di marcia ?

#include <Stepper.h>

const int stepsPerRevolution = 200;

Stepper myStepper(stepsPerRevolution, 2,3,4,5);           

int stepCount = 0;     // numero di passi del motore

void setup() {
}

void loop() {

  int sensorReading = analogRead(A0);
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    myStepper.step(stepsPerRevolution/100);
  } 
}

Dovresti consultare la libreria per invertire il senso di marcia. Ma per certo sarà da decelerare-fermare-invertire.
Per l' inversione devi fare _ myStepper.step(-stepsPerRevolution/100);_, che in pratica si definisce un senso quando positivo ed il contrario quando negativo.
Bastava leggere la libreria :wink:

1 Like

Grazie ! ci lavoro subito ! una domanda ma secondo voi è normale che l'L298N si scalda molto ? io alimento L'L298N con un alimentatore da 5v e 1A, da li alimento Arduino con l'uscita da 5V ...

io alimento L'L298N con un alimentatore da 5v e 1A, da li alimento Arduino con l'uscita da 5V ...

Hai un modulo di quelli già pronti ?
Perchè vorrebbero almeno 7.5V come alimentazione

Ho questo qui DROK L298N

Per ora sono arrivato qui comunque ...
alla pressione dello switch si accende un Led, se premuto nuovamente si spegne, vorrei aggiungere che sempre alla pressione si inverte il senso di rotazione ma non riesco a capire come fare ...

#include <Stepper.h>

const int stepsPerRevolution = 300;

int pinButton = 2;
int LED = 13;

int stateLED = LOW;
int previous = LOW;
int stateButton;

long time = 0;
long debounce = 200;

Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup()
{
  myStepper.setSpeed(5);
  pinMode(LED, OUTPUT);
  pinMode(pinButton, INPUT);
  Serial.begin(9600);
}
 
void loop()
{

  stateButton = digitalRead(pinButton);  
  
  if(stateButton == HIGH && previous == LOW && millis() - time > debounce) {
    if(stateLED == HIGH){
      
      stateLED = LOW; 
      //myStepper.step(-stepsPerRevolution);
      Serial.println("Orario");
      actOnButtons();
  
    } else {
      
      stateLED = HIGH;
      //myStepper.step(-stepsPerRevolution);
      Serial.println("Antiorario");
      actOnButtons();
        
    }
    time = millis();
  }
  
  digitalWrite(LED, stateLED);
  previous == stateButton;
  
}

Per girare in un senso puoi fare
myStepper.step(stepsPerRevolution); // senza il meno davanti : un senso di rotazione
myStepper.step(-stepsPerRevolution); // con il meno davanti : senso opposto

si pero inserendolo cosi dove già l'ho messo commentato mi blocca il loop, nel senso che se lo lascio cosi fa un giro completo e si ferma se schiaccio lo switch fa un giro completo dall'altro verso e si blocca cosi a rotazione, io vorrei che lui girasse all'infinito e alla pressione invertisse il senso di marcia continuando a girare all'inifinito ...

Se dai Stepper.step(Num_steps), farà un determinato numero di step della variabile Num_steps.
Il massimo è 65535,quindi se hai 200 passi per giro ne potrebbe fare 320 c.a. La libreria non ha un moto continuo.
Il massimo sarà 32767, quindi con 200 passi al giro, fai 160 giri c.a. Sì perché è un int con segno.

Se lo vuoi far girare di continuo allora ti conviene che alimenti un ciclo che ad ogni chiamata ti fa un giro.
Pertanto potresti considerare in pseudo codice

while (limit_switch) Stepper.step(200);

E lì si blocca, aspettando che il finecorsa va a livello basso.