Bananen taal

Door Infant op zaterdag 14 juni 2014 18:44 - Reacties (29)
Categorien: Gepruts, Sparta: Fiets verbouwen tot het stuk gaat., Views: 11.990

Dit is in vervolg op de vorige posts:
Dooie Fiets
Banana?
Je zit nu hier:
Bananen taal
En het gaat hier verder:
Cyclic Banana Checks
Alles moet draaien
Alles moet (kapot) draaien

Deze post zal spelfouten, semi-technisch gebrabbel en eindeloze ritsen aan compleet nutteloze data bevatten. Als je daar allemaal geen zin in hebt, zou ik vooral niet verder lezen.

Ik was zover dat ik een accu en display op elkaar aansloot, en hij spontaan beeld gaf. Geweldig.
De eerst volgende stap was om er een scope aan te hangen, om een idee te krijgen wat er zo ongeveer gebeurt.
Snuf snuf
Er komen 3 draadjes uit het display zetten, de accu zet daar 5V, 24V en GND op.

De 24V lijn zou de data bus moeten voor stellen, dus dat is het eerste waar de scope wat aan mag ruiken.
Er komt gigantisch veel verkeer voorbij. Er zit wel wat structuur in, bijvoorbeeld:

Elke overgang van geen data, naar wel data, begint met het karakter 0x10.

Pakketje!


Uit de vorige post:
De Atmega die nog met 4V aan staat, geeft op de TX pin inderdaad signaal uit:
10 04 20 CC en af en toe 10 C1 21 22 80 5F.


Mooi. Het is nu toch wel 99% zeker, dat het standaard seriele communicatie is. Deze scope kan dat ook decoderen, maar om dat vervolgens allemaal met de hand te gaan zitten over krijten... daar heb ik niet zo'n zin in. Dat moet gemakkelijker kunnen.

Het eerste geschikte object wat ik op mijn plank tegen kom, is een USB naar RS-485 adapter.

RS-485 is een standaard, verzonnen in een donker verleden door een of ander instituut.

Om bitjes te kunnen lezen en zenden, heeft RS-485 twee signalen nodig die het tegenovergestelde van elkaar zijn. Als het ene signaal hoog is, en de andere laag, komt er een 1 uit zetten, en als de andere hoog is... en de ene laag, komt er een 0 uit zetten. Okee?

Die "andere" en "die ene" heten officiler A en B, en iedereen (lees: Infant) haalt ze altijd door de war:
The RS-485 signaling specification states that signal A is the inverting or '-' pin and signal B is the non-inverting or '+' pin.
This is in conflict with the A/B naming used by a number of differential transceiver manufacturers...
These manufacturers are incorrect, but their practice is in widespread use.
To avoid these confusions, some equipment manufacturers have created a third D+ and D- naming convention.

-Wiki

Okee, rant time. Kort samengevat:

De helft van de fabrikanten implementeert de standaard verkeerd. Dat vinden we met z'n allen dan onduidelijk. Vervolgens fixen we dat door de onduidelijkheid te voorzien van een nieuw label, die niet in de standaard genoemd is.

Dit is waarom elke handleiding die ik heb gelezen m.b.t. RS-485 ongeveer zo gaat:
"Sluit A op A aan, B op B. Doet ie ut niet? Draai ze om."

Anyhow, met een voeding en twee weerstanden, kan deze converter ervan overtuigd worden dat de 24V fiets bus een hele brakke RS-485 lijn is:

Weer zo'n super duidelijk schema.


Na dat zo aan te hebben gesloten, en de A en B een keer te hebben verwisseld, slinger ik mijn favoriete serial terminal aan en steek het display opnieuw in de accu.

Meteen wordt je overspoeld met een muur aan gegevens, dat gaat zo'n 10 seconden door. Het display toont de foutcode E0005 net als de vorige keer, en daarna gaat het hele zaakje uit.
code:
1
2
3
4
5
6
7
8
10 c1 21 22 06 5d 10 22 c2 22 00 ad 77 10 a4 20  .!".]."".w. 
ee 10 a4 20 ee 10 a4 20 ee 10 a4 20 ee 10 c1 21  . . . .!
22 07 cc 10 22 c2 22 00 bc 2b 10 c1 21 22 08 39  ".."".+.!".9
10 22 c2 22 00 bd ba 10 c1 21 22 09 a8 10 22 c2  .""..!".."
22 00 bf db 10 c1 21 22 0a 58 10 22 c2 22 00 c0  "..!".X."".
cb 10 04 20 cc 10 04 20 cc 10 04 20 cc 10 04 20  .. .. .. .. 
cc 10 c1 21 22 0b c9 10 22 c2 22 00 d0 06 10 c1  .!"..""...
21 22 0c fb 10 22 c2 22 00 d1 97 10 c1 21 22 0d  !".."".—.!".

Kansloos!

Dit is een stukje uit dat gelogde verkeer, om je een idee te geven. Het hele bestand staat hier.

Zoals je kunt zien, komt er geen enkel nuttig leesbaar stukje tekst in voor. Niet dat ik dit echt verwachtte.

Stap twee was dan toch maar eens de motor er op aansluiten, want daar zal hij toch ook wel mee willen babbelen? De motor heb ik helaas uit elkaar gehaald, maar de ingewanden zijn nog heel:

En dit is een motor ... hoe precies?


Dus, die draadjes vrot ik in de daarvoor bestemde connector, start een nieuwe log sessie (dataverkeer wat er bij hoort.), en wat schetst de verbazing?
OMG!


OMFSM! Een getal!

Het eerste wat je dan natuurlijk op stom geluk doet, is kijken of dat getal ergens toevallig voorbij komt vliegen.

Ik heb de data in het log in regels opgesplitst, zodat op elke regel een begin van een pakketje staat.

Meerdere malen komt 10 C1 29 26 0c 0c c3 54 c0 00 f0 59 41 21 voorbij, en dat is het enige waar 59 41 zo pats boem in voor komt. (De hex waarde van 59 41 is 17 35 of 10 3F, afhankelijk van de endianness, maar beide komen niet voor.)

Dat is vrij veel belovend, maar nog niet echt een zekerheid.

De laatste banaan die ook nog een teken van leven toonde, heb ik er toen ook maar aan gehangen en gelogd.

Deze doet het ook, en zodra het display de km stand geeft haal ik hem er weer uit. Dit display geeft 7052 km aan, en what do you know: vlak bij het einde van het log staat:

10 C1 29 26 03 0c c0 00 c0 00 f0 70 52 49

Consistentie!

Veel meer kan ik van deze opstelling natuurlijk niet maken. De "motor" gaat nooit kunnen draaien, het is berhaupt een wonder dat hier leven uit komt.

De volgende stap leek mij daarom, uitvinden of ik zelf iets tegen het display kan zeggen, bijv een andere kilometer stand. Daarvoor moet ook terug gepraat kunnen worden, en dat vereist een iets andere en wellicht ook nettere opstelling.
Terug babbelen
In plaats van het gebeunde RS-485 ding nog langer te misbruiken, heb ik een oud Olimex bordje uit de kast gehaald.

Deze heeft er een RS-232 geval erop zitten, wat weer zo'n standaard is die gewoon hetzelfde op een andere manier doet, en daar heb ik het volgende op geprikt:

Hee, een leesbaar schema.


De communicatie bus, is een los draad wat d.m.v. een pull-up weerstand(R3) op 24V gehouden wordt. Als de bus 24V is, maakt de deling R4/R5 daar ietse van 8 keer minder van (3V ongeveer) zodat dat op het ontvangst pinnetje van het RS232 ic kan zonder dat die direct in rook op gaat.

Om de bus omlaag te trekken, moet het 5V tx-signaal ge-level-shift worden naar 24V. Dat kan met twee transistoren: Als tx hoog is en Q2 in gaat, is de ingang van Q1 laag en laat hij de bus met rust. De bus is dus 24V.

Als tx laag is, wordt de ingang van Q1 hoog, en trekt hij de bus door een 100 Ohm weerstand R2 naar de GND toe. De bus is dan nog ongeveer 2V, gedeeld door c.a. 8 is dat laag genoeg om als 0 gelezen te worden.

Een nuttige feature die deze bus automatisch heeft, is dat alles wat je nu over RS-232 verzend, ook direct terug krijgt. Als twee dingen op exact hetzelfde moment op deze bus proberen te praten, kun je dat direct vast stellen, je krijgt namelijk niet hetzelfde terug als wat je er op zet.

Het bordje ziet er nu zo uit. Er zit een connector op waar het display in geprikt kan worden. En als je dat doet, gebeurt er niks.

Hm...

Misschien moet hij eerst wat aan gemasseerd worden, door er data naar toe te slingeren. Dus ik verzend het stuk waarvan ik vermoed dat het 5941 km op het display weer gaat geven:

Hallo!
Blauw is verzonden, groen is ontvangen.


Ooh!

Voor een halve seconde ofzo verschijnt inderdaad dezelfde km stand op het display, en verdwijnt daarna weer. Als ik eerst dit bericht, en daarna allemaal onzin verzend blijft het display aan, net zolang tot ik ophoud met verzenden.

Veel interessanter nog, is dat het display kennelijk antwoord geeft:
10 22 c0 26 d9.

Het versturen van het pakket met de andere km stand, geeft hetzelfde antwoord.

Dat is heel aardig, want dan kan ik wat van het gelogde verkeer op een rijtje zetten:

10 C1 29 26 0C 30 C3 54 C0 00 FC CC C0 71
10 22 D0 26 D9
10 C1 29 26 03 0C C0 00 C0 00 F0 70 52 49
10 22 C0 26 D9
10 C1 29 26 0C 30 C3 4F C0 00 FC CC C0 4E
10 22 C0 26 D9

Die gaven allemaal hetzelfde antwoord, maar er is ook:

10 C1 29 27 03 30 C0 00 00 00 3C CC C0 D4
10 22 C0 27 48
10 C1 29 27 03 00 00 00 00 00 1e 00 05 b7
10 22 c0 27 48

Bij tet verzenden van deze twee pakketjes, gaat het display niet meer uit. En kijk:

10 C1 29 27 03 00 00 00 00 00 1e 00 05 b7
10 22 c0 27 48

Deze geeft de foutcode E0005 permanent weer!

Verder komt dit bericht vaak voorbij:
10 C1 21 22 00 FE.

Het een na laatste getal loopt steeds op:
10 C1 21 22 01 6F
... 02 9F
03 0E
04 3C
05 AD
06 5D
07 CC
08 39
09 A8
0A 58
0B C9
0C FB
0D 6A
0E 9A
0F 0B

En na 0F begint hij weer opnieuw.

Dit doet sterk vermoeden dat de laatste byte een CRC is. Als ik namelijk een bit aanpas in het bericht naar het display toe, en bijv. foutcode 0004 ervan maak, gebeurt er niks, en krijg ik ook geen antwoord.

En ik wil zo graag dat het display 666km aangeeft.
CRCs
CRC's zijn geweldige dingen. Het is een controle getal wat in dit geval achter het bericht geplakt zit.

Als tijdens de verzending de data in het bericht veranderd, komt de CRC niet meer overeen. Ze zijn ontworpen om bij een kleine verandering, van. bijv maar 1 bit, een zo groot mogelijke verandering in het controle getal op te leveren.

Maar een 8-bit CRC is natuurlijk niet zo veel. 8 bits zijn 256 verschillende mogelijkheden.

Als ik zo'n bericht compleet omgooi, en er een willekeurige CRC achter bengel, heb ik een 1 op 256 kans dat ik die goed gok.

En gezien dit display zo vriendelijk is om niks te zeggen als ik puin verstuur, en netjes te antwoorden als hij het met me eens is, kan ik in theorie gewoon maar wat getallen op het eind proberen totdat het goed gaat.

Nou, dat gehele proces heb ik samengevat in een quick and dirty programmaatje.

(Mocht je het willen proberen... het werkt onder Linux of Windows + cygwin door make uit te voeren. Hij opent standaard /dev/ttyS23, maar je kunt een ander device als opstart argument mee geven. Bijv:
code:
1
./tryme /dev/ttyUSB0



Als je die opstart, vraagt hij weke waarde hij naar het display moet smijten:


Het getal wat je invoert gaat door een binare gehaktmolen heen:
C:
1
2
3
4
5
6
7
8
9
//The encoding is kinda weird, it's the HEX representation of what you see:    
 uint8_t dec[3];
 //Break it into powers of 10.
 dec[0] = speed / 100;
 dec[1] = (speed - (100*dec[0])) / 10;
 dec[2] = speed % 10;
 //Convert it to ...something
 data[8] = 0x01 * dec[0];
 data[9] = ((0x10 * dec[1])) | dec[2];


Dat propt hij op de plek waar ik ondertussen stiekem van heb uitgevonden dat het de speedo locatie is, hij laat zien wat hij verzonden heeft en wat het vorige antwoord was:


En na een aantal pogingen komt er een antwoord terug van het display:


En verschijnt het getal automagisch op het scherm!
Evil!


Enig.

We zijn nu in ieder geval op het punt beland dat je Sparta Ion display in combinatie met deze enigszins lompe manier van communiceren, kan omtoveren tot bijv een kook wekker.

Hij piept alleen niet...

Volgende: Cyclic Banana Checks 07-'14 Cyclic Banana Checks
Volgende: Banana? 06-'14 Banana?

Reacties


Door Tweakers user NinjaTuna, zaterdag 14 juni 2014 19:21

Leuk om te lezen weer! Hacken op zijn best.

Door Tweakers user Boogie, zaterdag 14 juni 2014 20:00

Fantastish ga zo door, dit leest als een spannend jongensboek.
Dat hele protocol reverse-engineeren en de hardware uitpluizen; epic!

Door Tweakers user Opinion, zaterdag 14 juni 2014 20:42

Wat Boogie zegt! Ik heb hier absoluut geen verstand van maar ik vind het fascinerend en spannend!

Door Tweakers user sjaak, zaterdag 14 juni 2014 20:48

Meer meer meer! Fantastisch dat een elektrische fiets tot zo'n project verworden is. _/-\o_

Door Tweakers user Kaalus, zaterdag 14 juni 2014 20:48

Super cool weer, echt leuk om te lezen als Technisch Informatica student :)

Wat is je uiteindelijke doel ervan? De fiets opnieuw opbouwen en dan verbeteren? Of wil je echt alleen maar uitvinden hoe het werkt? (niet dat dat minder intressant is).

Door Tweakers user Infant, zaterdag 14 juni 2014 21:38

AktiveHate schreef op zaterdag 14 juni 2014 @ 20:48:
Wat is je uiteindelijke doel ervan? De fiets opnieuw opbouwen en dan verbeteren? Of wil je echt alleen maar uitvinden hoe het werkt?
Tja, mijn fiets toen was stuk. Het enige doel wat ik toen voor ogen had was om de motor als dynamo in te zetten.

Ik stoorde me er voornamelijk aan dat er nul informatie te vinden is over specifiek dit model fietsen, terwijl je er op Marktplaats mee dood gegooid wordt.

Mijn doel is nu wel om hem weer werkend te krijgen, ik weet alleen nog niet hoe dat er precies uit gaat zien.

Door Tweakers user Jeroen Sack, zondag 15 juni 2014 01:49

Reverse engineering is altijd leuk :). Overigens is de encoding van de nummers niet eens zo heel raar, ben het op het werk in de software ook wel eens tegengekomen in de communicatie met een third party device, kan me even niet meer herinneren wat. Het heet trouwens packed BCD.

Door Tweakers user Infant, zondag 15 juni 2014 11:43

Jeroen Sack schreef op zondag 15 juni 2014 @ 01:49:
Reverse engineering is altijd leuk :). Overigens is de encoding van de nummers niet eens zo heel raar, ben het op het werk in de software ook wel eens tegengekomen in de communicatie met een third party device, kan me even niet meer herinneren wat. Het heet trouwens packed BCD.
Het is voor displays inderdaad een logische vorm van encoding. Het leek mij wat minder logisch om het dan ook maar op die manier over je data bus heen te slingeren.

Door Tweakers user Paul C, zondag 15 juni 2014 23:20

Geweldig om te lezen dit! Ga vooral door, je schrijfstijl is ook echt heerlijk! :)

Door Tweakers user m-vw, maandag 16 juni 2014 14:02

Leuke blog, makkelijk te lezen.

Door Tweakers user SA007, dinsdag 17 juni 2014 00:23

Mm, ik weet niet wat er voor checksum er gebruikt wordt, maar ik kan niet vinden wat het is.

Ik heb getest:
- XOR
- Optellen en dan Mod 0xFF
- 2's complement
(de bovenste 3 hebben teveel verschil tussen 0x00 en 0x01 om te kunnen kloppen)

- CRC8 met alle mogelijke polynomen op de volgende manieren:
o data straight.
o data inverted
o data straight msb first
o data inverted msb first
o data straight compleet andersom
o data inverted compleet andersom

Het kan nog crc zijn met een custom startkarakter, dat heb ik niet getest
Had niet genoeg zin om dat te gaan scripten.

FYI: hier een linkje naar mijn CRC8 code:
http://got.sa007.nl/crc8code.txt

Ik ben me momenteel redelijk aan het irriteren dat ik het type checksum niet heb gevonden.

[Reactie gewijzigd op dinsdag 17 juni 2014 00:23]


Door Tweakers user Infant, dinsdag 17 juni 2014 02:02

SA007 schreef op dinsdag 17 juni 2014 @ 00:23:
Ik ben me momenteel redelijk aan het irriteren dat ik het type checksum niet heb gevonden.
Ha nice, goed bezig. Je bent er bijna. Wil je nog een hint? :)

[Reactie gewijzigd op dinsdag 17 juni 2014 02:04]


Door Tweakers user RadioKies, dinsdag 17 juni 2014 10:42

Erg leuk om te lezen weer. Zelf weinig kaas zelf van gegeten, maar kon wel volgen waar je mee bezig was.

Door Tweakers user ThinkPad, dinsdag 17 juni 2014 16:41

Leuke blog! Je vorige blog over HP accu's hacken las ook al zo lekker weg :) Keep it going!

Door Tweakers user Schlumpie, dinsdag 17 juni 2014 19:22

Leuk gemaakt, al zou je n blog maken over een molecuul op je linkersok zou het nog leuk zijn! Blijf zo doorgaan!
Originele titel's trouwens!

[Reactie gewijzigd op dinsdag 17 juni 2014 19:23]


Door Tweakers user vraag200, dinsdag 17 juni 2014 21:44

Vraag kan je ook een ander display gebruiken voor de banaan accu ?

weet iemand dit misschien

Door Tweakers user Infant, dinsdag 17 juni 2014 22:47

vraag200 schreef op dinsdag 17 juni 2014 @ 21:44:
Vraag kan je ook een ander display gebruiken voor de banaan accu ?
Wat voor eentje had je in gedachten? Zolang hij dit protocol begrijpt, ja waarom niet.

Door Tweakers user Thijs Visser, vrijdag 27 juni 2014 12:19

Wat een leuke en interessante blog!

Vraag: Zelf heb ik ook zo'n fiets, maar nu is de lader kapot. Weet iemand of het laden ook met een gewone voeding kan? Zorgt het printje in de accu dan voor de afslag?

Ik heb de originele lader open geschroefd, maar ben (als student werktuigbouwkunde) op het gebied van elektronica niet zo onderlegd dat ik het verschil tussen een voeding en een acculader kan zien :(

[Reactie gewijzigd op vrijdag 27 juni 2014 12:20]


Door Tweakers user Infant, vrijdag 27 juni 2014 12:35

Je zou hem begrenst 34V / 3.5A moeten geven. Minder stroom mag ook, dan duurt het langer. (Ja, vierendertig volt.)

Ik laad hem met mijn labvoeding op, want ik werd het straaljager geluid van de standaard lader een beetje zat.

Als hij vol is, slaat hij inderdaad automatisch af.

Door Tweakers user Thijs Visser, vrijdag 27 juni 2014 13:21

Bedankt voor het snelle antwoord! Ik ben eigenlijk op zoek naar een zo goedkoop mogelijk alternatief voor de lader, zou zoiets, op het trager laden na, al voldoen?

http://www.ebay.com/itm/H...sh=item46172d9628&vxp=mtr

Door Tweakers user Infant, vrijdag 27 juni 2014 14:40

Die zijn om loodaccu's te laden, dat zou op zich ook moeten kunnen, maar het gaat dan i.d.d. wel lang duren.

Verder zou ik nooit chinees spul van eBay aanraden wat in het stopcontact moet, maar dat ter zijde.

Door Tweakers user Thijs Visser, vrijdag 27 juni 2014 14:52

Ok, bedankt voor je advies!

Ik ga even verder zoeken naar een beter geschikte voeding.
Blijf zo doorgaan ik volg je blog graag, ook al snap ik zelf veel dingen maar voor de helft :)

Door Tweakers user Lucky Luke 008, maandag 30 juni 2014 20:32

Echt hekwerk. Leuke schrijfstijl. Would read again.

Ben benieuwd naar het vervolg. In het topic op CO zitten vooral veel mensen met hetzelfde probleem, dan leest dit een stuk lekkerder weg.

Door Tweakers user hikhakhok, donderdag 10 juli 2014 19:02

Leuk om te lezen :)
Lastig allemaal, ik ben zelf bezig met een chinees controller setje op mijn ion fietsje te maken.. Accu was `kapot`..yea right

Door Tweakers user markdepoes, dinsdag 15 juli 2014 17:28

Geniaal blogwerk!

"wat is je beweegrede om getallen vast te pinnen?"
"En ik wil zo graag dat het display 666km aangeeft. "

enough reason to do so! zeer vermakelijk, en net als Thijs Visser, heb ik er wel wat kaas van gegeten, (+/- de helft van de technische info) maar dat boeit nie!

In afwachting op je vervolg-post(s).

Door Tweakers user Xanward, dinsdag 15 juli 2014 19:28

Ik weet hier ook helemaal niets van, maar erg interessant hoe je deze puzzel oplost :) Ga zo door!

Door Tweakers user Kastermaster, dinsdag 15 juli 2014 19:47

Erg vermakelijk om te lezen en krijg zowaar het idee dat ik dit zelf ook makkelijk kan (wat een ijdel idee is natuurlijk). Ik wacht met smart op het vervolg! ;)

Door Tweakers user Milmoor, dinsdag 15 juli 2014 22:57

Heel af en toe heb ik in huis een powerdip. Dat vind mijn servertje niet leuk want die krijgt dan effectief een powercycle. Op zich start hij weer netjes op, maar het kan mooier. Nu vraag ik me af of ik een powerbank als mini UPS zou kunnen inzetten. Mijn servertje heeft 12v nodig, dat ding geeft er 5. Voor het omhoog transformeren zijn verwacht ik wel schakelingen te vinden, maar die combineren met een schakeling die de powerbank netjes geladen houdt gaat mijn kennis te boven. Waarom vertel ik dit? Misschien is het een batterij puzzel die jij leuk vindt om op te lossen.

[Reactie gewijzigd op woensdag 16 juli 2014 09:47]


Door Tweakers user Karmos, zaterdag 19 juli 2014 22:25

Mooi! Ik wacht met smart op het volgende deel! Enig idee wanneer deze komt?

Reageren is niet meer mogelijk