LCD con comando Bottone e rotazione motore [RISOLTO]

Devo fare girare due motori DC con quattro bottoni vedere sul LCD l'impulso della rotazione (tramite contatto magnetico)
e trasmettere sul schild le due entrate per i due motori avanti indietro e velocità :astonished:
ecco raggiunto fin ora esperimentale(manca ultima parte e comanda solo un motore)
Pin liberi 6/13
tutto occupato da 4 bottoni e lcd
e fattibile usare ini dello stesso numero pin
o domando troppo per arduino... XD
Grazie

#include <LiquidCrystal.h>
int in=7;         //+Verticale 
int in2=8;        //+Orizzontale
int in3=9;        //-Verticale
int in4=10;       //-Orizzontale

 int pinDirA=10;   //Motore DC Direzione
 int pinDirB=8;   //Motore Dc Direzione
 int pinPwmA=3;   //Pwm 
 int pinPwmB=9;   //Pwm      Nota!!!!da sistemare i Pin!!! 

int a = 0;
int b = 0;
int c= 0;
int d = 0;


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  pinMode(in,INPUT);
  lcd.begin(16, 2);
  lcd.print("Il MioSat");
  delay(2000); lcd.clear();
  lcd.setCursor(11,1);
  lcd.print("");
  lcd.setCursor(0, 0);
  lcd.print("Oriz.");
  lcd.setCursor(0, 1);
  lcd.print("Vert.");
  
  pinMode( pinDirA,OUTPUT );
   pinMode( pinPwmA,OUTPUT );
   pinMode( pinDirB,OUTPUT );
   pinMode( pinPwmB,OUTPUT );
  
}

void loop() {

  c=digitalRead(in);
  if ( c== 1){b=b+1; delay(500);}
  c=digitalRead(in3);
  if ( c== 1){b=b-1; delay(500);}
  d=digitalRead(in2);
  if ( d== 1){a=a+1;delay(500);}
  d=digitalRead(in4);
  if ( d== 1){a=a-1;delay(500);}
 
 
  lcd.setCursor(6, 0);
  lcd.print(a); lcd.print(" ");
  lcd.setCursor(6, 1); 
  lcd.print(b); lcd.print(" "); 
  
   digitalWrite( pinDirA,HIGH );
   digitalWrite( pinDirB,HIGH );
   //       velocità massima
   analogWrite( pinPwmA,255 );
   analogWrite( pinPwmB,255 );
 
   delay(5000);

   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,LOW );
   //       velocità massima
   analogWrite( pinPwmA,255 );
   analogWrite( pinPwmB,255 );

Più che ad Arduino chiedi troppo all'italiano! :smiley:

Lo LCD usa 6 pin, 4 pulsanti altri 4 pin, ogni motore controllato in PWM usa 3 pin (velocità, direzione e reed) = 16 pin.

Usando i cinque ingressi analogici come digitali dovresti farcela.

XD L'italiano....
forse non sono troppo italiano :cold_sweat:
dici che A1 A2 analogici ecc si possono usare per i pulsanti!!
viene scritto A1 =comando bottone!

int in2=A1;

era solo una domanda per non perdere troppo tempo per poi rimanere bocca asciutta :wink:
provo Grazie

Sì, gli ingressi analogici possono essere utilizzati come digitali imponendo nel Setup

  pinMode(A1, INPUT_PULLUP);                   // pulsante 1
  pinMode(A2, INPUT_PULLUP);                   // pulsante 2
  pinMode(A3, INPUT_PULLUP);                   // pulsante 3
  pinMode(A4, INPUT_PULLUP);                   // pulsante 4

Nota che inserendo l'opzione INPUT_PULLUP il collegamento non necessita di resistori di pull-up poiché si sfrutta un resistore da 20k interno ad Arduino collegato ai +5V.
Basta collegare un estremo del pulsante a massa (GND) e l'altro all'ingresso analogico, tenendo presente che quando verrà premuto l'istruzione digitalRead(A1) restituirà LOW.

ok tolgo int e metto (pin mode)
poi cambio in A1,A2 ecc in void loop come sotto!
il pulsante viene specificato ora in A1 e non più int
non cambia se e( c=digitalRead)??
c=digitalRead(A1);<------

Dunque!

void loop() {

   c=digitalRead(A1);<------
  if ( c== 1){b=b+1; delay(500);}
  c=digitalRead(A2);
  if ( c== 1){b=b-1; delay(500);}
  d=digitalRead(A3);
  if ( d== 1){a=a+1;delay(500);}
  d=digitalRead(A4);
  if ( d== 1){a=a-1;delay(500);}

Giusto??!! scus della mia ingoranza :expressionless: ma applico solo la logica non ho studiato.....
Grazie

#include <LiquidCrystal.h>

byte PinButton1 = A1;         // aumenta velocità motore 1
byte PinButton2 = A2;        // diminuisci velocità motore 1
byte PinButton3 = A3;        // aumenta velocità motore 2
byte PinButton4 = A4;       // diminuisci velocità motore 2

byte pinDir1 = 10;   // direzione motore 1
byte pinDir2 = 8;   // direzione motore 2 
byte pinPWM1 = 3;   // PWM motore 1 
byte pinPWM2 = 9;   // PWM motore 2

int Vel1 = 0;     // velocità motore 1
int Vel2 = 0;    // velocità motore 2

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  pinMode(PinButton1 , INPUT_PULLUP);   // inserito resistore di pull up!
  pinMode(PinButton2 , INPUT_PULLUP);  // inserito resistore di pull up!
  pinMode(PinButton3, INPUT_PULLUP);  // inserito resistore di pull up!
  pinMode(PinButton4, INPUT_PULLUP);  // inserito resistore di pull up!
  pinMode(PinDir1, OUTPUT );
  pinMode(PinPWM1, OUTPUT );
  pinMode(PinDir2, OUTPUT );
  pinMode(PinPWM2, OUTPUT );
  
  lcd.begin(16, 2);
  lcd.print("Il MioSat");
  delay(1000);
  lcd.clear();
  lcd.setCursor(11, 1);
  lcd.print("");
  lcd.setCursor(0, 0);
  lcd.print("Oriz.");
  lcd.setCursor(0, 1);
  lcd.print("Vert.");
}

void loop() {

  if (digitalRead(PinButton1) == LOW) Vel1  ++;
  else if (digitalRead(PinButton2) == LOW) Vel1 --;
  else if (digitalRead(PinButton3) == LOW) Vel2 ++;
  else if (digitalRead(PinButton4) == LOW) Vel2 --;

  Vel1 = constrain(Vel1, 0, 255);  // limita Vel1 tra 0 e 255
  Vel2 = constrain(Vel2, 0, 255); // limita Vel2 tra 0 e 255

   digitalWrite(PinDir1, HIGH);     // motore 1 avanti
   analogWrite(PinPWM1, Vel1);

   digitalWrite(PinDir2, HIGH);     // motore 1 avanti
   analogWrite(PinPWM2, Vel2);

   delay(3000);

   digitalWrite(PinDir1, LOW );     // motore 1 indietro
   analogWrite(PinPWM1, Vel1);

   digitalWrite(PinDir2, LOW );    // motore 2 indietro
   analogWrite(PinPWM2, Vel2);

  lcd.setCursor(6, 0);
  lcd.print(Vel1); lcd.print(" ");
  lcd.setCursor(6, 1); 
  lcd.print(Vel2); lcd.print(" "); 
}

:slight_smile:

byte pinDir1 = 10;   // direzione motore 1
byte pinDir2 = 8;   // direzione motore 2 
byte pinPWM1 = 3;   // PWM motore 1 
byte pinPWM2 = 9;   // PWM motore 2

La verifica mi da errore,  pinMode(PinDir1, OUTPUT );
does not name a type
in fondo mi serve solo la lettura del contatore,che ad ogni giro lo dava in gradi
per sapere la posizione,per quello che riguarda i motori penso di lasciare perdere!
lo farò meccanicamente con relè vedrò se fattibile usare un relè a 5 volt che mi comanda il motore
grazie comunque

Prima la variabile viene dichiarata come pinDir1 e poi viene indicata come PinDir1. Il C/C++ è case-sensitivi e quelli sono 2 nomi diversi. Cambia uno dei due.

Infatti :fearful: non ho visto!
la maiuscola :astonished:
il motore viene alimentato sulla scheda Arduino?
so che come amperaggio e molto limitato,voglio provare con una scheda relè
per aumentare gli Amp. fatto stare che non posso regolare la tensione/Velocità....però!!!
Grazie per lo sketch