Forum: Mikrocontroller und Digitale Elektronik what we have here is failure to communicate (nrf24l01?)


von sid (Gast)


Lesenswert?

Mahlzeit,

irgendwie kratze ich mir gerade ein mittelgroßes Loch in die 
Kopfbehaarung,
und würde gerne mal einige Meinungen von Euch hören bevor ich zu Gewalt 
übergehe.

Die Situation:
Ich habe mir ein elektrisches Skateboard gekauft vor ein paar jahren 
(naja ein Motorset zum Anschrauben.. funing.. ich mag's)
Der Support war ehrlich ausgezeichnet, aber scheinbar hat die Firma 
Funing Tech das zeitliche gesegnet und ich habe damit auch jeden Kontakt 
zu deren Support verloren leider.

Das Problem:
Die Ferbnbedienung kann seit einiger Zeit den Motorcontroller nichtmehr 
erkennen, sie blinkt auf der Suche nach Kontakt und die Motoren drehen 
sich nur ... na sagen wir stotternd, der Motorcontroller scheint also 
die Fernbedienung noch zu erkennen.

Die Hardware:
die Fernbedienung nutzt ein AS01-SPIPX Funkmodul (mit *nRF24L01+* 
Chip)
das auf das PCB gelötet ist und von einem STC15W408AS via SPI 
kontrolliert wird.
der Motorcontroller ist vollständig vergossen und sein externes 
Funkmodul
würde etwas Gewalt erfordern um auch nur die Beschriftung lesen zu 
können,
das würde ich also lieber ersteinmal unangetastet lassen.
Da es aber nur 5 zuleitungs Kabel hat (zwei davon seperat: rot/schwarz)
würde ich SPI hier als unwahrscheinlich einstufen, da es aber kein 
bare-copper gibt und jeder elektrisch leitende Test eine teilweise 
Zerstörung bedarf.. hab ich alles Weitere ersteinmal ignoriert.
Anzunehmen ist aber, dass es was Shockburst kompatibles ist n nRF2401A 
vllt
oder auch n nRF24L01+ mit ner uart bridge ... wenn nicht anders geht 
guck ich nach.

mein Ansatz:
mangels wohlausgestatteter Elektronikwerkstatt,
musste ich ein wenig "kreativ werden" und ja, das ist ein Euphemismus 
für "rumprutschen" :D

Ich hab also ein altes Kabel aus der Krimskramkiste gezogen das einen 
0.05" Stecker hatte,
den Stecker mit ein paar abgeschnittenen Bauteilbeinchen zum männlichen 
Pendant umoperiert,
das andere Ende in mein Steckbrett genagelt
und mit nem Arduino versucht die SPI Kommunikation 'mitzuhören', wenn 
die Fernbedienung startet.
und ich konnte nichtnur das Setup des Funkmoduls mitansehen sowie das 
versenden einiger payloads, sondern nach ein paar Versuchen und dem 
Abwarten einer ruhigen Sekunde auch dessen Register vollständig und 
fehlerfrei auslesen.
MOSI log (mit erklärung):
1
0x30  0x24 0xA0 0x15 0x03 0xBB  |0x30 => W_REGISTER TX_ADDR    5 bytes (address: 0xBB0315A024)
2
0x2A  0xFF 0xFF 0xFF 0xFF 0xFF  |0x2A => W_REGISTER RX_ADDR_P0 5 bytes (address: 0xFFFFFFFFFF)
3
0x21  0x00                      |0x21 => W_REGISTER EN_AA      1 byte  (disable auto ack)
4
0x22  0x01                      |0x22 => W_REGISTER EN_RXADDR  1 byte  (enable only data pipe 0)
5
0x25  0x00                      |0x25 => W_REGISTER RF_CH      1 byte  (channel set to 0 [2.4GHz])
6
0x31  0x0A                      |0x31 => W_REGISTER RX_PW_P0   1 byte  (payload set to 10 bytes)
7
0x26  0x07                      |0x26 => W_REGISTER RF_SETUP   1 byte  (power 0dBm, 1Mbps data rate)
8
0x30  0x24 0xA0 0x15 0x03 0xBB  |0x30 => W_REGISTER TX_ADDR    5 bytes
9
0x20  0x3F                      |0x20 => W_REGISTER CONFIG     1 byte  (IRQ:RX_DR, CRC16, PW_UP, PRX)
10
0x07  0x00                      |0x07 => R_REGISTER STATUS     1 byte
11
0x27  0x0E                      |0x27 => W_REGISTER STATUS     1 byte  (reset value 0x0E)
12
13
REPEAT:
14
0x2A  0xFF 0xFF 0xFF 0xFF 0xFF  |0x2A => W_REGISTER RX_ADDR_P0 5 bytes
15
0xA0  0x01 0x91 0x00 0x00 0xFF  |0xA0 => W_TX_PAYLOAD         10 bytes (only throttleposition?)
16
      0xFF 0x00 0x00 0x00 0x00  | // leftmost 16bit change according to throttle position //
17
0x20  0x7E                      |0x20 => W_REGISTER CONFIG     1 byte  (IRQ:--, CRC16, POWER_UP, PTX)
18
0x20  0x3F                      |0x20 => W_REGISTER CONFIG     1 byte  (IRQ:RX_DR, CRC16, PW_UP, PRX)
19
::

nRF24L01+ Register
1
reg#   data     (reg#   data)
2
0x00   0x3F    | 0x01   0x00 
3
0x02   0x01    | 0x03   0x03 
4
0x04   0x03    | 0x05   0x00 
5
0x06   0x07    | 0x07   0x2E
6
0x08   0x00    | 0x09   0x00 
7
8
0x0A   0xFF 0xFF 0xFF 0xFF 0xFF 
9
0x0B   0xC2 0xC2 0xC2 0xC2 0xC2
10
11
0x0C   0xC3    | 0x0D   0xC4 
12
0x0E   0xC5    | 0x0F   0xC6 
13
14
0x10   0x24 0xA0 0x15 0x03 0xBB 
15
16
0x11   0x0A    | 0x12   0x0A 
17
0x13   0x00    | 0x14   0x00 
18
0x15   0x00    | 0x16   0x00 
19
0x17   0x11 
20
0x1C   0x00    | 0x1D   0x00
Soweit so gut!
Ich weiss also, Shockburst (NICHT enhanced shockburst) kenne den 
Funkkanal und die Addressen, CRC einstellung usw.

Also ab an die brasilianische Flussmündung und n paar dieser billigen 
nrf24L01 Dinger gekauft, schon der zweite versuch brachte mir Modelle 
ein die zwar immernoch gefälscht aber mindestens funktionstüchtig sind
(das alleine hat 14 Tage gedauert)
egal.. waren billig und zum Testen muss das reichen

dei Payloads der Fernbedienung sind zum Glück unfassbar trivial:
"xx xx 00 00 FF FF 00 00 00 00"
wobei xx xx nichts als die 10bit des ADC sind der das "Gaspedal" 
ausliesst.
mittelt sich bei 0x191 ein (nicht perfekt, aber zuverlässig)
höchster wert 0x3e8 oder so (auch nicht perfekt aber okay)
und der microcontroller rundet starkes bremsen auf perfektes 0x0000
der Rest scheint mir bislang vollends unmodifizierbar.

Ich hab also mit meinem Modul ein paar ähnlich gestrickter payloads an 
den Controller geschickt und es funktioniert.. gut gut
Ich versuchte natürlich auch die RX Addresse der Fernbedienung zu 
belauschen, hörte aber nie irgendetwas..
(die unfassbar dämliche Addresse ist "FF FF FF FF FF" na suuuper)
Also hab ich CRC deaktiviert und siehe da.. NOISE
unfassbar viel Krach (was zu erwarten war mitten im Wlan Band)
seltenst mal ein 0bit.. also fielen mir ausreisser nach unten schnell 
auf..
nach so 10Mb and mitgeschnittenem Käse kristallisierten sich einige
10 byte Pakete auf, die ich nur sah, wenn der Motorcontroller auch 
angeschaltet war
(mitschnitte fast immer über die ganzen 32 möglichen bytes.. und nie war 
da eine CRC Prüfsumme dahinter, häufig was was so aussah als wenn nach 
15 byte eine käme.. aber sie passt nicht.)
Also vermutete ich mal die 10byte die die Fernbedienung auch erwartete.
die folgenden Kandidaten hatten sich in dem Lärm herausgefiltert:
1
0xE8 0xF2 0x40 0x29 0x70    0x10 0x10   0x24 0x50 0x00 
2
0xA3 0xC9 0x00 0xA5 0xC0    0x40 0x40   0x91 0x40 0x00 
3
0xF4 0x79 0x20 0x14 0xB8    0x08 0x08   0x12 0x28 0x00
die ersten fünf byte sind immer unverändert, mal ein falsches bit hier, 
mal eins da.. aber im Grunde diese ...
Die TX Addresse der Fernbedienung ist ähnlich "willkürlich" ich würde 
also vermuten, dass das ein Paarungsversuch des Motorcontrollers 
darstellt mit der Bitte um Addressanpassung
die folgenden Zwillinge sind ebenso unverändert,
sie erinnerten mich and das 0xFF 0xFF ich vermute Sinnhaftigkeit in 
deren Wert, allein der Sinn erschliesst sich mir noch nicht.

die letzten drei Byte sind quasi variabel.. immer mal wieder ändert sich 
das mittlere byte, dann steigt es wieder (in 0x10 er Schritten)

Ich hab also mit den CRC Einstellungen gespielt.
der Motorcontroller braucht ZWINGEND eine 2 byte CRC damit er die 
Befehle der Fernbedienung (und meines Replikats) anerkennt.. er sendet 
aber im Gegenzug scheinbar OHNE CRC Prüfsumme.
Wissend, dass die Fernbedienung im RX Modus aber eine Prüfsumme 
erwartet, hab ich mir einen Papageien gebastelt, der zehn bytes ohne 
Prüfsumme liesst, und dann mit Prüfsumme an dieselbe Addresse schickt.
und sihe da... die Fernbedienung meint den Motorcontroller zu sehen, 
hört auf zu blinken und zeigt volle Batterieleistung an (könnte sogar 
gut sein.. hatte sie ja frisch geladen als mir das Problem auffiel)

In der Sekunde wo ich den Papageien abschalte fängt die Fernbedienung 
wieder an zu suchen...
irgendwas von meinen Annahmen muss also ausreichend zutreffen.

Aber: die FB wechselt ihre Addresse nicht (sonst würde ich sie im 
Funkprotokoll an der alten Addresse ja nichtmehr sehen können)
der Motorcontroller auch nicht.
Und wieso der Motorcontroller sich quasi von jetzt auf gleich weigert 
eine Prüfsumme zu erstellen für seine versendeten Pakete ist mir 
schleierhaft.
Ich behauptete mal frech, dass dieselbe Hardwareimplementierung das 
einkommende und das ausgehende Paket bespielt in diesen kleinen Dingern

Ich hab einfach keine Idee, weswegen der Motorcontroller aufgehört hat 
CRC Sumnmen zu senden, das Pfund Epoxid macht es mir auch nicht leicht 
den Fehler einzugrenzen.

Nun (ENDLICH!!) die Frage:
Habt Ihr eine Idee was entweder dazu führt, dass der microcontroller 
ein/zwei bits in einem Befehl vergisst
oder was das Funkmodul dazu bringt keine CRCs mehr erstellen zu können 
sie aber dennoch interpretieren und prüfen kann für einkommende Pakete?

Wenn ihr ne Idee habt wie die Pakete des Motorcontrollers zu deuten 
sind,
bin ich auch glücklich über Eure Nachricht,
irgendein Fernsteuerdingen (Drone, Skateboard, Auto.. vllt auch nur ein 
gamecontroller oder sowas 2.4Ghziges) könnte ja ein Protokoll benutzen, 
dass mindestens so ähnlich ist, dass man es mal zur Weitererforschung 
heranziehen kann.

Wie gesagt, ich bin echt nicht scharf drauf mit dem großen 
Schraubendreher in dem Motorcontroller herumzuhebeln um an das Funkmodul 
zu kommen, solange ihr also Alternativen habt wär ich froh.

Dankeschön

'sid

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.