Kommunikation zwischen C7 Display und Motorkontroller NCM Venice+ Das-Kit

Diskutiere Kommunikation zwischen C7 Display und Motorkontroller NCM Venice+ Das-Kit im Nabenmotoren Forum im Bereich Fertig-Pedelecs; Hi, Do you have a step by step guide for beginners for this? I can share feedback when I manage to complete the guide or share data for comparison...
J

jpepinofk

Dabei seit
19.12.2020
Beiträge
1
Punkte Reaktionen
0
Hi, Do you have a step by step guide for beginners for this?
I can share feedback when I manage to complete the guide or share data for comparison as well as any other findings.
 
D

DeBabphe

Dabei seit
22.12.2020
Beiträge
2
Punkte Reaktionen
0
Hallo, ich hatte vor Monaten bereits mein Glück versucht mein NCM London+ (20") mit C7 Display zu tunen.
Ich hatte dabei einen ESP32 mit dem Code von Northy bei #33 verwendet. Nach dem Umbau war es möglich auf Stufe 2 mit "Power" die höchste Geschwindigkeit zu fahren, nur lag diese nur bei ca. 27km/h, also kein wirklicher Erfolg. Da ich jetzt wieder Zeit und Lust gefunden haben daran weiter zu forschen habe ich nochmals das Forum studiert und mir sind nun einige Dinge bewusst geworden.
Nun will ich selber die Daten zwischen Display und Motorcontroller rauslesen und danach meinen Code anpassen. Da ich selber in Informatik nur große Interesse und kein Wissen habe, bräuchte ich dafür eure Hilfe !
Vielen Dank, D'Babph
 
D

DeBabphe

Dabei seit
22.12.2020
Beiträge
2
Punkte Reaktionen
0
Kurzes Update. Also das Tuning hat nicht funktioniert. Ich hatte es geschafft den Log auszulesen:
Bei Stufe 2 mit Licht 36V
11:28:06.091 -> received: 3A new: 3A
11:28:06.091 -> received: 2C new: 2C
11:28:06.091 -> received: B new: B
11:28:06.091 -> received: C2 new: C6
11:28:06.124 -> received: 1A new: 24
11:28:06.124 -> received: C8 new: C8
11:28:06.124 -> received: 5 new: 5
11:28:06.124 -> received: 6 new: 6
11:28:06.124 -> received: E6 new: F4
11:28:06.124 -> received: 1 new: 1
11:28:06.165 -> received: D new: 1
11:28:06.165 -> received: A new: A

Habe die neue Checksumme "F4" ausgerechnet.
Bei dem Code #79 mit neuer Checksumme, sowie #130&140 funktioniert die Geschwindigkeitsanzeige und tuning nicht. Das liegt wohl an der fehlgeschlagenen Kommunikation. Dadurch funktioniert aber das Daumengas bis 27km/h..seltsam.

Ich benutze einen ESP32 und hab versucht den Code vom ESP8266 umzuschreiben, vielleicht habe ich hier einen Fehler gemacht:


//Neue Version C7-Diplay-Kommunikation

//Display sendet 12 byte, Controller antwortet mit 10 bytes, Display sendet nochmal 9 bytes

//ACHTUNG: bei Ausgabe auf seriellem Monitor keine Geschwindigkeitsanzeige mehr!

//Checksumme berechnet sich aus b1 - b7, wird aufgeteilt in High und Low Byte




#define BAUD_RATE 9600




byte rb = 0;
byte rb2 = 0;
byte sb = 0;
boolean tune = false;

boolean SerialOutput = false; //bei true werden die Daten an den seriellen Monitor gesendet

void setup() {
Serial.begin(115200);
Serial1.begin(BAUD_RATE,SERIAL_8N1,12,13);
Serial2.begin(BAUD_RATE,SERIAL_8N1,14,15);
}

void loop() {
if (Serial1.available()) // wenn neue serielle Daten anliegen
{

rb = Serial1.read(); // receive byte in rb speichern

if (rb == (0xC2)) // wenn Fahrstufe 2 aktiviert
{
sb = 0xC6; // sendbyte auf Fahrstufe 6 ändern
tune = true; // "Tuning" ist aktiv
}
else if ((rb == (0x1A)) && (tune == true)) // wenn Tuning aktiv und das byte für die Maximalgeschwindigkeit kommt
{
sb = 0x24; // die max. Geschwindigkeit anpassen 1a = 26 km/h
}
else if ((rb == (0xE6)) && (tune = true)) // wenn Tuning aktiv und das low byte für Checksumme kommt
{
sb = 0xF4; // Checksumme anpassen
}
else if (rb == (0x0D)) // wenn wir am Ende vom Datensatz sind, "Tuning" zurücksetzen
{
tune = false;
}
else // ansonsten die bytes durchreichen
{
sb = rb;
}


Serial1.write(sb); // byte an den Controller senden


if (SerialOutput == true)
{
Serial.print("received: ");
Serial.print(rb, HEX);
Serial.print(" new: ");
Serial.println(sb, HEX);
}

}
 
S

schadam

Dabei seit
14.01.2021
Beiträge
1
Punkte Reaktionen
0
Neuer Code, neues Glück.

Änderungen:

- Checksumme wird neu berechnet, das heisst auch andere Rahmengrößen werden ohne Änderungen unterstützt
- die "Seriengeschwindigkeit" kann auch 25 anstatt 26 km/h sein, damit sollte der Code auch für die alten Modelle funktionieren
- zusätzlich wird das Byte vor der Fahrstufe erkannt (Eco, Normal, Power), damit ist auch das Plus-Modell kompatibel

Code:
/*

Neue Version C7-Diplay-Kommunikation

Display sendet 12 byte, Controller antwortet mit 10 bytes, Display sendet nochmal 9 bytes

ACHTUNG: bei Ausgabe auf seriellem Monitor keine Geschwindigkeitsanzeige mehr!

Checksumme berechnet sich aus b1 - b7, wird aufgeteilt in High und Low Byte


*/

#include <SoftwareSerial.h>
#define BAUD_RATE 9600


SoftwareSerial swSer1(12, 13, false, 256);        //Software Seriell 1 auf GPIO12 und 13
SoftwareSerial swSer2(14, 15, false, 256);        //Software Seriell 2 auf GPIO14 und 15

byte rb = 0;
byte sb = 0;
byte prerb = 0;
byte checkadd = 0;
boolean tune = false;
int bytecounter = 0;

boolean SerialOutput = false;                   //bei true werden die Daten an den seriellen Monitor gesendet

void setup() {
  Serial.begin(BAUD_RATE);
  swSer1.begin(BAUD_RATE);
  swSer2.begin(BAUD_RATE);
}

void loop() {
  if (swSer1.available())                       // wenn neue serielle Daten anliegen
  {    
   
    rb = swSer1.read();                         // receive byte in rb speichern

    if ((rb == (0xC2)) && (prerb == (0x0B)))    // wenn Fahrstufe 2 aktiviert und vorher "Power" empfangen wurde
      {
        sb = 0xC6;                              // sendbyte auf Fahrstufe 6 ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if ((rb == (0x1A)) && (tune == true))  // wenn Tuning aktiv und das byte für die Maximalgeschwindigkeit kommt
      {
        sb = 0x24;                              // die max. Geschwindigkeit anpassen 1a = 26 km/h
        bytecounter = 4;                        // Bytecounter für Checksummen-Byte setzen
        checkadd = 0x0E;                        // Addition zur Checksumme auf 14
      }
     else if ((rb == (0x19)) && (tune == true))  // wie vorher, nur mit 25 km/h Seriengeschwindigkeit
      {
        sb = 0x24;                              
        bytecounter = 4;
        checkadd = 0x0F;                        // Addition zur Checksumme auf 15
      }
    else if ((bytecounter == 1) && (tune = true)) // wenn Tuning aktiv und das low byte für Checksumme kommt
      {
        sb = rb + checkadd;                     // Checksumme addieren
        bytecounter = 0;
      }
    else if (rb == (0x0D))                      // wenn wir am Ende vom Datensatz sind, "Tuning" zurücksetzen
      {
        sb = rb;
        tune = false;
      }    
    else                                        // ansonsten die bytes durchreichen
      {
        sb = rb;
        prerb = rb;
            if (bytecounter > 0)                           // wenn Fahrstufe 2 aktiviert
              {
                  bytecounter = bytecounter - 1;
              }
       
      }

   
    swSer1.write(sb);                           // byte an den Controller senden


  if (SerialOutput == true)
    {
      Serial.print("received: ");
      Serial.print(rb, HEX);
      Serial.print("  new: ");
      Serial.println(sb, HEX);
    }

}

}

Ich biete den Chip nun fertig aufgebaut bei ebay im Gehäuse mit Einbauanleitung und passenden Julet-Kabeln an. Einfach nach "NCM Tuning" suchen. Die Abfrage nach Modell und Größe ist nur als Backup, falls doch etwas nicht funktionieren sollte. Ihr könnt mir auch im Forum per PN schreiben, dann gibts den Chip für 10€ weniger.

Gerne kann auch jemand mal den Code bei anderen 48V Modellen ausprobieren, vielleicht passt er ja da auch.

Viele Grüße
Ich hätte Interesse an so einem Chip,hast du noch welche?
 
F

Favorino

Dabei seit
27.10.2020
Beiträge
19
Punkte Reaktionen
6
Der ist leider bei eBay ausverkauft. - Aber ich hätte auch Interesse an einem.

@illuminati235 : Ist irgendwann eine Nachproduktion geplant?
 
F

Favorino

Dabei seit
27.10.2020
Beiträge
19
Punkte Reaktionen
6
O je: illuminati235: Zuletzt online am 14.10.2020. - Somit vermutlich nicht mehr so schnell zu erreichen.
 
F

Favorino

Dabei seit
27.10.2020
Beiträge
19
Punkte Reaktionen
6
Aber gerade gesehen: jokskot (Forumsmitglied aus England) bietet für 49,50 Pfund (ca. 55 €) über eBay-UK seinen Tuning-Chip NCM Supercharger für die Moscow-Modellreihe (mit 29''-Bereifung) an. Funktioniert sicherlich auch für die übrigen NCM-Modelle. Wobei man dann aber eine falsche Geschwindigkeitsanzeige in Kauf nehmen muß.

Allerdings ist die Lieferung nach D nicht vorgesehen. Müsste man halt mit ihm reden, ob er das ausnahmsweise macht. Wird evtl. schwierig werden mit dem Zoll. Jetzt, nachdem Großbritannien nicht mehr in der EU ist...

Ein anderer bietet dasselbe Tuning-Modul für teuere 99 € bei eBay-Kl. an.
 
M

Marze6989

Dabei seit
04.06.2020
Beiträge
54
Punkte Reaktionen
23
Kurzes Update. Also das Tuning hat nicht funktioniert. Ich hatte es geschafft den Log auszulesen:
Bei Stufe 2 mit Licht 36V
11:28:06.091 -> received: 3A new: 3A
11:28:06.091 -> received: 2C new: 2C
11:28:06.091 -> received: B new: B
11:28:06.091 -> received: C2 new: C6
11:28:06.124 -> received: 1A new: 24
11:28:06.124 -> received: C8 new: C8
11:28:06.124 -> received: 5 new: 5
11:28:06.124 -> received: 6 new: 6
11:28:06.124 -> received: E6 new: F4
11:28:06.124 -> received: 1 new: 1
11:28:06.165 -> received: D new: 1
11:28:06.165 -> received: A new: A

Habe die neue Checksumme "F4" ausgerechnet.
Bei dem Code #79 mit neuer Checksumme, sowie #130&140 funktioniert die Geschwindigkeitsanzeige und tuning nicht. Das liegt wohl an der fehlgeschlagenen Kommunikation. Dadurch funktioniert aber das Daumengas bis 27km/h..seltsam.

Ich benutze einen ESP32 und hab versucht den Code vom ESP8266 umzuschreiben, vielleicht habe ich hier einen Fehler gemacht:


//Neue Version C7-Diplay-Kommunikation

//Display sendet 12 byte, Controller antwortet mit 10 bytes, Display sendet nochmal 9 bytes

//ACHTUNG: bei Ausgabe auf seriellem Monitor keine Geschwindigkeitsanzeige mehr!

//Checksumme berechnet sich aus b1 - b7, wird aufgeteilt in High und Low Byte




#define BAUD_RATE 9600




byte rb = 0;
byte rb2 = 0;
byte sb = 0;
boolean tune = false;

boolean SerialOutput = false; //bei true werden die Daten an den seriellen Monitor gesendet

void setup() {
Serial.begin(115200);
Serial1.begin(BAUD_RATE,SERIAL_8N1,12,13);
Serial2.begin(BAUD_RATE,SERIAL_8N1,14,15);
}

void loop() {
if (Serial1.available()) // wenn neue serielle Daten anliegen
{

rb = Serial1.read(); // receive byte in rb speichern

if (rb == (0xC2)) // wenn Fahrstufe 2 aktiviert
{
sb = 0xC6; // sendbyte auf Fahrstufe 6 ändern
tune = true; // "Tuning" ist aktiv
}
else if ((rb == (0x1A)) && (tune == true)) // wenn Tuning aktiv und das byte für die Maximalgeschwindigkeit kommt
{
sb = 0x24; // die max. Geschwindigkeit anpassen 1a = 26 km/h
}
else if ((rb == (0xE6)) && (tune = true)) // wenn Tuning aktiv und das low byte für Checksumme kommt
{
sb = 0xF4; // Checksumme anpassen
}
else if (rb == (0x0D)) // wenn wir am Ende vom Datensatz sind, "Tuning" zurücksetzen
{
tune = false;
}
else // ansonsten die bytes durchreichen
{
sb = rb;
}


Serial1.write(sb); // byte an den Controller senden


if (SerialOutput == true)
{
Serial.print("received: ");
Serial.print(rb, HEX);
Serial.print(" new: ");
Serial.println(sb, HEX);
}

}
Darf ich fragen wieso du nicht den normalen ESP8266 genutzt hast?
Hier gibt es aber glaube ich auch ein Code für dein Controller. Den brauchst du dann nur ändern und nicht komplett neu schreiben.
 
M

Marze6989

Dabei seit
04.06.2020
Beiträge
54
Punkte Reaktionen
23
Kurzes Update. Also das Tuning hat nicht funktioniert. Ich hatte es geschafft den Log auszulesen:
Bei Stufe 2 mit Licht 36V
11:28:06.091 -> received: 3A new: 3A
11:28:06.091 -> received: 2C new: 2C
11:28:06.091 -> received: B new: B
11:28:06.091 -> received: C2 new: C6
11:28:06.124 -> received: 1A new: 24
11:28:06.124 -> received: C8 new: C8
11:28:06.124 -> received: 5 new: 5
11:28:06.124 -> received: 6 new: 6
11:28:06.124 -> received: E6 new: F4
11:28:06.124 -> received: 1 new: 1
11:28:06.165 -> received: D new: 1
11:28:06.165 -> received: A new: A

Habe die neue Checksumme "F4" ausgerechnet.
Bei dem Code #79 mit neuer Checksumme, sowie #130&140 funktioniert die Geschwindigkeitsanzeige und tuning nicht. Das liegt wohl an der fehlgeschlagenen Kommunikation. Dadurch funktioniert aber das Daumengas bis 27km/h..seltsam.

Ich benutze einen ESP32 und hab versucht den Code vom ESP8266 umzuschreiben, vielleicht habe ich hier einen Fehler gemacht:


//Neue Version C7-Diplay-Kommunikation

//Display sendet 12 byte, Controller antwortet mit 10 bytes, Display sendet nochmal 9 bytes

//ACHTUNG: bei Ausgabe auf seriellem Monitor keine Geschwindigkeitsanzeige mehr!

//Checksumme berechnet sich aus b1 - b7, wird aufgeteilt in High und Low Byte




#define BAUD_RATE 9600




byte rb = 0;
byte rb2 = 0;
byte sb = 0;
boolean tune = false;

boolean SerialOutput = false; //bei true werden die Daten an den seriellen Monitor gesendet

void setup() {
Serial.begin(115200);
Serial1.begin(BAUD_RATE,SERIAL_8N1,12,13);
Serial2.begin(BAUD_RATE,SERIAL_8N1,14,15);
}

void loop() {
if (Serial1.available()) // wenn neue serielle Daten anliegen
{

rb = Serial1.read(); // receive byte in rb speichern

if (rb == (0xC2)) // wenn Fahrstufe 2 aktiviert
{
sb = 0xC6; // sendbyte auf Fahrstufe 6 ändern
tune = true; // "Tuning" ist aktiv
}
else if ((rb == (0x1A)) && (tune == true)) // wenn Tuning aktiv und das byte für die Maximalgeschwindigkeit kommt
{
sb = 0x24; // die max. Geschwindigkeit anpassen 1a = 26 km/h
}
else if ((rb == (0xE6)) && (tune = true)) // wenn Tuning aktiv und das low byte für Checksumme kommt
{
sb = 0xF4; // Checksumme anpassen
}
else if (rb == (0x0D)) // wenn wir am Ende vom Datensatz sind, "Tuning" zurücksetzen
{
tune = false;
}
else // ansonsten die bytes durchreichen
{
sb = rb;
}


Serial1.write(sb); // byte an den Controller senden


if (SerialOutput == true)
{
Serial.print("received: ");
Serial.print(rb, HEX);
Serial.print(" new: ");
Serial.println(sb, HEX);
}

}
Darf ich fragen wieso du nicht den normalen ESP8266 genutzt hast?
Hier gibt es aber glaube ich auch ein Code für dein Controller. Den brauchst du dann nur ändern und nicht komplett neu schreiben.
Oder hast du mittlerweile dein Problem gelöst?
 
M

micro

Dabei seit
25.02.2021
Beiträge
1
Punkte Reaktionen
0
Does anyone have the code for 28" wheels such as found on the Venice Plus? If not I'll dig into the checksum process
 
T

ThWe

Dabei seit
13.08.2020
Beiträge
1
Punkte Reaktionen
0
Hi,
gibt es denn noch Hoffnung das ein fertiger Chip mit plug&play angeboten wird oder eine detaillierte Bau/Programmieranleitung für Anfänge.
 
M

markustoe

Dabei seit
27.06.2016
Beiträge
1.176
Punkte Reaktionen
623
Ort
LU
Details E-Antrieb
Stromer ST1X
Den gab's (gibt's) doch in der Bucht....
 
M

Marze6989

Dabei seit
04.06.2020
Beiträge
54
Punkte Reaktionen
23
Der wird schon lange nicht mehr verkauft in der Bucht. Die Anleitung findet man hier im Thread. Da steht wirklich alles was man braucht um den selbst zu bauen.
 
M

Mugen120

Dabei seit
28.02.2021
Beiträge
4
Punkte Reaktionen
2
Hallo, gibts eine Möglichkeit den Daumengas auf max Geschwindigkeit zu schreiben?
 
J

jokskot

Dabei seit
05.04.2020
Beiträge
21
Punkte Reaktionen
5
Hello, is there a way to write the thumb throttle to max speed?
The following is pasted from an entry I made on a UK Pedelecs site:

E-bikes sold in the UK and Europe are only allowed to provide assistance from the motor when the pedals are turned.
All new pre-assembled e-bikes are sold without a throttle, other than the "walk" facility Which Allows movement of the bike to be assisted at 6kph Benthic, usually by depressing a button on the display.
Many pedelecers while rarely requiring a throttle would welcome one for hill starts, for better accelaration at road junctions and to maintain movement while clipping in to the pedals.
E-bike kits will often have a facility to include a throttle so that the motor can be energized using either the bottom bracket PAS or the throttle.
In some instances it may be possible to fit a throttle to new preassembled bikes by connecting to the controller, but not all controllers will have suitable connection pads and in many instances the controller circuits will be encased in silicone to prevent water ingress thus preventing user access .

The PAS sensors fitted to many e-bikes rely on rotating magnets at the bottom bracket creating electronic pulses, in a hall sensor, which energises the controller and activates the motor.
The first post of this thread provides an Arduino based circuit and code to create pulses to mimic those generated by the PAS and thereby activate the motor. I have spent some time trying to get this (and another Arduino based solution described in my recent post) to work without success.

Using the circuit attached * consisting of a momentary switch to supply 5v from the PAS supply lines to an NE555, wired as an astable oscillator, and to activate a relay to disconnect the signal line from the PAS to the controller, I have been able to mimic the PAS and energize the motor without having to turn the pedals.
The throttle is either On or Off, there is no intermediate control, but this exactly the same as the normal PAS.
The NE555 was bought as a board from eBay for a little over £ 2 (see second attachment) and offers a wide range of signal frequencies and duty cycles using dip connectors and fine tuning using the variable potentiometers.
I have found a 7Hz frequency and a 55% duty cycle to be effective, but this does not need to be precise.

* the circuit needs a flyback diode across the relay coil.
 

Anhänge

  • 0001.jpg
    0001.jpg
    36,6 KB · Aufrufe: 47
  • s-l140.jpg
    s-l140.jpg
    8,5 KB · Aufrufe: 46
M

Mugen120

Dabei seit
28.02.2021
Beiträge
4
Punkte Reaktionen
2
Wenn ich den Code auf Seite 1, Beitrag 15 aufspiele, funktioniert das Daumengas bis V max. Ich kriege es nur nicht hin, dass Byte 7 auf 0x00 im Code von Marze6989 auf Seite 7 zu implementieren.
 
F

Favorino

Dabei seit
27.10.2020
Beiträge
19
Punkte Reaktionen
6
Bei eBay gibt's übrigens wieder so ein Tuning-Modul:

<KLICK>

...allerdings mit 104 € ziemlich teuer.
 
M

markustoe

Dabei seit
27.06.2016
Beiträge
1.176
Punkte Reaktionen
623
Ort
LU
Details E-Antrieb
Stromer ST1X
Sogar recht viele....
 
L

Lionz

Dabei seit
08.03.2021
Beiträge
4
Punkte Reaktionen
0
Hallo zusammen,
mein erster Beitrag hier im Forum.
habe seit zwei Wochen ein NCM Milano mit C7 Display.
Habe jetzt einen ESP 8266 mit folgendem Code (im Anhang) programmiert.
Nach einigen Hürden wie USB seriell Treiber für Windows 10 und eine älteren Boardversion des ESP 8266 im Boardmanager von Arduino hat es funktioniert.
Auf Stufe 2 mit Licht volle Power. Daumengas funktioniert bis Endgeschwindigkeit.
Der Code ist für ein NVM 29" Moskau
So weit so gut.
Leider keine erhöhte Endgeschwindigkeit und keine Geschwindigkeitsangabe.
Hat jemand einen Tipp?
Gruß Lionz


// C7 Display Tuning
// Mittwoch 24.Oktober 2018
// Rene Horstmann

#include <SoftwareSerial.h>
#define BAUD_RATE 9600

SoftwareSerial swSer1(12, 13, false, 256); //Software Seriell 1 auf GPIO12 und 13
SoftwareSerial swSer2(14, 15, false, 256); //Software Seriell 2 auf GPIO14 und 15

const byte numBytes = 32;
byte receivedBytes1[numBytes];
byte numReceived1 = 0;
byte receivedBytes2[numBytes];
byte numReceived2 = 0;
boolean newData1 = false;
boolean newData2 = false;

byte sendBytes[numBytes];

void setup()
{
Serial.begin(BAUD_RATE); //eingebaute USB Schnitstelle
swSer1.begin(BAUD_RATE); //Software seriell1
swSer2.begin(BAUD_RATE);
Serial.println("<Arduino is ready>");
}

void loop()
{
recvBytesWithStartEndMarkers1(); // Nachsehen ob neues Telegramm von Display da ist
modNewData(); // Bytes tauschen
Checksumm(); // checksumme berechnen
showNewData(); //verändertes Telegramm senden
//delay(20);
recvBytesWithStartEndMarkers2(); // Nachsehen ob neues Telegramm von Motorcontroller da ist
}

void recvBytesWithStartEndMarkers1()
{
static boolean recvInProgress = false;
static byte ndx = 0;
byte startMarker = 0x3A; //muss mit 0x3A beginnen
byte endMarker1 = 0x0D;
byte endMarker2 = 0x0A; // und mit CR LF enden
byte rb;


while (swSer1.available() > 0 && newData1 == false)
{
rb = swSer1.read();

if (recvInProgress == true)
{
if ((rb != endMarker2) || (receivedBytes1[ndx-1] !=endMarker1))
{
receivedBytes1[ndx] = rb;
ndx++;

if (ndx >= numBytes)
{
ndx = numBytes - 1;
}
}
else
{
receivedBytes1[ndx-1] = '\0'; // terminate the string
recvInProgress = false;
numReceived1 = ndx-1; // save the number for use when printing
ndx = 0;
newData1 = true;
}
}

else if (rb == startMarker)
{
recvInProgress = true;
}
}
}

void recvBytesWithStartEndMarkers2()
{
static boolean recvInProgress = false;
static byte ndx = 0;
byte startMarker = 0x3A; //muss mit 0x3A beginnen
byte endMarker1 = 0x0D;
byte endMarker2 = 0x0A; // und mit CR LF enden
byte rb;



while (swSer2.available() > 0 && newData2 == false)
{
rb = swSer2.read();

if (recvInProgress == true)
{
if ((rb != endMarker2) || (receivedBytes2[ndx-1] !=endMarker1))
{
receivedBytes2[ndx] = rb;
ndx++;

if (ndx >= numBytes)
{
ndx = numBytes - 1;
}
}

else
{
receivedBytes2[ndx-1] = '\0'; // terminate the string
recvInProgress = false;
numReceived2 = ndx-1; // save the number for use when printing
ndx = 0;
newData2 = true;
}
}

else if (rb == startMarker)
{
recvInProgress = true;
}
}
}

void modNewData()
{
sendBytes[0]=0x3A; // neues Telegramm mit 0x3A beginnen
for (byte n=0; n < numReceived1; n++)
{
sendBytes[n+1]=receivedBytes1[n]; // Die empfangenen Bytes an die nächsten Positionen
}
sendBytes[10]=0x0D; // CR und LF ans Ende
sendBytes[11]=0x0A;

if ( (sendBytes[3] == (0x42)) || (sendBytes[3] == (0xC2) )) // Wenn das 4. Byte 0x42 (2. Stufe) ODER dann 4. Byte 0xC2 (licht an)
{
sendBytes[2]=(0x0B); // 3. Byte (Unterstützungslevel)
sendBytes[3]=(0x46); // 4. Byte (Stufe) auf 6
sendBytes[4]=(0x36); // und 5. Byte (Speed) auf (0x24 = 36km/h) (0x36=54km/h)

if (sendBytes[7] == (0x06) ) // Wenn Daumengas und 2. Stufe dann
{
sendBytes[7]=(0x00); // ersetze auf vmax (0x00)
}
}
}

void Checksumm()
{
sendBytes[8]=0;
for (byte n=1; n<8; n++)
{
sendBytes[8]=sendBytes[8]+sendBytes[n];
}
}

void showNewData()
{
if (newData1 == true)
{
Serial.print("received: ");
for (byte n = 0; n < numReceived1; n++)
{
Serial.print(receivedBytes1[n], HEX);
Serial.print(' ');
}
Serial.println();

Serial.print("mod: ");
for (byte n = 0; n < 12; n++)
{
Serial.print(sendBytes[n], HEX);
Serial.print(' ');

}
Serial.println(); // bis hier DebugInfo via USB an PC



swSer1.write(sendBytes,12); // Telegramm rausschicken
newData1 = false;
}

if (newData2 == true)
{
Serial.print("receivedMotorC: ");
for (byte n = 0; n < numReceived2; n++)
{
Serial.print(receivedBytes2[n], HEX);
Serial.print(' ');
}
Serial.println();
newData2 = false;

Serial.println(); // bis hier DebugInfo via USB an PC
}
}
 
M

Marze6989

Dabei seit
04.06.2020
Beiträge
54
Punkte Reaktionen
23
So ich habe nochmal ein Code gemacht für das NCM Moscow Plus 29 Zoll. Ob der auf den anderen läuft weiß ich jetzt nicht genau. Ich habe den auch nur gemacht damit mein Daumengase ohne Tunung 6 Km/h hat und mit Tuninng volle Leistung hat. Da ist Stufe 1-6 ohne Licht das Tuning deaktiviert und Daumgas 6 kmh und mit Licht alle Stufen getunt mit besseren Ansprechverhalten und das Daumengas mit voller Leistung.
Ich habe das Moscow plus 29 zoll. Da läuft der absolut perfekt.


Code:
/*

Neue Version C7-Diplay-Kommunikation

Display sendet 12 byte, Controller antwortet mit 10 bytes, Display sendet nochmal 9 bytes

ACHTUNG: bei Ausgabe auf seriellem Monitor keine Geschwindigkeitsanzeige mehr!

Checksumme berechnet sich aus b1 - b7, wird aufgeteilt in High und Low Byte


*/

#include <SoftwareSerial.h>
#define BAUD_RATE 9600


SoftwareSerial swSer1(12, 13, false, 256);        //Software Seriell 1 auf GPIO12 und 13
SoftwareSerial swSer2(14, 15, false, 256);        //Software Seriell 2 auf GPIO14 und 15

byte rb = 0;
byte rb2 = 0;
byte sb = 0;
boolean tune = false;

boolean SerialOutput = false;                   //bei true werden die Daten an den seriellen Monitor gesendet
boolean SerialOutput2 = false;                   //bei true werden die Daten an den seriellen Monitor gesendet

void setup() {
  Serial.begin(BAUD_RATE);
  swSer1.begin(BAUD_RATE);
  swSer2.begin(BAUD_RATE);
}

void loop() {
  if (swSer1.available())                       // wenn neue serielle Daten anliegen
  {    
   
    rb = swSer1.read();                         // receive byte in rb speichern


    if (rb == (0xC1))                           // wenn Fahrstufe 1 aktiviert
      {
        sb = 0xC1;                              // sendbyte auf Fahrstufe 1 ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if (rb == (0xC2))                           // wenn Fahrstufe 2 aktiviert
      {
        sb = 0xC2;                              // sendbyte auf Fahrstufe 2 ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if (rb == (0xC3))                           // wenn Fahrstufe 3 aktiviert
      {
        sb = 0xC3;                              // sendbyte auf Fahrstufe 3 ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if (rb == (0xC4))                           // wenn Fahrstufe 4 aktiviert
      {
        sb = 0xC4;                              // sendbyte auf Fahrstufe 4 ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if (rb == (0xC5))                           // wenn Fahrstufe 5 aktiviert
      {
        sb = 0xC5;                              // sendbyte auf Fahrstufe 5 ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if (rb == (0xC6))                           // wenn Fahrstufe 6 aktiviert
      {
        sb = 0xC6;                              // sendbyte auf Fahrstufe 6 ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if ((rb == (0x06)) &&  (tune == true)) // alle Fahrstufe ändern aktiviert
      {
        sb = 0x00;                              // sendbyte auf alle Fahrstufe ändern
        tune = true;                            // "Tuning" ist aktiv
      }
    else if ((rb == (0x1A)) && (tune == true))  // wenn Tuning aktiv und das byte für die Maximalgeschwindigkeit kommt
      {
        sb = 0x2D;                              // die max. Geschwindigkeit anpassen 2D = 45 km/h
      }
    else if ((rb == (0x12)) && (tune = true))   // wenn Tuning aktiv und das low byte für Checksumme kommt
      {
        sb = 0x1F;                              // Checksumme anpassen
      }
    else if ((rb == (0x13)) && (tune = true))   // wenn Tuning aktiv und das low byte für Checksumme kommt
      {
        sb = 0x20;                              // Checksumme anpassen
      }
    else if ((rb == (0x14)) && (tune = true))   // wenn Tuning aktiv und das low byte für Checksumme kommt
      {
        sb = 0x21;                              // Checksumme anpassen
      }
    else if ((rb == (0x15)) && (tune = true))   // wenn Tuning aktiv und das low byte für Checksumme kommt
      {
        sb = 0x22;                              // Checksumme anpassen
      }
    else if ((rb == (0x16)) && (tune = true))   // wenn Tuning aktiv und das low byte für Checksumme kommt
      {
        sb = 0x23;                              // Checksumme anpassen
      }
    else if ((rb == (0x17)) && (tune = true))   // wenn Tuning aktiv und das low byte für Checksumme kommt
      {
        sb = 0x24;                              // Checksumme anpassen
      }
    else if (rb == (0x0D))                      // wenn wir am Ende vom Datensatz sind, "Tuning" zurücksetzen
      {
        tune = false;
      }    
    else                                        // ansonsten die bytes durchreichen
      {
        sb = rb;
      }
    swSer1.write(sb);                           // byte an den Controller senden


  if (SerialOutput == true)
    {
      Serial.print("received: ");
      Serial.print(rb, HEX);
      Serial.print("  new: ");
      Serial.println(sb, HEX);
    }

}

}
 
Zuletzt bearbeitet:
Thema:

Kommunikation zwischen C7 Display und Motorkontroller NCM Venice+ Das-Kit

Kommunikation zwischen C7 Display und Motorkontroller NCM Venice+ Das-Kit - Ähnliche Themen

Extern Balancer für 10S selber bauen?: Hi, ich habe das hier ins Auge gefast: TP4056 Platine Chip Datasheet Meine Cellen Technische Daten (kurzfassung)...
Haibike Yamaha: Reverse-Engineering: Hallo, nachdem ich zusammen mit dem Nutzer @hErMeS den Yamaha Thread mit dem Akku-protokoll vollgequatscht hatte, haben wir uns über die...
Oben