Arduino schéma - arduino.sk

Easy Transfer

Programovanie arduina
Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Easy Transfer

Poslaťod Jaroslav1 » Uto 25. Feb 2014 15:53:50

Potreboval by som trochu nakopnúť s komunikáciou pomocou knižnice easy transfer i2c. Ak by bol niekto ochotný napísať ukážku pre master a slave pre prenos premenej oboma smermi. Jedným smerom mi to ide , teda master načítava alebo zapisuje premennú, alebo oboma smermi si neviem rady. Takže napr. jeden je s ethernet shieldom (master) a tlačidlami , prijme stav A0 z druhého(slave) arduina, vykoná nazáklde info z A0 operáciu a pošle do druhého premennú pre servo v druhom(slave) arduine.

Obrázok užívateľa
Príspevky: 318
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: Easy Transfer

Poslaťod tomXX » Pia 06. Jún 2014 14:22:51

Jaroslav1 píše:Potreboval by som trochu nakopnúť s komunikáciou pomocou knižnice easy transfer i2c. Ak by bol niekto ochotný napísať ukážku pre master a slave pre prenos premenej oboma smermi. Jedným smerom mi to ide , teda master načítava alebo zapisuje premennú, alebo oboma smermi si neviem rady. Takže napr. jeden je s ethernet shieldom (master) a tlačidlami , prijme stav A0 z druhého(slave) arduina, vykoná nazáklde info z A0 operáciu a pošle do druhého premennú pre servo v druhom(slave) arduine.


Ahoj, a SoftwareSerial nestačí?
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Re: Easy Transfer

Poslaťod Jaroslav1 » Str 21. Jan 2015 19:34:29

Softwareserial, nestačí kedže chcem komunikovať po i2c. Ja neviem, stale my ide sparavit prenos iba jedným smerom, oboma sa mi nedarí. Na kolko niesom nejak zdatný programátor chcel by som si daný problém ulahčiť práve knižnicou easy transfer.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Easy Transfer

Poslaťod posjirka » Str 21. Jan 2015 22:02:07

Ahoj. Easy transfer jsem neresil ale sbernice i2c pracuje prave v rezimu 1 master, x slave uz jen proto ze master udava kmitocet rychlosti prenosu. Celkem me na vyskolil projekt i2c klavesnice s displayem, ktery jsem nasel na netu. Fungoval tak, ze pismena a cisla meli standardni ascii hodnotu a nektere netisknutelne znaky volali pomocne funkce jako treba navrat kurzoru na 0,0 a pod. Jeden prikaz pak byl jako dotaz na stisk klavesy a po odeslani cekal master na odpoved. Zkus projit examply . urcite to nebude neresitelny problem. Full duplexni komunikaci ale od toho cekat nemuzes.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: Easy Transfer

Poslaťod posjirka » Str 21. Jan 2015 22:21:14

Jeste jsem koukal na tu knihovnu easy transfer a examply tam jsou
https://github.com/madsci1016/Arduino-E ... C/Examples

Nevidim v tom ale zadny prinos oproti klasicke knihovne wire. Kdyz se podivas na knihovnu wire na arduino je tam zapojeni i examply pro 2 arduina v rezimech master write/ slave read a master read / slave write. To by melo byt co potebujes. Musis tu ko.unikaci udelat formou dotazu a prikazu, oboji ze strany master :http://arduino.cc/en/Tutorial/MasterReader
http://arduino.cc/en/Tutorial/MasterWriter

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Easy Transfer

Poslaťod budvar10 » Štv 22. Jan 2015 9:22:01

Presne tak. Myslím, že wire knižnica plne stačí.
Pri I2C je len jeden master a nemyslím si, že to ide len tak prehodiť.

Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Re: Easy Transfer

Poslaťod Jaroslav1 » Štv 22. Jan 2015 9:33:45

Ďakujem za rýchlu odpoveď. Podla tohto http://arduino.cc/en/Tutorial/MasterReader sa mi to podarilo rozchodiť, ale nechápte ma zle v tomto som len začiatočník a nerozumiem akým spôsobom by som vedel od mastra poslať do slave napr.: hodnotu AD prevodnika A0 a A1, aby slave presne vedel čo je A0 a čo A1 a zároveň aby master čítal zo slave jeho A0 a A1.

Práve toto za moju nevedomosť rieši knižnica easytransfer, ale aj v nej mi to ide len od mastra do slave a na opak nie.
Ak by ste boli niekto ochotný ukážku kódu kde s mastra posielam do slave (float A0) a A1, a zároveň master číta zo slave jeho (float A0) a A1, asi by som stým už vedel nejako prebojovať pre moje potreby.Nie je pre mňa potrebné využívať práve knižnicu Easytransfer, ide mi len o komunikáciu na zberni I2c, pretože plánujem použiť viac slave zariadení.

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Easy Transfer

Poslaťod budvar10 » Štv 22. Jan 2015 10:27:54

Dohodneš si protokol. Len úplne jednoducho: prvý bajt bude napríklad popis 0 = A0, 1 = A1, ..., potom bude nasledovať hodnota povedzme ďalších 5 bajtov, potom môže nasledovať povedzme CRC kvôli kontrole správnosti prenosu. Tak sa to robí aj v priemyselných aplikáciách a hovorí sa tomu telegram.

Obrázok užívateľa
Príspevky: 318
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: Easy Transfer

Poslaťod tomXX » Štv 22. Jan 2015 10:29:41

Ešte nezabudni brať do úvahy aj maximálnu dĺžku I2C zbernice, oficiálne zdroje uvádzajú tuším len nejaké centimetre...
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Re: Easy Transfer

Poslaťod Jaroslav1 » Štv 22. Jan 2015 10:42:01

budvar10 píše:Dohodneš si protokol. Len úplne jednoducho: prvý bajt bude napríklad popis 0 = A0, 1 = A1, ..., potom bude nasledovať hodnota povedzme ďalších 5 bajtov, potom môže nasledovať povedzme CRC kvôli kontrole správnosti prenosu. Tak sa to robí aj v priemyselných aplikáciách a hovorí sa tomu telegram.


Prosím Ťa, nevedel by si ukázať na nejakom krátkom príklade ako má daný telegram vyzerať? A na druhej strane ako telegram dešifrovať? V teoretickej rovine tomu rozumiem, ale po praktickej si to neviem predstavť.

Príspevky: 78
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: Easy Transfer

Poslaťod Robo Ulbricht » Štv 22. Jan 2015 11:03:04

Jaroslav, nasiel som ti stranku, kde riesia aj odoslanie (co uz mas nastudovane zo stranky http://arduino.cc/en/Tutorial/MasterWriter) aj precitanie. V priklade pouzivaju na prenos len jeden znak, ale na pochopenie principu vyziadania odpovede by to malo stacit.

Teraz ku tvojej otazke, ze ako prenasat bloky dat v praxi. Zaklad je, aby obe Arduina presne vedeli, ako data vyzeraju. Na to je najlepsie si data, ktore chces odosielat ulozit v strukture. A prenasanie udajov je v podstate len o algoritme:
  • Ulozim si udaje do premennej typu moja definovana struktura
  • Zistim si cez operator sizeof velkost mojich dat v znakoch
  • Odoslem moje data tak, ze adresu premennej si pretypujem na void alebo char pointer a odoslem tolko znakov, kolko mi povedalo sizeof

Napriklad takto by mohli vyzerat struktury
Kód: Vybrať všetko
struct jaro_data {
  int a;
  float b;
};

jaro_data d;
d.a=1;
d.b=2.4;

int size=sizeof(d);
const uint8_t* p = (const uint8_t*)&d;
Wire.write(p,size);



Pisal som to z hlavy, len podla kodu v wire.h, takze tam mozno je drobna chyba, ale od tohoto principu sa odpichni.

Odosielanie aj citanie z mastra
https://cyclicredundancy.wordpress.com/2013/03/07/passing-serial-data-over-i2c-between-two-arduinos/

Príspevky: 11
Registrovaný: Uto 25. Feb 2014 15:44:32

Re: Easy Transfer

Poslaťod Jaroslav1 » Štv 22. Jan 2015 11:25:05

No večer sa pokúsim podla tvojho návodu, celkom chápem ako to myslíš, len som zvedavý ako sa mi to podarí preniesť do praxe.Inak na strane čítania je treba tie data nejakým spôsobom zase rozobrať na int a, float b.Poradíš ešte ako?

Príspevky: 78
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: Easy Transfer

Poslaťod Robo Ulbricht » Štv 22. Jan 2015 11:50:40

To ides zase presne naopak. Nerobil som klienta na I2C, takze ti len analyzujem zdrojove kody co vidim. V principe mozu nastat dve situacie.
  • Dostanes vsetky data v jednom baliku
  • Bude ti to posielat postupne

Myslim si, ze Wire kniznica ti to posle naraz v jednom baliku, takze je to jednoduchsie.

Kód: Vybrať všetko
// behind the scenes function that is called when data is received
void TwoWire::onReceiveService(uint8_t* inBytes, int numBytes)
{
  // don't bother if user hasn't registered a callback
  if(!user_onReceive){
    return;
  }
  // don't bother if rx buffer is in use by a master requestFrom() op
  // i know this drops data, but it allows for slight stupidity
  // meaning, they may not have read all the master requestFrom() data yet
  if(rxBufferIndex < rxBufferLength){
    return;
  }
  // copy twi rx buffer into local read buffer
  // this enables new reads to happen in parallel
  for(uint8_t i = 0; i < numBytes; ++i){
    rxBuffer[i] = inBytes[i];   
  }
  // set rx iterator vars
  rxBufferIndex = 0;
  rxBufferLength = numBytes;
  // alert user program
  user_onReceive(numBytes);
}


Ten posledny riadok bude volat tvoju funkciu. A v nej presne ako robia ostatni, len musis buffer vyprazdnit do svojich dat. Bez pretypovania to nepojde. Takze zase budem pisat z hlavy a je mozne, ze sa aj pomylim trochu.

Kód: Vybrať všetko
struct jaro_data {
  int a;
  float b;
};

jaro_data d;

void receiveEvent(int howMany)
{
if(sizeof(d)!=howMany)
  return; // asi nam nedosli tie data co cakame, ked nemaju spravnu velkost

uint8_t* p = (uint8_t*)&d;
while(Wire.available())
    {
     char c = Wire.read(); // precitam jeden znak z buffra
    *p=c; // ulozim ho do miesta, kam smeruje pointer
    p++; // pointer posuniem o jeden znak hore
    }
}

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: Easy Transfer

Poslaťod budvar10 » Štv 22. Jan 2015 14:15:41

Presne toto som myslel. Len dodám, že pôjde to aj bez pretypovania a to cez union. Arduino používa strict mode pri kompilácii, takže na zmenu typu sa kompilátor bude sťažovať na union nie. Výsledný kód však bude rovnaký.

Príspevky: 78
Registrovaný: Štv 04. Dec 2014 22:15:58
Bydlisko: Banská Bystrica

Re: Easy Transfer

Poslaťod Robo Ulbricht » Štv 22. Jan 2015 15:26:37

budvar10 píše:Presne toto som myslel. Len dodám, že pôjde to aj bez pretypovania a to cez union. Arduino používa strict mode pri kompilácii, takže na zmenu typu sa kompilátor bude sťažovať na union nie. Výsledný kód však bude rovnaký.


Myslis tento riadok? const uint8_t* p = (const uint8_t*)&d;
Na to kompilator urcite nevypise ani varovanie.

Osobne by som sa kodu, kde sa pouzivaju uniony vyhybal. Co si pamatam z praxe, vzdy ked som sa musel uchylit k takej taktike, ci uz vynutenej zo strany Microsoftu, alebo som sa pokusal o ukladanie roznych dat do jedneho pamatoveho miesta, vzdy z toho vyliezal tazko pochopitelny kod, velmi nachylny na zanesenie nejakej chyby.

Ďalší

Späť na Software