Kruhová sběrnice

19. června 2014 v 5:32 | Petr |  Roboti
Když v listopadu 2003 moje tehdejší manželka prchla za anabolikovým bezmozkem z posilovny i s 1,5 letou dcerou - byl jsem tak nějak "down", proto mě velice potěšilo, že lidi, kteří jsou dnes bez výjimky kámoši, uspořádali v dubnu 2004 první "veřejný" Robotický den.

Na robotickém dni byla spousta pozoruhodných robotů a taky spousta pozoruhodných jevů "mezi nebem a zemí". Příklad - nějací kluci měli elektroniku pro robota v obalu od videokazety (ví mládež co to je ?) Když měli obal otevřený - robot fungoval jako z partesu, když obal zavřeli - robotovi se asi tak po 2 sekundách "kousnul" jeden z procesorů a bylo vymalováno. Když jste se podívali dovnitř videokazety tak to bylo jako břicho mrtvého bezdomovce při pitvě - neskutečný chaos drátů na kterých visely jednotlivé "čtyřdírkové moduly". Tak jsem se ptal - jakou sběrnici používají - a dostalo se mi odpovědi, že se jim jako nejsnazší jevilo použít I2C. Když jsem se ptal proč I2C tak jsem se dověděl, že to je sběrnice, na kterou se nejsnáze "věší" další moduly.

Rozluštění pohádky jistě tušíte - když se dráty nacpaly do zavřeného obalu nastala "nežádoucí vazba" mezi nimi a bylo vymalováno. Protože sběrnice I2C je opravdu "svůdná" - nebo "ve své době" svůdná byla, protože zdánlivě řeší vše - adresování modulů, konflikty na sběrnici atd. Proto jsem vydal "Kubáčovo imperativní nařízení" které si teď tréningově zopakujeme :
ABSOLUTNĚ ZAKAZUJU POUŽÍVAT I2C MIMO JEDNOTLIVÉ DPS A I NA DPS NE NA VĚTŠÍ VZDÁLENOST NEŽ 5 CM!!!
Tušítě proč ? Přesně k tomu totiž bylo I2C vymyšleno - aby usnadnilo routování desek televizorů na dálkové ovládání v 80 letech. tehdy spojovalo přijímač IR, kanálový volič, a ještě "ten třetí šváb", který nastavoval analogové parametry jako hlasitost, výšky basy, kontrast, a barevnou sytost. - Nic více - žádné tahání kabelem na metry daleko, kolem motorů.

Tím samozřejmě vyvstala myšlenka vymyslet něco jiného - a tak jsme dělali "brainstorming mailem". Já jsem křičel - "vymyslete cokoliv, ale ať je to diferenciální sběrnice", kvůli odolnosti proti rušení. Bezstarosťák křičel "hlavně ať to není RS 422 / 485" - protože tam se musí předem přepínat vysílání / příjem. Tak nakonec vznikla idea na RobBus - použije se hardware pro CANbus, ale budeme používat vlastní protokol: RobBus by nikdy nepřekročil práh "kecání na Internetu", kdyby se jí nechytlo duo Kamil + Beřich kteří ji dotáhli do stádia, kdy jí používají ve svých robotech.

Potud lze RobBus považovat za ověřenou "hotovou věc". ´Já jsem už byl mnohokrát nalomen jej taky použít (všechny moduly z mé dílny jsou z hlediska hardwaru připraveny), ale ať jsem počítal jak jsem počítal - pořád mi nevycházela přenosová kapacita, zejména s ohledem na moji ideu posílat ze sonarů do PC celé "mapy ultrazvukové odrazivosti". K tomu směřovala i snaha o naprogramování jednoduché ztrátové komprese atd. Robbus je totiž z principu Simplexní / Poloduplexní sběrníce a navíc "všichni slyší všechny" včetně toho, že každý modul "slyší sám sebe" - což třeba převodníkům USB / RS232 pro PC nedělá 2x dobře.


Tak jsem přemýšlel nad "procesorovými sonary" kdy kažý mikrofon bude mít vlastní procesor, který udělá preprocesing. Vymýšlel jsem Robbusové SWITCHE a HUBy a pořád mi z toho vycházely věci - více méně monstrózní. Mezitím jsem přemýšlel nad tím, jestli by nestálo za to Robbus úplně opustit a místo něho se vrátit k RS 232 (a obětovat robustnost diferenciální sběrnice). Vymýšlel jsem jak spojit více RXD a TXD pinů navzájem až najednou PINK - sedím ráno na záchodě a "je to tady".

Nejsou přece jenom sítě typu "sběrnice" nezanedbatelnou část historie se používaly sítě typu "kruh". Dodnes se používá SPI, z historie je známý Token Ring, nebo ARCnet. Takže idea je následující - data se po sběrnici nešíří pasivně, ale aktivně, každý modul dostane paket, co potřebuje si ponechá a zbytek "přepošle" dál. Master se navenek chová stejně, akorát místo neustálého kroužení starého packetu - nahradí tento novým. Tohle může fungovat na úrovní packetů, ale z hlediska softwaru i propustnosti sběrnice je lepší tohle dělat na úrovni bytů. tím že kruh je tvořen full-duplexními úseky komunikační rychlost celé sítě modulů rovná se rychlosti komunikace s jedním modulem. S počtem modulů roste zpoždění mezi vysláním dotazu a přijetím odpovědi, ale u praktického počtu modulů v robotech ( do 10 ) by se s tím (snad) dalo žít.

V čem může být nevýhoda - jedná se o sériové spojení v pravém slova smyslu - tedy vypadne vám odněkud konektor a je po ptákách. Proto zase pro změnu přemýšlím, že "hlavní rozbočovač" by měl nějakou detekci této situace. Na druhé straně master má schopnost detekovat že se packet nevrátil....

Nevím nevím - nabízím tuto ideu jako myšleku (jistě už známou všem zkušeným) - jak pomocí UARTu spojit více než dva moduly. V ostatních oblastech je to stále ve stadiu spekulací aneb jak říkal Doktor FAST - "kdo nejvíce - myslí nejméně ví" ...

Tedy idejí bychom měli dosti - zbývá ještě tradiční rada pro blondýny : Víte jak dopadla moje exmanželka ? Po 10 letech a dalších 2 dětech se svalovec z fitka sebral a šel "o dům dále" - za blondýnou v minisukni - takže pozor ! "Lehce nabyl - lehce pozbyl" funguje i této oblasti.
 

Buď první, kdo ohodnotí tento článek.

Komentáře

1 Karel Karel | 19. června 2014 v 6:25

Jakou komunikační rychlost potřebuješ a na jakou vzdálenost? Já tahám v zarušeném prostředí poblíž velkých motorů RS485 na cca 100m rychlostí 115200bps a bez problémů. Přepínání směru není až takový strašák jak se zdá.

2 petr-kubac petr-kubac | 19. června 2014 v 9:03

10 měření / sec
1000 - 8 bitových hodnot
Mininálně 4 sonary - ergo 320 kbit/sec.
Nuto tahat po robotu - tedy max 1 metr.
Viděl jsem to jako UART na 1 MBIT/SEC.

3 kolemjdoucí kolemjdoucí | 19. června 2014 v 9:55

Jedno z českých vydání knihy od Burkharda Kainky „Využití rozhraní PC” (taková útlá s modrým přebalem, nakladatelství HEL) popisovalo na RS232 „fintu” s využitím devátého bitu, kterým se tuším přepínalo jestli „adresa nebo data” (nevím přesně, nemám teď tu knihu po ruce, tak se nemůžu podívat), a dalo se tak tedy na RS232 adresovat několik zařízení.

4 Karel Karel | 19. června 2014 v 11:26

[3]: Jo tohle umí i atmel AVR, kdysi se to jmenovalo multiprocessor communication mode. Xmega to taky umí. Ale žádný zázrak bych od toho nečekal.

5 Karel Karel | 19. června 2014 v 11:29

[2]: Do 1m bych použil uart, kdyžtak do stíněného kablíku. Pro připojení k PC (příposlech)přes FT2232, ten to zvládne.

6 kolemjdoucí kolemjdoucí | 19. června 2014 v 18:19

No ono je to jedno, protože autor čláknu stejně zřejmě myslel spojit fyzicky (hardware), i když mě teda taky zmátlo že je to v odstavci zvlášť. Bych se té RS232 tolik nebál, a asi bych ani neřešil víc zařízení na jedné lince - v době kdy jsou k dostání mikrokontroléry klidně třeba i se čtyřmi TTL RS232...

CAN není špatnej, Microchip na něj dělá v THT i SMD pěknej a relativně levnej převodník MCP2551 (a pokud by bylo potřeba oběma směry bez přepínání tak bych to klidně zdvojil), a nebo klasicky MAX485/75176... Ono to jinak nepůjde, pokud to má být diferenciální, tak buď zdvojit, nebo přepínat... o žádným duálním CAN transceiveru bohužel nevím.

7 petr-kubac petr-kubac | 19. června 2014 v 21:01

[6]: Máte pravdu MCP2551 je přesně, co v RobBusu požíváme

8 Dalík Dalík | 21. června 2014 v 8:19

Tak tu kruhovou sběrnici jsem nepochopil, jaká je hlavní výhoda? Že se data v jednom okamžiku šíří pouze mezi dvěmima zařízeními a nikoli po celém robotovi najednou?

Ono se říká, neber chlapa od rodiny, nejspíš to funguje i naopak. Neber ženskou od rodiny, páč to bude kráva a do deseti let si budeš muset najít jinou, mladší, krásnější a kdo se s tím má pořád srát.

9 petr-kubac petr-kubac | 23. června 2014 v 8:35

[8]: když chcete "naivně" udělat sběrnici z UARTů tak "spojíte všechny piny RX - ty jsou vstupy a tak není problém, ale co s piny TX, které jsou výstupy ?

Spojení do kruhu s tím že paket krouží od modulu k modulu je jedna z cest jak spojení "point to point" udělat tak, že může fungovat jako "point to multipoint" - tedy klasická sběrnice, která tam ale nide není.

10 m.marianek m.marianek | 23. června 2014 v 9:23

[9]: Zpravidla většina komunikací je typu master-slave a tak můžete s Tx udělat to samé jako s Rx - spojit je dohromady, akorád je třeba je udělat v provedení s otevřeným kolektorem. U zařízení master jsou samozřejmě potom vývody Rx a Tx do kříže, tj. Tx obsluhuje všechny Rx a Rx poslouchá všechny Tx. Další varianta je spojit naprosto všechny Rx a Tx na jeden drát a provozovat half duplex, pro menší objemy dat je to zkousnutelné řešení a z hardwarového hlediska se ušetříjeden drát. Jinak ta multiprocesorová komunikace o které se tu mluvilo, je celkem fajn věc a přibližuje to UART k té I2C sběrnici, protože to elegantně řeší adresování jednotlivých zařízení na sběrnici. Výhodu ve vašem spojení do kruhu vidím v tom, že není nutné zařízení master, data mohou běžet odkudkoliv kamkoliv a po cestě si je někdo vyzvedne, pokud ne, dojdou zpět k odesílateli a ten je stornuje. Daní za to je větší zpoždění dat a potřeba buferů v každém zařízení, pokud totiž průchozí zařízení zároveň vysílá a má Rx obsazen vlastní zprávou, musí zpráva předchozího modulu čekat na uvolnění Rx. Další krutá daň je opravdu ta seriovost, při jakékoliv poruše, či zatuhnutí komunikace u jednoho zařízení, se komunikace zhroutí, což se u robota rovná oslepnití, ohluchnutí a ochrnutí a to je dost fatální. Vzhledem k tomu, že je pro vás mohutnou inspirací biologické řešení a příroda se podle mě touhle cestou neubírá, nenajde to asi ve vašich robotech velkého uplatnění :-D.

11 mln mln | E-mail | 23. června 2014 v 15:03

Podla mna vami navrhnutá zbernica už existuje, je to upravená SPI, nazýva sa to SPI Daisy Chain.

Komentáře jsou uzavřeny.


Aktuální články

Reklama