gestern hatte ich bereits einige Fragen bezüglich hardware hier ins Forum gestellt und war sehr begeistert von der Hilfe, die ich erhalten habe!
Ich habe direkt noch eine Ich komme beruflich aus der Automatisierungstechnik, daher sind mir viele Prinzipien bekannt, habe aber keine Ahnung wie man sie implementiert und nicht nur verwendet...
Ich möchte gerne zwei Arduino miteinander sprechen lassen, Sinn soll sein, dass einer als Remote-IO funktioniert und dem anderen nur die Informationen seiner I/O Kanäle zukommen lässt. Geht das? und wenn ja wie? Ich würde gerne etwa 5m überbrücken. Macht es sinn hierfür ModBus oder CanBus zu nutzen und wenn ja, was brauche ich dafür an extra hardware?
Vielen Dank euch!
Anmerkung: Das zweite müsste auch kein Arduino sein, da es noch gekauft werden müsste, bin daher für alles offen...
Wie soll die Verbindung hergestellt werden? Draht, WiFi?
Ein paar mehr Infos von Deiner Seite wären sinnvoll.
Welchen Arduino hast Du schon? Bist Du auf den fest gelegt? Welche Sensoren, ...
bitte beschreibe exakt was du wirklich machen willst.
Was ist wo und wie weit auseinander.
ich würde immer versuchen, nur einen Microcontroller zu verwenden. Wenn nur ein paar remote IOs eingelesen werden sollen, nimm dort eine Modbus IO Karte und nur auf der Masterseite einen Arduino den du programmierst.
Beide (RS485 und CAN-Bus) haben ziemliche viel Übertragungsprotokoll, was für eine Punkt zu Punkt Verbindung nicht notwendig ist. RS232 hat das nicht, Da reicht normal Serial.print bzw .write und Serial.read.und der Abdabter ändert nur die Spannnungspegel.
Ich weiß nicht ob 5m zuviel sind aber ich würde mal einfach RX mit TX und TX mit RX verbinden. Notfalls zwei TTl zu RS232 dazwischen, Aber da kommt man dann auf Distanzen von 100 ten metern.
Da die Pins Tx/RX bei einigen Arduino-Modellen auch fürs Hochladen des Sketches gebraucht werden ist eine Wahl eines Models mit nativen USB (Leonardo, Micro) und freier TX/RX oder Mehreren TX/RX (Mega2560) oder die serielle Schnittstelle über SW zu emulieren. (Softwareserial Bibliothek) Wahrscheinlich die bessere Wahl.
Auch könnte man einen I2C-Expander für mehr digitale Ein/Ausgänge nehmen und mittels I2C Extendern die Distanz sicher überbrücken. Da reicht ein Arduino an der "Senderseite".
Auch kann zwischen RX/TX ein Funkmodul oder Bluetooth modul geschaltet werden und darum die Verbindung Drahtlos werden.
Hallo Uwe, ich möchte die Schwerpunkte etwas anders legen.
RS485 ist busfähig, was bei einer Punkt-zu-Punkt-Verbindung egal ist. RS485 nutzt aber Differenzsignale, was gut gegen elektromagnetische Störungen hilft. Mein Schwerpunkt! RS232 bringe ich mit ±15 V in Verbindung, für mich für einen Arduino eher exotisch. Da würde ich dann eher die UARTs direkt verbinden und abwarten, ob es bei 5 m Distanz zu Störungen kommt, was vermutlich von der elektromagnetischen Umgebung abhängt. Auch bei RS485 genügt Serial.print, siehe RS485 communications.
Also Mega2560 oder ESP32 mit RS485 fände ich eine gute Wahl.
CAN-Bus hat den Charme, an einem Uno oder Nano die SPI-Schnittstelle zu nutzen. Außerdem kümmert sich der µC auf dem Board um den Datenaustausch einschließlich Prüfsumme und das sehr schnell. Uno oder Nano können sich um das Wesentliche kümmern. Da die Nachrichten Adressen haben, kann man diese gezielt Meßwerten zuordnen. Auch CAN-Bus nutzt störunanfällige Differenzsignale. Der ESP32 hat die CAN-Bus Register eingebaut und benötigt nur einen externen Treiber. Es ist nicht so schwierig, wie es zunächst scheinen mag, siehe UNO - Mega - Teensy mittels CAN-Bus verbinden oder
CAN-Bus mit ESP32
//### Espressif ESP32 wiring CAN transceiver SJA1000
//
// SJA1000 | ESP32
// ------- | -----
// 3V3 | 3V3
// GND | GND
// CTX | 5
// CRX | 4
//
// Vorlage \esp32\1.0.4\libraries\ESP32-Arduino-CAN\examples\esp32can_basic\esp32can_basic.ino
#include <Arduino.h>
#include <ESP32CAN.h>
#include <CAN_config.h>
CAN_device_t CAN_cfg; // CAN Config
unsigned long previousMillis = 0; // will store last time a CAN Message was send
const int interval = 1000; // interval at which send CAN Messages (milliseconds)
const int rx_queue_size = 10; // Receive Queue size
void setup() {
Serial.begin(115200);
Serial.println("Basic Demo - ESP32-Arduino-CAN");
CAN_cfg.speed = CAN_SPEED_500KBPS;
CAN_cfg.tx_pin_id = GPIO_NUM_5;
CAN_cfg.rx_pin_id = GPIO_NUM_4;
CAN_cfg.rx_queue = xQueueCreate(rx_queue_size, sizeof(CAN_frame_t));
// Init CAN Module
ESP32Can.CANInit();
}
void loop() {
CAN_frame_t rx_frame;
unsigned long currentMillis = millis();
// Receive next CAN frame from queue
if (xQueueReceive(CAN_cfg.rx_queue, &rx_frame, 3 * portTICK_PERIOD_MS) == pdTRUE) {
if (rx_frame.FIR.B.FF == CAN_frame_std) {
printf("New standard frame");
}
else {
printf("New extended frame");
}
if (rx_frame.FIR.B.RTR == CAN_RTR) {
printf(" RTR from 0x%08X, DLC %d\r\n", rx_frame.MsgID, rx_frame.FIR.B.DLC);
}
else {
printf(" from 0x%08X, DLC %d, Data ", rx_frame.MsgID, rx_frame.FIR.B.DLC);
for (int i = 0; i < rx_frame.FIR.B.DLC; i++) {
printf("0x%02X ", rx_frame.data.u8[i]);
}
printf("\n");
}
}
// Send CAN Message
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
CAN_frame_t tx_frame;
tx_frame.FIR.B.FF = CAN_frame_std;
tx_frame.MsgID = 0x005;
tx_frame.FIR.B.DLC = 8;
tx_frame.data.u8[0] = 0x00;
tx_frame.data.u8[1] = 0x01;
tx_frame.data.u8[2] = 0x02;
tx_frame.data.u8[3] = 0x03;
tx_frame.data.u8[4] = 0x04;
tx_frame.data.u8[5] = 0x05;
tx_frame.data.u8[6] = 0x06;
tx_frame.data.u8[7] = 0x77;
ESP32Can.CANWriteFrame(&tx_frame);
}
}
Wenn Du zB einen MAX232 als Adapter verwendest macht dieser die notwendigen Spannungen durch 4 Kondensatoren aus den 5V selbst. Da brauchst Du nichts denken. Die RS232 Eingangs-Pegel sind als ±3V bis ±25V spezifiziert.
Nicht wirklich.
Es ist bidirektionale Kommunikation erwünscht.
Dann braucht es 4 Signal Adern, oder ein "Serial" welches die Umschaltung der Richtung unterstützt.
Die vier Adern sind bei Vollduplex-Betrieb erforderlich.
Bei den für Halbduplex ausgelegten RS485-Konverterboards kann man im Wesentlichen zwei Auslegungen unterscheiden:
Solche mit herausgeführten Pins zum Schalten der Enable-Pins DE und RE für Sende- bzw. Empfangsfunktion des MAX485-Bausteins. Hier benötigt man am Controller digitalWrite() Aufrufe zum Umschalten der Sende/Empfangsfunktion.
Solche, die mittels eines zusätzlichen Bausteins die Sende/Empfangfunktion automatisch umschalten.
In beiden Fällen muss man sicherstellen, dass nur jeweils ein angeschlossener Teilnehmer zur Zeit auf dem Bus sendet.