Last active 2 years ago

scooter, hujalnoga, esp, arduino

drops revised this gist 2 years ago. Go to revision

1 file changed, 484 insertions

gistfile1.txt(file created)

@@ -0,0 +1,484 @@
1 + ====
2 + int powerPin = 5;
3 + byte messageA[] = {0xA6, 0x12, 0x02, 0x10, 0x14, 0xCF};
4 + byte messageB[] = {0xA6, 0x12, 0x02, 0x11, 0x14, 0x0B};
5 + byte messageC[] = {0xA6, 0x12, 0x02, 0x89, 0x01, 0x1C};
6 +
7 + ====
8 + byte messageD[] = {0xA6, 0x12, 0x02, 0x85, 0x24, 0x4D}; // CHANGE LOOP TO MODIFY AND TEST
9 + ====
10 + ===
11 + byte messageC[] = {0xA6, 0x12, 0x02, 0XF5, 0xE4, 0x31}; // LIGHT ON & ESC ON & KPH & MAX SPEED
12 +
13 + ===
14 + How did you figure out the 0xA6, 0x12, 0x02, 0x85, 0x24, 0x4D command? Really how did you discover the 0x24 portion. I tried a lot of different numbers in the fifth location with no luck?
15 + ===
16 + #include <Arduino.h>
17 +
18 + int powerPin = 5;
19 + byte messageA[] = {0xA6, 0x12, 0x02, 0x10, 0x14, 0xCF}; // MAKES HEADLIGHT BLINK ONCE
20 +
21 + byte messageB[] = {0xA6, 0x12, 0x02, 0XE1, 0x14, 0x92}; // LIGHT OFF & ESC ON & MPH & SLOW
22 + byte messageC[] = {0xA6, 0x12, 0x02, 0XE3, 0x14, 0x03}; // LIGHT Flash & ESC ON & MPH & SLOW
23 + byte messageD[] = {0xA6, 0x12, 0x02, 0XE5, 0x14, 0xA9}; // LIGHT ON & ESC ON & MPH & SLOW
24 +
25 + byte messageE[] = {0xA6, 0x12, 0x02, 0XE1, 0xE4, 0xE6}; // LIGHT OFF & ESC ON & MPH & FAST
26 + byte messageF[] = {0xA6, 0x12, 0x02, 0XE3, 0xE4, 0x77}; // LIGHT Flash & ESC ON & MPH & Fast
27 + byte messageG[] = {0xA6, 0x12, 0x02, 0XE5, 0xE4, 0xDD}; // LIGHT ON & ESC ON & MPH & FAST
28 +
29 + byte messageH[] = {0xA6, 0x12, 0x02, 0XF1, 0x14, 0x7E}; // LIGHT OFF & ESC ON & KPH & SLOW
30 + byte messageI[] = {0xA6, 0x12, 0x02, 0XF3, 0x14, 0xEF}; // LIGHT Flash & ESC ON & KPH & SLOW
31 + byte messageJ[] = {0xA6, 0x12, 0x02, 0XF5, 0x14, 0x45}; // LIGHT ON & ESC ON & KPH & SLOW
32 +
33 + byte messageK[] = {0xA6, 0x12, 0x02, 0XF1, 0xE4, 0x0A}; // LIGHT OFF & ESC ON & KPH & FAST
34 + byte messageL[] = {0xA6, 0x12, 0x02, 0XF3, 0xE4, 0x9B}; // LIGHT Flash & ESC ON & KPH & Fast
35 + byte messageM[] = {0xA6, 0x12, 0x02, 0XF5, 0xE4, 0x31}; // LIGHT ON & ESC ON & KPH & FAST
36 +
37 +
38 + void setup() {
39 + // initialize Serial1:
40 + Serial.begin(9600);
41 + pinMode(powerPin, OUTPUT);
42 + digitalWrite(powerPin, HIGH);
43 + Serial.write(messageA, sizeof(messageA));
44 + delay(500);
45 + }
46 +
47 + void loop() {
48 + delay(500);
49 + // Pick what ever driving profile you want and remove the "//" to make that part of the code active
50 +
51 + //Serial.write(messageB, sizeof(messageB));
52 + //Serial.write(messageC, sizeof(messageC));
53 + //Serial.write(messageD, sizeof(messageD));
54 + //Serial.write(messageE, sizeof(messageE));
55 + //Serial.write(messageF, sizeof(messageF));
56 + //Serial.write(messageG, sizeof(messageG));
57 + //Serial.write(messageH, sizeof(messageH));
58 + //Serial.write(messageI, sizeof(messageI));
59 + //Serial.write(messageJ, sizeof(messageJ));
60 + //Serial.write(messageK, sizeof(messageK));
61 + //Serial.write(messageL, sizeof(messageL));
62 + //Serial.write(messageM, sizeof(messageM));
63 + }
64 + ===
65 + Found in hex dump:
66 + "0xa6,0x12,0x2,0x95,0x1,0xbd"
67 +
68 + "0xa6,0x12,0x2,0x91,0x1,0x86"
69 +
70 + The reason I mentioned 3-6 occurences is that one of the matches contains coming four sequences in one straight sequence.
71 + 0xa6,0x12,0x2,0x90,0x1,0x42,0xa6,0x12,0x2,0x89,0x1,0x1c,0xa6,0x12,0x2,0x8d,0x1,0x27,0xa6,0x12,0x2,0xf2,0x1,0x89
72 + ===
73 + conclusoes:
74 +
75 + Lights:
76 + ON -- A6 12 02 8D 01 27
77 + OFF -- A6 12 02 89 01 1C
78 +
79 +
80 + Sound:
81 + CONFIRMCAO ?? A6 12 02 90 01 42
82 + R2D2 -- A6 12 02 89 01 1C
83 +
84 + ESC:
85 +
86 + ?? A6 12 02 F2 01 89
87 + ?? A6 12 02 A9 01 DD
88 + ?? A6 11 01 80 01 42
89 + ===
90 + Ok, so I got my ES-200G running yesterday.
91 + I reach 37km/h on freewheel, haven't tested with load yet since my scoot is in a thousand pieces on my workbench.
92 +
93 + These are the codes I used:
94 +
95 + {0xA6, 0x12, 0x02, 0x10, 0x14, 0xCF} - boot the scooter, lights on, km/h, sent once at startup
96 + {0xA6, 0x12, 0x02, 0XF5, 0xE4, 0x31} - this is sent every 500ms
97 + ===
98 + #include <FastCRC.h>
99 +
100 + FastCRC8 CRC8;
101 +
102 + bool firstdigit = 0; //Still unknown function
103 + bool seconddigit = 0; //Still unknown function
104 + bool fastAcceleration = 1; //1 for on, 0 for off
105 + bool KPH = 1; //1 for KPH, 0 for MPH
106 + bool fifthdigit = 0; //Still unknown function
107 + bool Light = 1; //1 for on, 0 for off
108 + bool LightBlink = 0; //1 for on, 0 for off
109 + bool ESCOn = 1; //1 for on, 0 for off
110 + int SpeedLimit = 255; //Beetwen 0 and 255
111 +
112 +
113 + int forth = 0;
114 + byte buf[6] = {0xA6, 0x12, 0x02};
115 +
116 + void setup() {
117 + Serial.begin(9600);
118 + calculateforth();
119 + buf[3] = forth;
120 + buf[4] = SpeedLimit;
121 + buf[5] = CRC8.maxim(buf, 5);
122 + }
123 +
124 +
125 + void loop() {
126 + Serial.write(buf, sizeof(buf));
127 + delay(500);
128 + }
129 +
130 + void calculateforth() {
131 + if (firstdigit == 1){
132 + forth = forth + 128;
133 + }
134 + if (seconddigit == 1){
135 + forth = forth + 64;
136 + }
137 + if (fastAcceleration == 1){
138 + forth = forth + 32;
139 + }
140 + if (KPH == 1){
141 + forth = forth + 16;
142 + }
143 + if (fifthdigit == 1){
144 + forth = forth + 8;
145 + }
146 + if (Light == 1){
147 + forth = forth + 4;
148 + }
149 + if (LightBlink == 1){
150 + forth = forth + 2;
151 + }
152 + if (ESCOn == 1){
153 + forth++;
154 + }
155 + }
156 + ===
157 + or take several diodes in throughput direction in series, works also. (500-700mV per regular silicon diode)
158 + There will be no big current and therefore no big in rush at all. The biggest option would be when using a ESP32 for example but even that chips doesn't draw more than 200mA @ 3,3V. The LM2596 has a converting efficiency around 94% plus it takes approximately 5-8mA to power itself so if you lower the input voltage about 10V we're talking about 17-32 volt to the regulator what is within its operating range. 200mA @ 3,3V= 660mW, 660mW divided by 0.94~=702.1mW, for the highest current we take 17V as lowest case so 702.1mW divided by 17V = 4,13mA, 4,13ma plus 8mA selfpower is 12,13mA, 10V diodes loss times 12,13mA = 121,3mW loss in heat on the diode when powering a ESP32 in full load giving approximately 88% safety factor when using a 10V 1W type.
159 + Cheers
160 + ===
161 + // RemoteXY select connection mode and include library
162 + #define REMOTEXY_MODE__ESP32CORE_BLE
163 +
164 + #include <RemoteXY.h>
165 +
166 + // RemoteXY connection settings
167 + #define REMOTEXY_BLUETOOTH_NAME "Your Scooter"
168 + #define REMOTEXY_ACCESS_PASSWORD "password"
169 +
170 +
171 + // RemoteXY configurate
172 + #pragma pack(push, 1)
173 + uint8_t RemoteXY_CONF[] =
174 + { 255,4,0,0,0,155,0,8,8,1,
175 + 2,0,6,16,22,11,4,26,31,31,
176 + 79,78,0,79,70,70,0,129,0,8,
177 + 8,18,6,16,80,111,119,101,114,0,
178 + 2,0,36,18,18,8,1,26,31,31,
179 + 79,78,0,79,70,70,0,129,0,39,
180 + 10,12,6,16,70,97,115,116,0,3,
181 + 3,13,48,9,25,3,26,129,0,14,
182 + 38,15,6,16,76,105,103,104,116,0,
183 + 129,0,27,49,8,6,16,79,110,0,
184 + 129,0,27,58,9,6,16,79,102,102,
185 + 0,129,0,27,66,24,6,16,66,108,
186 + 105,110,107,105,110,103,0,2,0,7,
187 + 89,14,7,14,26,31,31,79,78,0,
188 + 79,70,70,0,129,0,24,90,28,5,
189 + 16,79,84,65,32,85,112,100,97,116,
190 + 101,0 };
191 +
192 + // this structure defines all the variables of your control interface
193 + struct {
194 +
195 + // input variable
196 + uint8_t switch_1; // =1 if switch ON and =0 if OFF
197 + uint8_t speed_switch; // =1 if switch ON and =0 if OFF
198 + uint8_t select_1; // =0 if select position A, =1 if position B, =2 if position C, ...
199 + uint8_t ota_update; // =1 if switch ON and =0 if OFF
200 +
201 + // other variable
202 + uint8_t connect_flag; // =1 if wire connected, else =0
203 +
204 + } RemoteXY;
205 + #pragma pack(pop)
206 +
207 + /**
208 + httpUpdate.ino
209 +
210 + Created on: 27.11.2015
211 +
212 + */
213 +
214 + #include <Arduino.h>
215 +
216 + #include <WiFi.h>
217 + #include <WiFiMulti.h>
218 + #include <ArduinoOTA.h>
219 + #include <HTTPClient.h>
220 + #include <HTTPUpdate.h>
221 + const char* ssid = "SSID";
222 + const char* password = "PASSWORD";
223 +
224 +
225 + byte slow[] = {0xA6, 0x12, 0x02, 0x35, 0x14, 0xF1}; // Speed Limit to 20 km/h
226 + byte fast[] = {0xA6, 0x12, 0x02, 0x35, 0xFF, 0x38}; // Maximum Speed
227 + byte off[] = {0xA6, 0x12, 0x02, 0x00, 0xFF, 0xEA};
228 + byte fast_stealth[] = {0xA6, 0x12, 0x02, 0x31, 0xFF, 0x03};
229 + byte fast_blinking[] = {0xA6, 0x12, 0x02, 0x33, 0xFF, 0x92};
230 + byte slow_stealth[] = {0xA6, 0x12, 0x02, 0x31, 0x14, 0xCA};
231 + byte slow_blinking[] = {0xA6, 0x12, 0x02, 0x33, 0x14, 0x5B};
232 +
233 + int run_once = 0;
234 +
235 + void setup() {
236 + Serial.begin(9600);
237 + RemoteXY_Init ();
238 +
239 + }
240 +
241 + void loop() {
242 + ArduinoOTA.handle();
243 + if((RemoteXY.ota_update == 1) && (run_once == 0))
244 + {
245 +
246 + Serial.println("Booting");
247 + WiFi.mode(WIFI_STA);
248 + WiFi.begin(ssid, password);
249 + while (WiFi.waitForConnectResult() != WL_CONNECTED) {
250 + Serial.println("Connection Failed! Rebooting...");
251 + delay(5000);
252 + ESP.restart();
253 + }
254 +
255 + // Port defaults to 8266
256 + // ArduinoOTA.setPort(8266);
257 +
258 + // Hostname defaults to esp8266-[ChipID]
259 + ArduinoOTA.setHostname("Your Scooter");
260 +
261 + // No authentication by default
262 + ArduinoOTA.setPassword((const char *)"password");
263 +
264 + ArduinoOTA.onStart([]() {
265 + Serial.println("Start");
266 + });
267 + ArduinoOTA.onEnd([]() {
268 + Serial.println("\nEnd");
269 + });
270 + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
271 + Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
272 + });
273 + ArduinoOTA.onError([](ota_error_t error) {
274 + Serial.printf("Error[%u]: ", error);
275 + if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
276 + else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
277 + else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
278 + else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
279 + else if (error == OTA_END_ERROR) Serial.println("End Failed");
280 + });
281 + ArduinoOTA.begin();
282 + Serial.println("Ready");
283 + Serial.print("IP address: ");
284 + Serial.println(WiFi.localIP());
285 + run_once = 1;
286 + }
287 +
288 +
289 + if((RemoteXY.ota_update == 0) && (run_once == 0))
290 + {
291 +
292 + RemoteXY_Handler ();
293 +
294 + if((RemoteXY.switch_1 == 1) && (RemoteXY.speed_switch == 0) && (RemoteXY.select_1 == 0))
295 + {
296 + Serial.write(slow, sizeof(slow));
297 + }
298 +
299 + else if((RemoteXY.switch_1 == 1) && (RemoteXY.speed_switch == 0) && (RemoteXY.select_1 == 1))
300 + {
301 + Serial.write(slow_stealth, sizeof(slow_stealth));
302 + }
303 +
304 + else if((RemoteXY.switch_1 == 1) && (RemoteXY.speed_switch == 0) && (RemoteXY.select_1 == 2))
305 + {
306 + Serial.write(slow_blinking, sizeof(slow_blinking));
307 + }
308 +
309 +
310 + else if((RemoteXY.switch_1 == 1) && (RemoteXY.speed_switch == 1) && (RemoteXY.select_1 == 0))
311 + {
312 + Serial.write(fast, sizeof(fast));
313 + }
314 +
315 + else if((RemoteXY.switch_1 == 1) && (RemoteXY.speed_switch == 1) && (RemoteXY.select_1 == 1))
316 + {
317 + Serial.write(fast_stealth, sizeof(fast_stealth));
318 + }
319 +
320 + else if((RemoteXY.switch_1 == 1) && (RemoteXY.speed_switch == 1) && (RemoteXY.select_1 == 2))
321 + {
322 + Serial.write(fast_blinking, sizeof(fast_blinking));
323 + }
324 +
325 + else
326 + {
327 + Serial.write(off, sizeof(off));
328 + }
329 + delay(200);
330 + }
331 +
332 +
333 + }
334 + ===
335 + /*
336 + -- VOI Controller --
337 +
338 + This source code of graphical user interface
339 + has been generated automatically by RemoteXY editor.
340 + To compile this code using RemoteXY library 2.4.3 or later version
341 + download by link http://remotexy.com/en/library/
342 + To connect using RemoteXY mobile app by link http://remotexy.com/en/download/
343 + - for ANDROID 4.5.1 or later version;
344 + - for iOS 1.4.1 or later version;
345 +
346 + This source code is free software; you can redistribute it and/or
347 + modify it under the terms of the GNU Lesser General Public
348 + License as published by the Free Software Foundation; either
349 + version 2.1 of the License, or (at your option) any later version.
350 + */
351 +
352 + //////////////////////////////////////////////
353 + // RemoteXY include library //
354 + //////////////////////////////////////////////
355 +
356 + // RemoteXY select connection mode and include library
357 + #define REMOTEXY_MODE__ESP32CORE_BLE
358 +
359 + #include <RemoteXY.h>
360 + #include <Arduino.h>
361 +
362 + // RemoteXY connection settings
363 + #define REMOTEXY_BLUETOOTH_NAME "VOI Controller V3"
364 + //#define REMOTEXY_ACCESS_PASSWORD "password" //dont work for me -> why?
365 +
366 +
367 + // RemoteXY configurate
368 + #pragma pack(push, 1)
369 + uint8_t RemoteXY_CONF[] =
370 + { 255,4,0,0,0,151,0,10,52,1,
371 + 2,1,12,22,39,7,52,8,31,31,
372 + 80,111,119,101,114,0,83,104,117,116,
373 + 32,100,111,119,110,0,2,1,12,34,
374 + 39,7,52,8,31,31,70,97,115,116,
375 + 32,115,112,101,101,100,0,83,108,111,
376 + 119,32,83,112,101,101,100,0,129,0,
377 + 7,4,49,6,16,86,79,73,32,67,
378 + 111,110,116,114,111,108,108,101,114,32,
379 + 86,51,0,2,1,12,46,39,7,52,
380 + 8,31,31,76,105,103,104,116,115,32,
381 + 111,110,0,76,105,103,104,116,115,32,
382 + 111,102,102,0,2,1,12,58,39,7,
383 + 52,8,31,31,80,111,119,101,114,32,
384 + 86,79,73,0,83,104,117,116,32,100,
385 + 111,119,110,32,86,79,73,0 };
386 +
387 + // this structure defines all the variables and events of your control interface
388 + struct {
389 +
390 + // input variables
391 + uint8_t switch_power; // =1 if switch ON and =0 if OFF
392 + uint8_t switch_fastspeed; // =1 if switch ON and =0 if OFF
393 + uint8_t switch_light; // =1 if switch ON and =0 if OFF
394 + uint8_t switch_powervoi; // =1 if switch ON and =0 if OFF
395 +
396 + // other variable
397 + uint8_t connect_flag; // =1 if wire connected, else =0
398 +
399 + } RemoteXY;
400 + #pragma pack(pop)
401 +
402 + ////////////////////////////////////////////
403 + // Scooter Command include //
404 + ///////////////////////////////////////////
405 +
406 + byte slowvoi[] = {0xA6, 0x12, 0x02, 0x65, 0x14, 0x86}; // Speed Limit to 20 km/h (tested on voi by mayaku)
407 + byte slow1[] = {0xA6, 0x12, 0x02, 0XF1, 0x14, 0x7E}; // LIGHT OFF & ESC ON & KPH & SLOW (tested by Wileok)
408 + byte slow2[] = {0xA6, 0x12, 0x02, 0XF5, 0x14, 0x45}; // LIGHT ON & ESC ON & KPH & SLOW (tested by Wileok)
409 +
410 + byte fastvoi[] = {0xA6, 0x12, 0x02, 0x35, 0xFF, 0x38}; // Maximum Speed (tested on voi by mayaku)
411 + byte fast1[] = {0xA6, 0x12, 0x02, 0XF1, 0xE4, 0x0A}; // LIGHT OFF & ESC ON & KPH & FAST (tested by Wileok)
412 + byte fast2[] = {0xA6, 0x12, 0x02, 0XF5, 0xE4, 0x31}; // LIGHT ON & ESC ON & KPH & FAST (tested by Wileok)
413 +
414 + byte off[] = {0xA6, 0x12, 0x02, 0x00, 0xFF, 0xEA}; //Off (tested on voi by mayaku)
415 +
416 + void setup()
417 + {
418 + RemoteXY_Init ();
419 +
420 + Serial.begin(9600);
421 + }
422 +
423 + void loop()
424 + {
425 + RemoteXY_Handler ();
426 + if((RemoteXY.switch_power == 1) && (RemoteXY.switch_fastspeed == 0) && (RemoteXY.switch_light == 0)) //light off + slow
427 + {
428 + Serial.write(slow1, sizeof(slow1));
429 + }
430 + else if((RemoteXY.switch_power == 1) && (RemoteXY.switch_fastspeed) == 0 && (RemoteXY.switch_light == 1)) //light on + slow
431 + {
432 + Serial.write(slow2, sizeof(slow2));
433 + }
434 + else if((RemoteXY.switch_power == 1) && (RemoteXY.switch_fastspeed) == 1 && (RemoteXY.switch_light == 0)) //light off + fast
435 + {
436 + Serial.write(fast1, sizeof(fast1));
437 + }
438 + else if((RemoteXY.switch_power == 1) && (RemoteXY.switch_fastspeed) == 1 && (RemoteXY.switch_light == 1)) //light on + fast
439 + {
440 + Serial.write(fast2, sizeof(fast2));
441 + }
442 + else if((RemoteXY.switch_power == 1) && (RemoteXY.switch_fastspeed) == 0 && (RemoteXY.switch_powervoi == 1)) //voi slow + light???
443 + {
444 + Serial.write(slowvoi, sizeof(slowvoi));
445 + }
446 + else if((RemoteXY.switch_power == 1) && (RemoteXY.switch_fastspeed) == 1 && (RemoteXY.switch_powervoi == 1)) //voi fast + light???
447 + {
448 + Serial.write(fastvoi, sizeof(fastvoi));
449 + }
450 + else
451 + {
452 + Serial.write(off, sizeof(off));
453 + }
454 + delay(200);
455 + }
456 + ===
457 + Max speed:
458 + #include <Arduino.h>
459 +
460 + int powerPin = 5;
461 + byte messageA[] = {0xA6, 0x12, 0x02, 0x10, 0x14, 0xCF};
462 + byte messageB[] = {0xA6, 0x12, 0x02, 0x11, 0x14, 0x0B};
463 + byte messageC[] = {0xA6, 0x12, 0x02, 0x35, 0xFF, 0x38};
464 +
465 + void setup() {
466 + // initialize Serial:
467 + Serial.begin(9600);
468 +
469 + pinMode(powerPin, OUTPUT);
470 + digitalWrite(powerPin, HIGH);
471 + }
472 +
473 + void loop() {
474 + delay(500);
475 + Serial.write(messageC, sizeof(messageC));
476 + }
477 + ===
478 +
479 + Niebieski - 13 (3v3)
480 + Zielony - 17
481 + Głośnik - 26
482 +
483 +
484 + ==
Newer Older