Nein, das wäre für den Bus nicht gut, also nur bei Bedarf.
Nano #3 könnte auch ein ESP32 sein, der Daten zum Anhänger sendet oder empfängt.
Ich habe dann mal die Bibliothek gewählt, die für Nano (bei mir UNO) und ESP32 funktioniert und einfach "gestrickt" ist. Der ESP32 sendet drei Pakete an drei Adressen = IDs, eins mit zufälligem Bitmuster, mein UNO filtert eine ID raus und zeigt das Bitmuster bei mir mit LEDs an.
ESP32:
// ESP32 - TJA1050
// 5V - VCC
// GND - GND
// 32 - RX
// 33 - TX
#include <CAN.h> // https://github.com/sandeepmistry/arduino-CAN
void setup() {
Serial.begin(115200);
delay (500);
Serial.println("CAN Sender");
CAN.setPins(32, 33); // RX, TX
if (!CAN.begin(500E3)) { // Start CAN Bus mit 500 kbps
Serial.println("Start CAN fehlgeschlagen!");
while (1);
}
}
void loop() {
// sende Paket: ID ist 11 Bits, ein Paket kann bis zu 8 Bytes Daten enthalten
Serial.print("Sende Paket ID = 0x21");
CAN.beginPacket(0x21);
CAN.write('h');
CAN.write('e');
CAN.write('l');
CAN.write('l');
CAN.write('o');
CAN.write('2');
CAN.write('1');
CAN.endPacket();
delay(1000);
Serial.print("Sende Paket ID = 0x22");
CAN.beginPacket(0x22);
CAN.write(random(0, 0x10)); // vier zufällige Bits
CAN.endPacket();
delay(1000);
Serial.print("Sende Paket ID = 0x23");
CAN.beginPacket(0x23);
CAN.write('h');
CAN.write('e');
CAN.write('l');
CAN.write('l');
CAN.write('o');
CAN.write('2');
CAN.write('3');
CAN.endPacket();
delay(1000);
}
UNO:
// UNO - MCP2515
// 13 - SCK
// 11 - SI
// 12 - SO
// 10 - CS
// 2 - INT
#include <CAN.h> // https://github.com/sandeepmistry/arduino-CAN
#define FILTER_ID 0x22
const uint8_t pin[] = {A0, A1, A2, A3};
const uint8_t PINS = sizeof(pin);
void setup() {
Serial.begin(115200);
Serial.println("CAN Empfänger");
CAN.setClockFrequency(8E6); // Taktfrequenz MCP2515 8 Mhz
if (!CAN.begin(500E3)) { // Start CAN Bus mit 500 kbps
Serial.println("Start CAN fehlgeschlagen!");
while (1);
}
CAN.filter(FILTER_ID); // nur die angegebene ID wird durchgelassen
CAN.onReceive(onReceive); // Pin 2 für Interrupt
for (uint8_t n = 0; n < PINS; n++) {
pinMode(pin[n], OUTPUT);
}
}
void loop() {
}
void onReceive(int packetSize) {
Serial.print("Empfangen Paket mit ID 0x");
Serial.print(CAN.packetId(), HEX);
if (!CAN.packetRtr()) {
Serial.print(" und Länge ");
Serial.println(packetSize);
while (CAN.available()) {
byte2pin(CAN.read());
}
}
Serial.println();
}
void byte2pin(uint8_t wert) {
for (uint8_t n = 0; n < PINS; n++) {
digitalWrite(pin[n], bitRead(wert, n));
}
}
Wegen der Warnung habe ich in der Programmbibliothek die Datei ESP32SJA1000.cpp geändert:
alt:
#include "esp_intr.h"
neu:
#include "esp_intr_alloc.h"
