spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Arduino

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 03-03-2014, 13.30.59
Falcon Falcon non è collegato
Robottaro senior
 
Data registrazione: 17-04-2013
Residenza: Agrigento
Messaggi: 46
Potenza reputazione: 29
Falcon E' per ora ancora un mistero
Predefinito Problema per contollare un motore passo passo con arduino e la scheda A4988

Ciao ,
Di recente ho scaricato il programma di Luca Dentella per controllare un motore passo passo con la scheda A4988 .
Preciso che ho usato gli stessi componenti descritti nel sito di Dentella di cui allego il link

http://www.lucadentella.it/2013/05/3...8-e-arduino-3/

Però il programma (che inserisco alla fine del post) presenta un inconveniente e cioè all'inizio funziona benissimo, ma ,se si fa girare alla stessa velocità il motorino per qualche minuto e poi si decide di variare la velocità (o il verso di rotazione del motorino), accade che il programma si blocca e si deve premere il tasto reset per sbloccarlo.
Pensando che potesse essere un problema di hardware ho usato 2 LCD keypad shield di marca diversa (una identica a quella usata da Dentella ed una altra della DF Robot), ma senza risolvere il problema .
Qualcuno potrebbe spiegarmi come risolvere il problema?
Grazie in anticipo

Codice:
#include <LiquidCrystal.h>
#include <TimerOne.h>
Codice:
 // buttons code 
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
 // directions
#define FORWARD   HIGH
#define BACKWARD  LOW
 // debounce time (milliseconds)
#define DEBOUNCE_TIME  200
 // PINs for Pololu controller
#define PIN_STEP  2
#define PIN_DIR   3
 // lookup table speed - ticks (interrupts)
const int speed_ticks[] = {-1, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};
 // global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 int actual_speed;
int actual_direction;
 int ticks;
int tick_count;
 int button;
boolean debounce;
int previous_time;
 // custom LCD square symbol for progress bar
byte square_symbol[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
 // string constants
char forward_arrow[] = "-->";
char backward_arrow[] = "<--";
 void setup() {
   // init the timer1, interrupt every 0.1ms
  Timer1.initialize(100);
  Timer1.attachInterrupt(timerIsr);
  
  // init LCD and custom symbol  
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.createChar(0, square_symbol);
  
  // pins direction
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
  
  // initial values
  actual_speed = 0;
  actual_direction = FORWARD;
  tick_count = 0;
  ticks = -1;
  debounce = false;
   digitalWrite(PIN_DIR, actual_direction);  
  updateLCD();
}
  
void loop() {
  
  // check if debounce active
  if(debounce) {
    button = btnNONE;
    if(millis() > previous_time + DEBOUNCE_TIME) debounce = false;
  } else button = read_buttons();
  
  // if a button is pressed, start debounce time
  if(button != btnNONE) {
    
    previous_time = millis();
    debounce = true;  
  }
    
  // check which button was pressed
  switch(button) {
    
    case btnUP:
      increase_speed();
      break;
    case btnDOWN:
      decrease_speed();
      break;
    case btnLEFT:
      change_direction(BACKWARD);
      break;
    case btnRIGHT:
      change_direction(FORWARD);
      break;
    case btnSELECT:
      emergency_stop();
      break;
  }
  
  // finally update the LCD
  updateLCD();
}
 // increase speed if it's below the max (70)
void increase_speed() {
  
  if(actual_speed < 70) {
    actual_speed += 5;
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}
 // decrease speed if it's above the min (0)
void decrease_speed() {
  
  if(actual_speed > 0) {
    actual_speed -= 5;
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
}
 // change direction if needed
void change_direction(int new_direction) {
  
  if(actual_direction != new_direction) {
    actual_direction = new_direction;
    digitalWrite(PIN_DIR, actual_direction);
  }
}
 // emergency stop: speed 0
void emergency_stop() {
  actual_speed = 0;
  tick_count = 0;
  ticks = speed_ticks[actual_speed / 5];
}
 // update LCD
void updateLCD() {
  
  // print first line:
  // Speed: xxxRPM --> (or <--)
  lcd.setCursor(0,0);
  lcd.print("Speed: ");
  lcd.print(actual_speed);
  lcd.print("RPM ");
   lcd.setCursor(13,0);
  if(actual_direction == FORWARD) lcd.print(forward_arrow);
  else lcd.print(backward_arrow);
  
  // print second line:
  // progress bar [#####         ]
  // 15 speed steps: 0 - 5 - 10 - ... - 70
  lcd.setCursor(0,1);
  lcd.print("[");
  
  for(int i = 1; i <= 14; i++) {
    
    if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
    else lcd.print(" ");
  }
  
  lcd.print("]");
}
 // timer1 interrupt function
void timerIsr() {
   if(actual_speed == 0) return;
  
  tick_count++;
  
  if(tick_count == ticks) {  
    
    // make a step
    digitalWrite(PIN_STEP, HIGH);
    digitalWrite(PIN_STEP, LOW);
    
    tick_count = 0;
  }
}
 // read buttons connected to a single analog pin
int read_buttons() {
  
 int adc_key_in = analogRead(0);
 
 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
}
Rispondi citando
  #2  
Vecchio 10-03-2014, 13.12.53
Falcon Falcon non è collegato
Robottaro senior
 
Data registrazione: 17-04-2013
Residenza: Agrigento
Messaggi: 46
Potenza reputazione: 29
Falcon E' per ora ancora un mistero
Predefinito

Ragazzi possibile che nessuno possa aiutarmi?
Rispondi citando
  #3  
Vecchio 10-03-2014, 13.26.15
L'avatar di aldofad
aldofad aldofad non è collegato
Robottaro sostenitore
 
Data registrazione: 22-01-2007
Residenza: Treviso
Età : 43
Messaggi: 936
Potenza reputazione: 87
aldofad Il suo nome è noto a tutti
Invia un messaggio via MSN a aldofad Send a message via Skype™ to aldofad
Predefinito

Do per scontato che il codice non abbia errori.

Hai un oscilloscopio?
Dovresti cominciare a vedere il disturbo anzitutto.
Dove ci sono induttanze trascorse da correnti variabili si creano tensioni indotte che causano disturbi e il micro "sballa". Su questo post http://forum.roboitalia.com/showthread.php?t=10485 spiego come si può diagnosticare e risolvere un disturbo "alla buona".
Rispondi citando
  #4  
Vecchio 10-03-2014, 13.28.20
L'avatar di aldofad
aldofad aldofad non è collegato
Robottaro sostenitore
 
Data registrazione: 22-01-2007
Residenza: Treviso
Età : 43
Messaggi: 936
Potenza reputazione: 87
aldofad Il suo nome è noto a tutti
Invia un messaggio via MSN a aldofad Send a message via Skype™ to aldofad
Predefinito

Citazione:
Orginalmente inviato da aldofad Visualizza messaggio
Dove ci sono induttanze trascorse da correnti ...
Ovviamente le induttanze sono gli avvolgimenti nel motore
Rispondi citando
  #5  
Vecchio 10-03-2014, 19.27.15
Falcon Falcon non è collegato
Robottaro senior
 
Data registrazione: 17-04-2013
Residenza: Agrigento
Messaggi: 46
Potenza reputazione: 29
Falcon E' per ora ancora un mistero
Predefinito

Innanzitutto grazie per i chiarimenti.
Mi scuso per non essere stato sufficientemente dettagliato nella descrizione del' hardware usato.
Uso arduino uno che so bene non ha molta RAM , la LCD KEYPAD SHIELD è quella usata da L . Dentella nel suo esperimento, ma funziona anche con quella della DF Robot ( ovviamente adeguando i valori di resistenza collegati al pin analogico 0). Per la LCD keypad shield (montata su arduino uno) al motorino per stampanti 3D (uso quello in vendita presso la DF Robot) ho usato la scheda polulolu A4988 (alimentata con un alimentatore a 24 V.).
Il problema si manifesta sia senza collegare il motorino che, collegando il motorino alla LCD keypad shield.
Credo che il problema sia nella RAM , infatti ho capito che il display viene scritto a ogni ciclo loop() nonostante che apparentemente non cambi niente premendo i vari pulsanti. Basta controllare che la variable button é cambiata dall'ultima volta e solo in quel caso aggiornare il display. Per fare questo basterebbe memorizzare lo stato di button in una altra variabile e confrontare quella con button, ma la cosa no ha funzionato .
Per diminuire la RAM usata ho anche , in tutti i casi che vengono stampati dei testi fissi, sostituito :
lcd.print("Speed: ");
Con
lcd.print(F("Speed: "));

Ma neanche questo a funzionato.

Qualche idea?
Sono disperato
Rispondi citando
  #6  
Vecchio 11-03-2014, 09.36.20
Falcon Falcon non è collegato
Robottaro senior
 
Data registrazione: 17-04-2013
Residenza: Agrigento
Messaggi: 46
Potenza reputazione: 29
Falcon E' per ora ancora un mistero
Predefinito

Caro ,
Grazie mille per il tutti i suggerimenti che mi Hai gentilmente dato.
Grazie a Te credo di aver ridotto notevolmente lo spazio occupato dal programma nella RAM di arduino, ma ho ancora qualche problema con l'aggiornamento del display [devo aver fatto qualche errore nella sezione if( scriviLcd ) updateLCD()]
Potresti dare uno squardo al programma modificato?
Grazie in anticipo
Falcon
Codice HTML:
#include <LiquidCrystal.h>
#include <TimerOne.h>
// buttons code 
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
// directions
#define FORWARD   HIGH
#define BACKWARD  LOW
// debounce time (milliseconds)
#define DEBOUNCE_TIME  200
// PINs for Pololu controller
#define PIN_STEP  2
#define PIN_DIR   3
// lookup table speed - ticks (interrupts)
const int speed_ticks[] = {-1, 600, 300, 200, 150, 120, 100, 86, 75, 67, 60, 55, 50, 46, 43};
// global variables
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int actual_speed;
int actual_direction;
int new_direction;
int ticks;
int tick_count;
int button;
boolean debounce;
boolean scriviLcd = false;
int previous_time;
// custom LCD square symbol for progress bar
byte square_symbol[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
// string constants
char forward_arrow[] = "-->";
char backward_arrow[] = "<--";
void setup() {
  // init the timer1, interrupt every 0.1ms
  Timer1.initialize(100);
  Timer1.attachInterrupt(timerIsr);
 
  // init LCD and custom symbol  
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.createChar(0, square_symbol);
 
  // pins direction
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
 
  // initial values
  actual_speed = 0;
  actual_direction = FORWARD;
  tick_count = 0;
  ticks = -1;
  debounce = false;
  digitalWrite(PIN_DIR, actual_direction);  
}
 
void loop() {
 
  // check if debounce active
  if(debounce) {
    button = btnNONE;
    if(millis() > previous_time + DEBOUNCE_TIME) debounce = false;
  } else button = read_buttons();
 
  // if a button is pressed, start debounce time
  if(button != btnNONE) {
 
    previous_time = millis();
    debounce = true;  
  }
 
  // check which button was pressed
  switch(button) {
    // increase speed if it's below the max (70)
    case btnUP:
       if(actual_speed < 70) {
          actual_speed += 5;
         tick_count = 0;
         ticks = speed_ticks[actual_speed / 5];
         }
      scriviLcd = true;
      break;
      // decrease speed if it's above the min (0)
    case btnDOWN:
      if(actual_speed > 0) {
    actual_speed -= 5;
    tick_count = 0;
    ticks = speed_ticks[actual_speed / 5];
  }
     scriviLcd = true;
      break;
    case btnLEFT:
      //change_direction(BACKWARD);
       if(actual_direction != new_direction) {
    actual_direction = new_direction;
    digitalWrite(PIN_DIR, actual_direction);
       }
     scriviLcd = true;
      break;
    case btnRIGHT:
      //change_direction(FORWARD);
       if(actual_direction != new_direction) {
    actual_direction = new_direction;
    digitalWrite(PIN_DIR, actual_direction);
       }
       scriviLcd = true;
      break;
 
    case btnSELECT:
      //emergency_stop;
      if (actual_speed = 0) {
  tick_count = 0;
  ticks = speed_ticks[actual_speed / 5];
}
     scriviLcd = true;
      break;
  }
 
  // finally update the LCD
   if( scriviLcd ) updateLCD();  //se scrviLcd è vero lo aggiorna
  scriviLcd = false;               //e resetta comunque il flag per il prossimo ciclo
 
  // print first line:
  // Speed: xxxRPM --> (or <--)
  lcd.setCursor(0,0);
  lcd.print(F("Speed: "));
  lcd.print(actual_speed);
  lcd.print(F("RPM "));
 
  lcd.setCursor(13,0);
  if(actual_direction == FORWARD) lcd.print(forward_arrow);
  else lcd.print(backward_arrow);
 
  // print second line:
  // progress bar [#####         ]
  // 15 speed steps: 0 - 5 - 10 - ... - 70
  lcd.setCursor(0,1);
  lcd.print(F("["));
 
  for(int i = 1; i <= 14; i++) {
 
    if(actual_speed > (5 * i) - 1) lcd.write(byte(0));
    else lcd.print(F(" "));
  }
 
  lcd.print (F("]"));
}
// timer1 interrupt function
void timerIsr() {
  if(actual_speed == 0) return;
 
  tick_count++;
 
  if(tick_count == ticks) {  
 
    // make a step
    digitalWrite(PIN_STEP, HIGH);
    digitalWrite(PIN_STEP, LOW);
 
    tick_count = 0;
  }
}
// read buttons connected to a single analog pin
int read_buttons() {
 
 int adc_key_in = analogRead(0);
 
 if (adc_key_in > 1000) return btnNONE;
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;   
}

Ultima modifica di Caronte : 12-03-2014 alle ore 22.35.04
Rispondi citando
  #7  
Vecchio 11-03-2014, 11.16.50
L'avatar di sergio_camici
sergio_camici sergio_camici non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Binasco (MI)
Età : 55
Messaggi: 2,665
Potenza reputazione: 304
sergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua famasergio_camici La sua reputazione è oltre la sua fama
Predefinito

Dissento fortemente, l'inglese non è la lingua degli "altri" ma è una lingua trasversale che parlano tutti, tedeschi, spagnoli, polacchi e permette di avere suggerimenti e supporto da tutto il mondo, magari anche dal super-esperto che per nostra sfortuna vive in Olanda e non parla la nostra meravigliosa lingua.
__________________
ciao
Sergio
---
Hai deciso di costruire un robot? Bene...
Cominciamo dalle brutte notizie: non e' facile...

Ultima modifica di Caronte : 12-03-2014 alle ore 22.34.55
Rispondi citando
  #8  
Vecchio 11-03-2014, 11.53.09
L'avatar di marnic
marnic marnic non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Monselice (PD)
Età : 58
Messaggi: 5,458
Potenza reputazione: 423
marnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua fama
Predefinito

No dai non fare il permaloso
Concorderai che l'inglese serve, almeno nella robotica, un qualsiasi componente ha il datasheet in inglese, un ragazzo che studia oggi trova molte più risorse se non limita il suo campo di ricerca (in rete ma non solo) alla lingua italiana, nel mondo scientifico si parla inglese....
Si, anch'io mi troverei meglio se tutto fosse in italiano ma così non è.
Spesso in questo forum aiutiamo "ragazzini" italiani e, proprio per aiutarli cerchiamo di far notare come questo forum, italiano, sia un piccolo orticello rispetto ai campi sterminati che trovi in lingua inglese e che il loro futuro tecnico dipenderà, volenti o nolenti, dalla conoscenza della lingua inglese. Io a 52 anni forse mi posso far bastare l'inglese che conosco ma ai miei nipoti consiglio vacanze poliglotte
__________________
Marnic
Roboitalia Staff
www.fabbrimarco.com

Ultima modifica di Caronte : 12-03-2014 alle ore 22.34.40
Rispondi citando
  #9  
Vecchio 11-03-2014, 11.54.08
Falcon Falcon non è collegato
Robottaro senior
 
Data registrazione: 17-04-2013
Residenza: Agrigento
Messaggi: 46
Potenza reputazione: 29
Falcon E' per ora ancora un mistero
Predefinito

Caro ,

Sull'uso dell'inglese vorrei chiarire che il programma non è mio , ma di Luca Dentella che lo ha commentato in inglese .
Per i rientri mi scuso, ma nella fretta li ho trascurati.
Per quanto riguarda l' updateLCD faceva parte del programma originale e credo che si possa eliminare, mettendo come da Te suggerito in chiusura del loop:

Codice:
if( scriviLcd ) updateLCD();  //se scrviLcd è vero lo aggiorna
  scriviLcd = false;               //e resetta comunque il flag per il prossimo ciclo
Il guaio è che se si fa una verifica del programma il compilatore da un errore.
Potresti provare a verificare il programma con IDE di arduino ?
Così Ti potresti render conto meglio dell'errore.
Grazie
Falcon

Ultima modifica di Caronte : 12-03-2014 alle ore 22.34.09
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Relazione tra tensione nominale di driver di potenza e motore passo-passo Ziko E. di Potenza 3 24-09-2013 10.56.02
Delucidazioni sigla motore passo-passo Sigma bodla Motori e azionamenti 2 05-02-2010 14.27.56
potenziare una scheda per motori passo passo fontzie E. di Potenza 7 01-02-2009 14.08.50
Pilotaggio motore passo-passo con scheda Dea Lordberisha P. in Basic per micro 10 03-04-2005 12.40.39
scheda per pilotare i motori passo-passo zzzzz Motori e azionamenti 6 30-12-2003 00.06.47


Tutti gli orari sono GMT. Adesso sono le: 22.35.12.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB