GPS-Daten und RTC über CAN-Bus übertragen

CKP
Beiträge: 301
Registriert: Mi Jul 09, 2014 4:41 pm
Wohnort: Stuttgart

GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von CKP »

Hi,

vielleicht kann mir hier jemand weiterhelfen, wie genau ich angesprochene Daten "stückeln" muss um sie über CAN-BUS an die Megasquirt zu schicken.

Bzw. wie die CAN-Message genau aussehen sollte.

Das ganze ist im Grund ja nur für den I/O-Extender ausgelegt.
Für den gibts keinen Source Code. (Zumindest habe ich keinen gefunden)

Und im MS3 Source Code habe ich auch schon unter ms3_can_isr.c und ms3_can.c geschaut, aber werde daraus nicht wirklich schlau.

Bin mir auch nicht sicher, was da alles übertragen wird. Ob das nur die Position ist oder alle verfügbaren Daten.
Mir würde es reichen die Position (Longitude und Latitude),GPS Speed und GPS Altitude zu übertragen.

RTC besteht im Grunde aus Datum und Uhrzeit.
Also Jahr+Monat+Datum sowie Stunde+Minute+Sekunde+Millisekunden


vielleicht kann mir ja hier jemand weiterhelfen.

Mit den normalen ADC Werten (0-255) habe ich schon getestet. Das hat über CAN-Receiving und anschließendes zurückrechnen über Generic Sensor Inputs auch super funktioniert. Nur dass eben "etwas Auflösung verloren geht". Würde so vorerst auch ausreichen außer jemand weiß noch eine genauere Variante.


Gruß
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

Hallo,

zu deinen Adc Werten:
wenn ich richtig verstehe hast du eine ms3
und verwendest die receiving Funktion .
11 Bit Header und 8 Byte Daten.
Wie liegen dir die Adc Werte vor?
8 oder 10bit?
Welche Hardware hast du da?
Wieviele Adc willst du übertragen?

Zu deinen anderen Fragen später mehr.
Bin grad unterwegs und nicht am pc.

Gruß
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
CKP
Beiträge: 301
Registriert: Mi Jul 09, 2014 4:41 pm
Wohnort: Stuttgart

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von CKP »

ja genau, nach deinem Rat damals, habe ich mir dann doch irgendwann einen Arduino Uno besorgt.
Bzw. zuerst hatte ich einen Pinguino32, aber da ist wieder alles in C geschrieben und die ganzen Arduino Libraries sind in C++.
Das konnte ich selbst nicht anpassen, deshalb kam dann doch der Uni ins Haus.
Wobei der jetzt wohl letztendlich nicht für alle Funktionen ausreichen wird, die ich später noch umsetzen möchte.

Auf alle fälle .. zu den ADC-Werten.

Also aktuell übertrage ich mittels Receiving keine "echten" ADC Werte, sondern nur Neigungswinkel (um x,y,z-Achse). Diese werden über Beschleunigung, Drehrate und Magnetfeld berechnet (Sensorfusion).
Achsen sind jetzt wegen der Montage vertauscht, aber egal:
X-Achse: 0 bis 360°
Y-Achse: -90 bis 90
Z-Achse: -180° bis 180°

Y-Achse ist dann die Schräglage des Motorrads die ich primär möchte. Das habe ich mittels 1S empfangen. Das ist optimal.
Da decke ich alles ab. Bzw Nachkommastellen kann ich nicht darstellen, aber das wäre hier auch nebensächlich.
Werde das vielleicht noch vorm übertragen runden, sonst werden da einfach die Nachkommastellen abgeschnitten (z.B. 16,89°=16°)

X-Achse teile ich beim Sender durch zwei, empfange es als 1U und multipliziere dann wieder mal zwei.
Z-Achse im Prinzip wie X-Achse nur als 1S empfangen.
Läuft dann bei den beiden letzten darauf hin, dass die Winkel immer in 2° Schritten angezeigt werden.
Aber ansonsten könnte ich das ja in einem Byte 0-255 nicht anders "entschlüsseln".
Außer man splittet die Werte auf mehrere Bytes und fügt das dann im Source Code der Megasquirt wieder zusammen. Aber das wäre mir jetzt zu aufwendig bzw. da würde ich mir schwer tun das umzusetzen. (Nach meinem aktuellen Wissensstand. )

Wenn noch etwas Kapazität frei ist möchte ich dann aber auch noch ein paar ADC Werte von den Inputs übertragen. Hatte da schon mal ein Poti dran, glaube das war ja dann 10bit. Das hätte ich jetzt durch vier geteilt und anschließend wieder multipliziert. Wobei es dann hier auch wieder zu Fehlern kommt, wenn die Nachkommastellen beschnitten werden?
z.B. Sensor: ADC=1022 -> 1022/4= 255,5 -> Empfange: 255 -> 255*4=1020

Wegen der RTC hatte ich auch schon mal getestet und mich an dem Source Code hier orientiert:
https://bitbucket.org/SebGiroux/diyecmgauge/src

Also die Message entsprechend aufgesplitet:

Code: Alles auswählen

    stmp[0] = GPS.seconds;
        stmp[1] = GPS.minute;
        stmp[2] = GPS.hour
        stmp[3] = 1;      //Anpassen!!! eigentlich Week Day
        stmp[4] = GPS.day;
        stmp[5] = GPS.month;
        stmp[6] = GPS.year / 256;
        stmp[7] = GPS.year % 256;
        
Wochentag habe ich rausgelassen.
Hatte ich nicht als direkten Output zur Verfügung müsste man wohl berechnen.
Aber ich dachte den brauchts bestimmt nicht.


CAN-ID konnte man ja nur bis 14 gehe, entsprechendes habe ich dann als HEX beim Sender eingestellt.

Aber Table und Offset wusste ich nicht wirklich was ich da eingeben muss. Habe auch mal einfach nur die ID in das Excel Tool von dir eingegeben. Aber Table war zu groß, das konnte ich nicht übernehmen. Blicke da aber echt noch nicht durch.
Habe aber auch ein paar Varianten getestet (z.B. 0 und 15 (max)).
Aber die RTC hat mir immer nicht das richtige angezeigt. Bzw fing immer wieder bei null an wenn ich das Fenster im TunerStudio geöffnet habe.

Über ADC Receiving Funktion habe ich aber auch mal die einzelnen Bytes abgegriffen und als RAW darstellt.
Funktioniert im Prinzip alles bis auf Year. (Und Milliseconds musste ich auch weglassen, da vierstellig. Aber das wird wohl auch nicht nötig sein).
Bei Year[6] kam dann immer 0
Und bei Year[7] kam 15.
schaue ich mir später nochmal genau an.
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

Hallo,

also dü überträgst deine Adten alle als B2U bzw. B2S.
In deinem Code machst du das wie folgt:

Code: Alles auswählen

/*Gehen wir von der X Achse aus. 
  Die hat ja 0-360° auflösung. Das passt nicht in 1 Byte.
  Also nehmen wir ein unsigned int 0..65535. = 2Byte  */  

unsigned int uiXAxis;
uiXAxis = "dein wert der X Achse 0-360°"

Can.data[0] = (char) (uiXAxis >> 0x08);
Can.data[1] = (char) (uiXAxis && 0xFF);

So kannst du das bei allen Werten machen die du nicht in einem Byte darstellen kannst.
Somit hast du in der MS den gleichen Wert wie im Arduini Uno.
Bei den ADC 0..1023 machst du das genau so.
Musst halt beim Receiving aufpassen wegen Offset...


Mit den RTC und GPS sieht das anders aus.
Da musst du zwindend das 29Bit MS Protocol verwenden.
Da fragt die MS bei dir an du sollst die Daten aus Table x mit offset y übertrage.
Dann auch noch wiviele Byte ab diesem Offset.

Wo der Speicherplatz bei der MS abgelegt wird steht in den ersten 3 Data byte der Can Message.
Byte 0 = Table in der MS
Byte 1 und Teile von Byte 2 sind der Offset in der MS
Die ersten 4 Bits von byte 2 sind die Anzahl der Bytes die du senden sollst.

Kannst ja mal die ID mit der die MS anfragt aufzeichnen und dann in meine Excel liste geben. Dann siehst dir die ersten 3 Data bytes an.
Mit den Daten der ersten 3 bytes und deiner ID kannst daann die Antwort Can id erstellen mit meinem excel sheet.

Ist zwar nicht besonders sexy du kannst aber dann einfach prüfen

Code: Alles auswählen

If ( rec_id == rtc_id) {}

oder 

if (rec_id == gps_id) {}
Gruß
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

So hier der Aufbau der Daten.

RTC:

Code: Alles auswählen

 rtc_sec            = scalar, U08,  110, "", 1,0 
rtc_min            = scalar, U08,  111, "", 1,0 
rtc_hour           = scalar, U08,  112, "", 1,0 
 rtc_day           = scalar, U08,  113, "", 1,0 
rtc_date           = scalar, U08,  114, "", 1,0 
rtc_month        = scalar, U08,  115, "", 1,0 
rtc_year           = scalar, U16,  116, "", 1,0            

Can.data[0] = sekunden;
Can.data[1] = minuten;
Can.data[2] = stunden;
Can.data[3] = 0;
Can.data[4] = tag;
Can.data[5] = monat;
Can.data[6] = jahr >> 0x08;
Can.data[7] = jahr && 0xFF;
GPS:

Code: Alles auswählen

gps_latdeg       = scalar, S08,  128, "", 1,0 
gps_latmin       = scalar, U08,  129, "", 1,0 
gps_latmmin      = scalar, U16,  130, "", 1,0 
gps_londeg       = scalar, U08,  132, "", 1,0 
gps_lonmin       = scalar, U08,  133, "", 1,0 
gps_lonmmin      = scalar, U16,  134, "", 1,0 

senden wie oben. Datenaufbereitnung musst du sehen weiß
nicht wie du die vorliegen hast.


gps_lonEW        = scalar, U08,  136, "", 1,0 // bit 0 = E/W 
gps_altk         = scalar, S08,  137, "", 1,0 
gps_altm         = scalar, S16,  138, "", 0.1,0 
gps_speedkm      = scalar, U16,  140, "", 0.1,0 
 gps_course       = scalar, U16,  142, "", 0.1,0 

senden wie oben. Datenaufbereitnung musst du sehen weiß
nicht wie du die vorliegen hast.
Gruß
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
CKP
Beiträge: 301
Registriert: Mi Jul 09, 2014 4:41 pm
Wohnort: Stuttgart

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von CKP »

schon mal Danke für die Hilfe, aber irgendwie haut das bei mir noch nicht ganz hin.

Habe es jetzt wie folgt versucht:

In der loop:

Code: Alles auswählen

unsigned int uiXAxis;
signed int uiZAxis;

uiXAxis=euler.x();
uiZAxis=euler.z();

 stmp[0]=(char) (uiXAxis >> 0x08); 
 stmp[1]=(char) (uiXAxis && 0xFF);
 stmp[2]=euler.y(); 
 stmp[3]=(char) (uiZAxis >> 0x08);
 stmp[4]=(char) (uiZAxis && 0xFF);
 
 CAN.sendMsgBuf(0x7B, 0, 8, stmp); 
In den Receiving Einstellungen wie folgt:
CAN ADC01 ID: 123 Offset:1 Size: B2U // Entspricht X
CAN ADC02 ID: 123 Offset:2 Size: 1S //Entspricht Y
CAN ADC03 ID: 123 Offset:4 Size: B2S // Entspricht Z

Bis auf Y wird bei keinem Eingang was sinnvolles angezeigt. Habe auch schon verschiedene Offset-Werte probiert, hat aber nicht funktioniert.
Bin jetzt davon ausgegeben, da ich z.B. für ADC01 2 Bytes verschicke, dass ich Offset=1 brauche etc.



Zum anderen:

Also ich habe mir das jetzt mal mittels receive_check angeschaut, was denn so auf dem Bus liegt.

In den MS Einstellungen der RTC stand jetzt beispielsweise noch:
ID: 14
Table: 15
Offset: 0

Sobald RTC über CAN aktiviert wurde, konnte ich folgendes lesen:

Code: Alles auswählen

get data from ID: 
120
7	73	168
Also ID: 120
Length ergibt sich zu 3
Und Data wäre dann eben 7 73 168

Wenn ich jetzt in dem Excel Sheet die 120 als ID eintrage kommt:
From ID: 0 To ID: 2 Table: 4 Offset:0

Habe jetzt zwar ein paar Varianten getestet was ich bei Arduino und MS eingeben könnte.
Aber irgendwie ohne gewünschten Erfolg. Verstehe das ganze aber auch noch nicht so wirklich.

Achja benutze Seeed Studio Can Bus, da habe ich jetzt für 29bit auf extended frame gestellt:
CAN.sendMsgBuf(0x120, 1, 8, rtcdata)
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

CKP hat geschrieben:schon mal Danke für die Hilfe, aber irgendwie haut das bei mir noch nicht ganz hin.

Habe es jetzt wie folgt versucht:

In der loop:

Code: Alles auswählen

unsigned int uiXAxis;
signed int uiZAxis;

uiXAxis=euler.x();
uiZAxis=euler.z();

 stmp[0]=(char) (uiXAxis >> 0x08); 
 stmp[1]=(char) (uiXAxis && 0xFF);
 stmp[2]=euler.y(); 
 stmp[3]=(char) (uiZAxis >> 0x08);
 stmp[4]=(char) (uiZAxis && 0xFF);
 
 CAN.sendMsgBuf(0x7B, 0, 8, stmp); 
In den Receiving Einstellungen wie folgt:
CAN ADC01 ID: 123 Offset:1 Size: B2U // Entspricht X
CAN ADC02 ID: 123 Offset:2 Size: 1S //Entspricht Y
CAN ADC03 ID: 123 Offset:4 Size: B2S // Entspricht Z

Bis auf Y wird bei keinem Eingang was sinnvolles angezeigt. Habe auch schon verschiedene Offset-Werte probiert, hat aber nicht funktioniert.
Bin jetzt davon ausgegeben, da ich z.B. für ADC01 2 Bytes verschicke, dass ich Offset=1 brauche etc.
CAN ADC01 ID:123 Offset:0
CAN ADC02 ID:123 Offset:2
CAN ADC03 ID:123 Offset:3
So müsste das eingestellt sein.
Multiply auf 1, Divide auf 1 und Add bei allen auf 0.

Die anzeige der ID bei dir welche´s Datenformat ist das???120 Decimal?

Gruß
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

Hab das grad mit meinem Can Sniffer getestet.
ID:14
TBL:15
OFFS:0
ergibt bei mir eine reale Bus ID von 0x8778.
Wennich das in die excel liste eingebe passt alles.

Wie kommst du den zu deiner id?
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
CKP
Beiträge: 301
Registriert: Mi Jul 09, 2014 4:41 pm
Wohnort: Stuttgart

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von CKP »

hab es gerade mal mit dem Offset so versucht.

Jetzt ist bei CAN ADC1 ( X-Achse) entweder 256 oder 257 in der Anzeige.
Wenn ich das mit den Daten via Seriell vergleiche, zeigt er mir bei der Megasquirt 256 für alles kleiner 256° an und 257 für alles größer.
Ich schätze falls ich weit genug drehe, würde er wohl noch 0 und 1 anzeigen.

Y-Achse mit 1S ist weiterhin der einzigste Wert der funktioniert.

Für die Z-Achse zeigt Megasquirt -255; 0 oder 1 an.
Wieder je nachdem was für ein Eingangswert vorhanden ist.

Multiply, Divide =1 und Add=0

wie müsste ich den mein Datenpacket, was jetzt in dem Fall noch stmp heißt initialisieren? Vll liegt ja da der Hund begraben
Aktuell habe ich:

Code: Alles auswählen

byte stmp[8] = {};

Wegen der CAN-ID, also ich habe da so ein fertiges Example vom Can Shield benutzt.

Code: Alles auswählen

void loop()
{
    unsigned char len = 0;
    unsigned char buf[8];

    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
    {
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned char canId = CAN.getCanId();
        
        Serial.println("-----------------------------");
        Serial.println("get data from ID: ");
        Serial.println(canId);

        for(int i = 0; i<len; i++)    // print the data
        {
            Serial.print(buf[i]);
            Serial.print("\t");
        }
        Serial.println();
    }
}
In der Doku steht noch folgendes, falls das hilft:

Code: Alles auswählen

4. Get CAN ID
When some data arrive, you can use the following function to get the CAN ID of the "send" node.
INT32U MCP_CAN::getCanId(void)

also doch eher DEC wert?
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

Hey,


kann es sein das deine x,z werte als float dargestelt werden?

mache es vor dem senden so:

Code: Alles auswählen

memset(&stmp, 0, sizeof(stmp));
Danach befüllst du wie werte.
So sind voerher alle 0.
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
CKP
Beiträge: 301
Registriert: Mi Jul 09, 2014 4:41 pm
Wohnort: Stuttgart

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von CKP »

also über seriell werden x,y und z immer mit zwei Nachkommastellen dargestellt.
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

Hab es selber grad mal getestet.
Hab die nötige Hardware ja hier bei mir.
Ist auch ein MCP2515.
Da funktioniert es prima.
Stell bitte deine msq ein. Dann kann ich checken was du da so eingestellt hast.

Gruß
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

CKP hat geschrieben:also über seriell werden x,y und z immer mit zwei Nachkommastellen dargestellt.
Welche library und welches modul ist das was dir x y z ausgibt?
Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
Benutzeravatar
Alfagta
Beiträge: 2382
Registriert: Mo Jan 24, 2011 2:24 pm
Kontaktdaten:

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von Alfagta »

Just for safety mach mal folgendes:

Code: Alles auswählen

unsigned int uiXAxis;
int iZAxis;

uiXAxis=(unsigned int)euler.x();
iZAxis=(int)euler.z();

 memset(&stmp, 0, sizeof(stmp));
 stmp[0]=(char) (uiXAxis >> 0x08); 
 stmp[1]=(char) (uiXAxis && 0xFF);
 stmp[2]=(char) euler.y(); 
 stmp[3]=(char) (iZAxis >> 0x08);
 stmp[4]=(char) (iZAxis && 0xFF);
 
 CAN.sendMsgBuf(0x7B, 0, 8, stmp); 

Wer aufhört besser zu werden hat aufgehört gut zu sein
Alfa 156 GTA
Alfa 75 Race Car MS III
Alfa 164 V6 Turbo
Test MS II
Tunerstudio V3.0.60.61 Registered
MLog View V4.3.30 Registered
MLog View HD V4.3.30 Registered
CKP
Beiträge: 301
Registriert: Mi Jul 09, 2014 4:41 pm
Wohnort: Stuttgart

Re: GPS-Daten und RTC über CAN-Bus übertragen

Beitrag von CKP »

ja das mit dem (int) hatte ich gerade auch schon mal ausprobiert. Hat auch nicht geholfen.

Das hier ist das Modul bzw. zur Library gibts da auch nen Download Link:
https://learn.adafruit.com/adafruit-bno ... r/overview

und msq ist im Anhang.

CAN 1-3 ist das relevante.
Beim Rest hatte ich es nochmal wie davor gelegt.

Code: Alles auswählen

 
 memset(&stmp, 0, sizeof(stmp));
    stmp[0]=(char) (uiXAxis >> 0x08); 
    stmp[1]=(char) (uiXAxis && 0xFF);
    stmp[2]=(char) (uiYAxis); 
    stmp[3]=(char) (uiZAxis >> 0x08);
    stmp[4]=(char) (uiZAxis && 0xFF);
   stmp[5]=euler.x()/2; //0  bis 360  umwandeln und als 1U empfangen;
   stmp[6]=euler.y(); // -90 bis 90 als 1S empfangen;
   stmp[7]=euler.z()/2; // -180 bis 180 ; durch 2 teilen, als 1S empfangen und wieder *2 multiplizieren;
   
Dateianhänge
can_test.msq
(245.02 KiB) 204-mal heruntergeladen
Antworten