Komunikační protokol robotických modulů
Komunikace po lince RS485 bude poloduplexní (nelze zároveň vysílat a přijímat), typu master-slave. Pro zmenšení zatížení mikroprocesorů bude využita 9 bitová komunikace a MPCM.
Stejný protokol je použit i pro komunikaci s PC, ale komunikace probíhá v 8 bitovém režimu.
Návrh protokolu
Při tvorbě návrhu byl použit jako inspirace protokol Martina Lockera (ROBONET) a dále protokol Tomáše Paseky uvedený v jeho diplomové práci (Návrh a realizace autonomního robotu pro kategorii IEEE Micromouse).
Popis paketu
| SYNC1 | SYNC2 | ADDR | LEN | TYPE | Data 0 | ... | Data n | CRC1 | CRC2 |
SYNC1, SYNC2: synchronizační byty
ADDR: adresa přijemce
LEN: délka dat (teoreticky max. 255 bytů, bude sw omezeno na 32 bytů)
TYPE: typ paketu/dat
Data 0 ... Data n: přenášená data
CRC1,CRC2: šestnáctibitový kontrolní součet
Vyhrazené adresy
- Adresa 0xFF vyhrazena pro broadcast
- Adresa 0x0 pro master zařízení
Algoritmus komunikace
Devátý bit signalizuje jestli se posílají data nebo adresa (nastavený = adresa).
- master sestaví paket, umístí ho do bufferu, vloží první byte do UDR a pak se již celý buffer odešle samočinně
- byty SYNC1, SYNC2 a ADDR mají nastavený devátý bit, takže na ně reagují všechny moduly
- jakmile modul zjistí, že mu přišel byte s jeho adresou, přepne se na příjem všech bytů, ostatní moduly další byty ignorují (mají nulový devátý bit)
- maximální délka datové části je omezena na 32 bytů
- po příjmu všech dat vypočítá kontrolní součet, nastaví se na příjem adresních bytů a nastaví příznak indikující přijetí paketu
Komunikaci vždy inicializuje master. Slave moduly posílají data jen pokud jsou o to požádány. Příjem paketu není nijak potvrzován. Pokud master nedostane odpověď, pošle paket ještě 2x a pak považuje modul za mrtvý. Stejně tak, pokud podřízený modul zjistí, že už příliš dlouho nedostal data (např. povel pro motory) ukončí svou činnost (robot se zastaví), protože komunikace zřejmě nefunguje. Dále se zjišťuje, jestli nenastal timeout mezi příjmem jednotlivých bytů (modul umřel v půlce paketu).
Typy paketů
Typy paketů používané pro komunikaci mezi moduly:
- P_ECHO - odeslání echo paketu
- P_MOTOR_COMM - příkaz pro motor
- P_MOTOR_INFO - informace z motorů
- P_COMM_INFO - informace o stavu komunikace
Typy užívané pro komunikaci s PC:
- P_ECHO
- PC_MOVE_STRAIGHT - pohyb rovně
- PC_MOVE_ROUND - otočení o zadaný úhel
TODO: doplnit hodnoty konstant
Realizace komunikace v procesorech AVR
TODO: přerušení receive_complet, transmit_complet, alokace bufferů, ukládání nastavení a statistiky do struktury atd.