Auslesen CAN-BUS, RS-485 oder RS-232 (nur Auslesen)

So und darum geht es, ich lese die 7 Datensätze des Brushless Regler aus.
Anbei die Daten aus dem Serial:

Standard ID: 0x001 DLC: 8 Data: 0x54 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Standard ID: 0x002 DLC: 8 Data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Standard ID: 0x003 DLC: 4 Data: 0x00 0x00 0x00 0x00
Standard ID: 0x004 DLC: 8 Data: 0x00 0x00 0x20 0x00 0x00 0x00 0x00 0x00
Standard ID: 0x005 DLC: 8 Data: 0x00 0x00 0x00 0x20 0x00 0x00 0x90 0x01
Standard ID: 0x006 DLC: 8 Data: 0x54 0x00 0x94 0x00 0x00 0x00 0x00 0x00
Standard ID: 0x007 DLC: 8 Data: 0x00 0x00 0x00 0x00 0x00 0x00 0x77 0x00

Anhand des CAN-Bus Protokolls möchte ich diese umrechnen (siehe PDF):
MGM_COMPRO_HBCi3_CAN_BUS_V10.pdf (1.2 MB)

Und am Ende möchte ich eigentlich die relevanten Bytes auslesen, umwandeln in eine Zahl (für mich) und auf einem OLED darstellen. Hierfür würde ich später auf den Teensy 4.1 gehen, da er performanter ist. Ich bekomme nur das einzelne herauslesen der Bytes nicht hin plus die Umrechnung wie bei dem PDF beschrieben.
Für Euch ein "Klacks" für mich der pure Horror....

LG und frohes Lesen, und natürlich einen schönen Feiertag :slight_smile:

1 Like

WOW cooles Projekt.

Das Display ist also in der Fernbedienung.

Jetzt hat sich mein Post mit deinem zeitlich überschnitten.

Frage noch mal auf den Punkt gebracht: Ist diese Fernbedienung für dich zum Einstellen von Parametern und zum Überprüfen von Messwerten **vor** dem Verkauf an den Kunden gedacht? oder ist das eine Fernbedienung für den Benutzer?

Wirst du die Fernbedienung nur in der Werkstatt benutzen oder am Strand und im Wasser?

Reicht eine einfache Textanzeige 4 x 20 Zeichen Display
Oder soll es ein Grafikdisplay sein?
Welche Auflösung soll dieses Grafik-Display haben?

Hi
Das Display sollte alle relevanten Werte anzeigen.
ZB Spannung, Stromstärke, Drehzahl und Temperatur des Reglers als des Motor.
Das Display kommt auf die Fernbedienung drauf, bin gerade am Design und Testdrucken dran.
Warum Oled, hier kann ich schöne Symbole in Gimp erstellen welche zB als Warnsymbol (zu hoher Strom) aufblinken sollen. Daher keine LCD mit zB 4x20 oder so.
Das ist nur für mich/Tochter bestimmt. Warum die Werte live? Damit ich nun das Board während des Betriebs austesten kann. In der Vergangenheit habe ich immer im Nachgang die Daten ausgelesen, konnte aber nicht nachvollziehen was das für eine Fahrsituation war. ZB Drehzahl ging hoch, Strom runter (deutet auf Luft/Kavitation hin).
Deswegen die kritischen Daten live auf ein kleines Oled.
Das kenne ich einigermassen und kann es auch programmieren :winking_face_with_tongue:

Eingestellt wird nichts an der Fernbedienung. Nur Anzeigen.... eingestellt kann nur mit PC und im Stillstand werden.

Wie viele Datenwerte sind das?
Was für eine Auflösung soll das OLED haben?

Wenn du später auf einen anderen Microcontroller umsteigen willst. Teensy 4.1 muss für ein paar CAN-Datensätze auslesen nicht unbedingt sein.

Aber wenn du auf einen anderen Microcontroller umsteigen willst, dann bedeutet das, in den meisten Fällen auch andere libraries zu benutzen. Deshalb bin ich der Meinung entweder beim Arduino Uno zu bleiben oder gleich auf den endgültigen Microcontroller umzusteigen.
Was ich selbst schon gemacht habe ist zwei ESP32 nodeMCU über einen ADJ 1051 CAN-Bus-tranceiver untereinander zu verbinden.

Du willst die MGM-ESC auslesen. Das heißt der CAN-BUS-Partner ist kein zweiter ESP32.
Ich würde jetzt keine großen Probleme erwarten. Aber wirklich wissen tut man es erst wenn man es live in in Farbe getestet hat.

user @my_xy_projekt hat schon so einige CAN-BUS-Projekte unterstützt. Manche deutlich komplexer als deines.

Der ESP32 hat WLAN an Board. Damit ist - zumindest theoretisch - möglich
den ESP32 sein eigenes WLAN aufzumachen und dann eine kleine Webseite zu erzeugen die die die ausgelesen Daten anzeigt.

Ich habe "- zumindest theoretisch - " geschrieben, weil ich es noch nicht selbst getestet habe.

Der ESP32 hat einen CAN-Bus-Controller onboard. Trotzdem ist CAN-BUS eine Anwendung die hohe Perfomance benötigt und da mache ich vor einem praktischen Test ein Fragezeichen ob CAN-BUS und WLAN gleichzeitig betreiben gut funktioniert.

Meine Einschätzung aus dem Bauch heraus gute Chance dass es funktioniert, aber keine Garantie.
Dafür ist ja das Forum da:
Also die Frage hat jemand praktische Erfahrung damit?
Und welche ESP32-CAN-Bus-library wurde dann benutzt?
ESP32 nodeMCU oder eine andere ESP32-Variante?
ESP32 mit CAN-BUS-Tranceiver auf dem Microcontroller-board integriert so wie hier:

oder externer CAN-BUS-Tranceiver

OK auslesen während der Fahrt auf dem Wasser.

Wie kommen die CAN-BUS-Daten zum Display?
Per Kabel?

Wo befindet sich die MGM-ESC? auf der Unterseite des Boards oder auf der Oberseite?
Aus was für einem Material ist das Board ? Metall oder etwas was 2,4GHz Funkwellen gut durchdringen kann?
Wenn Oberseite und Kunststoffgehäuse könnte WLAN ausreichend gut funktionieren
sind dann ja nur ca 1,5m zwischen Board und Handy
Wäre ein wasserdichtes Handy eine Option oder ist das zu klobig zu teuer bei Verlust

Nur im Falle von WLAN / Handy:
Ich habe einige Projekte mit der ESPUI-library gemacht.
Man kann da auch Grafiken verwenden. Habe ich aber noch nicht gemacht.
Es gibt Label, und Textfelder denen man recht einfach Farben und Werte zuweisen kann.

Wenn es todschick aussehen soll wird man tüfteln müssen.
Wenn Farbwechsel von grün nach gelb nach rot ausreicht das geht recht einfach.

Was mich selbst betrifft: Schon wieder völlig falsche Vermutung. Es macht Spaß.
Für dich scheinbar schrecklich. Ist dein Gehirn das diese Bewertungen vornimmt.
Dafür bist du selbst verantwortlich. So what?

Aufgelöst:

0x001 
 0x54 0x00           // [unsigned] Battery Voltage *0,1V    (8,4V)
 0x00 0x00           // [unsigned] Battery Current *0,1A
 0x00 0x00 0x00 0x00 // [signed] RPM
 
0x002                
 0x00 0x00           // [signed] Motor Temp *1°C 
 0x00 0x00           // [signed] ESC Temp *1°C
 0x00 0x00           //  Reserved
 0x00 0x00           // [signed] Wenn ein externer Sensor verbaut ist *1°C
  
0x003                
 0x00 0x00           // [signed] Output PWM
 0x00 0x00           // [signed] Input PWM
 
0x004 
 0x00 0x00 0x20 0x00 // [unsigned] ERROR  (0000 0000 0000 0000 0010 0000 0000 0000)
 0x00 0x00 0x00 0x00 // [unsigned] WARNING

0x005 
 0x00 0x00 0x00 0x20 // [unsigned] Notice (0000 0000 0000 0000 0000 0000 0010 0000
 0x00 0x00           // Reserved
 0x90 0x01           // [unsigned] ESC INIT Status          (400)
 
0x006 
 0x54 0x00           // [unsigned] Battery Voltage *.1V     (8,4)
 0x94 0x00           // [unsigned] Feeding Voltage *.001V   (0,148)
 0x00 0x00           // [unsigned] Max Phase Current *1A
 0x00 0x00           // [unsigned] Average Phase Current *1A
 
0x007 
 0x00 0x00 0x00 0x00 0x00 0x00 // Reserved
 0x77                // [unsigned] Bus Voltage *0,1V        (11,9)
 0x00                // [unsigned] Mosfet Temperature *1°C

Was ist da für ein Akku dran? Stimmt die Voltage?

Ansonsten ist das auflösen nicht so problematisch....

Ui viel Input und ich bin müde :wink:

Also die Daten können vom Arduino/Teensy per Kabel an das Display. Warum? Ich möchte eh weg von einer Funkfernbedienung - störanfällig wegen CFK und auch Wasser nicht der beste Freund.

Hierfür verwende ich folgendes Modul (PWM Generator):

An das Modul angeschlossen ist ein Hallsensor:
https://www.distrelec.ch/de/hall-effekt-winkelsensor-120-kabelhalterung-kabelanschlussklemme-ip67-ip68-ip69-novotechnik-rfd-4021-612-211-401/p/30024157?pup_e=1&pup_cid=361191&pup_id=30024157&cq_src=google_ads&cq_cmp=18261832767&cq_con=&cq_term=&cq_med=pla&cq_plac=&cq_net=x&cq_pos=&cq_plt=gp&gclsrc=aw.ds&gclsrc=aw.ds&gad_source=1&gad_campaignid=18261864183&gbraid=0AAAAAD_utRDnVoAtO5lWpE09wAZCMzB18&gclid=CjwKCAjwi-DBBhA5EiwAXOHsGX2XR0oob8xRQv2SvirACmRUxW6EFGxXIaRP43rYEdKN6WmsGOT4ShoChcgQAvD_BwE

Der MGM Regler sitzt im Board ebenfalls in einer CFK Box in Zukunft. Er muss ja vor Wasser geschützt sein.
Ich würde daher wirklich ein Kabel verwenden, die Fernbedienung hängt eh an einem Kabel, dies hilft einem sich festzuhalten. Freestyle ohne Griff, fast unmöglich :wink:

Wasserdichtes Handy lieber nicht.

Hier mal ein alter Prototyp des OLEDs-Display, ist aber auch schon wieder ein paar Jahre her:


https://video-downloads.googleusercontent.com/ADGPM2nLLn-0_cAcLN648nYIN6urWXm0kQOePRj-TbSXDb4eZvl648mlLzua70ah4a77tOIc8WSZgGV6ELIV7hw8YbSnCwxAskVapqQpHtpWI1tjr3sjmUMF15CxJPK8AW64cXLtGcrc9i0GnGph6i2T7RKPaeNC6xO2M0NOrGFKwhSGff1KNEXkzAdXI6JDWwZB5k7guy3114arYeZGKLgXkBgCcsKHvnxNr97meXAHeTEl6DpMaGjzQs79MTYSw6LDJY4o_dgWRlXtiIFuw9Ld8bRFxAUkw0a8MVlVJVbqr9_J37JborI5LVy_WDTdJDtQa5m9_uI5U74E0hLQk6hSpLRscu0sp89NPTVHiLVoL8-Q0irr1EvqjHO-96n3B1z6_UagkmznQuyA7Zd1HorlMRDFlL8i4jzwFPiBWf7rn8VvgPoqEFfcRojjRLGYtSoa8IzVhgexAe4duFWXAXJhKZogkwQ62_g2u3aTrbVgpt9LYLms0nJIdQwa4sZ1FeWBd0vgzr0C8HywtpXwso2wDKsCfQ54Fv284aBYkDejje4KPENK2n483ChhpCq-DpQhfRNwoj_wDtHSDEEgmu4uKthZX5-mTkYlv2putDCtrjU9JjkPxAb2DXRzo3EAH_-Mc1LDPlvJMiEHxY09VerHjE2lLtEtlztGn09DBHPgX5E9xoCBWDSkUav1b8vFpgiR9zKu98npKGsdpjN7EOi2zDTyV7_NVoqIVwqLKxgDLP7doN7IK3r0Ded9LEq_VvLkM_OQ5Bj5wxioGn2TD4Lbn-GY7rQ3ifda5KQLyN3UPjNG97mc0SRjm1QjSCUSSxTw0sg2qgbBSURMczyjtM5JNivLDc_AYsTPVGdOo3TU983hWREFjmIgfQ2oN8KmH7TcKXV_3tomiZcTscYS8LxUIWEMJqQJPj55wMRJ81PPhTHvxv7kWZwkqRTe9vDoh_fcqC3pu-UXaSkuzGGkvnQThzPTd21MnkhK_ggLdBgXm8mHnxB82XjEyZazxmwrPgdTSjGEDbZ6xVeBBKxh2Kcb92-9c4roFGWYpGmDQF2-Xh8ZKTYt7CFdQfRaQK3CurO9zm0CNXpZV7jJuOGXlo44XWDTPnhB_-Fbh-Mo3HiGmcADYa5G_KyvgqmNdQ2dUMVydl9zbFnO?authuser=0

Zum Testen hängt nur der Akku am ESC, welcher diesen versorgt. Der hat ca. 12V.
Der eigentliche Akku hängt noch nicht daran, daher auch kaum Werte vorhanden.
Der grosse Akku ist im Keller und schlummert noch.
Ich wollte erst das Auslesen fertig machen, bevor ich alles zusammen baue.
Ist doch ein wenig Aufwand und mit vielen Kratzern an den Händen und Fluchen verbunden :wink:

@my_xy_projekt wie hast Du das aufgelöst oder meinst Du, dass die Verknüpfung so passt zum CAN Protokoll? Wenn ja, richtig, ich sehe auch die 11.9V - das stimmt also.

Abgeschrieben und nach Doku aufgelöst.

Ja.
Das lässt sich auch in einer Handvoll Code wiedergeben.
Mal sehen, was mir einfällt. (Muss aber erstmal woanders bauen - wird viell. heute Abend)

// CAN Receive Example
//

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128];                        // Array to store serial string

#define CAN0_INT 2                              // Set INT to pin 2
// wenn von 2 auf andere Wert dann läuft der BUS
MCP_CAN CAN0(10);                               // Set CS to pin 10


void setup()
{
  Serial.begin(9600);
  //Serial.begin(115200);
  //Serial.begin(9600);
  
  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
    Serial.println("MCP2515 Initialized Successfully!");
  else
    Serial.println("Error Initializing MCP2515...");
  
  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.

  pinMode(CAN0_INT, INPUT);                            // Configuring pin for /INT input
  
  Serial.println("MCP2515 Library Receive Example...");
}

void loop()
{
  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer
  {
    CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
    
    if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
  
    Serial.print(msgString);
  
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }
        
    Serial.println();
  }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

Mit dem Standard-Code, kommt alles sauber heraus, habe ich soeben erneut festgestellt.

Kannst Du mir mal eine komplette Ausgabe geben?
Dann spare ich mir ne Glaskugel :slight_smile:

Müssten vermutlich 8 Nachrichten sein.

D.h. Du hast momentan Board mit CAN-Shield bei der Batterie im Board und willst nur das Display in die Fernbedienung auslagern?

Es wäre m.E. praktischer, wenn der Rechner (Arduino Nano sollte reichen) und der CAN-Empfänger in die Fernbedienung wandern. CAN ist ja gerade für solche Anwendungen erfunden worden (na gut, eher für Landfahrzeuge :slight_smile: ).

Je nachdem was für ein Display Du verwendest, könnte das mit den 1.5m nicht funktionieren - I2C geht auf keinen Fall, SPI kann gehen, aber braucht halt mindestens drei, mit Rückmeldung (unüblich bei Displays) vier Signalleitungen. Beim CAN sind es nur zwei.

Okay, also ein Arduino oder eben Teensy könnte durchaus in die Fernbedienung rein. Das wäre kein Problem. Nur der grosse Sparkfun Red oder eine Uno passen nicht. Stimmt Display und langes Kabel passt nicht....

Wegen dem kompletten Set Nachrichten/Ausgang muss ich heute Abend schauen. Dachte ich hätte es oben gepostet im 21er Beitrag :winking_face_with_tongue: weil laut CAN Bus wir der erste Eintrag nicht gemacht. Ich übermittle ja das Signal für den ESC via PWM und nicht CAN. Aber ich prüfe das noch mal in Ruhe

Ah - die Ausgabe da oben is das, was der Code liefert - dann kann ich das aufteilen.
Mal sehen, was mir einfällt...

Ja genau, das kommt genau so raus

1 Like