Ultrasonic range sensor mit RF-Link

Hallo Leute,
ich bin neu hier im Forum. Beschäftige mich schon einige Zeit mit Arduino würde mich trotzdessen noch der Anfänger-Fraktion zuordnen.

Ich hatte mir einen günstigen Ultasonic range sensor bestellt (die mit je einem Trigger- und einem Echo Pin).
Ich habe damit dann ein wenig rumexperimentiert und diesen u.a mit einem LCD und einem Buzzer kombiniert.

Nun wollte ich diese beiden Stationen trennen. Auf einem Standalone-Arduino soll nun nur der Sensor-Code und auf dem anderen der LCD und Buzzer laufen. Verbunden wurden diese beiden Teile mit 433MHz RF-Links.

Der Sensor war im normalen Aufbau sehr genau. Mit dem RF-Links weicht dieser bei manchen Messungen teilweise um 4 cm ab.
Nur weiß ich leider nicht warum. Ich habe irgendwie die umwandlung mit long, int etc im Auge, kenne mich da aber nicht ganz so perfekt aus.

Hier mal der Rx und Tx Teil:

/*
Tx-Part
connect the Transmitter data pin to Arduino pin 12
*/

#include <VirtualWire.h>
#define trigPin 10
#define echoPin 11

const int numberOfDigitalPins = 1; // Anzahl einzulesender Pins
long data[numberOfDigitalPins]; // Der Datenpuffer
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer



void setup(){
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // Initialize the IO and ISR
  vw_setup(2000); // Bits per sec
  
}

void loop() {

  long time;
  long x;
  
//Messung
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH); 
  
  //Umrechnung in cm
  x = (time/2) / 29.1;  
  
  long values = 0; 
  for(int i=0; i <= numberOfDigitalPins; i++) 
  {
  // Wert in Array
  data[i] = x; // Wert im Datenpuffer speichern 
  }
  send((byte*)data, dataBytes);
  delay(1000); // Einmal pro Sekunde senden
  
}




void send (byte *data, int nbrOfBytes) 
{
  vw_send(data, nbrOfBytes);
  vw_wait_tx(); // Warten, bis gesamte Nachricht gesendet wurde 
}

und hier der Rx -Part

  /*
  Rx
  Connect the Receiver data pin to Arduino pin 11
  */

#include <VirtualWire.h>

const int numberOfDigitalPins = 1; // Anzahl zu empfangender Integerwerte 
long data[numberOfDigitalPins]; // Der Datenpuffer 
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer
byte msgLength = dataBytes;


void setup() {
  
  Serial.begin (9600);
  Serial.println("Device is ready");
  
  // Initialize the IO and ISR
  vw_set_ptt_inverted(true); 
  vw_setup(2000); // Bits per sec
  vw_rx_start(); // Start the receiver
}

void loop() {

  
  if (vw_get_message((byte*)data, &msgLength)) // Non-blocking 
  {
    Serial.println("Empfangen: "); 
    if(msgLength == dataBytes) 
    {
      for (int i = 0; i < numberOfDigitalPins; i++)
      {
        Serial.print("Distanz: ");  
        Serial.print(data[i]);
        Serial.println(" cm"); 
      }
     }
     
    else 
    {
      Serial.print("Falsche Nachrichtenlänge: "); 
      Serial.println(msgLength);
    }

    Serial.println(); 
  }

}

Ich habe jetzt mal der Einfachheithalber das LCD und den Buzzer rausgelassen.
Ich weiß, dass bei einem Datenwert ein Array nicht nötig wäre und das die Variablenbennung im RF Part etwas verwirrend ist. Ich habe mich jedoch an dieser Stelle an einem anderen Beispiel orientiert und dies so gelassen.

Zum Vergleich:
Das ist das Beispiel mit dem simplen Aufbau (nur Sensor): Dieser funktioniert einwandfrei.

#define trigPin 10
#define echoPin 11

void setup() {
  
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 

}

void loop() {
 
  long time;
  long x;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH); 
  
  //x=(time*340)/2/100;
  x = (time/2) / 29.1;
  Serial.print(x);
  Serial.println(" cm");
  delay(800); 
  
}

Ich hoffe ihr könnt mit weiterhelfen.

Viele Grüße
Julius

Kann denn keiner helfen? Es muss irgendwo ein Fehler im Code vorliegen. Wahrscheinlich sogar bei der umwandlung in der Vorbereitung zum Senden.

Was an deiner Library VirtualWire oder deren Verwendung nicht so geht wie du es dir wünscht, kann man schlecht raten.

Wahrscheinlich sogar bei der umwandlung in der Vorbereitung zum Senden.

Wie kommst du darauf?

  send((byte*)data, dataBytes);

sieht gut aus.

Wird überhaupt was gesendet ? Wird was empfangen ? Was ist falsch daran ?

Weil ich bei dem Senden-part mit der Umwandlung noch nicht soviel Erfahrung habe und da nicht hundertprozentig durchsteige. Im angehängten dritten Sketch, der aber kein RF-Link verwendet sondern die Werte nur per Serial ausgibt, funktioniert es einwandfrei.

Ja es werden Werte empfangen. Bei einem Abstand von einer Länge von einem DIN-A4 Blatt (knapp 30 cm) wird jedoch 24 cm angezeigt. Und bei der Hälfte der Länge: 11 cm.

jota-te:
es werden Werte empfangen. Bei einem Abstand von einer Länge von einem DIN-A4 Blatt (knapp 30 cm) wird jedoch 24 cm angezeigt. Und bei der Hälfte der Länge: 11 cm.

Dann ist ja schon fast alles richtig!
Wenn du beim Sender mal ein Serial.print einbaust, und evtl. die gesendeten Bytes überprüfst?

/edit/
so habe jetzt ein wenig try&error praktiziert.

habe den Rx Part gleich gelassen. Den Tx modifiziert: Serial.print eingebaut und nach und nach einzelne Teile des Codes ausgeklammert.
Der Fehler tritt nicht mehr auf wenn man vw_setup(2000); // Bits per sec ausklammert.
Ich habe aber keine Ahnung warum.

/*
SimpleSend
This sketch transmits a short text message using the VirtualWire library
connect the Transmitter data pin to Arduino pin 12
*/

#include <VirtualWire.h>
#define trigPin 10
#define echoPin 11

const int numberOfDigitalPins = 1; // Anzahl einzulesender Analogpins
long data[numberOfDigitalPins]; // Der Datenpuffer
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer



void setup(){
 
  Serial.begin (9600);
  Serial.println("Device is ready");
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // Initialize the IO and ISR
  //vw_setup(2000); // Bits per sec
  
}

void loop() {

  long time;
  long x;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH); 
  Serial.println(time);
  //x=(time*340)/2/100;
  x = (time/2) / 29.1;  
  Serial.println(x);
  long values = 0; 
  for(int i=0; i <= numberOfDigitalPins; i++) 
  {
  // Wert in Array
  data[i] = x; // Wert im Datenpuffer speichern 
  }
  send((byte*)data, dataBytes);
  delay(1000); // Einmal pro Sekunde senden
  
}




 void send (byte *data, int nbrOfBytes) 
{
  vw_send(data, nbrOfBytes);
  vw_wait_tx(); // Warten, bis gesamte Nachricht gesendet wurde 
}

jota-te:
#define echoPin 11

Pin-11 ist der standardmäßige Receive-Pin von Virtualwire, den Du gleichzeitig als Echo-Pin für Dein Ultraschallmodul definierst.

Um möglichen Fehlfunktionen vorzubeugen, würde ich Doppelbelegungen von Pins vermeiden.
Insbesondere, wenn Du die Doppelbelegung gar nicht benötigst.

Also würde ich den Virtualwire RX-Pin auf irgendeinen sonst nicht benötigten Pin setzen, bevor ich bei Virtualwire die Bitrate setze:

#define RF_RX_PIN 12
...
  vw_set_rx_pin(RF_RX_PIN);  // Setup receive pin.
  vw_setup(2000); // Transmission speed in bits per second.

ich hatte auch schon vorher ausprobiert den Echo und Trigger Pin woanders hinzulegen.
Das hat aber leider nichts geändert.
Mein Code sieht jetzt so aus.

Hier hatte jemand anscheinend vor kurzer Zeit ein ähnliches Problem. Werde daraus allerdings nicht so ganz schlau.

/*
SimpleSend
This sketch transmits a short text message using the VirtualWire library
connect the Transmitter data pin to Arduino pin 12
*/

#include <VirtualWire.h>
#define trigPin 5
#define echoPin 6
#define RF_TX_PIN 12

const int numberOfDigitalPins = 1; // Anzahl einzulesender Analogpins
long data[numberOfDigitalPins]; // Der Datenpuffer
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer



void setup(){
 
  Serial.begin (9600);
  Serial.println("Device is ready");
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // Initialize the IO and ISR
  vw_set_rx_pin(RF_TX_PIN);  // Setup pin.
  //vw_set_ptt_inverted(true);
  vw_setup(2000); // Bits per sec
   
  
}

void loop() {

  
  long time;
  long x;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH); 
  Serial.println(time);
  //x=(time*340)/2/100;
  x = (time/2) / 29.1;  
  Serial.println(x);
  long values = 0; 
  for(int i=0; i <= numberOfDigitalPins; i++) 
  {
  // Wert in Array
  data[i] = x; // Wert im Datenpuffer speichern 
  }
  send((byte*)data, dataBytes);
  delay(1000); // Einmal pro Sekunde senden
  
  

}




void send (byte *data, int nbrOfBytes) 
{
  vw_send(data, nbrOfBytes);
  vw_wait_tx(); // Warten, bis gesamte Nachricht gesendet wurde 
}

jota-te:
Das hat aber leider nichts geändert.
Mein Code sieht jetzt so aus.

Dein Daten-Array hat einen Indexfehler:

const int numberOfDigitalPins = 1; // Anzahl einzulesender Analogpins
long data[numberOfDigitalPins]; // Der Datenpuffer
// Das heißt, es gibt NUR data[0] als einziges Array-Element
...
  for(int i=0; i <= numberOfDigitalPins; i++)  // Schleifenindex läuft von 0 bis 1
  {
  // Wert in Array
  data[i] = x; // Wert im Datenpuffer speichern  // hier wird data[1] geschrieben, INDEXFEHLER!
  }

Bei einer Zählschleife, die über einen Wert numberOfDigitalPins iterieren soll, darfst Du den Index nur von 0 bis <numberOfDigitalPins laufen lassen, aber nicht bis <=.

Oh okay, hatte ich übersehen. Danke.
Unglücklicherweise tritt der Fehler immer noch auf.
Bei 29/30cm wird 26cm angezeigt und zwar nur wenn die Zeile
vw_setup(2000); // Bits per sec
aktiv ist.
So ein Mist. Ich komm hier leider einfach nicht weiter.
Vielleicht weiß ja jemand von euch noch Rat.

hier der aktualisierte Code.

/*
SimpleSend
This sketch transmits a short text message using the VirtualWire library
connect the Transmitter data pin to Arduino pin 12
*/

#include <VirtualWire.h>
#define trigPin 5
#define echoPin 6
#define RF_TX_PIN 12

const int numberOfDigitalPins = 1; // Anzahl einzulesender Analogpins
long data[numberOfDigitalPins]; // Der Datenpuffer
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer



void setup(){
 
  Serial.begin (9600);
  Serial.println("Device is ready");
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // Initialize the IO and ISR
  vw_set_rx_pin(RF_TX_PIN);  // Setup pin.
  //vw_set_ptt_inverted(true);
  vw_setup(2000); // Bits per sec
   
  
}

void loop() {

  
  long time;
  long x;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH); 
  //x=(time*340)/2/100;
  x = (time/2) / 29.1;  
  Serial.println(x);
  long values = 0; 
  for(int i=0; i < numberOfDigitalPins; i++) 
  {
  // Wert in Array
  data[i] = x; // Wert im Datenpuffer speichern 
  }
  send((byte*)data, dataBytes);
  delay(1000); // Einmal pro Sekunde senden
  
  

}




void send (byte *data, int nbrOfBytes) 
{
  vw_send(data, nbrOfBytes);
  vw_wait_tx(); // Warten, bis gesamte Nachricht gesendet wurde 
}

jota-te: Unglücklicherweise tritt der Fehler immer noch auf.

Setzt Du bitte mal sowohl den RX-Pin, den TX-Pin und den PTT-Pin der Library auf freie und von Deiner Hardware nicht bereits belegte Pins?

#define RF_RX_PIN 12
#define RF_TX_PIN 13
#define RF_PTT_PIN A1
....
... und dann im setup
  vw_set_tx_pin(RF_TX_PIN); 
  vw_set_rx_pin(RF_RX_PIN);
  vw_set_ptt_pin(RF_PTT_PIN);
  vw_setup(2000); // Bits per sec

Tritt das Problem dann immer noch auf?

Habe es mal ausprobiert.
Aber warum ist der RX pin im TX arduino von Relevanz?
Betreibe im Moment nur den TX part und beobachte die Daten via Serial.

Leider ist das Fehlerbild immer noch da.
Wenn es nicht pinabhängig ist, kann es irgendwie mit dem internen timer oder so zu tun haben?

/*
SimpleSend
This sketch transmits a short text message using the VirtualWire library
connect the Transmitter data pin to Arduino pin 12
*/

#include <VirtualWire.h>
#define trigPin 5
#define echoPin 6

#define RF_RX_PIN 12
#define RF_TX_PIN 13
#define RF_PTT_PIN A1

const int numberOfDigitalPins = 1; // Anzahl einzulesender Analogpins
long data[numberOfDigitalPins]; // Der Datenpuffer
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer



void setup(){
 
  Serial.begin (9600);
  Serial.println("Device is ready");
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
 
  
  // Initialize the IO and ISR
  vw_set_rx_pin(RF_TX_PIN);  // Setup pin.
  vw_set_rx_pin(RF_RX_PIN);
  vw_set_ptt_pin(RF_PTT_PIN);
  //vw_set_ptt_inverted(true);
  vw_setup(2000); // Bits per sec
   
  
}

void loop() {

  
  long time;
  long x;
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  time = pulseIn(echoPin, HIGH); 
  //x=(time*340)/2/100;
  x = (time/2) / 29.1;  
  Serial.println(x);
  long values = 0; 
  for(int i=0; i < numberOfDigitalPins; i++) 
  {
  // Wert in Array
  data[i] = x; // Wert im Datenpuffer speichern 
  }
  send((byte*)data, dataBytes);
  delay(1000); // Einmal pro Sekunde senden
  
  

}




void send (byte *data, int nbrOfBytes) 
{
  vw_send(data, nbrOfBytes);
  vw_wait_tx(); // Warten, bis gesamte Nachricht gesendet wurde 
}

jota-te: Aber warum ist der RX pin im TX arduino von Relevanz?

Die Pins so zu setzen, dass Pin-Konflikte generell vermieden werden, ist nichts weiter als ein defensiver Programmierstil bei der Fehlersuche, wenn man nicht genau weiß, was die Library mit ihren ganzen Default-Pins überhaupt macht, wenn sie aktiviert wird.

jota-te: Leider ist das Fehlerbild immer noch da.

Beschreibe mal das Fehlerbild genauer:

Ist der Fehler, dass mit aktiviertem "vw_setup(2000);" a) IMMER 4 cm am Messwert fehlen. Also man bekommt auch 96cm statt 100 cm und 16cm statt 20cm? b) SPRINGENDE Werte auftreten, dass die Werte, die sonst konstant sind, dann immer wild zwischen 30/26, 100/96 oder 16/20 hin und her wechseln?

Hast Du mal versucht, die Impulsdauer anders als mit der PulseIn-Funktion zu messen?