motor driver L298N non riesco ad inserire un numero rotazioni

Ciao a tutti, mi scuso per disturbarvi per una cosa tanto banale, ma non ne salto fuori, ho scopiazzato uno sketch di esempio, il tutto funziona, ma se cerco di dire al motore di funzionare soltanto fino a quando il micro non è premuto, mi ignora completamente, per risultare più chiaro allego lo sketch:

static int pinAcceleratore = A0; //pin analogico deputato a leggere i valori del potenziometro
static int mA = 12; //pin digitale per determinare gli stati logici da inviare al modulo
static int mB = 13; //pin digitale per determinare gli stati logici da inviare al modulo
static int pinPotenza = 11; //pin digitale tramite il quale inviare un segnale di tipo PWM tramite la funzione analgWrite()
int accelerazione;  //valore letto dal pin A0
int potenza;  //valore in uscita dal pin 11
int x;
int limitswitchPinRotazioneAvantiTV=6;
void setup() {
  pinMode(limitswitchPinRotazioneAvantiTV, INPUT);
  Serial.begin(9600);
  accelerazione = 0;
  potenza = 0;
  pinMode(pinAcceleratore, INPUT); //input in quanto legge il valore analogico del pin A0
  pinMode(mA, OUTPUT); //output perche' definisce lo stato logico del pin IN1 del modulo L298N
  pinMode(mB, OUTPUT); //output perche' definisce lo stato logico del pin IN2 del modulo L298N
  pinMode(pinPotenza, OUTPUT);  //output perche' definisce il valore PWM del pin EN1 del modulo L298N
  digitalWrite(pinAcceleratore, LOW);
  digitalWrite(mA, LOW);
  digitalWrite(mB, HIGH);
}

void loop(){
  while(digitalRead(limitswitchPinRotazioneAvantiTV)==HIGH){
    accelerazione = analogRead(pinAcceleratore);
    potenza = map(accelerazione, 0, 1024, 0, 255);
    Serial.print("Accelerazione = ");
    Serial.print(accelerazione);
    Serial.print(" - potenza = ");
    Serial.println(potenza);
    digitalWrite(mA, LOW);
    digitalWrite(mB, HIGH);
    analogWrite(pinPotenza, potenza);
  }
}

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

prova a dirgli che limitswitchPinRotazioneAvantiTV è un INPUT

E mettici una resistenza di PullDown, altrimenti mettilo come INPUT_PULLUP e controlla quando va in LOW

Ti chiedo scusa Guglielmo sono stato poco educato, fatto mi sono presentato.

nanigago:
Ti chiedo scusa Guglielmo sono stato poco educato, fatto mi sono presentato.

Tranquillo, nessun problema, è ... mal comune :smiley: :smiley: :smiley: Benvenuto :slight_smile:

Guglielmo

resti nel WHILE finche il pulsante non é premuto e piloti il motore in PWM col valore analogico letto.
Ma dove é che spegni il motore? Una volta che non entra piú nel WHILE il valore PWM resta invariato.
Ciao Uwe

brunello22:
prova a dirgli che limitswitchPinRotazioneAvantiTV è un INPUT

E mettici una resistenza di PullDown, altrimenti mettilo come INPUT_PULLUP e controlla quando va in LOW

Seguendo il tuo consiglio ho apportato alcune modifiche e il segue sketch finalmente funziona come voglio,
grazie

static int pinAcceleratore = A0; //pin analogico deputato a leggere i valori del potenziometro
static int mA = 12; //pin digitale per determinare gli stati logici da inviare al modulo
static int mB = 13; //pin digitale per determinare gli stati logici da inviare al modulo
static int pinPotenza = 11; //pin digitale tramite il quale inviare un segnale di tipo PWM tramite la funzione analgWrite()
int accelerazione;  //valore letto dal pin A0
int potenza;  //valore in uscita dal pin 11
int x;
int limitswitchPinRotazioneAvantiTV=6;
void setup() {
  pinMode(6, INPUT_PULLUP);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
  accelerazione = 0;
  potenza = 0;
  pinMode(pinAcceleratore, INPUT); //input in quanto legge il valore analogico del pin A0
  pinMode(mA, OUTPUT); //output perche' definisce lo stato logico del pin IN1 del modulo L298N
  pinMode(mB, OUTPUT); //output perche' definisce lo stato logico del pin IN2 del modulo L298N
  pinMode(pinPotenza, OUTPUT);  //output perche' definisce il valore PWM del pin EN1 del modulo L298N
  digitalWrite(pinAcceleratore, LOW);
  digitalWrite(mA, LOW);
  digitalWrite(mB, HIGH);
}

void loop(){
  int sensorVal = digitalRead(6);
  if(sensorVal == HIGH){
    accelerazione = analogRead(pinAcceleratore);
    potenza = map(accelerazione, 0, 1024, 0, 255);
    digitalWrite(mA, LOW);
    digitalWrite(mB, HIGH);
    analogWrite(pinPotenza, potenza);
}
else{
  accelerazione = analogRead(pinAcceleratore);
  potenza = map(accelerazione, 0, 1024, 0, 255);
  digitalWrite(mA, LOW);
  digitalWrite(mB, LOW);
  analogWrite(pinPotenza, potenza);
}
}

Ciao scusate ma ho un altro problema, quello che segue è lo sketch completo, se commento il codice nei punti che ho chiamato commento 1 e commento 2 lo sketch funziona, tranne ovviamente la parte riguardante il motore deputato alla rotazione della tv, se tolgo i commenti lo sketch non si comporta correttamente i segnali inviati dal telecomando non producono l'azione corretta.
Cercherò di essere più chiaro, io voglio che premendo il tasto1 del telecomando il motore passo passo si azioni portando avanti la tv, che raggiunto il fine corsa aziona un secondo motore che la fa ruotare avanti fino a che tocca un altro finecorsa.
Premendo il tasto 0 volglio che avvenga il contrario, prima la tv deve ruotare per rimettersi in posizione orrizontale e poi toccato un micro deve avviare il motore passo passo per arretrare.

//Inclusione delle librerie necessarie
#include <SoftwareSerial.h>
#include <IRremoteInt.h>

#include <IRremote.h>
//Definizione dei pin
static int pinAcceleratore = A0; //pin analogico deputato a leggere i valori del potenziometro
static int mA = 12; //pin digitale per determinare gli stati logici da inviare al modulo (IN1)
static int mB = 13; //pin digitale per determinare gli stati logici da inviare al modulo (IN2)
//Definisco il senso di marcia del motore
  /*
    mA |   mB  | Evento
  -----|-------|----------------------
  LOW  | LOW   | fermo
  LOW  | HIGH  | Movimento in un senso
  HIGH | LOW   | Movimento senso opposto
  HIGH | HIGH  | Fermo
  */
static int pinPotenza = 11; //pin digitale tramite il quale inviare un segnale di tipo PWM tramite la funzione analgWrite() (ENA)
int accelerazione;  //valore letto dal pin A0
int potenza;  //valore in uscita dal pin 11
int limitswitchPinRotazioneAvantiTV=6; //pin di arduino collegato al segnale S del micro azionato quando la TV ruota avanti
int limitswitchPinRotazioneIndietroTV=5; //pin di arduino collegato al segnale S del micro azionato quando la TV ruota indietro
const int pinDir = 2; //pin di arduino collegato al pin DIR del dirver che comanda il motore passo-passo
const int pinStep = 3; //pin di arduino collegato al pin DIR del dirver che comanda il motore passo-passo
int limitswitchPinTVdentro=8; //pin di arduino collegato al segnale S del micro azionato quando la TV è completamente rientrata
int limitswitchPinTVfuori=7; //pin di arduino collegato al segnale S del micro azionato quando la TV è completamente uscita
const int numStepMotore = 200; //imposto il numero di step per rotazione del motore 
const long velocita = 400; //imposto i microsecondi tra un impulso e l'altro sul pin STEP a 500

int receiver = 10; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
void setup()
{
  pinMode(10,OUTPUT); // imposto il pin 10 che riceverà il segnale dal telecomando
  pinMode(limitswitchPinTVdentro,INPUT); //inizializzo il pin a cui è collegato il segnale del micro a TV rientrata
  pinMode(limitswitchPinTVfuori,INPUT); //inizializzo il pin a cui è collegato il segnale del micro a TV uscita
  pinMode(6, INPUT_PULLUP); //inizializzo il pin a cui è collegato il micro rotazione tv avanti
  pinMode(5, INPUT_PULLUP); //inizializzo il pin a cui è collegato il micro rotazione tv indietro
  pinMode(pinStep, OUTPUT); //inizializzo il PIN STEP come OUTPUT
  pinMode(pinDir, OUTPUT); //inizializzo il PIN DIR come OUTPUT
  pinMode(mA, OUTPUT); //inizializzo il PIN mA (IN1)come OUTPUT 
  pinMode(mB, OUTPUT); //inizializzo il PIN mB (IN2)come OUTPUT
  pinMode(pinAcceleratore, INPUT); //inizializzo il PIN A0 come OUTPUT  
  pinMode(pinPotenza, OUTPUT); //inizializzo il PIN 11 come OUTPUT
  digitalWrite(mA, LOW); // imposto come fermo il motore
  digitalWrite(mB, LOW); //             "
  
  Serial.begin(9600); // for serial monitor output
  irrecv.enableIRIn(); // Start the receiver
  pinMode(9, OUTPUT); // Pin 9 output
}
void loop()
{
  int sensorVal = digitalRead(6);
 
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
    irrecv.resume();// receive the next value
  }

  if ( results.value == 0xB4B4DC23 ) //se premo il tasto 1 sul telecomando
  {
    while(digitalRead(limitswitchPinTVfuori)==HIGH){
      digitalWrite(9, HIGH); //il LED si accende
      digitalWrite(pinDir, HIGH);
      for (int x = 0; x < numStepMotore; x++ ) {
        digitalWrite(pinStep, HIGH);
        delayMicroseconds(velocita);
        digitalWrite(pinStep, LOW);
        delayMicroseconds(velocita);
        }
    }
    
  /* commento1
if(sensorVal == HIGH){
    accelerazione = analogRead(pinAcceleratore);
    potenza = map(accelerazione, 0, 1024, 0, 255);
    digitalWrite(mA, LOW);
    digitalWrite(mB, HIGH);
    analogWrite(pinPotenza, potenza);
    }*/
  }
  if ( results.value == 0xB4B422DD ) //se premo il tasto 0 sul telecomando
  {
    /*commento2
while(digitalRead(limitswitchPinRotazioneIndietroTV)==HIGH){
      digitalWrite(mA, HIGH);
      digitalWrite(mB, LOW);
      }*/
      while(digitalRead(limitswitchPinTVdentro)==HIGH){
        digitalWrite(9, LOW);
        digitalWrite(pinDir, LOW);
        for (int x = 0; x < numStepMotore; x++ ) {
          digitalWrite(pinStep, HIGH);
          delayMicroseconds(velocita);
          digitalWrite(pinStep, LOW);
          delayMicroseconds(velocita);
      }
      }
  }
}