Anbei eine Frage, welche für Euch wahrscheinlich trivial ist, für mich aber unlösbar.
Da ich relativ neu noch immer bin, stelle ich sie einfach.
Forum habe ich durchforstet, Deutsch und English und einiges an Programmen versucht.
Folgender Aufbau:
Ich habe einen ESC-Controller von MGM (Brushless Motor Regler).
Dieser hat 3 Schnittstellen, RS-485, RS-232 und CAN-BUS.
Ich möchte lediglich Werte auslesen (keine Werte senden) und die auf einem Display darstellen.
Bisher habe ich folgendes versucht:
Sparkfun RedBoard mit Sparkfun CAN-Bus Shield angehängt, beide Enden mit 120 Ohm versehen und versucht über die diversen Codes die CAN-Schnittstelle zu initiieren.
Baudrate stimmt laut dem ESC überein mit dem eingestellten Wert in Arduino 125E3. Ich habe auch mehrere Werte versucht, kein Erfolg.
Auch habe ich im ESC den CAN-Standard von 2.0A auf B gewechselt.
Es klappt nicht einmal die CAN-Schnittstelle zu initiieren.
Nun nach einigen Nächten kommt die Ernüchterung.
Nach erneuter Recherche stellt sich mir die Frage: War das der richtige Ansatz? Da ich nur Daten auslesen möchte, würde vielleicht eine RS-232 oder RS-485 UART das Leben einfacher machen.
Was für Ideen habt ihr?
Anbei sende ich Euch die beiden Protokolle und die Daten des ESCs zu:
Bilder vom Aufbau posten.
Jede Verkabelung muss sichtbar sein.
Sollte am "CAN Bus Shield" ein Quartz drauf sein, muss auch dessen Beschriftung lesbar sein (weil häufiger Fehler, dass der am Shield aufgebrachte Quartz eine andere Frequenz hat als die 99% der Mustersketche).
Den Code in Code Tags posten den du ausprobiert hast.
Serial Output posten damit wir sehen was du aktuell als Ergebnis bekommst.
Widerstände a 120 Ohm vorhanden, gemessen an den Kabeln, je Durchgang und kreuz-gemessen je 40 Ohm. Gemessen wurde am ESC direkt und dann an den 4 Löchern beim Sparkfun Schriftzug. Hier sind die Pins eigentlich nach dem Sub D herausgeführt.
#include <CAN.h>
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("CAN Receiver");
// start the CAN bus at 500 kbps
if (!CAN.begin(125E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
}
void loop() {
// try to parse packet
int packetSize = CAN.parsePacket();
if (packetSize || CAN.packetId() != -1) {
// received a packet
Serial.print("Received ");
if (CAN.packetExtended()) {
Serial.print("extended ");
}
if (CAN.packetRtr()) {
// Remote transmission request, packet contains no data
Serial.print("RTR ");
}
Serial.print("packet with id 0x");
Serial.print(CAN.packetId(), HEX);
if (CAN.packetRtr()) {
Serial.print(" and requested length ");
Serial.println(CAN.packetDlc());
} else {
Serial.print(" and length ");
Serial.println(packetSize);
// only print packet data for non-RTR packets
while (CAN.available()) {
Serial.print((char)CAN.read());
}
Serial.println();
}
Serial.println();
}
}
das war erster Versuch, Ausgabe Serial:
20:49:07.653 -> CAN Receiver
20:49:07.653 -> Starting CAN failed!
das war zweiter Versuch:
#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>
//********************************Setup Loop*********************************//
void setup() {
Serial.begin(9600); // For debug use
Serial.println("CAN Read - Testing receival of CAN Bus message");
delay(1000);
if(Canbus.init(CANSPEED_125)) //Initialise MCP2515 CAN controller at the specified speed
Serial.println("CAN Init ok");
else
Serial.println("Can't init CAN");
delay(1000);
}
//********************************Main Loop*********************************//
void loop(){
tCAN message;
if (mcp2515_check_message())
{
if (mcp2515_get_message(&message))
{
//if(message.id == 0x620 and message.data[2] == 0xFF) //uncomment when you want to filter
//{
Serial.print("ID: ");
Serial.print(message.id,HEX);
Serial.print(", ");
Serial.print("Data: ");
Serial.print(message.header.length,DEC);
for(int i=0;i<message.header.length;i++)
{
Serial.print(message.data[i],HEX);
Serial.print(" ");
}
Serial.println("");
//}
}}
}
Ausgabe Serial erneut:
20:56:22.939 -> CAN Read - Testing receival of CAN Bus message
20:56:23.943 -> Can't init CAN
So mehr habe ich nicht gemacht, ausser die Baudraten verstellt. Den ESC ausgelassen, versucht so zu initialisieren usw.
Signale kommen welche raus aber das Shield will wohl nicht - warum auch immer.
Shield-Versionen habe ich Beide getestet, auch hier kein weiterkommen.
Der CAN initiiert nicht. Bin ratlos und was das anbelangt, frustriert.
Vielleicht hat jemand noch ne Idee.
LG Fabian
Hi,
das mit dem Delay hatte ich schon von 10 zu 50 zu 100 uS.
Den Schalter habe ich nicht bedient, denke der sollte bei 3.3V Standard sein oder?
Soll ich den auf 5V switchen? Und erneut mit dem Delay versuchen?
Danke Euch, LG Fabian
@my_xy_projekt DANKE das Delay und vor allem die 5V haben die CAN initiiert. Schon komisch, dass ich den Schalter nie und nimmer umgeschaltet hätte.
Jetzt muss ich mich ans auslesen machen. Danke schon mal...die Arbeit fängt wohl jetzt erst an.
Ich frage ja gerne immer erst einmal nach dem letztendlichen Zweck des Datenauslesens ist.
Und dazu müsstest du mal einen Überblick über dein Projekt geben.
Gut möglich, dass du von genau diesem ESC Werte auslesen willst und das schon der letztendliche Zweck ist.
Wenn es etwas anderes ist gibt es wahrscheinlich ganz andere Möglichkeiten diesen letztendlichen Zweck zu erreichen.
Was vollkommen unsinnig ist, wenn der TO einfach nur die INIT-Sequenz für einen Chip nicht gebacken bekommt.
Aber Du wirst natürlich eine Lösung vollkommen losgelöst von der Funktion des Chips präsentieren.
Ich nehme an du hast den Thread
Wie man dieses Forum benutzt - bitte lesen tatsächlich gelesen.
Zitat
Ich versuche es mal mit einer physischen Analogie zu erklären:
Useranfrage: "ich muss etwas schneiden" (sehr allgemein gehaltene Anfrage)
Helfer-Antwort: "Nimm eine Schere" (Vorschlag ohne zu wissen um was es wirklich geht)
User "ja funktioniert. Es ist aber irgendwie zu langsam" (wieder nur eine Detailantwort ohne Überblick)
Helfer-Antwort "nimm eine motorisierte Schere" (Antwort die die neue Detailanforderung erfüllt)
User "funktioniert jetzt tatsächlich schneller. Ist aber immer noch zu langsam"
Helfer-Antwort "Dann mach mehrere motorisierte Scheren parallel" (Detaillösungsvorschlag die das Schneiden schneller macht)
User "funktioniert jetzt tatsächlich noch schneller. Ist aber immer noch zu langsam"
Helfer-Frage: "Was willst du denn eigentlich schneiden? (Die Frage nach dem Überblick)
User: "Die Grashalme eines Fußballplatzes"
Und mit dem finalen Zweck des Schneidens stellt sich dann heraus, dass eine gaaanz andere Lösung viel besser geeignet ist.
Helfer-Antwort: " Dann nimm einen Aufsitzmäher mit 1m breitem Mulchwerk
oder
wenn es sich um mehrere nebeneinander liegende Fußballplätze handelt einen Spindelmäher mit Auslegerarmen so dass du eine Schnittbreite von 3m erreichst.
Beispiel bei dem es sehr offensichtlich ist was eine gute und effektive Lösung ist.
In der Elektronik sind gute Lösungen oft nicht so einfach ersichtlich. Um so wichtiger die ganzen Rahmenbedingungen zu kennen um sich nicht immer weiter in einer auf das falsche hin optimierten "Lösung" zu versteigen.
Wie schon von mir selbst geschrieben: Wenn das Auslesen dieser Betriebsdaten aus genau dieser ESC schon der Zweck des Programms ist. Dann gibt es weitere Detailfragen mit denen man dann abwägen kann welche Schnittstelle, CAN-BUS, RS485, UART am besten geeignet ist.
Was macht der User?
einen stationären Motoren / ESC-Prüfstand?
Betriebsdaten in einem
Modellfahrzeug (wenig Platz),
Schiff (relativ viel Platz),
Flugzeug (auf geringes Gewicht hin optimiert)
auf dem Display anzeigen
Was für ein Display schwebt dem User vor?
4 Zeilen LCD = Arduino Uno ist geeignet
480x320 SPI SPI-TFT-Display mit Nachbildung von Analoginstrumenten? = Arduino Uno hat einfach viel zu wenig Speicher
=> gleich umsteigen auf einen ESP32 mit onboard CAN-Bus-tranceiver und als Display das eigene Handy verwenden. Oder Teensy 4.1mit onboard SD-Card slot um die Daten gleich noch auf SD-Karte zu speichern.
Aber du möchtest ja lieber gleich im Detail draufloslegen um dann später eventuell festzustellen "Oh dann nehmen wir jetzt aber doch lieber ...."
Ja der TO (denke das bin ich hier ) und damit meine ich mich, mag das vielleicht nicht hinbekommen. Das stimmt aber dafür ist ja auch ein Forum da oder?
Zu der Verteidigung vieler Anfänger, schon schwierig einzusteigen in das Ganze, wenn er nicht mal von Seiten Hersteller die "ausreichende Dokumente" gibt - hiermit meine ich den Spass mit dem Switch 3.3V zu 5V.
Zu der Frage was ich eigentlich mache:
Das Ganze nennt sich Jetsurf Boards. Diese baue ich seit 2012, bisher immer unter der Zuhilfenahme einer fertigen Fernbedienung (China Ware).
Da diese aber beim besten Willen nicht meinen Wünschen entspricht, habe ich das Thema nun in Angriff genommen.
Gerne teile ich ein paar Bilder hier, meine Stärken sind definitiv nicht Bits und Bytes, sondern CFK, Leichtbau, 3D Design, ....leider eben nicht die Programmierung.
Auch kenne ich mich durchaus mit vielen anderen Disziplinen aus, Leistungselektronik, Motoren, PID Regler, ... aber eben, die Programmierung macht mich fertig.
Bisher hatte eine Freundin vieles programmiert, allerdings eher in Richtung Datenlogger uns so. Leider oder sagen wir so, zum Glück, ist sie nun Mama und hat nen ganz anderen Fokus.
Anbei mal ein paar Bilder:
Elektronik, Motor, Regler, BMS, Sensoren, ...