Kodėl aš nemėgstu Arduino… arba kelios bibliotekos

Posted: 2013-10-08 in Darbeliai
Žymos:, , ,

Taigi va, aš šiek tiek prakutau su AVR mikrovaldiklių programavimu. Įsigijęs Arduino pradėjau tyrinėti jo kodą, paskui pradėjau eksperimentuoti… na, ir patys žinote, kaip nutinka, kai į kažką giliniesi. Kuo toliau į mišką, tuo… čia irgi tas pats. Tiesa, kas tas Arduino yr, aš suvokiau labai greitai ir lygiai taip pat suvokiau, kad visomis jo bibliotekomis pasitikėti tikrai negalima.

Visų pirma, AVR mikrovaldikliai yra tikrai labai mažučiukai ir juos bandyti programuoti taip pat, kaip ir normalius kompiuterius ar telefonus yra klaida. O Arduino bibliotekos yra padarytos taip, kad sudarytų įspūdį, jog čia viskas čiki-piki ir galima tuos mikrovaldiklius programuot visaip gražiai objektiškai ir panašiai patogiai.

Aš šiaip nesu nusiteikęs prieš objektinį programavimą. Ar netgi prieš aspektinį. Bet tokius dalykus, deja, reikia naudoti savo vietoje ir savo laiku.

Pamenu, kažkada skaitinėjausi iš susidomėjimo vieną įrašą ir radau komentaruose apie Arduino blogį. Šiaip labai tam pritariu. Visos grožybės kažką slepia.

Arduino bibliotekos yra gėris, jei tenka daryti mažučiukus projektėlius ir juos reikia kepti. Tada programavimo laikas yra paprasčiausiai brangesnis, nei procesoriaus taktai. Kurie, būkim biedni, bet teisingi, vis tiek 100% neišnaudojami. Tad vietoj rašymo tiesiai į registrą galima pasinaudoti ir gražia funkcija, kuri gal vietoj vieno procesoriaus takto prasuks kokius trisdešimt — tik niekas to nepajus, o projekto sėkmė bus kur kas didesnė. Bet kitais atvejais…

O kiti atvejai paprasti. Tarkim, kad reikia padaryti sąlyginai sudėtingą sistemą, su dideliu kiekiu periferijos ir dar pora vartotojo sąsajų. Kai išreiškiau savo mintis apie šilumos ūkio valdiklį, komentatoriai perspėjo, jog LCD ekranas ir Ethernet sąsaja tinklo serveriui mažučiuką procesorių apkraus ar netgi „perkraus“.

Taip, tai tiesa. Ypač, jei naudočiausi visokiomis gražiomis Arduino bibliotekomis ir bandyčiau programuoti objektiškai. Ir, beje, procesoriaus taktai yra visai neįdomu. Kur kas įdomiau yra naudojama atmintis. Atmega328, kurių aš turiu pilną stalčių, turi 2 kB RAM. Taip, draugai kompiuterastai, lygiai du kilobaitu. Aš net nesu turėjęs kompiuterio su tokiu kiekiu atminties, nors teko su visokiomis senienomis dirbti. Netgi mano senučiukė Hercules vaizdo plokštė turėjo cielus keturis kilobaitus vaizdo atminties. O čia — 2 kB.

Aš specialiai, moksliniais-pažintiniais tikslais atlikau šiokį tokį eksperimentą. Pirmasis buvo meniu sistema mano minėtam šilumos ūkio valdikliui, kuris vaizduojamas 16×2 LCD ekranėlyje ir valdomas keturiais mygtukasi. Suprogramavau vieną versiją, kuri buvo graži, objektiška, su visokiais paveldėjimais ir netgi AVR-GCC kompiliatoriaus tiuningais operatoriams new ir delete pajungti. Visas meniu konglomeratas suvalgė nei daug, nei mažai — apie 200 baitų. Beje, čia su PROGMEM (ne RAM, o Flash) atmintyje saugomais meniu punktų pavadinimais. O kai jį perrašiau į kelias funkcijikes, kurių rodyklės taip pat nugulė į PROGMEM, vietoj 200 baitų likau su 40. Cha. Galiu patapšnoti sau per petį. Žinoma, kodas ne toks jau gražus, nėra vaizdo-veiksmo-įvykio išsluoksniavimo, bet penkis kartus mažiau atminties. O kodas vis tiek tvarkingas ir gražus, bent jau man.

Toliau. Aš bandžiau LCD ekraną valdyti per I²C magistralę su PCF8754 mikroschema. Naudojau F. Malpartida objektinę biblioteką, paveldinčią Arduino Stream ir visaip kaip šaunią. Testas: poros eilučių išvedimas į ekraną. RAM sunaudojama apie 300 baitų. Daug, kaip poros eilučių išvedimui (rodomas laisvų SRAM baitų kiekis):

Arduino I²C ekranas naudojant Ferdinando Malpartida biblioteką | Darau, blė

Ką gi, jamam interneto klasika tapusią Peter Fleury LCD biblioteką, jo paties I²C biblioteką ir dar kažkieno PCF8754 biblioteką. Nieko objektiško, ne taip gražu, kai kurias funkcijas (pvz., kursoriaus mirksėjimą) reikia įsijungti pačiam siunčiant atitinkamą komandą… bet 200 baitų daugiau laisvos atminties! Be to, objektinėje bibliotekoje naudojama tarpinė Wire biblioteka, kuri neveikia iš pertraukimų kodo. O aš gal noriu iš pertraukimo kodo siųstelėti eilutę į ekraną arba nusiskaityti reikšmes iš RTC laikroduko… Be to, turiu pasakyti, kad Peter Fleury bibliotekos konfigūravimas I²C magistralei nė kiek ne sudėtingesnis, nei objektinės — vis tiek reikia žinoti, prie kurių PCF8754 elektrodų ekranas prijungtas. O baitų skirtumas akivaizdus:

AVR I²C ekranas naudojant Peter Fleury biblioteką | Darau, blė

Pažiūrėjimui galite parsisiųsti abiejų LCD testų programėles iš dėžės.

Tai va šitaip va. Tolimesnis žingsnis: reikia nusiskaityti laikroduko DS1307 parodymus arba jį nustatyti. JeeLabs biblioteka labai graži ir objektinė, bet vėlgi: nauoja Wire, valgo daug baitų atminties ir neveikia iš pertraukimų kodo. Deja, padorios bibliotekos neradau, tai prisėdau ir parašiau pats, naudodamas Peter Fleury I²C bibliotekėlę. Juokinga, bet pavyko iš pirmo karto, DS1307 protokolas visai nesudėtingas. Tad mano DS1307 bibliotekėlę irgi galite naudoti, jei reikia.

O šiaip tai apskritai kažkokia kūrybinė depresija su AVR procesoriais. Perskaičiau daug interneto apie STM32 ir LPC11xx  serijų Cortex-M0 ir Cortex-M3 ARM procesoriukus ir dabar bandau nusiraminti ir nuspręsti, kad man jų nereikia. O pabandyti vis tiek norisi. Realiai Atmega328 procesorių lyg ir per akis, bent jau man asmeniškai, o va ramybės nėr, norisi ir kokį 32 bitų ARM pačiupinėti. Tik… a nuo kokio pradėt? Jei būtų galimybė kaip nors įsigyti, gal ir pasiimčiau LPC1114FN28 DIP mikroschemą. Bet jų kažkaip Europoj ir šiaip ybėjuj niekur neradau. O amerikonai už siuntimą plėšia po $30 ar netgi $120. Na, kur matyta? Gal reikės kokį TQFP pasiimt and durniaus… o gal STM32 koks nors Cortex-M0 ar Cortex-M3 geriau? Nebežinau… LPC11xx lyg ir lengviau programuojami gali būti, tiesiai per UART… Blogai, kai pasirinkimas didelis.

Komentarai
  1. Nelabai tą programavimą raukiu, bet patinka kaip Tu viską gamini. Tikriausiai, jau ir pats matei, bet čia toks tarpinis dalykas tarp Ardunio ir Rasberio: http://www.wired.com/wiredenterprise/2013/10/tessel/

    • Darau, Blė parašė:

      Dėkui už komplimentą. Šiaip po to, kai užbaigsiu dabartinius darbelius, imsiuos namų tobulinimo „demuškės“. Kitaip sakant, pradėsiu eksperimentus „ant savęs“. Detalės ir kiti gėriai po truputį atkeliauja, net ir dėžučių gražių pavyko rasti…

  2. Saulix parašė:

    Laba,
    Netyčia naršydamas aptikau temelę “Naujas kompas namuose“ ir nejučia perskaičiau viską iki galo 🙂
    Yra minčių pasidaryti akvariumo kontrolerį, tik bėda ta, kad nesu susidūręs su mikrovaldikliais. Mačiau, kad žmonės gaminasi tokius kontrolerius su arduino uno. Jo kaina gana prieinama, tai ir sustiprėjo noras pabandyti gamintis kontroleriuką.
    Laidus junginėti ir lituoti moku, tačiau didžiausią nerimą keliantis reikalas – kontrolerio programavimas. Ar yra kur nors aprašytas arduino pradžiamokslis (neskaitant jo oficialaus tinklapio) kur būtų aiškai ir nuo pat pradžių paaiškinta arduino pradmenys: sintaksė, seka ir t.t.?
    Beje ar planuose yra parašyti apie PWM valdymą?

    • Darau, Blė parašė:

      Labas vakaras,

      būtų žymiai paprasčiau kažką pakomentuoti, jei galėtumėte paprastais punktais 1), 2), 3)… išvardyti reikalavimus tam akvariumo valdikliui. Aš pats apie akvariumus nežinau visiškai nieko, išskyrus, kad tai yra stiklinė talpa su vandeniu ir žuvelėmis, tad neturiu ir jokio įsivaizdavimo, kam ir kokiu tikslu ten reikia valdiklio ir kokius darbus jam reikia užkrauti.

      Valdiklio programavimui reikėtų turėti bendrus programavimo pagrindus. Žinoti, kas yra kintamasis, funkcija, sąlygos, loginiai blokai. Arduino programuojamas C++, tai reikia šios kalbos pradmenų ir sintaksės žinių: suprasti, kokie skliausteliai ką reiškia, kur dėlioti kabliataškius, kaip apsibrėžti kintamuosius ir kas yra specifinio būtent Arduino. Taigi geras pradžiamokslis būtų šiek tiek susipažinti su C++, o toliau ir Arduino tinklapis tikrai ganėtinai aiškus ir neblogas. Mano pradžiamokslis prasidėjo nuo ten.

      Man, kaip programuotojui, užduotis neatrodo sunki. Arduino puslapin dabar užklystu retokai, dažniausiai ieškau konkrečios problemos sprendimo. Kaip nuskaitomas kažkoks daviklis, kaip valdomas varikliukas, kaip „padauginti“ įvadų ar išvadų… daug daug įvairaus gūglinimo.

      Įtariu, kad tas akvariumo valdiklis nebus labai sudėtingas, tad ir PWM valdymas gali būti labai paprastas: tiesiog naudotis Arduino funkcija analogWrite(…). Šiaip, artimiausiu metu, nieko susijusio su PWM daryti neplanuoju, todėl atitinkamo įrašo greitai turbūt nebus :-]

  3. Saulix parašė:

    Pagrindinės aqua kontrolerio funkcijos:
    1. Apšvietimo valdymas (akvariumas apšviečiamas philips luxeon rebel 3w ledais):
    a) saulėtekio/saulėlydžio imitavimas t.y. užduotu laiku, apšvietimas turėtų pasikeisti nuo 0 iki 100% ar kitos užduotos maksimalios vertės (80% ar pan.) per užduotą laiko intervalą (pvz. 60min.).
    b) apšvietimo trukmės paros bėgyje nustatymas t.y. pvz. įjungiamas nuo 12:00 iki 22:00.
    c) 1-4 apšvietimo pwm kanalai, kuriuos būtų galima atskirai nustatyti pagal a ir b punktus.
    2. Led temperatūros matavimas ir pagal jos parodymus proporcingai (gal pagal PID) valdyti (kokį nors naudojamą kompiuterių korpusui aušinti su pwm), kuris kylant led temperatūrai nuo užduotos vertės įsijungtų ir didintų apsukas, o jei mažėjant – mažintų.
    3. Akvariumo vandens temperatūros matavimas – parodant ekrane (opcija ateičiai nuo jos valdyti šildytuvą per relę).
    Laikui bėgant gal ir atsirastų papildomų sumanymų, bet tai jau būtų paprastas relinis valdymas nuo temperatūros ar laiko.

    Kol kas svarbiausia būtų (ir tai yra sunkiausia) apšvietimo valdymas (punktas 1), nes dabar ji valdoma nuo taimerio – nustatytu laiku įsijungia ir išsijungia. Būtų visai šaunu, kad imituojant saulėtekį sklandžiai įsijungtų ir atv. bei eitų reguliuoti maksimalų apšvietimą – sumažinti, padidinti.
    Kol kas dar pačiam reikia susigalvoti algoritmą, ką vaizduoti ekrane ir t.t.
    Naršydamas internete radau net kelis gatavus sketch-us šiam reikalui. Gal dar ir jais pavyks pasinaudoti.

    Aparatinė įranga. Jau įsigijau Arduino uno R3 (kinietišką kopiją), 20×4 LCD su i2c, RTC laikroduką su i2c. Su kiek mygtukų būtų galima prasisukti (naršymui po meniu ir parametrų nustatymui)? Tikiuosi kad visas šitas gėris sėkmingai atkeliaus, nors paskutiniu metu siuntinukai iš ten stringa 😦
    Tikiu kad normaliam programuotojui, tai juokų darbas, bet besimokant gali šiek tiek ir užtrukti…
    Kol lauksiu siuntinuko, reikia pastudijuoti C++ pagrindus…

    • Saulix parašė:

      Prašau rekomenduokit kokį gerą skaitalą C++, būtų gerai lietuvišką…

    • Darau, Blė parašė:

      Maždaug aišku.
      1. Šviesos diodų draiveriai turi turėti PWM valdymą. Jei tamstos turimi draiveriai tokią galimybę turi, tai problemų nebus. Kitu atveju teks juos perdaryti arba daryti pačiam. Nors gal perdaryti bus paprasčiau, dauguma visokių draiverių mikroschemų turi „enable“ ar panašias kojas. Na, bent jau kiek man pačiam teko su tokiom susidurti. Jeigu PWM valdymą pavyks įvesti, tai tiek maksimalias vertes, tiek gražų perėjimą į/iš tamsos irgi pavyks padaryti. Reikės tik pagal minutes išdalinti maksimalią PWM reikšmę. Dar reikia atkreipti dėmesį, kad apšvietimą reikia mažinti ne tiesiškai, t.y. 0 minučių — 256, 30 minučių — 128, ir 59 minutės — 0. Reikia pasirinkti kokį nors logaritminį mažinimo kelią. Čia iš praktikos: tiesiškai mažinant apšvietimą atrodo, kad jis iš pradžių nelabai slopsta, o paskui šast ir užtemsta staigiai. Mažinti iš pradžių reikia gan drastiškai, o paskui švelnint. Matematikos kursus teks prisiminti 🙂

      2. O nesinorėtų sudėti, tarkim, dvigubai daugiau diodų, bet ant pusės jų galios? Mažiau galvą sukt dėl aušinimo tada… Na, nebent patį akvariumą šildo ir dėl to reikia aušinti.

      3. Na, čia paprasta, manau, tikrai, tai nekomentuosiu 🙂

      Dėl mygtukų. Aš šilumos valdikliui dariau keturis, panašiai, kaip kompiuterio monitoriuje. Šilumos valdiklio tyzeryje tas matosi. Bet man komentaruose siūlė naudoti rotary encoderį visokioms reikšmėms įvedinėti. Jei neteko girdėti, tai rotary encoderis toks kaip ir „potenciometras“ be pabaigos. Tarkim, norint sumažinti apšvietimo galią nuo 100% iki 80% tektų arba dvidešimt kartų mygtuką paspaust, arba užmygus laikyt. O su rotary encoderiu tiesiog pasukti į reikiamą pusę — malonesnis jausmas uždavinėt reikšmes tokiu būdu.

      Minimalus variantas yra trys mygtukai, bet tada nelieka mygtuko „Atgal“, tik „OK“. Tada užknisa, jei netyčia „OK“ paspaudi ir įlendi kur nors gilyn, turi varyt daug kartų „OK“, kol pagaliau atgal išeisi. Tiesa, tamstos projektas gal nebus labai sudėtingas ir meniukų ten kelių lygių turbūt nebus, bet keturis mygtukus verta pasilikti. Be to, darant konkrečiai užduočiai tai galima ir daugiau tų mygtukų įsidėti, kurių kiekvienas atliktų kokią nors konkrečią funkciją. Pvz., viens mygtukas LED galios nustatymui, antras — saulėtekio-saulėlydžio „greičiui“… O dėl rotary encoderio tai siūlyčiau pagalvoti, nes pats pasidariau be jo ir dabar nuoširdžiai gailiuosi 🙂

      C++ pradmenų… prieš 15 metų tai skaičiau tokią knygą „Thinking in C++“… Yra rusiškai, „Философия C++“ vadinasi, berods. Dar čia kiek panaršęs radau tokį saituką http://www.coderland.lt, pavyzdukai lyg ir nieko, nors aiškinamoji kalba neblizga. YouTube šiaip yra keli kanalai lietuviški C++ mokymuisi, tai galima ir ten panaršyti. Na, gerbiamasis, gūglinkit 🙂

      • Saulix parašė:

        Didelis dėkui už suteiktą informaciją ir nukreipimą ant tinkamo kelio. Daug aiškiau nuo ko pradėti ir ką daryti.
        Benaršydamas aptikau “Arduino programming notebook“ by Bien W. Evans – geriausias pradžiamokslis: viskas glaustai ir labai aiškiai surašyta.
        Žodžiu gana lysti į akis, reikia tęsti gyvenimo universitetą… 🙂

        • Darau, Blė parašė:

          Nu šiaip tai prašom kreiptis bet kada. C++ nepamokysiu (aišku, galėčiau, bet brangiai atsieitų :-D), bet šiaip visada kelios galvos geriau už vieną.

  4. Saulix parašė:

    Dėkui už rotary encoderio idėją. Mintis superinė – patogus ir paprastas valdymas. Nors tenka ir pačiam orkaitę su panašiu ratuku pareguliuoti, bet pačiam kažkodėl tai net minties nebuvo, kad ir valdymą būtų galima su juo pasidaryti. Va tai tau ir kelios galvos. .. 🙂

  5. BlackSheeps parašė:

    Žmonės rašantys “Arduino“ bibliotekas vienam ar kitam įrenginiui taigi nežino kokius projektus tu darysi su tuo įrenginiu ir kokius dar papildomus priedus prie jo jungsi 🙂 Tai šiek tiek prajukino straipsnis. Jeigu netenkina biblioteka gali susikurti pats, arba bent jau pasiredaguoti. Žmonės rašantis tas programas dažnu atveju negauna jokio atlygio o ir tą biblioteką taigi parsisiunti už dyką tai kažkokios super kokybės nereiktų tikėtis. Nori kokybės pirk Siemens400 arba siemens300 už 700 eurų ir reikš pretenzijas specializuotiems Siemens pritaikytų prietaisų kūrėjams kiek tik nori 🙂

    • Darau, Blė parašė:

      Gerbiamasis, aš apie žmones, rašančius bibliotekas, neparašiau nė vieno blogo žodžio. Parašiau, kad visu tuo pasitikėti nereikia, o jei netenkina — pasidaryti pačiam taip, kad būtų geriau. O tą būtent aš ir darau. Taip kad arba neskaitėte, kas parašyta, arba užsikabinote už kokio nors sakinio be konteksto.

  6. td parašė:

    visiems kurie sedi ant ardruino….imkit atmel studio 7… avr…te biblioteku yra begales….galesit naudot i valias….bet copy/paste problema isliks….mano patirtis sako ka draiverius 90% geriau rasyt paciam…pagal gamintoju datasheet

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Pakeisti )

Google photo

Jūs komentuojate naudodamiesi savo Google paskyra. Atsijungti /  Pakeisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti /  Pakeisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Pakeisti )

Connecting to %s

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.