Conflitto VirtualWire.h e sensore SR04

Salve a tutti!
mentre realizzavo un piccolo progetto di un macchinina a tre ruote ho avuto più di un problema con la libreria VirtualWire.h, vi spiego il progetto, la macchina viene comandata tramite un accelerometro montato su un guanto, i segnali vengono inviati tramite un modolo TX 315-433MHz. In ricezione c’è il modulo RX complementare, un driver motori TB6612FNG che comanda due motori in continua e il modulo HC-SR04.
Ho implementato passo passo ogni modulo, inizialmente utilizzavo sia la libreria per i servomotori (SparkFun_TB6612.h) che la VirtualWire ed avevo problemi nel comando dei motori (facevano un po’ come gli pareva) ho optato quindi per il set dei segnali per il dirver eliminando la rispettiva libreria (no mi piace molto ma almeno funziona…). Una volta implementato anche il modulo ad ultrasuoni, utilizzando la libreria NewPing.h ho di nuovo problemi, infatti se da solo il modulo funziona perfettamente implementato nel programma non legge nulla e sulla porta seriale mi restituisce che la distanza è pari a 0.
Iniziando a fare un po’ di prove a ritroso ho visto che commentando il comando vw_setup(2000); il modulo torna a funzionare naturalmente però non funziona più la radio.
Ho provato allora a non servirmi della libreria per il modulo SR04 ma ho lo stesso identico problema…
Sto cercando di capire se c’è un problema con il timer interno ma leggendo la libreria VirtualWire non riesco a capire come viene usato…
vi posto sotto l’ultimo codice che sto utilizzando

#include <VirtualWire.h>
//#include <SparkFun_TB6612.h>

//DICHIARAZIONE ED INIZIALIZZAZIONE VARIABILI GLOBALI
int trigger = 13;
int echo = 12;
int ain1 = 7;
int bin1 = 4;
int ain2 = 8;
int bin2 = 2;
int pwma = 6;
int pwmb = 5;
int stby = 3;
const int receive_pin = 11;


void setup() {
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(ain2, OUTPUT);
  pinMode(ain1, OUTPUT);
  pinMode(pwma, OUTPUT);
  pinMode(bin2, OUTPUT);
  pinMode(bin1, OUTPUT);
  pinMode(pwmb, OUTPUT);
  pinMode(stby, OUTPUT);
  pinMode(11, INPUT);

  Serial.begin(9600);
  digitalWrite(stby, HIGH);                             //abilitazione bit stby per motor
  vw_set_rx_pin(receive_pin);
  vw_setup(2000);                                       // Bits per sec
  vw_rx_start();                                        // Start the receiver PLL running
}

void loop() {
          digitalWrite(trigger, LOW);                         //porta bassa l'uscita del trigger
          digitalWrite(trigger, HIGH);                        //invia un impulso di 10microsec su trigger
          delayMicroseconds(10);
          digitalWrite(trigger, LOW);

          long durata, distanza;

          durata = pulseIn(echo, HIGH);
          distanza = 0.034 * durata / 2;

          Serial.print("Durata: ");
          Serial.println(durata);
          Serial.print("Distanza: ");
          Serial.println(distanza);

          if (durata > 38000) {                               //dopo 38ms ostacolo fuori portata
            Serial.print("Nessun ostacolo");
          }
          else {
            Serial.print(distanza);
            Serial.println(" cm");
          }

          delay(1500);                                        //aspetta 1.5 secondi

  int xaxis, yaxis, group, command;
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) {
    Serial.println("Got it:");

    group = buf[0];
    xaxis = buf[1];
    yaxis = buf[2];
    command = buf[3];

    Serial.println(group);
    Serial.println(xaxis);
    Serial.println(yaxis);
    Serial.println(command);

    if (group == 16) {
      Serial.println("OK");
      switch (command) {
        case 1:
          digitalWrite(ain1, LOW);
          digitalWrite(ain2, LOW);
          digitalWrite(bin1, HIGH);
          digitalWrite(bin2, HIGH);
          analogWrite(pwma, 0);
          analogWrite(pwmb, 0);
          digitalWrite(stby, HIGH);
          break;
        case 2:
          digitalWrite(ain1, HIGH);
          digitalWrite(ain2, LOW);
          digitalWrite(bin1, HIGH);
          digitalWrite(bin2, LOW);
          analogWrite(pwma, abs(yaxis));
          analogWrite(pwmb, 0);
          break;
        case 3:
          digitalWrite(ain1, HIGH);
          digitalWrite(ain2, LOW);
          digitalWrite(bin1, HIGH);
          digitalWrite(bin2, LOW);
          analogWrite(pwma, 0);
          analogWrite(pwmb, abs(yaxis));

          break;
        case 4:
          digitalWrite(ain1, HIGH);
          digitalWrite(ain2, LOW);
          digitalWrite(bin1, HIGH);
          digitalWrite(bin2, LOW);
          analogWrite(pwma, abs(yaxis));
          analogWrite(pwmb, abs(yaxis));
          break;
        case 5:
          digitalWrite(ain1, HIGH);
          digitalWrite(ain2, LOW);
          digitalWrite(bin1, HIGH);
          digitalWrite(bin2, LOW);
          analogWrite(pwma, abs(yaxis));
          analogWrite(pwmb, (abs(yaxis) - 40));
          break;
        case 6:
          digitalWrite(ain1, HIGH);
          digitalWrite(ain2, LOW);
          digitalWrite(bin1, HIGH);
          digitalWrite(bin2, LOW);
          analogWrite(pwma, (abs(yaxis) - 40));
          analogWrite(pwmb, abs(yaxis));

          break;
        case 7:
          digitalWrite(ain1, LOW);
          digitalWrite(ain2, HIGH);
          digitalWrite(bin1, LOW);
          digitalWrite(bin2, HIGH);
          analogWrite(pwma, abs(yaxis));
          analogWrite(pwmb, abs(yaxis));
          break;
        case 8:
          digitalWrite(ain1, LOW);
          digitalWrite(ain2, HIGH);
          digitalWrite(bin1, LOW);
          digitalWrite(bin2, HIGH);
          analogWrite(pwma, abs(yaxis));
          analogWrite(pwmb, (abs(yaxis) - 40));
          break;
        case 9:
          digitalWrite(ain1, LOW);
          digitalWrite(ain2, HIGH);
          digitalWrite(bin1, LOW);
          digitalWrite(bin2, HIGH);
          analogWrite(pwma, (abs(yaxis) - 40));
          analogWrite(pwmb, abs(yaxis));
          break;

          Serial.println(command);
      }
    }
  }
}

grazie!

Non so se sia nel tuo caso qualcosa di diverso dal problema che io ho avuto con gli SR04, ma a me hanno sempre dato problemi, ossia spesso sono fallati ossia si "bloccano" in stato HIGH per cui iniziano a leggere sempre distanza 0.

Per questo motivo non solo non compro più gli SR04, sostituiti dagli HC-SRF05, ma ho anche realizzato una libreria che è in grado anche di cercare di "sbloccare" gli SR04 fallati.
La trovi qui:

Prova e fammi sapere.

grazie per la risposta, ho provato ad usare la tua libreria ma nulla di fatto, ho anche provato con un diverso sensore che avevo ma nemmeno in quel caso ho risolto.
Usando la tua libreria mi chiedeva di dichiarare unblock, l'ho dichiarato da prima int e poi bool ma comunque sia non funzionava in entrambi i casi.
Una cosa buona c'è però (forse), infatti quando prima commentavo la riga vw_setup(); il sensore tornava a funzionare mentre invece ora con la tua libreria anche commentando quella riga non funziona.
L'unica cosa che mi viene in mente è che c'è qualche inghippo con i timer dell' atmega, oppure potrebbe anche esserci qualche problema con il compilatore... (mi è capitato con lo stesso codice compilato su due pc diversi e fatto girare sulla stessa scheda in un caso andava nell'altro no)
Non so proprio come risolvere...

Unblock è una property dell'oggetto, devi solo assegnarli il valore true se vuoi attivare lo "sblocco" deli SR04, non c'è da dichiarare nulla... Per curiosità, potresti postare il codice nel quale hai usato la libreria SRF05 (o almeno le parti dove la dichiari e dove la usi) così provo a capire?

>naper: non avendolo tu ancora fatto, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (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 il su citato REGOLAMENTO ... Grazie.

Guglielmo

> docdoc: Ti prego, prima di rispondere, di verificare sempre se l'utente abbia effettuato la presentazione, cosa che, ovviamente, NON può essere possibile se il suo numero di post è 1. Grazie anticipatamente per la collaborazione. :slight_smile:

Guglielmo si, hai perfettamente ragione, scusami, in genere sai che lo faccio, ma ho letto e risposto dal cellulare e sulla versione mobile del browser non viene indicato il numero di post dell'autore...

Scusate, mi sono appena presentato.
Ritornando al discorso, quando compilavo lo sketch mi diceva che unblock non era dichiarato, purtroppo però da ieri di codici ne ho fatti e non lo ho più quello con implementata la tua libreria.
Comunque ho risolto il problema... anche se rimane un po' un mistero... provo a spiegare, ho riutilizzato la libreria SparkFun_TB6612 usando la funzione motor.drive invece che le funzioni forward, back, ecc... ed ho cambiato i pin a cui sono collegati sia l'RX che ilsensore ad ultrasuoni...
Ora tranne qualche problema di latenze (che non so come risolvere senza usare le interrupt )sembra andare tutto ok