An Electric Scooter Community on a Mission to Stamp out Transportation Mediocrity.

Covers electric scooter models whether shared or for consumers.
By Marius Petz
#57801
toots3412 wrote:
Thu May 04, 2023 3:01 pm
When removing the IOT I know it triggers Error 32, does this immobilize the scooter? Can you roll it freely after IOT has been removed?
On the new ninebot scooters from tier this doesnt work. Removing the IoT will not immobilize the scooter (internal name: ninebot g3). when moving the scooter the scooter brakes and the rear light is flashing. To cut of the power for the brake you have to open the board on the bottom with the printing "Please help me up!". There you will find the mainboard, where you can cut off the power. This will release all brakes.
By Ilikescooters
#57803
Marius Petz wrote:
Mon May 22, 2023 7:24 am
toots3412 wrote:
Thu May 04, 2023 3:01 pm
When removing the IOT I know it triggers Error 32, does this immobilize the scooter? Can you roll it freely after IOT has been removed?
On the new ninebot scooters from tier this doesnt work. Removing the IoT will not immobilize the scooter (internal name: ninebot g3). when moving the scooter the scooter brakes and the rear light is flashing. To cut of the power for the brake you have to open the board on the bottom with the printing "Please help me up!". There you will find the mainboard, where you can cut off the power. This will release all brakes.
This dude only wants to steal scooters, so maybe not the best idea to help him. Also quite useless if you cant unlock it later.
By Schlonja
#57870
00RC00 wrote:
Thu Apr 27, 2023 10:28 pm
What you need:

Arduino clone (AT mega328p):
https://de.aliexpress.com/item/10050014 ... pt=glo2deu

MCP2515:
https://de.aliexpress.com/item/32843305 ... pt=glo2deu

DC-DC Step Down Modul 12-80V to 5V:
https://de.aliexpress.com/item/10050014 ... pt=glo2deu

Arduino IDE 2.1.0.
https://www.arduino.cc/en/software

Library for Arduino IDE (mcp_can.h):
https://github.com/coryjfowler/MCP_CAN_lib

if the links don't work:
https://docs.google.com/document/d/1jGx ... ue&sd=true

Sketch:
Code: Select all
#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(10); // Set CS to pin 10

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
if (CAN0.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
else Serial.println("Error Initializing MCP2515...");
CAN0.setMode(MCP_NORMAL);
}

//Motor
byte Motor=0x01;            //
byte StartSpeed=0x01;       //Soft/Fast start
byte MaxSpeed=0x28;         //MaxSpeed          0F = 15km/h       14 = 20km/h      19 = 25km/h      1E = 30km/h      23 = 35km/h      28 = 40km/h      2D = 45km/h        32 = 50km/h
byte DirectStart=0x01;      //0: kick to start, 1: thumb throttle

//Display
byte Unit=0x01;             //0: mph, 1: km/h
byte Light=0x01;            //0: off, 1: on, 2: blink
byte Display=0x01;          //0: off, 1: on
byte TestDisp=0x00;         //0: normal, 1: test display
byte Charger=0x01;          //0: off, 1: Turning on the charger 

//                       1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
byte NumberBytes[29] = { 8, 8, 8, 8, 7, 7, 8, 8, 2, 8, 2, 8, 8, 8, 8, 4, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 };

//                            1           2           3           4           5           6           7           8           9           10          11          12          13          14          15          16          17          18          19          20          21          22          23          24          25          26          27          28          29
unsigned long IDs[29] = { 0x02181606, 0x03FF1601, 0x03FF1602, 0x02FF2602, 0x05124609, 0x05124609, 0x02203606, 0x04FF3400, 0x05124500, 0x02FF2602, 0x05124501, 0x03FF1500, 0x03FF1501, 0x05124502, 0x05124503, 0x04FF3502, 0x05124504, 0x03FF1502, 0x03FF1503, 0x03FF1504, 0x05124611, 0x04FF3400, 0x02FF2602, 0x05124612, 0x05124613, 0x05124614, 0x03FF1601, 0x03FF1602, 0x03FF1400 };

byte MessageBytes[29][8] = {
{ Motor, StartSpeed, MaxSpeed, DirectStart, 0x01, 0x00, 0x00, 0x01 }, //1   Motor:  1.Enable Module,  2.StartSpeed ,  3.MaxSpeed,  4.DirectStart Push away/direct start
{ 0x6E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //2
{ 0xF2, 0x43, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //3
{ 0x98, 0x40, 0xEC, 0xDB, 0x09, 0xD1, 0x69, 0x0B },                   //4
{ 0x03, 0x00, 0x03, 0x70, 0x03, 0xE8, 0x00, 0x00 },                   //5
{ 0x03, 0x00, 0x03, 0xB8, 0x03, 0xCA, 0x00, 0x00 },                   //6
{ Unit, Light, 0x00, Display, TestDisp, Charger, 0x00, 0x00 },        //7   Display:  1.Unit kmh/mph,  2.Light off/on/flash,  3.Reservation (Should be 0),  4.Display on/off,  5.Test display off/on,  6.Charger off/on
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //8
{ 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //9
{ 0xEE, 0xF8, 0xAA, 0xD3, 0x2C, 0x1C, 0xDF, 0x1F },                   //10
{ 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //11
{ 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00 },                   //12
{ 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00 },                   //13
{ 0x52, 0x50, 0x31, 0x33, 0x53, 0x32, 0x30, 0x41 },                   //14
{ 0x00, 0x13, 0x09, 0x18, 0x00, 0x00, 0x00, 0x6A },                   //15
{ 0x00, 0x6F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00 },                   //16
{ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //17
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //18
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //19
{ 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00 },                   //20
{ 0x00, 0x64, 0x25, 0xFA, 0x00, 0x00, 0x21, 0x64 },                   //21
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //22
{ 0x27, 0xF0, 0xD7, 0x53, 0x29, 0x3E, 0x33, 0x5B },                   //23
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //24
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //25
{ 0x0F, 0x94, 0x05, 0x0F, 0x8C, 0x0A, 0x00, 0x08 },                   //26
{ 0x6E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //27
{ 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //28
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }                    //29
};

void loop()
{
  // send data: ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
  for (int i = 0; i < 29; i++) {
    byte sndStat = CAN0.sendMsgBuf(IDs[i], 1, NumberBytes[i], MessageBytes[i]);
    if (sndStat == CAN_OK) {
      Serial.println(IDs[i]);
	} else {
      Serial.println("Error Sending Message...");
    }
  //delay(100);
    }
    delay(500);
}

Optional:

mini Julet connector:
https://de.aliexpress.com/item/40002744 ... pt=glo2deu

Charger:
https://de.aliexpress.com/item/32958115 ... pt=glo2deu

Adapter for Charger:
https://de.aliexpress.com/item/10050035 ... pt=glo2deu


https://i.imgur.com/svZxeDr.png

First you download the Arduino IDE program and download the mcp_can.h library.
Sketch can now be loaded and then the board can be connected. Atmel atmega328p Xplained mini can be selected as board. Then verify and upload. Now the board can be connected to the scooter.

Sorry for my English I'm from Germany.

It works with the 3 switches. You could still build the switches somewhere, but it would be best to use Arduino for it. You would probably need a relais board. The best way to do this is to program it over time. Since my knowledge of programming is not so good, it may take a while :D




But I still have a question, especially for those who have the ES400B/C. If I connect the charger to the charging port and just turn on the IoT, it works. But I don't know if the BMS is then also switched on. does anyone know more Or does anyone know how to check that without cutting open the battery? It also works without the IoT but you can see the status on the display.

So I did everything as described and the IoT gives a sound but the scooter doesn't turn on. So neither the light nor the display turns on. Could you show how you built it?
By Peter Bird
#57899
00RC00 wrote:
Thu Apr 27, 2023 10:28 pm
What you need:

Arduino clone (AT mega328p):
https://de.aliexpress.com/item/10050014 ... pt=glo2deu

MCP2515:
https://de.aliexpress.com/item/32843305 ... pt=glo2deu

DC-DC Step Down Modul 12-80V to 5V:
https://de.aliexpress.com/item/10050014 ... pt=glo2deu

Arduino IDE 2.1.0.
https://www.arduino.cc/en/software

Library for Arduino IDE (mcp_can.h):
https://github.com/coryjfowler/MCP_CAN_lib

if the links don't work:
https://docs.google.com/document/d/1jGx ... ue&sd=true

Sketch:
Code: Select all
#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(10); // Set CS to pin 10

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
if (CAN0.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
else Serial.println("Error Initializing MCP2515...");
CAN0.setMode(MCP_NORMAL);
}

//Motor
byte Motor=0x01;            //
byte StartSpeed=0x01;       //Soft/Fast start
byte MaxSpeed=0x28;         //MaxSpeed          0F = 15km/h       14 = 20km/h      19 = 25km/h      1E = 30km/h      23 = 35km/h      28 = 40km/h      2D = 45km/h        32 = 50km/h
byte DirectStart=0x01;      //0: kick to start, 1: thumb throttle

//Display
byte Unit=0x01;             //0: mph, 1: km/h
byte Light=0x01;            //0: off, 1: on, 2: blink
byte Display=0x01;          //0: off, 1: on
byte TestDisp=0x00;         //0: normal, 1: test display
byte Charger=0x01;          //0: off, 1: Turning on the charger 

//                       1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
byte NumberBytes[29] = { 8, 8, 8, 8, 7, 7, 8, 8, 2, 8, 2, 8, 8, 8, 8, 4, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 };

//                            1           2           3           4           5           6           7           8           9           10          11          12          13          14          15          16          17          18          19          20          21          22          23          24          25          26          27          28          29
unsigned long IDs[29] = { 0x02181606, 0x03FF1601, 0x03FF1602, 0x02FF2602, 0x05124609, 0x05124609, 0x02203606, 0x04FF3400, 0x05124500, 0x02FF2602, 0x05124501, 0x03FF1500, 0x03FF1501, 0x05124502, 0x05124503, 0x04FF3502, 0x05124504, 0x03FF1502, 0x03FF1503, 0x03FF1504, 0x05124611, 0x04FF3400, 0x02FF2602, 0x05124612, 0x05124613, 0x05124614, 0x03FF1601, 0x03FF1602, 0x03FF1400 };

byte MessageBytes[29][8] = {
{ Motor, StartSpeed, MaxSpeed, DirectStart, 0x01, 0x00, 0x00, 0x01 }, //1   Motor:  1.Enable Module,  2.StartSpeed ,  3.MaxSpeed,  4.DirectStart Push away/direct start
{ 0x6E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //2
{ 0xF2, 0x43, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //3
{ 0x98, 0x40, 0xEC, 0xDB, 0x09, 0xD1, 0x69, 0x0B },                   //4
{ 0x03, 0x00, 0x03, 0x70, 0x03, 0xE8, 0x00, 0x00 },                   //5
{ 0x03, 0x00, 0x03, 0xB8, 0x03, 0xCA, 0x00, 0x00 },                   //6
{ Unit, Light, 0x00, Display, TestDisp, Charger, 0x00, 0x00 },        //7   Display:  1.Unit kmh/mph,  2.Light off/on/flash,  3.Reservation (Should be 0),  4.Display on/off,  5.Test display off/on,  6.Charger off/on
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //8
{ 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //9
{ 0xEE, 0xF8, 0xAA, 0xD3, 0x2C, 0x1C, 0xDF, 0x1F },                   //10
{ 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //11
{ 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00 },                   //12
{ 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00 },                   //13
{ 0x52, 0x50, 0x31, 0x33, 0x53, 0x32, 0x30, 0x41 },                   //14
{ 0x00, 0x13, 0x09, 0x18, 0x00, 0x00, 0x00, 0x6A },                   //15
{ 0x00, 0x6F, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00 },                   //16
{ 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //17
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //18
{ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //19
{ 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00 },                   //20
{ 0x00, 0x64, 0x25, 0xFA, 0x00, 0x00, 0x21, 0x64 },                   //21
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //22
{ 0x27, 0xF0, 0xD7, 0x53, 0x29, 0x3E, 0x33, 0x5B },                   //23
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //24
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //25
{ 0x0F, 0x94, 0x05, 0x0F, 0x8C, 0x0A, 0x00, 0x08 },                   //26
{ 0x6E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //27
{ 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00 },                   //28
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }                    //29
};

void loop()
{
  // send data: ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
  for (int i = 0; i < 29; i++) {
    byte sndStat = CAN0.sendMsgBuf(IDs[i], 1, NumberBytes[i], MessageBytes[i]);
    if (sndStat == CAN_OK) {
      Serial.println(IDs[i]);
	} else {
      Serial.println("Error Sending Message...");
    }
  //delay(100);
    }
    delay(500);
}

Optional:

mini Julet connector:
https://de.aliexpress.com/item/40002744 ... pt=glo2deu

Charger:
https://de.aliexpress.com/item/32958115 ... pt=glo2deu

Adapter for Charger:
https://de.aliexpress.com/item/10050035 ... pt=glo2deu


https://i.imgur.com/svZxeDr.png

First you download the Arduino IDE program and download the mcp_can.h library.
Sketch can now be loaded and then the board can be connected. Atmel atmega328p Xplained mini can be selected as board. Then verify and upload. Now the board can be connected to the scooter.

Sorry for my English I'm from Germany.

It works with the 3 switches. You could still build the switches somewhere, but it would be best to use Arduino for it. You would probably need a relais board. The best way to do this is to program it over time. Since my knowledge of programming is not so good, it may take a while :D




But I still have a question, especially for those who have the ES400B/C. If I connect the charger to the charging port and just turn on the IoT, it works. But I don't know if the BMS is then also switched on. does anyone know more Or does anyone know how to check that without cutting open the battery? It also works without the IoT but you can see the status on the display.

How long does the scooter run with your hack? I let your program communicate with the battery and it didn't respond to the CAN commands. I assume you only communicate with the motor controller and display, the battery is not permanently activated.
By Cologne
#57999
zgscooter wrote:
Mon May 22, 2023 7:04 am
I was able to compile and flash the code, and I see that the battery is ACKnowledging the CAN messages (all 29 of them).
But the BMS still does not enable the power output or charging input.
Note that I only have the battery. I do not have the escooter.
My assumption is that other components on the escooter's CAN bus are also sending messages after the ones sent by the arduino, enabling power output.
Could you confirm that the code can't enable power output when only connected to the battery?
If that is the case, could you monitor the CAN bus (also using the MCP2515) to see what other messages are transmitted? (I can provide the code to do that if required).
Your assumption is quite right. I got stuck for a very long time on this one. Apparently the battery connector in the scooter is somehow doing that. When I just plug the connector in the battery, the output goes up to 54V. If I take the battery out, the output is a about 5V. But I still dont get what part inside that connector activates it. Its a normal connector without any logic.

Note: The connector was not wired to other cables, it alone activated the battery. I'm still figuring out :)
By juha1986
#58004
the picture where it shows all the wires and where they should go is a little pixelated. could someone make a little bit higher quality picture for the wires.
By John Blackthorne
#58007
Hello every one.

Well , i did the 3 switches trick on ES400.
It basicaly works, but:

Scooter is works for 5 minutes with max speed 32 km/h, then shows error 16e on the display (it's not a problem because when i let throttle go and push it again scooter can rolls for next 5 minutes, then it shows 16e and i need to let the throttle again).



I don't know why, but it sometimes catches 28e error and i'm unable to get rid of this error untill i disconnect the battery.

Is there any list of error codes for his scooter?

I would like to check what error 28 means.
  • 1
  • 25
  • 26
  • 27
  • 28
  • 29
BIRD ZERO ELECTISAN F350

Hey people, I'm having problems with my Bird Zero […]

I can't seem to find any info anywhere online […]

LIME 3.GEN PERSONAL.....

For the battery indicator, it worked before. The[…]

How much could you pull max?