Vse se je začelo z avtorjem, ki je na sekundarnem trgu kupil zanimivo napravo - Smart Response XE (
Te naprave so bile ukinjene pred nekaj leti in tisto, kar so šole kupovale za 100 do 200 $ vsako, se zdaj pojavlja na eBayu za 10 $ ali manj. Tamkajšnja strojna oprema je zelo primerna za geeky eksperimente:
- 60 tipkovnica
- zaslon z ločljivostjo 384 × 136, 2 bita na slikovno piko - podobno kot BC, CGA, vendar 4 ne barve, ampak gradacije svetlosti
- mikrokrmilnik ATmega128RFA1 (128 kB flash pomnilnik, 4 kB ROM, 16 kB RAM, 802.15.4 sprejemnik)
- zunanji (glede na mikrokrmilnik, ne na celotno napravo) 1 megabit (128 kilobajtov) bliskovni pomnilnik z vmesnikom SPI
- predal za 4 AAA elemente.
Že iz imena mikrokontrolerja je razvidno, da pripada družini AVR, kar pomeni, da je narediti napravo združljivo z Arduino več kot nepomembna naloga...
Od novic naprej
Toda avtorja bolj zanima priložnost, da ne igra na napravi, ampak študira:
- flash pomnilnik s serijskim vmesnikom SPI
- zagonski nalagalniki za AVR
- standard 802.15.4
Avtor je začel s pisanjem
To je dovolj za nalaganje zagonskega nalagalnika Arduino, ne pa tudi skice - serijska vrata tam niso povezana, tako da še vedno ne morete brez odpiranja ohišja. Prav tako sta liniji TX0 in RX0 prvega serijskega vmesnika združeni s poizvedovalnimi linijami matrike tipkovnice, in sicer s tistimi, ki poizvedujejo funkcijske tipke ob straneh zaslona. Toda kaj lahko storite - avtor je zgradil tole:
Tja je prinesel linije JTAG in zdaj ni treba odpreti prostora za baterije. In da se lahko naložijo skice, sem oba serijska vhoda povezal na isti konektor, dodal sem tudi stikalo, saj je z vstavljenimi baterijami fizično nemogoče drugače izklopiti napravo.
Kar nekaj časa je vzelo delo s spajkalnikom, nožem in lepilno pištolo. Na splošno je nalaganje skic "po zraku" veliko bolj priročno, za to moramo nujno nekaj izumiti.
Arduino IDE uporablja program za nalaganje skic
Po preizkušanju različnih načinov za premagovanje te težave je avtor prišel do naslednjega. Naprava ima 128 KB flash pomnilnik z vmesnikom SPI - podatke sprejemamo po žicah (ne pozabite, da ima avtor že eno napravo s konektorjem ob strani), ta pomnilnik uporabljamo kot medpomnilnik in pošiljamo podatke po radiu. kanal na drugo napravo. Pozdrav iz Cybiko.
Po pisanju kode za delo z radijsko postajo in pisave je nalagalnik postal daljši od 4 kilobajtov. Zato je bilo treba vrednost HFUSE spremeniti iz 0xDA v 0xD8. Zdaj je lahko zagonski nalagalnik dolg do 8 kilobajtov, začetni naslov pa je zdaj 0x1E000. To se odraža v Makefileu, vendar ga je treba upoštevati tudi pri polnjenju
Oddajnik-sprejemnik 802.15.4 v ATmega128RFA1 je prvotno zasnovan za delovanje s protokolom
Izkazalo se je, da sta za motnje WiFi najmanj dovzetna kanala 15 in 26. Avtor je izbral drugega. Izjava o omejitvi odgovornosti: prevajalec ne ve, ali je dovoljeno poenostaviti ZigBee na ta način. Mogoče bi morali malo bolj programirati in ga v celoti implementirati?
Na prvi napravi je potrebno implementirati končni avtomat, ki prenaša podatke po protokolu STK500. Večinoma so poslana in prejeta sporočila samozadostna, nekatera pa so vezana na tista, ki so prej šla skozi kanal. Podan je opis dialoga
Pomembna komponenta tega dialoga je prenos paketov, namenjenih zapisovanju v bliskovni pomnilnik ciljne naprave. Za preproste mikrokontrolerje družine AVR je velikost strani 128 bajtov, za ATmega128RFA1 pa 256. In za bliskovni pomnilnik, ki je povezan prek protokola SPI, je enako. Program v prvi napravi, ko naloži skico, je ne prenese takoj v drugo, ampak jo zapiše v ta pomnilnik. Ko Arduino IDE preveri pravilnost vnosa, pošlje tisto, kar je tam zapisano. Zdaj moramo prejete podatke prenesti prek radijskega kanala na drugo napravo. Hkrati se precej pogosto pojavlja preklop s sprejema na oddajanje in nazaj. Protokol STK500 je brezbrižen do zamud, vendar ne dopušča izgube podatkov (čudno, toda zgoraj je bilo rečeno, da zamude vplivajo tudi na prenos podatkov). In izgube med brezžičnim prenosom so neizogibne. ATmega128RFA1 ima vgrajeno strojno implementacijo ponavljajočih se zahtevkov ob dvomih o pravilnosti prenosa, vendar se je avtor odločil, da bo isto programsko implementiral sam. Razvil je protokol, po katerem teče veliko več podatkov v eno smer kot v drugo.
Ni popolno, vendar deluje. 256-bajtna stran je razdeljena na štiri segmente, od katerih se vsak prenaša po zraku kot paket. Paket lahko vsebuje do 125 bajtov podatkov plus en bajt za dolžino in dva bajta za CRC. Tako so tam postavljeni fragmenti, dolgi 64 bajtov, skupaj s številkami strani in segmentov (od 0 do 3). Sprejemna naprava ima spremenljivko, ki ji omogoča sledenje, koliko segmentov je bilo prejetih, in ko prispejo vsi štirje, naprava pošiljateljica prejme potrditev, da je bila prejeta celotna stran. Ni potrditve (CRC se ne ujema) – ponovno pošlji celotno stran. Hitrost je celo večja kot pri prenosu po kablu. Glej:
Toda na splošno bi bilo treba zagotoviti udoben način za povezavo kabla z napravami za nalaganje skic in prek njega. Na primer, postavite tak pretvornik vmesnika na CP2102, kot je na fotografiji, in ga prilepite na ploščo, tako da lahko prenese silo pri priklopu in odklopu kabla Micro USB.
Ima tudi 3,3-voltni stabilizator (in kako ga uporabiti v napravi s 6-voltnim napajalnikom - če ima le isti stabilizator in lahko dodaš dve diodi, da samodejno izbereš, katera bo napajala napravo) . Vse tri LED diode je treba odspajkati s plošče pretvornika vmesnika, sicer bodo med delovanjem dodatno obremenile baterije, motile pa bodo tudi anketiranje tipkovnice in delo z bliskovnim pomnilnikom z vmesnikom SPI.
Zasledovanje cilja se je izkazalo za celo bolj zanimivo kot njegovo doseganje (in ne rabite tiste šale o avtobusu). Avtor je izvedel veliko o AVR bootloaderjih, SPI flash pomnilniku, STK500 protokolu in standardu 802.15.4.
Vsa druga koda poleg zgoraj opisane knjižnice je −
Vir: www.habr.com