[RISOLTO] - lcd key shield 16x2 + unl2003 + Mototech S35S5-6010

Buonasera a tutti,

Ho molte lacune nella programmazione in quanto ho iniziato appena da un mese a “giocare” con l’elettronica arduino.

Ho una scheda arduino uno con sopra un lcd key shield 16x2 link link

collegato ai pin dell’lcd 1-2-3-11 c’è un driver unl2003 link

Ho provato ad impostare un programma che: se clicco il tasto “up” il motore gira di x step in una direzione; se clicco il tasto “down” gira di x step nella direzione inversa.

mi viene fuori un errore che con le mie quasi nulle conoscenze non mi permette di andare avanti.

Potete cortesemente aiutarmi?
Grazie

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#include <Stepper.h>
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 1, 2, 3, 10);


#define btnSELECT 0 
#define btnLEFT   1
#define btnUP     2
#define btnDOWN   3
#define btnRIGHT  4
#define btnNONE   5
 
int read_buttons() {
  
 int A0 = analogRead(0);
 
 if (A0 > 1000) return btnNONE;
 if (A0 < 50)   return btnRIGHT;  
 if (A0 < 195)  return btnUP; 
 if (A0 < 380)  return btnDOWN; 
 if (A0 < 555)  return btnLEFT; 
 if (A0 < 790)  return btnSELECT;   
}
 
void setup()
{
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(10, OUTPUT);
  myStepper.setSpeed(60);
  Serial.begin(9600);
 lcd.begin(16, 2);
 lcd.setCursor(0,0);
 lcd.print("FOCUS RAIL");
}
  
void loop()
{
 lcd.setCursor(0,1);
 lcd.print("tasto:");
 
 while(1){
    read_buttons();
    switch (A0)
    
    {
      case btnUP:
      {
        myStepper.step(+200);
      }
      lcd.setCursor(0,1);
      lcd.print("avanti  ");
      delay(200);
      break;
    }
    case btnDOWN:
      {
        myStepper.step(-200);
      }
      lcd.setCursor(0,1);
      lcd.print("indietro");
      delay(200);
      break;
  }

Non puoi usare il pin 1 perché fa parte della seriale. Come indicato nella immagine che hai allegato non usare neanche il pin 10 (che non so il perché) Usa 11, 12, 13, A1, A2, A3, A4 o A5

Ciao Uwe

Ti consiglio anche di NON usare i nomi di variabili uguali ai pin, visto che il core (Arduino.h) fa delle define ad esempio di A0

Quindi usa pinA0 oppure valA0 per le variabili

Ragazzi siete fantastici!

uwefed:
Non puoi usare il pin 1 perché fa parte della seriale. Come indicato nella immagine che hai allegato non usare neanche il pin 10 (che non so il perché) Usa 11, 12, 13, A1, A2, A3, A4 o A5

Ciao Uwe

Ho usato i pin da A1 ad A4 e ho risolto il problema. Grazie per la dritta

nid69ita:
Ti consiglio anche di NON usare i nomi di variabili uguali ai pin, visto che il core (Arduino.h) fa delle define ad esempio di A0

Quindi usa pinA0 oppure valA0 per le variabili

Ho rinominato e ho risolto. Grazie per la dritta

Il codice “funzionante” è questo ma c’è un problema ( lo descrivo in basso)

#include <LiquidCrystal.h>
#include <Stepper.h>
const int stepsPerRevolution = 50;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Stepper myStepper(stepsPerRevolution, A1, A2, A3, A4);

int lcd_key     = 0;

#define btnSELECT 0 
#define btnLEFT   1
#define btnUP     2
#define btnDOWN   3
#define btnRIGHT  4
#define btnNONE   5
 
int read_buttons() {
  
 int A0 = analogRead(0);
 
 if (A0 > 1000) return btnNONE;
 if (A0 < 50)   return btnRIGHT;  
 if (A0 < 195)  return btnUP; 
 if (A0 < 380)  return btnDOWN; 
 if (A0 < 555)  return btnLEFT; 
 if (A0 < 790)  return btnSELECT;   
}

void setup(){
lcd.begin (16,2);
pinMode(A1, OUTPUT);
lcd.setCursor(0,0);
lcd.print("direzione:");
}

void loop(){
 
 myStepper.setSpeed(50);

  lcd_key = read_buttons();
  switch (lcd_key) 
  {
   case btnUP:
   lcd.setCursor(0,1);
   lcd.print("avanti  ");
   Serial.println("clockwise");
   myStepper.step(stepsPerRevolution);
   delay(500);    
   break;
  
  case btnDOWN:
  lcd.setCursor(0,1);
   lcd.print("indietro");
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
  break;
 }
}

Il problema è che non sto usando il motorino che mi hanno dato insieme al driver unl2003 ma sto usando un motore recuperato da uno scanner motore

se imposto “stepsPerRevolution” = 50 ( che sono gli step che fa per completare un giro di 360°) non ci sono problemi.
Io pero ho bisogno che faccia 1 step alla volta, quindi ho pensato di sostituire il 50 con 1 ma non succede nulla; sostituendo con 2= uno step avanti e uno indietro; 3= uno step avanti e 2 indietro; 4= 4 step avanti (sempre considerando il caso “case btnUP”)

Dove sto sbagliando?

se vuoi fare un solo step

stepper.step(1); o stepper.step(-1); per andare nel senso opposto

Se cammina male, dipende da come hai colleagato le fasi sui pin.

provaa cambiare cosi'
Stepper myStepper(stepsPerRevolution, A1, A3, A2, A4);

Brunello:
se vuoi fare un solo step

stepper.step(1); o stepper.step(-1); per andare nel senso opposto

Se cammina male, dipende da come hai colleagato le fasi sui pin.

provaa cambiare cosi’
Stepper myStepper(stepsPerRevolution, A1, A3, A2, A4);

Ho fatto come hai detto tu e ho risolto il problema ( la sequenza dei cavi era giusta)

Inoltre ho implementato la programmazione aggiungendo 2 tasti.

#include <LiquidCrystal.h>
#include <Stepper.h>
const int stepsPerRevolution = 50;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Stepper myStepper(stepsPerRevolution, A1, A2, A3, A4);

int lcd_key     = 0;
int startPos = 1;
int inizio = 0;
int fine = 91;
#define btnSELECT 0 
#define btnLEFT   1
#define btnUP     2
#define btnDOWN   3
#define btnRIGHT  4
#define btnNONE   5
 
int read_buttons() {
  
 int A0 = analogRead(0);
 
 if (A0 > 1000) return btnNONE;
 if (A0 < 50)   return btnRIGHT;  
 if (A0 < 195)  return btnUP; 
 if (A0 < 380)  return btnDOWN; 
 if (A0 < 555)  return btnLEFT; 
 if (A0 < 790)  return btnSELECT;   
}

void setup(){
lcd.begin (16,2);
pinMode(A1, OUTPUT);
lcd.setCursor(0,0);
lcd.print("direzione:");
}

void loop(){
 
  lcd_key = read_buttons();
  switch (lcd_key) 
  {
   case btnUP:
   myStepper.setSpeed(50);
   {
    if (startPos > inizio){
      myStepper.step(1);
      startPos = startPos +1;
    }
   lcd.setCursor(0,1);
   lcd.print("pos:            ");
   lcd.setCursor(5,1);
   lcd.print(startPos);   
   delay(500);    
   break;
    }
  
  case btnDOWN:
  myStepper.setSpeed(50);
  {
    if (startPos <= fine)
    {
      myStepper.step(-1);
      startPos = startPos -1;
    }
   lcd.setCursor(0,1);
   lcd.print("pos:            ");
   lcd.setCursor(5,1);
   lcd.print(startPos);
   delay(500);
   break;
   

  case btnRIGHT:
  myStepper.setSpeed(100);
   {
    if (startPos = startPos){
      myStepper.step(90);
      startPos = startPos +90;
    }
   lcd.setCursor(0,1);
   lcd.print("pos:            ");
   lcd.setCursor(5,1);
   lcd.print(startPos);   
   delay(500);    
   break;

   case btnLEFT:
   myStepper.setSpeed(100);
   {
    if (startPos = fine){
      myStepper.step(-90);
      startPos = startPos -90;
    }
   lcd.setCursor(0,1);
   lcd.print("pos:            ");
   lcd.setCursor(5,1);
   lcd.print(startPos);   
   delay(500);    
   break;
  }
  }
 }
}
}

Ultimo piccolo problema:
Quando arrivo allo step N°91 se per sbaglio clicco il bottone “up” non voglio che vada oltre, ma vorrei che venga visualizzato un messaggio sull’lcd.
Quindi ho provato ad inserire questo codice subito dopo il break del caso “btnUP”

if (startPos = fine){
    lcd.setCursor(5,1);
    lcd.print("fine corsa");
    break;
   }

ma non funzione, quindi se continuo a premere il motore esegue l’azione ignorando il codice.

Dove sto sbagliando?

Un "=" Assegnazione
Due "==" Confronto

Brunello:
Un “=” Assegnazione
Due “==” Confronto

Grazie per l’aiuto, ma nel mio caso ho risolto con if-while ( reimpostando le condizioni che prima erano sbagliate)

Direi che il problema è stato completamente risolto e ora non mi rimane che fare una scatola su misura che ospiti l’hardware.

Siete stati tutti molto gentili, e non mi rimane che dirvi GRAZIE

posto il codice per chi volesse farne uso.

#include <LiquidCrystal.h>
#include <Stepper.h>
const int stepsPerRevolution = 50;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Stepper myStepper(stepsPerRevolution, A1, A2, A3, A4);

int lcd_key     = 0;
int startPos = 0;
int fine = 90;
#define btnSELECT 0 
#define btnLEFT   1
#define btnUP     2
#define btnDOWN   3
#define btnRIGHT  4
#define btnNONE   5
 
int read_buttons() 
{
  int A0 = analogRead(0);
  if (A0 > 1000) return btnNONE;
  if (A0 < 50)   return btnRIGHT;  
  if (A0 < 195)  return btnUP; 
  if (A0 < 380)  return btnDOWN; 
  if (A0 < 555)  return btnLEFT; 
  if (A0 < 790)  return btnSELECT;   
  }

void setup()
{
  lcd.begin (16,2);
  pinMode(A1, OUTPUT);
  lcd.setCursor(3,0);
  lcd.print("MOTOR");
  lcd.setCursor(7,1);
  lcd.print("TEST");
  delay(250);
  myStepper.setSpeed(10); 
  myStepper.step(+5);  
  delay (500);
  myStepper.step(-5);
  delay (500);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("STEP N");
  lcd.print((char)223);
  lcd.print(":");
  lcd.setCursor(0,1);
  lcd.print("       0        ");
  }

void loop()
{
  lcd_key = read_buttons();
  switch (lcd_key) 
 {
  case btnUP:
  myStepper.setSpeed(50);
  {
    if (startPos < fine)
    {
      myStepper.step(1);
      startPos = startPos +1;
      lcd.setCursor(0,1);
      lcd.print("                ");
      lcd.setCursor(7,1);
      lcd.print(startPos);   
      delay(500);    
       break;
       }
    else 
    {
      lcd.setCursor(3,1);
      lcd.print("STEP LIMIT");
      break;
      }
  }

   
  case btnDOWN:
  myStepper.setSpeed(50);
  {
    if (startPos == startPos)
    {
      myStepper.step(-1);
      startPos = startPos -1;
      lcd.setCursor(0,1);
      lcd.print("                ");
      lcd.setCursor(7,1);
      lcd.print(startPos);
      delay(500);
      break;
      }
    else 
    {
     lcd.setCursor(3,1);
     lcd.print("STEP LIMIT");
     break;
     }
  }
   

  case btnRIGHT:
  myStepper.setSpeed(100);
  {
   if (startPos == 0)
   {
    myStepper.step(90);
    startPos = startPos +90;
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(7,1);
    lcd.print(startPos);   
    delay(500);    
    break;
    }
   else 
   {
    lcd.setCursor(0,1);
    lcd.print("go to step 0");
    delay (2000);
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(7,1);
    lcd.print(startPos);   
    break;
    }
  }

  case btnLEFT:
  myStepper.setSpeed(100);
  {
   if (startPos == 90)
   {
    myStepper.step(-90);
    startPos = startPos -90;
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(7,1);
    lcd.print(startPos);   
    delay(500);    
    break;
    }
   else 
   {
    lcd.setCursor(0,1);
    lcd.print("go to step 90");
    delay (2000);
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(7,1);
    lcd.print(startPos);   
    break;
    }
  }
 }
}

io continuo a vedere errori

    if (startPos = startPos)
    {

Mi era sfuggito, corretto anche sopra, grazie :cold_sweat: