Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2019_276_44
V tem in nekaj naslednjih številkah revije Svet elektronike bomo predstavili zanimiv komplet modulov, ki se na trgu nudi pod imenom “37-in-1”. Komplet je sestavljen iz 37 ploščic (v nadaljnjem tekstu, moduli), na katerih so zaspajkane posamezne komponente ali vezja. Komplet vsebuje vsega po malem, od banalnih stvari kot so tipke, piskači ali LEDice, do različnih senzorjev in drugih komponent (od katerih bi nekatere težko našli v svobodni prodaji) in do enostavnih sklopov, ki se lahko uporabijo v robotiki (slika 83). V kompletu se nahaja tudi Arduino UNO modul z ustreznim kablom za programiranje.
Bascom-AVR programi za module iz 37-in-1 kompleta
Uporabniki Arduino in Python platform bodo na spletnih straneh lahko našli delujoče programske primere za vse module iz kompleta: dovolj je modul povezati na Arduino UNO, “naložiti” ustrezen program iz Arduino ali Python okolja in takoj lahko preverite, kako modul “diha”. Za tiste, ki rajši uporabljate Bascom-AVR smo pripravili podoben komplet programov – včasih bo to samo “prevod” Arduino programa v Bascom-AVR, medtem ko bomo za zanimivejše module ponudili tudi precej več od tega: nove in podrobno obrazložene programske rešitve. Poleg tega smo za vsak modul pripravili montažno shemo in shemo vezja, ki se na njemu nahaja, z opisom načina dela kompleksnih vezij, tako da boste vso dokumentacijo imeli na enem mestu.
Ta vsebina je samo za naročnike
Programiranje Arduino UNO modula iz Bascom-AVRa
Ampak gremo po vrsti! Modul Arduino UNO je sestavljen iz mikrokontrolerja ATmega328P z bootloaderjem, čipa za programiranje in serijske komunikacije (ATmega8U / 16U, CH340G ali FT232RL), stabilizatorjev napetosti 5V in 3,3V ter nekaj drugih komponent, ki so povezane v funkcionalno enoto. Ker je napajanje omogočeno tudi prek USB priključka, je dovolj, da priključite Arduino UNO na računalnik z ustreznim USB kablom in začne delovati. Pravilno delovanje se bo pokazalo z utripanjem signalne LEDice – tak program se najprej vpiše v vse Arduino module. Kadar napišemo nek program in ga želimo naložiti v Arduino UNO, nam bo v tem pomagal bootloader, mali program nameščen na koncu programskega spomina mikrokontrolerja. Bootloader se zažene takoj po resetu mikrokontrolerja (ne glede na to, ali je reset povzročil priklop napajanja, pritisk na RESET tipko ali osebni računalnik preko čipa za serijsko komunikacijo) in preko Rx in Tx pinov pričakuje prihod sekvence za programiranje. Če se takšna vrsta komunikacije z osebnim računalnikom vzpostavi v predvidenem roku, bo bootloader začel polniti programski spomin mikrokontrolerja z novim programom in nato mu bo predal kontrolo. Če se v času nekaj sekund ne vzpostavi komunikacija z osebnim računalnikom, bo bootloader predal kontrolo predhodno vpisanem programu.
Če želimo iz Bascom-AVR okolja naložiti program v Arduino (tj., programirati mikrokontroler na Arduino modulu), moramo izbrati in pravilno konfigurirati ustrezen programator. Bascom-AVR pozna dve izvedbi Arduino bootloaderja, ki se v konfiguracijskih nastavitvah Options->Programmer pokažejo kot “ARDUINO” in “ARDUINO STK500V2” (slika 84). Poleg ene od njih je še potrebno izbrati COM port, na katerega je Arduino modul priključen ter hitrost komunikacije. Od vsega navedenega je najlažje ugotoviti, kateri COM port uporablja Arduino modul: povežite Arduino na USB port in v Device managerju poglejte pod “Ports (COM&LPT)”; tam bi morali videti vrstico kot “Arduino Uno (COM4)”.
Za nastavljanje ostalih postavk je potrebno malo potrpljenja. Poleg originalne izvedbe (katerih je tudi več verzij verzija), se na tržišču nahaja večje število različnih Arduino klonov, katerih bootloaderji se medsebojno razlikujejo. Po mojih izkušnjah boste v Arduino UNO modulu najbolj pogosto naleteli na bootloader, kateremu ustreza Bascomov ARDUINO programator in hitrost 115200 Baudov. Potrebno je poizkusiti tudi s hitrostmi od 57600 ali 19200 Baudov (pri Arduino Nano modulu se pogosto srečata te dve nizki hitrosti). Dobra je tista izbira, pri kateri v okolju za programiranje lahko preberete kateri mikrokontroler se nahaja na Arduino modulu (največkrat ATmega328P). Če pa dobite niz “rdečih” sporočil, je to znak, da je treba poizkusiti z drugo hitrostjo komunikacije, in nato tudi z drugim programatorjem, ARDUINO STK500V2. Včasih ni dovolj samo menjati opcije programatorja v Bascom-AVR okolju, pač pa je treba pri vsaki spremembi odklopiti in ponovno priklopiti Arduino modul in ponovno zagnati Bascom-AVR. K sreči je to dolgočasno delo potrebno narediti samo enkrat: Bascom-AVR si bo zapomnil dobre nastavitve in jih uporabil ob naslednjem programiranju; morda bo potrebno spremeniti samo COM port.
Specifičnosti ARDUINO programatorja:
- pred programiranjem ni potrebno brisati predhodnega programa;
- ni možno prebrati niti spreminjati Fuse bite.
Specifičnosti ARDUINO STK500V2 programatorja:
- pred programiranjem je potrebno zbrisati predhodni program;
- možno je brati in spreminjati Fuse bite.
Možni problemi pri uporabi Arduino UNO modula
Sheme na sliki 85 prikazujejo izvedbo vezja programatorja na Arduino modulu s CH340G čipom (zgoraj) in ATmega8U2 ali ATmega16U2 mikrokontrolerjem (spodaj). Izvedbe Arduino modula z FT232RL čipom se danes precej redko srečajo, so pa podobne rešitvi z ATmega mikrokontrolerji.
Nekaj stvari moramo komentirati v povezavi s shemami s slike 85. Najprej, programiranje ATmega328P mikrokontrolerja se vrši preko pinov PD0 in PD1, zato uporaba priključkov “RX←0” in “TX→1” lahko povzroči določene probleme med programiranjem ali med serijsko komunikacijo z osebnim računalnikom. Moj generalni nasvet bi bil, da ne uporabljate priključke “0” in “1”! Če je to zaradi katerega koli razloga nujno, bodite pozorni na naslednje:
- Bootloader rekonfigurira pine PD0 in PD1 tako, da postaneta vhodni (RX) in izhodni (TX) priključki vezja za serijsko komunikacijo (USART). Ko predajo kontrolo glavnemu programu nekatere verzije bootloaderja “pozabijo” vrniti osnovno funkcijo teh pinov. Opazili boste to po tem, ker bo branje s teh pinov ali pisanje na njih dalo nepričakovane rezultate, kot da so preklicali poslušnost. Pinom PD0 in PD1 lahko vrnete osnovno I/O funkcijo, če na začetku svojega Bascom-AVR programa napišete ukaze (glej program 1)
- Možna posledica takšne intervencije so težave pri naslednjem programiranju mikrokontrolerja. Če Bascom-AVR več ne uspe vzpostaviti komunikacije s programatorjem, naredite sledeče: pritisnite tipko RESET na Arduino modulu, kliknite na gumb za programiranje in spustite RESET. Če ne uspe prvič, ponovite postopek.
- Če v svojem programu konfigurirate pine PD0 in PD1 kot izhodne in jim nato hitro menjate stanje (stokrat v sekundi), lahko to tudi zmoti reprogramiranje mikrokontrolerja, neodvisno od tega, ali ste morali delati intervencijo opisano pod a) ali ne. V tem primeru uporabite ročni reset kakor je opisano pod a).
- Arduino modul vizualizira serijsko komunikacijo s pomočjo LEDic Rx in Tx. Pri izvedbi, ki uporablja CH340G čip (slika 85 zgoraj), so te LEDice vezane direktno na priključke “0” in “1” in lahko vplivajo na pravilno delo vezij ali komponent, ki jih vežete na te priključke, posebej če jih uporabljate kot vhode. Pri izvedbah, ki uporabljajo ATmega8U, ATmega16U ali FT232RL čipe (slika 85 spodaj), so Rx in Tx LEDice vezane drugače in ne motijo normalne uporabe priključkov “0” in “1”, vpliv 8U/16U/232RL čipa preko upora vrednosti 1 kΩ je zanemarljiv.
- Medtem pa ima negativni vpliv upor vrednosti 1 kΩ, ki bo prišel do izraza pri vseh navedenih izvedbah programatorja, če na priključke “0” ali “1” povežete komponente, ki ne dopuščajo, da njihova napetost med programiranjem mikrokontrolerja ali med serijsko komunikacijo zavzema jasno definirana logična stanja. Npr., če na priključek “0” povežete upor vrednosti, ki je manjša od 2 kΩ prema masi ali 10 kΩ proti napetosti napajanja, ali druge elemente kateri lahko “potegnejo” tokove večje od nekaj sto µA, ali recimo kondenzatorje večjih kapacitet, boste popolnoma onemogočili programiranje in serijsko komunikacijo; takrat ne bo pomagal niti postopek opisan pod a).
program 1
Reset Ucsr0b.rxen0 ‘Rx -> D0
Reset Ucsr0b.txen0 ‘Tx -> D1
Naslednje opozorilo je vezano z uporabo priključka “13”. Na Arduino modulu je na njega, oziroma na pin PB5 mikrokontrolerja, vezana signalna LEDica (obično je označena s črko L). To je tista LEDica, ki utripa, kadar še neprogramirani Arduino modul povežemo na napajalno napetost. Na nekaterih modulih je LEDica preko upora vrednosti 330 Ω do 1 kΩ direktno vezana na PB5 (slika 86 zgoraj). Takšna rešitev je zelo slaba, ker omejuje možnost uporabe PB5 kot vhodnega pina: interni pull-up več ni dovolj, da postavi pin v stanje “1”. Problem lahko rešimo z zunanjim pull-up uporom vrednosti izmed 330 Ω in 1 kΩ, vendar to nepotrebno povečuje porabo in obremenjuje element ali vezje, ki smo ga vezali na “13”. Na novejših izvedbah in boljših klonih je signalna LEDica vezana kot na sliki 86 spodaj. Obe navedeni integrirani vezji imata zelo majhen izhodni tok in zato ne obremenjuje PB5. Zato se pri takšni rešitvi priključek “13” lahko brez omejitev uporablja tudi kot vhodni in kot izhodni.
Tukaj je treba biti previden, ker sama prisotnost LM/LMV358 čipa na Arduino modulu ne pomeni, da je signalna LEDica vezana na “dober način”! Polovica LM/LMV358 čipa se standardno uporablja za preklapljanje napajalne napetosti (izključuje USB port, če je prisoten drugi vir napajalne napetosti), medtem ko je druga polovica na nekaterih modulih koristno uporabljena, kot na sliki 86 spodaj, na nekaterih pa je ostala neizkoriščena. Če niste prepričani kakšno izvedbo Arduino modula imate, lahko to preverite s programom kot ta:
Config Pinb.5 = Input Do Portb.5 = Not Portb.5 Wait 1 Loop
Program konfigurira PB5 kot vhodni pin in nato izmenično vključuje in izključuje interni pull-up upor. Če imate “dobro” rešitev bo signalna LEDica utripala s polno svetilnostjo; pri “slabi” rešitvi bo LEDica komaj vidno utripala, ker pull-up upor ne more “potegniti” napetost PB5 pina dovolj visoko. V tem drugem primeru priporočam, da se priključek “13” uporablja samo kot izhodni. Če želite dobiti zanesljiv rezultat, mora biti priključek “13” med izvajanjem programa “v zraku”, tj. na njega ne sme biti nič priključeno.
Kako Bascom-AVR vidi Arduino UNO?
Odgovor je enostaven – nikakor! Medtem ko je programski jezik Arduino orientiran na oznake na Arduino UNO modulu, Bascom-AVR “vidi” samo mikrokontroler ATmega328P in njegove pine. Zaradi tega moramo dobro preučiti povezavo med pini mikrokontrolerja in priključki na Arduino modulu.
Standardni razpored priključkov na Arduino UNO modulu je prikazan na sliki 87. Slika prikazuje oznake priključkov na modulu (stolpec OZN), imena pod katerimi so vidni iz Arduino programa (PRG), kateri so pini mikrokontrolerja povezani na posamezni priključek (PIN), katere so alternativne funkcije teh pinov (PWM, SPEC, PCINT, ADC) in končno, kateri se priključki lahko uporabljajo za neki način komunikacije na hardverskem nivoju (KOM).
Tako se, npr., priključek “~11” iz Arduino programa naslavlja kot digitalni vhod “11” ali digitalni izhod “11”, pri čemer oznaka ~ pomeni, da je ta priključek možno uporabiti tudi kot analogni izhod (to terminologijo Arduino uporablja za PWM signal). Naprej ugotavljamo, kako je ta priključek vezan na pin PB3 mikrokontrolerja, ki alternativno služi tudi kot OC2A izhod Timerja 2, da se preko njega lahko zažene PCINT 3 prekinitev in da se lahko uporablja tudi kot MOSI priključek v SPI komunikaciji. Ali pa priključka A5 in SCL (čeprav sta fizično ločena, gre za isti priključek), se iz Arduina naslavljata kot analogni vhod “A5”, digitalni vhod “19” ali digitalni izhod “19”, vezana pa sta na pin PC5 mikrokontrolerja. Ta pin alternativno lahko služi kot vhod kanala 5 A/D pretvornika, preko njega se lahko zažene PCINT 13 prekinitev, v I2C komunikaciji pa služi kot SCL priključek.
Arduino programerju je lažje, ker mora upoštevati samo oznako priključka na modulu, zato ukaza
pinMode(13,OUTPUT); digitalWrite(13,HIGH);
konfigurirata priključek “13” kot izhodni in ga postavljata v stanje logične enice. Bascom-AVR programer mora dodatno upoštevati to, da je priključek “13” vezan na pin PB5, in bo isti učinek dosegel z ukazoma
Config Portb.5 = Output Portb.5 = 1
To je “nečitljivo”, ker se ne vidi direktna povezava med Portb.5 in Arduino priključkom “13”; Bascom-AVR uporabnik mora med programiranjem imeti pri roki tabele s slike 87. Lahko si pomagamo, če pinom dodelimo alternativna imena kot
Arduino_port#13 Alias Portb.5
S tem bomo naš Bascom-AVR program približali Arduino modulu inle-ta bo postal bolje razumljiv in”čitljiv”:
Config Arduino_port#13 = Output Arduino_port#13 = 1
Da bi olajšali pisanje Bascom-AVR programa za Arduino modul smo za naše bralce v datoteki “Arduino_pins.sub” dodelili alternativna imena vsem pinom mikrokontrolerja ATmega328P po naslednjem principu:
Pini mikrokontrolerja, ki so vezani na “analogne” priključke “A0” do “A5” Arduino modula, so v Bascom-AVR programu dobili alternativna imena “Arduino_port#a0” do “Arduino_port#a5”, oziroma “Arduino_pin#a0” do “Arduino_pin#a5”. Alternativna imena, ki vsebujejo “port” ali “pin” se uporabljajo po istih pravilih, po katerih bi v Bascom-AVR programu uporabili izvirna imena nekega pina (npr., Arduino_port#a0 pišete v ukazih v katerih bi uporabili Portc.0, medtem ko Arduino_pin#a0 pišete v ukazih v katerih bi uporabili Pinc.0).
Pini mikrokontrolerja kateri so vezani na “digitalne” priključke “0” do “19” Arduino modula, so v Bascom-AVR programu dobili alternativne nazive “Arduino_port#0” do “Arduino_port#19”, oziroma “Arduino_pin#0” do “Arduino_pin#19”. Tudi tukaj velja ista opomba za “port” in “pin” imena. Opazili boste, da se oznake Arduino priključkov “A0”-“A5” in “14”-“19” nanašajo na iste pine mikrokontrolerja, PC0-PC5.
Vse definicije postajajo dostopne, ko v svojem programu vključite datoteko “Arduino_pins.sub” (datoteka se mora nahajati v isti mapi kot tudi program). To je najbolje narediti na samem začetku programa:
$include "Arduino_pins.sub"
Če želite npr., Arduino priključek “10” uporabiti kot vhod, ga morate tako konfigurirati
Config Arduino_pin#10 = Input
vključiti pull-up upor
Arduino_port#10 = 1
in nato lahko preberete njegovo stanje:
If Arduino_pin#10 = 0 Then ...
Sedaj smo spoznali osnove, in se bomo od naslednjega nadaljevanja naprej lahko pozabavali z moduli iz kompleta 37-in-1…
Opombe
Vse opombe o načinu programiranja in možnih problemih, ki so vezani na uporabo Arduino UNO modula iz Bascom-AVR okolja so rezultat avtorjevih izkušenj z moduli, ki jih je imel na razpolagi in so navedene z najboljšimi nameni. Na tržišču obstajajo različne verzije in kloni, zato je možno, da se obnašanje posameznih modulov več ali manj razlikuje od opisanega.
Datoteko “Arduino_pins.sub” z alternativnimi imeni pinov mikrokontrolerja lahko brezplačno dobite v uredništvu revije Svet elektronike. Uporabna je za Arduino UNO, Arduino Nano in druge module, ki uporabljajo iste oznake priključkov, in ATmega328P ali drugi pin-kompatibilni mikrokontroler.
Barduino_17