Cool vielen Dank! habe diese Verbindung von Rx/Tx auf den Arduino die ganze Zeit gesucht! Pin 2 und 3 des Header 3 sind bereits gebrückt.
Danke auch für die Info, dann werde ich wohl auch Pin 2 und 3 benutzen, da ich keine Lust habe die ganze Zeit das Shield zu entfernen.
Noch eine Frage zum Code, wenn ich einen Temperatursensor auslesen möchte kann ich die Daten mit dem Befehl "gettemperature!15" anfordern? 15 ist die RS485 Adresse des Sensors.
Gruß Marcel
Das kommt auf den Sensor an....
Ist es ein Eigenbausensor von dir, welcher auch mit der Lib von Nick Gammon programmiert wurde? Dann klar ja, du musst dann nur dem Sensor beibringen, dass er, wenn er "gettemperature!15" erhält, seine Temperatur zurück sendet.
Wenn es ein fertiger Sensor mit RS485 Schnittstelle ist, dann kannst du nicht die Lib von Nick verwenden, sondern musst selber dafür sorgen, dass zuerst der Tx Enable gesetzt wird und dann mit der richtigen Baudrate und eventuellem Start und/oder Stopzeichen gesendet wird. Diese Daten müsstest du dann aus der Doku zum Temperatursensor entnehmen.
Grüsse
Peter
hi,
so'n m...
hab' grad den schaltplan gefunden (ist nicht auf der beschreibungsseite, sondern auf der seite, wo man das ding kaufen kann), wollte ganz stolz schreiben, but someone was faster...
gruß stefan
@Stefan: Weiss nicht, ob ich das jetzt so sagen darf.... Aber.... ätsch
8)
Grüsse
Peter
klar, darfst Du, ich vertrag' schon was... 
Danke Leute. Ja der Sensor ist schon eingelernt habe das über Hterm bereits so ausgelesen. Aber ich muss ja trotz allem noch den Tx enable setzen bzw nicht setzen oder? Welche lib meint ihr genau, da gibt es mehrere auf der Website.
Gruß Marcel
Ok, in dem Fall ein fertiger Sensor...
Also, vergiss die Libs vom Nick. Das Problem bei denen ist, dass die Daten bei ihm nicht so übertragen werden, wie du sie auf die UART sendest, sondern vorher noch "bearbeitet" werden um eine höhere Übertragungssicherheit zu gewährleisten (jedes einzelne Zeichen wird normal und invers übertragen und somit werden Störeinflüsse erkannt, vereinfacht gesagt).
Für dich heisst das jetzt du musst zuerst den enable-Pin auf High setzen, dann die Daten, in deinem Fall gettemperature!15, senden und sobald diese Daten raus sind, den enable-Pin wieder auf Low setzen, damit RS485 Chip wieder etwas empfangen kann.
Also entweder im Stil von
digitalWrite (ENABLE_PIN, HIGH);
Serial.print("gettemperature!15");
delayMicroseconds (800); //Diesen Wert musst du anhand der Baudrate und der Länge der Nachricht errechnen
digitalWrite (ENABLE_PIN, LOW);
oder
digitalWrite (ENABLE_PIN, HIGH);
Serial.print("gettemperature!15");
while (!(UCSR0A & (1 << UDRE0))) // Wait for empty transmit buffer
UCSR0A |= 1 << TXC0; // mark transmission not complete
while (!(UCSR0A & (1 << TXC0))); // Wait for the transmission to complete
digitalWrite (ENABLE_PIN, LOW);
die zweite Variante kannst du aber nur verwenden, wenn du zum senden wirklich die Hardware-Serial des Arduinos verwendest. Mit der Softserial geht das nicht.
Grüsse
Peter
hi,
anstelle des delays oder der zweiten lösung kann er ab IDE 1.0 auch flush nehmen. ist bei altsoftserial genauso, wie ich das sehe...
gruß stefan
Vielen Dank für die Hilfe,
eine Frage zum ersten Code, wie errechne ich genau den Wert für das delay?
Und noch eine Frage sendet der Sensor die Daten Sobald der enable PIN wieder auf Low ist?
Viele Grüße
Hi habe mir jetzt einen Code zusammengebastelt. Schätze er ist noch sehr fehlerhaft da das Shield die ganze Zeit auf "Tx ein" ist. Den Jumper auf Header 3 habe ich auf D9_CTRL gesteckt schätze so sind PIN 2 und 3 des Headers verbunden. Rx habe ich auf PIN D2 und Tx auf D3 des Arduinos gelegt. Ich bekomme ebenso kein Temperatursignal ausgegeben. PIN 9 ist i.wie dauerhaft auf High..
#include <SoftwareSerial.h>
const unsigned long BAUD_RATE = 9600;
// software serial pins
const byte RX_PIN = 2;
const byte TX_PIN = 3;
// transmit enable
const byte ENABLE_PIN = 9;
const byte LED_PIN = 13;
SoftwareSerial rs485 (RX_PIN, TX_PIN); // receive pin, transmit pin
void setup ()
{
// debugging prints
Serial.begin (9600);
// software serial for talking to other devices
rs485.begin (BAUD_RATE);
// set up various pins
pinMode (ENABLE_PIN, OUTPUT);
// demo action pins
pinMode (LED_PIN, OUTPUT);
}
void loop ()
{
digitalWrite (ENABLE_PIN, HIGH);
digitalWrite (LED_PIN, HIGH);
rs485.println("");
rs485.println("gettemperature!15");
delayMicroseconds(800);
digitalWrite (ENABLE_PIN, LOW);
digitalWrite (LED_PIN, LOW);
delay (2);
} // end of loop
hi,
gesendet wird unmittelbar, das hat nichts mit enable=LOW zu tun.
das delay ist da, weil Du sonst den enable-pin auf LOW setzt, bevor alles gesendet wurde (das braucht ja ein wenig).
zuallererst mußt Du rauskriegen, warum enable immer auf high ist (ich nehme an, die LED leuchtet ständig). mach das delay am ende der loop mal auf 2000, sonst geht das so schnell, daß Du den wechsel nicht siehst. solange enable auf hich ist, kann er nichts empfangen, weil das gleichzeitig read ausschaltet.
gruß stefan
Hi, mittlerweile habe ich meinen Code noch etwas umgebaut, die LED von TX blinkt jetzt nicht mehr dauerhaft, sondern immer in einem kurzen Impuls.
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX 2 //Serial Receive pin
#define SSerialTX 3 //Serial Transmit pin
#define SSerialTxControl 9 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
#define Pin13LED 13
/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
/*-----( Declare Variables )-----*/
float byteReceived;
int byteSend;
void setup() /****** SETUP: RUNS ONCE ******/
{
// Start the built-in serial port, probably to Serial Monitor
Serial.begin(9600);
pinMode(Pin13LED, OUTPUT);
pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, RS485Receive); // Init Transceiver
// Start the software serial port, to another device
RS485Serial.begin(9600); // set the data rate
}//--(end setup )---
void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
digitalWrite(Pin13LED, HIGH); // Show activity
digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit
RS485Serial.println("gettemperature!15\r\n"); // Send byte to Remote Arduino
delay(500);
digitalWrite(SSerialTxControl, RS485Receive); // Disable RS485 Transmit
Serial.println("Temp:");
float t = RS485Serial.read(); // Read received byte
Serial.println(t);
digitalWrite(Pin13LED, LOW); // Show activity
delay(1000);
}//--(end main loop )---
An meinen Arduino mit aufgestecktem Shield ist nun laut Skizze noch ein USB Kabel mit Pegelwandler angebunden, lese ich nur über dieses die Temperatur, unabhängig vom Programm aus funktioniert es. Mein jetziges Progromm gibt mir für "t" einen konstanten wert von -1.00 aus was nicht sein kann, auch die RX LED blinkt nicht.
Dachte ich kann über die Anbindung des USB Pegelwandlers die gesendeten Daten sehen, also das gettemperature!15 aber auch da sehe ich nicht. Wird dann überhaupt was ausgesendet? Wie könnte ich das überprüfen.
Besten Dank.
hi
wie Du da ein USB-kabel angebunden hast, mußt Du erklären. und was ist ein pegelwandler an dem ding?
und Dir muß klar sein, daß das TX-enable auch immer gleichzeitig das lesen ausschaltet. bei dem shield geht das nur abwechselnd. ein delay(500) verhindert also das lesen auf RX für eine halbe sekunde. da ist dann längst alles vorbei. ich nehme an, Du hast das mit delayMicroseconds verwechselt.
versuch mal, statt des delay ein RS485Serial.flush() zu verwenden.
gruß stefan
Wenn ich mich nicht täusche ist es sowas in der Richtung (https://www.dresden-elektronik.de/fileadmin/Downloads/Produkte/7-Zubehoer/USB-Levelshifter-Stick-Basic-DBT-de.pdf). Es setzt einfach das RS485 Signal um sodass ich es mit Hterm auslesen kann.
Okay ich dachte lieber mal ein bisschen zu lange als zu kurz :o
Habe nun RS485Serial.flush() eingebunden. Leider keine veränderung.
Gruß Marcel
hi,
also nach der beschreibung des "pegelwandlers" zu urteilen, ist das ding vollkommen falsch.
Du brauchst einen USB <> RS485 - wandler.
hast Du eigentlich jemals eine korrekte antwort von Deinem sensor bekommen? der ist doch der grund, warum Du das ganze machst, oder ist das ziel ein anderes?
gruß stefan
Also wenn ich dich richtig verstehe, dann hast du den Pegelwandler mal direkt am Temperaturfühler angeschlossen und hast dann mit HTerm valide Temperaturwerte empfangen!?
Wenn das so ist, dann kannst du dir die RS485 Geschichte sparen, weil der Pegelwandler aus deinem Link hat nichts mit RS485 zu tun...
hi,
lese ich nur über dieses die Temperatur, unabhängig vom Programm aus funktioniert es.
hab' ich überlesen.
Dein "pegelwandler" übersetzt ein normales serielles signal auf usb. Du kannst also den sensor (sofern er mit 5V betrieben wird) einfach an Deine serielle schnittstelle am arduino anschließen. da ist nix mit RS485.
gruß stefan
Also ich habe mich nochmal informiert und mein "pegelwandler" oder wie man es auch immer nennen kann setzt das RS485 Signal um (ist wohl eher sowas: https://www.amazon.de/Interface-Konverter-Seriell-Adapter-kompatibel/dp/B00GWEGZOI/ref=pd_sim_23_1?ie=UTF8&dpID=415U5aEtXLL&dpSrc=sims&preST=_AC_UL160_SR160%2C160_&psc=1&refRID=QX4V2DNCHHMC03P88ZAR), dass ich es in Hterm auslesen kann, der sensor ist ganz sicher für RS485.
Das Ziel ist es den Sensor über den Arduino bzw das Shield auszulesen. Diesen USB " Pegelwandler" benutze ich nur zum manuellen auslesen des sensors.
Müsste halt mal mein programm zum laufen bekommen ..
Ok, also doch RS485...
Dann versuch doch mal, deinen PC mit dem Sensor zu verbinden und an den gleichen Bus hängst du noch den Arduino dran.
Dann einen kleinen Sketch auf dem Arduino welcher nur über Softserial (RS485) lauscht und alles 1:1 auf Serial und somit auf den Monitor in der Arduino IDE ausgibt.
Also im Stil von
#include <SoftwareSerial.h>
SoftwareSerial RS485Serial(2, 3);
void setup() {
Serial.begin(9600);
RS485Serial.begin(9600);
}
void loop() {
if (RS485Serial.available()) {
byte inByte = RS485Serial.read();
Serial.write(inByte);
}
}
Dann kannst du mit HTerm die Temperaturanfrage schicken und siehst, ob beim Arduino etwas ankommt.
Wenn das funktioniert, kümmerst du dich beim Arduino darum, dass das, was ankommt, auch vernünftig entgegen genommen wird. Sprich, die Temperatur in einem für dich passenden Format in eine Variable gespeichert wird.
Wenn das auch klappt, dann versuchst du, die Temperatur mit dem Arduino abzufragen. Zu Testzwecken würde ich für den Anfang einen Taster nehmen. Wenn Taster gedrückt, sende 1 Anfrage.
So solltest du Schritt für Schritt zur Lösung kommen.
Grüsse
Peter
Hi,
Peter erstmal Danke für die super Idee! Die Kommunikation mit deinem Sketch funktioniert, bekomme alles auf dem Serial Monitor ausgegeben. Auch die Rx LED leuchtet wenn ich die Daten anfordere!
Nun zu meinem Code.
#include <SoftwareSerial.h>
const byte ENABLE_PIN = 9;
SoftwareSerial RS485Serial(2, 3);
void setup() {
Serial.begin(9600);
RS485Serial.begin(9600);
}
void loop() {
digitalWrite (ENABLE_PIN, HIGH);
RS485Serial.println("gettemperature!15\r\n");
delayMicroseconds (800);
digitalWrite (ENABLE_PIN, LOW);
byte inByte = RS485Serial.read();
Serial.write(inByte);
delay(2000);
// }
}
Die Zeit des delays habe ich frei gewählt und variiert, denn ich weiss nicht genau wie ich diese berechnen soll. Die Tx LED blinkt also scheint es etwas auszusenden. Die Rx LED blinkt bei meinem Sketch nie. I.welche Ideen?