Totul a început cu autorul achiziționării unui dispozitiv interesant pe piața secundară - Smart Response XE (
Aceste dispozitive au fost întrerupte în urmă cu câțiva ani, iar ceea ce școlile au cumpărat cu 100-200 USD fiecare apare acum pe eBay pentru 10 USD sau mai puțin. Hardware-ul de acolo este foarte potrivit pentru experimente geek:
- Tastatură cu 60 de taste
- afișaj cu o rezoluție de 384×136, 2 biți per pixel - similar cu BC, CGA, dar 4 nu culori, ci gradații de luminozitate
- microcontroler ATmega128RFA1 (memorie flash de 128 kB, ROM 4 kB, RAM 16 kB, transceiver 802.15.4)
- extern (în raport cu microcontrolerul, nu cu întregul dispozitiv) memorie flash de 1 megabit (128 kilobyte) cu interfață SPI
- compartiment pentru 4 elemente AAA.
Din numele microcontrolerului reiese clar că acesta aparține familiei AVR, ceea ce înseamnă că a face dispozitivul compatibil cu Arduino este o sarcină mai mult decât banală...
De la știri încolo
Dar autorul este mai interesat de oportunitatea de a nu juca pe dispozitiv, ci de a studia:
- memorie flash cu interfață serială SPI
- bootloadere pentru AVR
- standard 802.15.4
Autorul a început prin a scrie
Acest lucru este suficient pentru a încărca bootloader-ul Arduino, dar nu și schița - portul serial nu este conectat acolo, așa că tot nu puteți face fără deschiderea carcasei. De asemenea, liniile TX0 și RX0 ale primului port serial sunt combinate cu liniile de interogare ale matricei tastaturii, și anume cele care interogează tastele funcționale de pe lateralele afișajului. Dar ce poți face - autorul a construit asta:
A adus liniile JTAG acolo, iar acum nu mai este nevoie să deschideți compartimentul bateriei. Și pentru ca schițele să poată fi încărcate, am conectat ambele porturi seriale la același conector, adăugând și un comutator, deoarece cu bateriile instalate este imposibil din punct de vedere fizic să oprești dispozitivul în alt mod.
A fost nevoie de ceva timp pentru a lucra cu un fier de lipit, un cuțit utilitar și un pistol de lipici. În general, încărcarea schițelor „prin aer” este mult mai convenabilă, trebuie urgent să inventăm ceva pentru asta.
Arduino IDE folosește programul pentru a încărca schițe
După ce a încercat diferite moduri de a depăși această problemă, autorul a venit cu următoarele. Dispozitivul are o memorie flash de 128 KB cu o interfață SPI - primim date prin fire (rețineți că autorul are deja un dispozitiv cu un conector pe lateral), folosim această memorie ca un buffer și trimitem datele prin radio canal către alt dispozitiv. Salutare de la Cybiko.
După ce a scris codul pentru a funcționa cu canalul radio, precum și cu fontul, încărcătorul a devenit mai lung de 4 kilobytes. Prin urmare, valoarea HFUSE a trebuit să fie schimbată de la 0xDA la 0xD8. Acum, bootloader-ul poate avea o lungime de până la 8 kilobytes, iar adresa de pornire este acum 0x1E000. Acest lucru se reflectă în Makefile, dar ar trebui să fie luat în considerare și la completare
Transceiver-ul 802.15.4 din ATmega128RFA1 este proiectat inițial să funcționeze folosind protocolul
S-a dovedit că canalele 15 și 26 sunt cel mai puțin susceptibile la interferențe de la WiFi Autorul a ales al doilea dintre ele. Disclaimer: traducătorul nu știe dacă este permis să simplifice ZigBee în acest fel. Poate ar trebui să facem puțin mai multă programare și să o implementăm complet?
Pe primul dispozitiv, este necesar să se implementeze o mașină cu stări finite care transmite date prin protocolul STK500. În cea mai mare parte, mesajele transmise și primite sunt autosuficiente, dar unele sunt legate de cele care au trecut prin canal mai devreme. Este oferită descrierea dialogului
O componentă importantă a acestui dialog este transmiterea pachetelor destinate a fi scrise în memoria flash a dispozitivului de destinație. Pentru microcontrolerele simple din familia AVR, dimensiunea paginii este de 128 de octeți, dar pentru ATmega128RFA1 este de 256. Și pentru memoria flash care este conectată prin protocolul SPI, este același lucru. Programul din primul dispozitiv, atunci când încarcă o schiță, nu o transferă imediat pe al doilea, ci o scrie în această memorie. Când IDE-ul Arduino verifică corectitudinea intrării, i se trimite ceea ce a fost scris acolo. Acum trebuie să transmitem datele primite prin canal radio către al doilea dispozitiv. În același timp, trecerea de la recepție la transmitere și înapoi are loc destul de des. Protocolul STK500 este indiferent la întârzieri, dar nu tolerează pierderea de date (ciudat, dar s-a spus mai sus că întârzierile afectează și transferul de date). Și pierderile în timpul transmisiei fără fir sunt inevitabile. ATmega128RFA1 are o implementare hardware încorporată a solicitărilor repetate atunci când există îndoieli cu privire la corectitudinea transferului, dar autorul a decis să implementeze el însuși același lucru în software. El a dezvoltat un protocol în care mult mai multe date circulă într-un fel decât în altul.
Nu este perfect, dar funcționează. Pagina de 256 de octeți este împărțită în patru segmente, fiecare dintre acestea fiind transmisă prin aer sub formă de pachet. Un pachet poate conține până la 125 de octeți de date plus un octet pentru lungime și doi octeți pentru CRC. Deci fragmentele de 64 de octeți, împreună cu numerele de pagină și de segment (de la 0 la 3) sunt plasate acolo. Dispozitivul de primire are o variabilă care îi permite să urmărească câte segmente au fost primite, iar când sosesc toate patru, dispozitivul expeditor primește confirmarea că întreaga pagină a fost primită. Nicio confirmare (CRC nu s-a potrivit) - retrimiteți întreaga pagină. Viteza este chiar mai mare decât la transmiterea prin cablu. Vedea:
Dar, în general, ar fi necesar să se ofere o modalitate convenabilă de a conecta cablul la dispozitivele pentru încărcarea schițelor și prin intermediul acestuia. De exemplu, plasați în interiorul unui astfel de convertor de interfață pe CP2102, ca în fotografie, și lipiți-l pe placă, astfel încât să poată rezista forței la conectarea și deconectarea cablului Micro USB.
De asemenea, are un stabilizator de 3,3 volți (și cum să-l folosești într-un dispozitiv cu o sursă de alimentare de 6 volți - doar dacă are același stabilizator și poți adăuga două diode pentru a selecta automat care dintre ele va alimenta dispozitivul) . Toate cele trei LED-uri trebuie să fie dezlipite de pe placa convertorului de interfață, altfel vor încărca suplimentar bateriile atunci când funcționează pe ele și, de asemenea, vor interfera cu sondarea tastaturii și vor lucra cu memoria flash cu interfața SPI.
Urmărirea unui obiectiv s-a dovedit a fi chiar mai interesantă decât atingerea acestuia (și nu am nevoie de gluma aceea despre autobuz). Autorul a învățat multe despre încărcătoarele AVR, memoria flash SPI, protocolul STK500 și standardul 802.15.4.
Toate celelalte coduri în plus față de biblioteca descrisă mai sus sunt -
Sursa: www.habr.com