Stoppare motori DC tramite sensore HC SR04

Ciao Ragazzi =) Mi chiamo Leo e sono nuovo nel forum. Questo è il mio primo topic.
Ho un problema nel realizzare un progetto con Arduino UNO, con un sensore ad ultrasuoni HC SR04 e un driver per pilotare motori DC (LN298N) a doppio ponte H.

Praticamente ho collegato i motori al driver. Sul driver sono presenti 6pin: dal pin 1 e dal pin 6 vado a fornire tensione ai motori tramite Arduino.
Il pin 1 del driver è collegato al pin digitale 11 e il pin 2 al pin digitale 9 di Arduino.
Inoltre regolo la velocità dei motori attraverso un potenziometro.
Fin qui tutto funziona regolarmente.

Adesso vorrei inserire un sensore ad Ultrasuoni in modo tale che quando vede un ostacolo porti a livello logico basso i pin 11 e 9 di arduino.
Ho provato ad utilizzare la funzione "if" ed "else" nello sketch ma senza risultati.
Allego lo sketch del funzionamento dei motori e del driver.

Spero qualcuno riesca ad aiutarmi nell'inserimento della funzione che fa disattivare i motori attraverso il sensore.

Grazie in anticipo =)

Controllo_motori_DC_tramite_L298N.ino (2.66 KB)

Ciao leo, benvenuto nel forum! (Se non lo avessi già fatto, preparati nell'apposita sezione eh :wink: )

If ed else vanno benissimo se i collegamenti sono giusti, ma ricordati di racchiudere la funzione in un loop, in modo che controlli sempre. Posto qui il codice aggiornato a ieri del mio robottino, spero ti sia utile, controlla la parte "exploration e usdis".

//------------------------------------------------/*/*variables and libraries*\*\---------------------------------------------
#include <IRremote.h>

const int receiver = 6;
IRrecv irrecv(receiver);
decode_results results;

const int mot1fr = 2;
const int mot1bk = 3;
const int mot2fr = 4;
const int mot2bk = 5;
const int trigger = 7;
const int echo = 8;
const int mode = A0;
const int rgRed = A1;
const int rgGreen = A2;

int valmode = 0;
int valecho = 0;
int usdelay = 0;
int usdistance = 0;
int valir = 0;
//------------------------------------------------/*/*setup*\*\------------------------------------------------
void setup() {

  pinMode(mot1fr, OUTPUT);
  pinMode(mot1bk, OUTPUT);
  pinMode(mot2fr, OUTPUT);
  pinMode(mot2bk, OUTPUT);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);

  irrecv.enableIRIn();

}
//------------------------------------------------/*/*loop*\*\------------------------------------------------
void loop() {

  valmode = analogRead(mode);

  if (valmode >= 0 && valmode <= 10) {
    manual();
    manualLed();

  } else if (valmode >= 20 && valmode <= 30) {
    resetLed();
    analogWrite(rgGreen, 255);
    exploration();

  } else {
    motorStop();
    waitingLed();

  }
}
//------------------reset led status------------------
void resetLed() {

analogWrite(rgRed,0);
analogWrite(rgGreen,0);

}
//------------------manual mode led status------------------
void manualLed() {

  resetLed();
  analogWrite(rgRed, 255);
  analogWrite(rgGreen, 128);
  delay(150);
  analogWrite(rgGreen, 0);
  delay(150);

}
//------------------waiting led status------------------
void waitingLed() {

resetLed();
analogWrite(rgRed,255);
analogWrite(rgGreen,255);
delay(150);
analogWrite(rgGreen,128);
analogWrite(rgRed,0);
delay(150);
analogWrite(rgGreen, 0);
analogWrite(rgRed, 128);
delay(150);

}
//------------------exploration mode------------------
void exploration() {

  while (!irrecv.decode(&results)) {
    usdis();
    if (usdistance > 10) {
      goForward();

    } else {

      turnLeft();
      analogWrite(rgRed, 128);
      delay(100);
      analogWrite(rgRed, 128);
      delay(100);

    }
  }
  motorStop();

}
//------------------manual mode------------------
void manual() {

  if (irrecv.decode(&results)) {

    switch(results.value) {

    case 16615543:
      goForward();
      break;

    case 16619623:
      goBack();
      break;

    case 16591063:
      turnLeft();
      break;

    case 16607383:
      turnRight();
      break;

    case 16623703:
      motorStop();
      break;

    }
    irrecv.resume();
  }
}
//------------------ultrasonic module controller------------------
void usdis() {

  digitalWrite(trigger, LOW );
  digitalWrite(trigger,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger,LOW);
  usdelay = pulseIn(echo, HIGH );
  usdistance = 0.034 * usdelay / 2;
}
//------------------------------------------------/*/*motor controller*\*\------------------------------------------------
void motorStop() {

  digitalWrite(mot1fr,LOW);
  digitalWrite(mot1bk, LOW);
  digitalWrite(mot2fr, LOW);
  digitalWrite(mot2bk, LOW);
}

void goForward() {

  motorStop();
  digitalWrite(mot1fr, HIGH);
  digitalWrite(mot2fr, HIGH);
}

void goBack() {

  motorStop();
  digitalWrite(mot1bk, HIGH);
  digitalWrite(mot2bk, HIGH);
}

void turnRight() {

  motorStop();
  digitalWrite(mot2bk, HIGH);
  digitalWrite(mot1fr, HIGH);
}

void turnLeft() {

  motorStop();
  digitalWrite(mot1bk, HIGH);
  digitalWrite(mot2fr, HIGH);
}

Ciao.

P.s. essendo da telefono non posso controllare il tuo codice, spero quindi di non aver detto qualcosa effettivamente già eseguito.

Ciao =) Grazie per avermi risposto. Allora ho provato ma senza risultati. Evidentemente c'è un problema di sintassi.
Allora ho appena collegato il sensore ad ultrasuoni collegando il pin "echo" al pin 3 e il e il pin "trig" al pin 4 di arduino.

Ho definito:
const int pin_echo = 3;
const int pin_trig = 4;

Successivamente nel void step ho impostato:

pinMode (pin_echo, INPUT);
pinMode (pin_trig, OUTPUT);

Ora nel void loop come devo fare per far disattivare il pin 9 e il pin 11 in caso di ostacolo?

In pratica devi usare una parte di codice (cone io uso in usdis()) per calcolare la distanza, poi in un loop controlli con un if che la distanza sia sotto un certo limite. Se lo è, va avanti, se non lo è i motori si fermano.

 void distanza() {

 digitalWrite(trigger, LOW );
  digitalWrite(trigger,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger,LOW);
  usdelay = pulseIn(echo, HIGH );
  usdistance = 0.034 * usdelay / 2;
}

(Questo frammento di codice, ovviamente da modificare con nomi e variabili a tuo piacere, serve a decifrare la distanza)

void loop (o qualsiasi altro loop) {
 if {distanza >= 10}

Vaiavanti();

}else{ 

Fermati();
}

Questo invece è a grandissime linee il loop da usare, come esempio ho usato 10 cm di distanza.

Ti potrò aiutare meglio quando sarò a casa :wink:

Ho seguito la tua guida scrivendo così (facendo un circuito di prova). Non ho capito però quali dovrebbero essere i valori da dare a usdistance e usdelay;

Ho fatto così:

const int pin_echo = 2;
const int pin_trig = 1;
const int pin_motore = 0;

int usdistance = 1;
int usdelay = 1;

void setup() {
// put your setup code here, to run once:
pinMode (pin_echo, INPUT);
pinMode (pin_trig, OUTPUT);
pinMode (pin_motore, OUTPUT);
}

void distanza () {

digitalWrite (pin_trig, LOW);
digitalWrite (pin_trig, HIGH);
delayMicroseconds (10);
digitalWrite (pin_trig, LOW);
usdelay = pulseIn (pin_echo, HIGH);
usdistance = 0.034 * usdelay / 2;
}

void loop() {
// put your main code here, to run repeatedly:

if {distanza > 10}
digitalWrite (pin_motore, LOW);
}else {
digitalWrite (pin_motore, HIGH);

}

Scusami, ero distratto e mi sono scordato di inserire una cosa fobdamentale nel frammento di codice :grin:

Innanzitutto cerca di lasciare liberi i pin0 ed 1, che sono particolari, poi devi inserire "distanza();" nel loop, in modo che richiami le operazioni da fare colsensore, poi decida il da farsi.

Per i valori da dare, inizialmente per chiamare una variabile usa sempre lo 0, poi sarà il sensore a gestire il numero che sarà assegnato alla variabile.

const int pin_echo = 4;
const int pin_trig = 3;
const int pin_motore = 2;

 int distanzacm = 0;
 int attesa = 0;

void setup() {
  // put your setup code here, to run once:
pinMode (pin_echo, INPUT);
pinMode (pin_trig, OUTPUT);
pinMode (pin_motore, OUTPUT);
}

void distanza() {

  digitalWrite (pin_trig, LOW);
  digitalWrite (pin_trig, HIGH);
  delayMicroseconds (10);
  digitalWrite (pin_trig, LOW);
  attesa = pulseIn (pin_echo, HIGH);
  distanzacm = 0.034 * usdelay / 2;
}

void loop() {
  // put your main code here, to run repeatedly:

distanza();
  if {distanzacm > 10}
  digitalWrite (pin_motore, HIGH);
}else {
  digitalWrite (pin_motore, LOW);

}

Tranquillo =) Mi da degli errori nella fase di compilazione: expected '(' before '{' token (alla riga "if { distanza > 10}.

In questo modo lo carica ma non funziona niente =(

const int pin_echo = 4;
const int pin_trig = 3;
const int pin_motore = 2;

int distanzacm = 0;
int attesa = 0;

void setup() {
// put your setup code here, to run once:
pinMode (pin_echo, INPUT);
pinMode (pin_trig, OUTPUT);
pinMode (pin_motore, OUTPUT);
}

void distanza() {

digitalWrite (pin_trig, LOW);
digitalWrite (pin_trig, HIGH);
delayMicroseconds (10);
digitalWrite (pin_trig, LOW);
attesa = pulseIn (pin_echo, HIGH);
distanzacm = 10;
}

void loop() {
// put your main code here, to run repeatedly:

if (distanzacm > 10)
{
digitalWrite (pin_motore, HIGH);}
else
{
digitalWrite (pin_motore, LOW);
}
}

leomilillo:
In questo modo lo carica ma non funziona niente =(

const int pin_echo = 4;
const int pin_trig = 3;
const int pin_motore = 2;

int distanzacm = 0;
int attesa = 0;

void setup() {
// put your setup code here, to run once:
pinMode (pin_echo, INPUT);
pinMode (pin_trig, OUTPUT);
pinMode (pin_motore, OUTPUT);
}

void distanza() {

digitalWrite (pin_trig, LOW);
digitalWrite (pin_trig, HIGH);
delayMicroseconds (10);
digitalWrite (pin_trig, LOW);
attesa = pulseIn (pin_echo, HIGH);
distanzacm = 10;
}

void loop() {
// put your main code here, to run repeatedly:

if (distanzacm > 10)
{
digitalWrite (pin_motore, HIGH);}
else
{
digitalWrite (pin_motore, LOW);
}
}

hai sostituito il calcolo matematico che determina la distanza con 10, che non serve a nulla, per questo non funziona, sostituiscilo con questo: distanzacm = 0.034 * usdelay / 2;

codice completo:

const int pin_echo = 4;
const int pin_trig = 3;
const int pin_motore = 2;

 int distanzacm = 0;
 int attesa = 0;

void setup() {

pinMode (pin_echo, INPUT);
pinMode (pin_trig, OUTPUT);
pinMode (pin_motore, OUTPUT);

}

void distanza() {

  digitalWrite (pin_trig, LOW);
  digitalWrite (pin_trig, HIGH);
  delayMicroseconds (10);
  digitalWrite (pin_trig, LOW);
  attesa = pulseIn (pin_echo, HIGH);
  distanzacm = 0.034 * attesa / 2;
}

void loop() {


  if (distanzacm >= 10) {

  digitalWrite (pin_motore, HIGH);

} else {
  
digitalWrite (pin_motore, LOW);
 
}
}

Perfetto =) Ha caricato il programma. Ma purtroppo non c'è segno di vita.
Il motore funziona perfettamente e il sensore anche e i collegamenti sono giusti. =(

Mi arrendo. Non so più come fare

RISOLTO!!!!!!!

const int pin_echo = 11;
const int pin_trig = 12;
const int pin_motore = 10;

int distanzacm = 0;
int attesa = 0;

void setup() {

pinMode (pin_echo, INPUT);
pinMode (pin_trig, OUTPUT);
pinMode (pin_motore, OUTPUT);

}

void loop() {

digitalWrite (pin_trig, LOW);
delayMicroseconds (10);
digitalWrite (pin_trig, HIGH);
delayMicroseconds (10);
digitalWrite (pin_trig, LOW);
attesa = pulseIn (pin_echo, HIGH);
distanzacm = 0.034 * attesa / 2;
delay (250);

if (distanzacm > 10) {

digitalWrite (pin_motore, HIGH);

} else {

digitalWrite (pin_motore, LOW);

}
}

Meglio così, bravo :slight_smile: .

Onestamente non ho avuto problemi col codice che ti avevo scritto, dato che lo uso io stesso con un sensore cinesone, ma si vede che tra il tuo ed il mio ci sono delle differenze.