Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Komandat Arduino në Rusisht. Programimi i Arduino në C në AVR Studio

Gjuha e programimit Arduino për fillestarët është paraqitur në detaje në tabelën e mëposhtme. Mikrokontrollues Arduino i programueshëm në gjuhë e veçantë programimi i bazuar në C/C++. Gjuha e programimit Arduino është një variant i C++, me fjalë të tjera, nuk ka gjuhë programimi të veçantë për Arduino. Shkarko libri PDF e mundur në fund të faqes.

Arduino IDE të gjitha skicat e shkruara përpilohen në një program në C/C++ me ndryshime minimale. Përpiluesi Arduino IDE thjeshton shumë shkrimin e programeve për këtë platformë dhe krijimi i pajisjeve në Arduino bëhet shumë më i aksesueshëm për njerëzit që nuk kanë njohuri të gjera të gjuhës C/C++. Le të japim më tej pak informacion me një përshkrim të funksioneve kryesore Gjuha Arduino me shembuj.

Referencë e hollësishme për gjuhën Arduino

Gjuha mund të ndahet në katër seksione: deklarata, të dhëna, funksione dhe biblioteka.

Gjuha Arduino Shembull Përshkrim

Operatorët

konfigurimi () konfigurimi i zbrazët ()
{
pinMode (3, INPUT);
}
Funksioni përdoret për të inicializuar variablat, për të përcaktuar mënyrat e funksionimit të kunjave në tabelë, etj. Funksioni funksionon vetëm një herë, pas çdo furnizimi me energji të mikrokontrolluesit.
lak () void loop ()
{
digitalWrite(3, LARTË);
vonesë (1000);
digitalWrite (3, LOW);
vonesë (1000);
}
Funksioni i ciklit rrotullohet, duke e lejuar programin të kryejë dhe të reagojë ndaj llogaritjeve. Funksionet setup() dhe loop() duhet të jenë të pranishme në çdo skicë, edhe nëse këto deklarata nuk përdoren në program.

Deklaratat e kontrollit

nëse
nëse (x>
nëse (x< 100) digitalWrite (3, LOW );
Deklarata if përdoret në kombinim me operatorët e krahasimit (==, !=,<, >) dhe kontrollon nëse kushti është i vërtetë. Për shembull, nëse vlera e ndryshores x është më e madhe se 100, atëherë LED në daljen 13 ndizet; nëse është më pak, LED fiket.
nese Tjeter
nëse (x > 100) dixhital Shkruaj (3, LARTË );
tjetër digitalWrite(3, LOW);
Deklarata else ju lejon të bëni një kontroll të ndryshëm nga ai i specifikuar në if, në mënyrë që të kryeni disa kontrolle ekskluzive reciproke. Nëse asnjë nga kontrollet nuk merr një rezultat të VËRTETË, atëherë ekzekutohet blloku i deklaratave në else.
kaloni...kasë
çelësi (x)
{


rasti 3: pushim ;

}
Ashtu si një deklaratë if, një deklaratë switch kontrollon një program duke ju lejuar të specifikoni veprimet që do të kryhen kur kushte të ndryshme. Break është një komandë për të dalë nga një deklaratë; parazgjedhja ekzekutohet nëse nuk zgjidhet asnjë alternativë.
për konfigurimi i zbrazët ()
{
pinMode (3, OUTPUT);
}
void loop ()
{
për (int i=0; i<= 255; i++){
analogWrite(3, i);
vonesë (10);
}
}
Konstrukti for përdoret për të përsëritur deklaratat e mbyllura në kllapa kaçurrelë. Për shembull, zbehja e qetë e një LED. Kreu i ciklit for përbëhet nga tre pjesë: for (initializimi; kushti; shtimi) - inicializimi kryhet një herë, pastaj kontrollohet kushti, nëse kushti është i vërtetë, atëherë kryhet rritja. Lakja përsëritet derisa gjendja të bëhet false.
derisa void loop ()
{
ndërsa (x< 10)
{
x = x + 1;
Seriali.println(x);
vonesë (200);
}
}
Deklarata while përdoret si një lak që do të ekzekutohet për sa kohë që kushti në kllapa është i vërtetë. Në shembull, deklarata e ciklit while do të përsërisë kodin në kllapa pafundësisht derisa x të jetë më pak se 10.
bej Nderkohe void loop ()
{
bëj
{
x = x + 1;
vonesë (100);
Seriali.println(x);
}
ndërsa (x< 10);
vonesë (900);
}
Deklarata e ciklit do...while funksionon në të njëjtën mënyrë si cikli while. Megjithatë, nëse shprehja në kllapa është e vërtetë, cikli vazhdon në vend që të dalë nga cikli. Në shembullin e mësipërm, nëse x është më i madh se 10, operacioni i mbledhjes do të vazhdojë, por me një pauzë prej 1000 ms.
thyej
vazhdojnë
çelësi (x)
{
rasti 1: DigitalWrite (3, LARTË );
rasti 2: DigitalWrite (3, LOW );
rasti 3: pushim ;
rasti 4: vazhdo;
default: dixhital Shkrimi (4, LARTË);
}
Break përdoret për të detyruar daljen nga unazat e ndërprerësit, do, për dhe ndërsa pa pritur që cikli të përfundojë.
Deklarata vazhdim i anashkalon deklaratat e mbetura në hapin aktual të ciklit.

Sintaksë

;
(pikëpresje)

digitalWrite(3, LARTË);
Një pikëpresje përdoret për të shënuar fundin e një deklarate. Harrimi i një pikëpresjeje në fund të një rreshti rezulton në një gabim përpilimi.
{}
(kllapa)
konfigurimi i zbrazët ()
{
pinMode (3, INPUT);
}
Kllapa e hapjes "(" duhet të pasohet nga kllapa mbyllëse ")". Kllapat e pakrahasueshme mund të çojnë në gabime të fshehura dhe të pakuptueshme gjatë përpilimit të një skice.
//
(një koment)
x = 5; // një koment

Në jetën e një zhvilluesi Arduino, herët a vonë vjen një moment kur mjedisi standard i zhvillimit bëhet i mbushur me njerëz. Nëse skicat nuk kanë më memorie të mjaftueshme, keni nevojë për kohë reale dhe punë me ndërprerje, ose thjesht dëshironi të jeni më afër harduerit, atëherë është koha të kaloni në C. Inxhinierët elektronikë me përvojë do të vrenjten me përbuzje kur përmendet Arduino dhe do të dërgojnë i ri në një dyqan radio për një saldim. Kjo mund të mos jetë këshilla më e keqe, por ne nuk do ta ndjekim ende. Nëse hedhim poshtë Arduino IDE dhe gjuhën e lidhjes/përpunimit, na mbetet një tabelë e shkëlqyer korrigjimi, e pajisur tashmë me gjithçka të nevojshme për funksionimin e mikrokontrolluesit. Dhe, më e rëndësishmja, një bootloader është tashmë i lidhur në memorien e kontrolluesit, duke ju lejuar të ngarkoni firmuerin pa përdorur një programues.

Për të programuar në C, na duhet AVR GCC Toolchain.

Do të na duhet gjithashtu i instaluar Arduino IDE, sepse... ai përmban programin avrdude, i cili nevojitet për të shkarkuar firmuerin në kontrollues. CrossPack gjithashtu përmban avrdude, por versioni që vjen me të nuk funksionon me Arduino.

Pasi të jetë instaluar gjithçka, le të krijojmë projektin tonë të parë. Për të filluar, le të shkruajmë Makefile. Do të na lejojë të shmangim futjen manuale të komandave të gjata sa herë që përpilojmë dhe ngarkojmë firmware-in.

#Kontrolluesi i instaluar në tabelë. Mund të jetë i ndryshëm, për shembull atmega328 DEVICE = atmega168 #Clock Frekuenca 16 MHz CLOCK = 16000000 #Avrdude komanda e nisjes. Duhet të kopjohet nga Arduino IDE. AVRDUDE = /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.con. -carduino -P/dev/tty.usbserial-A600dAAQ -b19200 -D -p atmega168 OBJEKTE = main.o COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) të gjitha: kryesore .hex .c.o: $(COMPILE) -c $< -o $@ .S.o: $(COMPILE) -x assembler-with-cpp -c $< -o $@ .c.s: $(COMPILE) -S $< -o $@ flash: all $(AVRDUDE) -U flash:w:main.hex:i clean: rm -f main.hex main.elf $(OBJECTS) main.elf: $(OBJECTS) $(COMPILE) -o main.elf $(OBJECTS) main.hex: main.elf rm -f main.hex avr-objcopy -j .text -j .data -O ihex main.elf main.hex avr-size --format=avr --mcu=$(DEVICE) main.elf

Në këtë skedar duhet të fusim komandën tonë për të nisur avrdude. Do të duket ndryshe në sisteme të ndryshme. Për të zbuluar opsionin tuaj, hapni Arduino IDE dhe kontrolloni kutinë "Trego daljen me fjalë gjatë ngarkimit" në cilësimet.

Tani ngarkojmë çdo skicë në Arduino dhe shikojmë mesazhet e shfaqura në fund të dritares. Aty gjejmë thirrjen avrdude, kopjojmë gjithçka përveç parametrit -Uflash dhe ngjisim në Makefile pas “AVRDUDE =”.


Një shënim i shpejtë: të gjitha futjet në Makefile bëhen me karaktere skedash (tasti Tab). Nëse redaktori juaj i tekstit zëvendëson këto karaktere me hapësira, komanda make do të refuzojë të ndërtojë projektin.

Tani le të krijojmë një skedar kryesore.c- teksti aktual i programit tonë, në të cilin ne tradicionalisht ndezim LED.

#përfshi #përfshi #define LED_PIN 5 int main() ( DDRB |= 1<< LED_PIN; while(1) { PORTB |= 1 << LED_PIN; _delay_ms(1000); PORTB &= ~(1 << LED_PIN); _delay_ms(1000); } return 0; }

Projekti ynë është gati. Le të hapim konsolën në drejtorinë tonë të projektit dhe të futim komandën "make":


Siç mund ta shihni, madhësia e firmware-it që rezulton është vetëm 180 bajt. Një skicë e ngjashme Arduino merr 1116 bajt në kujtesën e kontrolluesit.

Tani le të kthehemi në tastierë dhe të futim "make flash" për të ngarkuar skedarin e përpiluar në kontrollues:


Nëse shkarkimi përfundoi pa gabime, LED i lidhur me pinin 13 të tabelës do të pulsojë me gëzim. Ndonjëherë avrdude nuk mund ta gjejë tabelën ose bie për shkak të një afati kohor - në këtë rast, përdredhja e kabllit USB mund të ndihmojë. Gjithashtu, për të shmangur konfliktet e aksesit në bord, mos harroni të mbyllni Arduino IDE përpara komandës "make flash".

Ndoshta shumë nga gjërat e përshkruara në këtë artikull do të duken të dukshme për zhvilluesit me përvojë. U përpoqa ta përshkruaj procesin në një gjuhë sa më të kuptueshme për një përdorues fillestar të Arduino dhe të mbledh në një vend informacionin që arrita të marr nga burime të ndryshme dhe të verifikuara në mënyrë empirike. Ndoshta ky artikull do t'i kursejë dikujt disa orë kohë.

Fat i mirë në zotërimin e mikrokontrolluesve!

Arduino është një tabelë zhvillimi e gatshme për përdorim dhe një gjuhë programimi shumë e thjeshtë që e bën të lehtë fillimin me mikrokontrolluesit me koston e madhësisë dhe shpejtësisë së programit. Kohët e fundit, Atmel ka shtuar mbështetje për ngarkuesin Arduino në AVR Studio, domethënë mund të shkruani dhe ngarkoni programe të shkruara në C, C++ ose Assembler pa një programues. Për më tepër, mund të shkruani kodin në gjuhën e përpunimit/lidhjes në AVR Studio.
Unë rekomandoj të filloni të lexoni artikullin me përditësimin në fund!
Në këtë artikull, ne ofrojmë udhëzime hap pas hapi për instalimin e softuerit programues Arduino duke përdorur AVR Studio. Ne morëm si bazë një përmbledhje të shtesave AVR Studio nga faqja easyelectronics.ru. Ne do të përdorim të gjithë shembujt në tabelën tonë.

Instalimi i Arduino IDE

Ne përdorim versionin 1.5.2 të Arduino. Mund ta shkarkoni në faqen zyrtare të internetit. Versioni i fundit (1.6.2-r2 në kohën e shkrimit) për disa arsye nuk funksionon me mikrokontrolluesin Atmega8.
Ju do të shkarkoni një arkiv zip me mjedisin e vendosur tashmë. Gjithçka që mbetet është ta shpaketoni atë në drejtorinë e programit.

Instalimi i Atmel Studio

UPD

Unë shoh se tema është e njohur dhe dua të sqaroj disa pika.
Ka tre mënyra në të cilat jam përpjekur të programoj një bord të pajtueshëm me Arduino në C:

  1. Shkruani direkt në Arduino IDE në C. Duhet të kuptoni se Përpunimi/Instalimi nuk është një gjuhë, por thjesht një grup makrosh dhe bibliotekash. Kur shkruani në të, ai duket në titujt e tij, konverton kodin tuaj të lexueshëm nga njeriu në C dhe më pas përpilohet me përpiluesin standard AVR GCC. Nëse shkruani kodin në C, atëherë ai nuk do të hyjë në libet e tij dhe menjëherë do të përpilojë gjithçka siç duhet, POR!... në të njëjtën kohë, lidhësi do t'i shtojë projektit tuaj çfarë të dojë. Avantazhi është se nuk ju nevojitet asgjë tjetër përveç Arduino IDE. Disavantazhi është magjia, e cila fshihet nga zhvilluesi. Kjo metodë përdoret shpesh në rastet kur është e nevojshme të zbatohet një funksion që miqtë tanë italianë nuk e kanë parashikuar në gjuhën e tyre.
  2. Metoda e propozuar në këtë artikull (në fakt, më e çuditshmja, sepse kombinon të gjitha mangësitë). Ideologjikisht, kjo shtesë është e nevojshme për të programuar në Përpunim/Instalime dhe për të përdorur Atmel Studio si një ndërfaqe. Ekziston gjithashtu një funksionalitet me pagesë që ju lejon të korrigjoni kodin, por unë nuk e kam provuar. Pra, në thelb, kur programoni, ndodh e njëjta gjë si në opsionin e parë, por ju punoni në një IDE të ndryshme. Në të njëjtën kohë, nga pikëpamja e rezultatit, ju merrni të njëjtën gjë. Nëse e keni programuar Arduino dhe keni vendosur ta bëni atë në C, mos ngurroni të shkruani direkt në Arduino IDE. Nëse nuk ju pëlqen ndërfaqja, mund të përdorni një redaktues normal (unë rekomandoj Sublime Text). Nëse punoni në Atnel Studio dhe dëshironi të ndezni bordin tuaj direkt nga ndërfaqja e tij ose të shkruani Processing/Wiring në të (papritmas!), atëherë kjo shtesë është për ju. Nga rruga, studio punon vetëm nën Windows, domethënë, metoda nuk është për të gjithë. E shkrova këtë artikull vetëm sepse gjeta një metodë të re për veten time, por nuk më pëlqen.
  3. Metoda e tretë, më duket, është më e mira për një përdorues të avancuar. Në fillim, gjithçka ndodh si zakonisht - ju shkruani kodin, përpiloni dhe merrni një skedar hex. Pastaj, duke kujtuar se keni një bord të rregullt korrigjimi me një ngarkues në duart tuaja, shkarkoni një program që mund të hyjë në këtë ngarkues dhe transferoni kodin tuaj në memorie. Ne kemi postuar tashmë udhëzime hap pas hapi. Në këtë rast, zhvilluesi merr kontrollin maksimal mbi të gjitha funksionet, por problemet mund të lindin për shkak të përdorimit të një ngarkuesi të palës së tretë.

Do të doja të zbuloja një gjë tjetër që ndodh në Arduino. Çfarëdo që të bëni, Arduino IDE patjetër do të ndezë vetë pajisjet periferike. Për shembull, do të nisë kohëmatësit. Dhe nëse doni të punoni me ta në C, mund të zbuloni se ato nuk funksionojnë siç prisnit. Dhe kjo mund të bëhet një problem i vërtetë. Dhe ka shumë shembuj të tillë, domethënë, ka shumë grabujë, paterica dhe defekte të mundshme.
Nëse thjesht ngarkoni një skedar hex, atëherë problemet mund të lindin vetëm për shkak të ngarkuesit. Deri më tani kam gjetur vetëm një - pasi të përfundojë ngarkuesi, UART mbetet i aktivizuar. Nëse shkruani përmes Arduino IDE, atëherë ai do të futet në kodin tuaj për ta çaktivizuar atë dhe kush e di se çfarë tjetër. Nëse thjesht dëshironi të vraponi heksin tuaj, atëherë nuk do të keni kontroll mbi këmbët UART. Ju do të duhet të shtoni manualisht një çaktivizim UART në projektin tuaj. Shembujt e këtij artifakti dhe kodi përshkruhen në detaje në.
Epo, në përfundim. Shumica e bordeve të pajtueshme me Arduino kanë një lidhës për një programues ISP. Nëse e blini këtë programues nga kinezët për 3-4 dollarë, do t'i harroni shpejt të gjitha këto probleme.

Do të jemi shumë të lumtur nëse mbështesni burimin tonë dhe vizitoni dyqanin tonë të produkteve.

Përshëndetje! Unë jam Alikin Alexander Sergeevich, mësues i arsimit shtesë, drejtoj klubet "Robotikë" dhe "Inxhinieri Radio" në Qendrën për Rininë dhe Teknologjinë Rinore në Labinsk. Do të doja të flisja pak për një metodë të thjeshtuar të programimit të Arduino duke përdorur programin ArduBlock.

E futa këtë program në procesin edukativo-arsimor dhe jam i kënaqur me rezultatin; është shumë i kërkuar nga fëmijët, veçanërisht kur shkruajnë programe të thjeshta ose për krijimin e disa fazave fillestare të programeve komplekse. ArduBlock është një mjedis programimi grafik, domethënë të gjitha veprimet kryhen me fotografi të vizatuara me veprime të nënshkruara në Rusisht, gjë që thjeshton shumë mësimin e platformës Arduino. Fëmijët nga klasa e dytë mund të zotërojnë lehtësisht punën me Arduino falë këtij programi.

Po, dikush mund të thotë se Scratch ekziston ende dhe është gjithashtu një mjedis grafik shumë i thjeshtë për programimin Arduino. Por Scratch nuk e ndez Arduino-n, por e kontrollon vetëm nëpërmjet një kablloje USB. Arduino është i varur nga kompjuteri dhe nuk mund të funksionojë në mënyrë autonome. Kur krijoni projektet tuaja, autonomia është gjëja kryesore për Arduino, veçanërisht kur krijoni pajisje robotike.

Edhe robotët e njohur LEGO, si NXT ose EV3, nuk janë më aq interesantë për studentët tanë me ardhjen e programit ArduBlock në programimin Arduino. Arduino është gjithashtu shumë më i lirë se çdo komplet ndërtimi LEGO, dhe shumë komponentë thjesht mund të merren nga elektronika e vjetër shtëpiake. Programi ArduBlock do të ndihmojë jo vetëm fillestarët, por edhe përdoruesit aktivë të platformës Arduino.

Pra, çfarë është ArduBlock? Siç thashë tashmë, ky është një mjedis programimi grafik. Përkthyer pothuajse plotësisht në Rusisht. Por kulmi i ArduBlock nuk është vetëm kjo, por edhe fakti që programi ArduBlock që kemi shkruar konvertohet në kod Arduino IDE. Ky program është i integruar në mjedisin e programimit Arduino IDE, pra është një plugin.

Më poshtë është një shembull i një LED që pulson dhe një program i konvertuar në Arduino IDE. E gjithë puna me programin është shumë e thjeshtë dhe çdo student mund ta kuptojë atë.

Si rezultat i punës me programin, jo vetëm që mund të programoni Arduino, por edhe të studioni komanda që nuk i kuptojmë në formatin e tekstit të Arduino IDE, por nëse jeni shumë dembel për të shkruar komanda standarde, mund t'i përdorni shpejt miun për të skicuar një program të thjeshtë në ArduBlok dhe për të korrigjuar atë në Arduino IDE.

Për të instaluar ArduBlok, së pari duhet të shkarkoni dhe instaloni Arduino IDE nga faqja zyrtare e Arduino dhe të kuptoni cilësimet kur punoni me bordin Arduino UNO. Si ta bëni këtë përshkruhet në të njëjtën faqe interneti ose në Amperka, ose shikoni në YouTube. Epo, kur e gjithë kjo të kuptohet, duhet të shkarkoni ArduBlok nga faqja zyrtare, këtu. Unë nuk rekomandoj shkarkimin e versioneve të fundit, ato janë shumë të ndërlikuara për fillestarët, por versioni nga 2013-07-12 është më i miri, ky skedar është më i popullarizuari atje.

Më pas, riemërtoni skedarin e shkarkuar në ardublock-all dhe në dosjen "documents". Krijojmë dosjet e mëposhtme: Arduino > tools > ArduBlockTool > tool dhe në këtë të fundit hedhim skedarin e shkarkuar dhe të riemërtuar. ArduBlok punon në të gjitha sistemet operative, edhe në Linux, personalisht e kam testuar në XP, Win7, Win8, të gjithë shembujt janë për Win7. Instalimi i programit është i njëjtë për të gjitha sistemet.

Epo, për ta thënë thjesht, unë përgatita një arkiv në diskun 7z Mail, duke e zbërthyer të cilin do të gjeni 2 dosje. Në njërën ekziston tashmë një program Arduino IDE që funksionon, dhe në dosjen tjetër përmbajtja duhet të dërgohet në dosjen e dokumenteve.

Për të punuar në ArduBlok, duhet të ekzekutoni Arduino IDE. Më pas shkojmë te skeda Tools dhe aty gjejmë artikullin ArduBlok, klikojmë mbi të - dhe ja ku është qëllimi ynë.

Tani le të shohim ndërfaqen e programit. Siç e kuptoni tashmë, nuk ka cilësime në të, por ka shumë ikona për programim dhe secila prej tyre mbart një komandë në formatin e tekstit Arduino IDE. Versionet e reja kanë edhe më shumë ikona, kështu që të kuptosh versionin e fundit të ArduBlok është e vështirë dhe disa prej ikonave nuk janë të përkthyera në Rusisht.

Në seksionin "Menaxhimi" do të gjejmë një shumëllojshmëri ciklesh.

Në seksionin "Portet", ne mund të menaxhojmë vlerat e porteve, si dhe emituesin e zërit, sensorin e afërsisë servo ose tejzanor të lidhur me to.

Në seksionin "Numrat/Konstantet", ne mund të zgjedhim vlera dixhitale ose të krijojmë një ndryshore, por nuk ka gjasa të përdorni atë që është më poshtë.

Në seksionin "Operatorët" do të gjejmë të gjithë operatorët e nevojshëm të krahasimit dhe llogaritjes.

Seksioni Utilities përdor kryesisht ikona me kohë.

"TinkerKit Bloks" është seksioni për sensorët e blerë të TinkerKit. Ne, natyrisht, nuk kemi një grup të tillë, por kjo nuk do të thotë që ikonat nuk janë të përshtatshme për grupe të tjera, përkundrazi, është shumë i përshtatshëm për djemtë të përdorin ikona të tilla si ndezja e një LED ose një butonin. Këto shenja përdoren pothuajse në të gjitha programet. Por ato kanë një veçori - kur i zgjidhni, ka ikona të pasakta që tregojnë portet, kështu që ju duhet t'i hiqni ato dhe të zëvendësoni ikonën nga seksioni "numrat/konstantet" në krye të listës.

"DF Robot" - ky seksion përdoret nëse sensorët e specifikuar në të janë të pranishëm, ato ndonjëherë gjenden. Dhe shembulli ynë sot nuk bën përjashtim, ne kemi një "Çelës IR të rregullueshëm" dhe një "sensorë linje". “Sensori i linjës” është i ndryshëm nga ai në foto, pasi është i kompanisë Amperka. Veprimet e tyre janë identike, por sensori Ampere është shumë më i mirë, pasi ka një rregullator ndjeshmërie.

"Seedstudio Grove" - ​​Unë kurrë nuk i kam përdorur sensorët në këtë seksion, megjithëse ka vetëm levë. Në versionet e reja ky seksion është zgjeruar.

Dhe seksioni i fundit është "Kit lidhës". Nuk kam hasur në sensorët e paraqitur në të.

Do të doja të tregoja një shembull të një programi në një robot që lëviz përgjatë një shiriti. Roboti është shumë i thjeshtë, si për t'u montuar ashtu edhe për t'u blerë, por gjërat e para. Le të fillojmë me blerjen dhe montimin e tij.

Këtu është vetë grupi i pjesëve, gjithçka është blerë në faqen e internetit të Amperka.

  1. Mburoja motorike AMP-B001 (2 kanale, 2 A) 1890 RUB
  2. AMP-B017 Troyka Shield 1690 RUB
  3. AMP-X053 Ndarja e baterisë 3×2 AA 1 60 RUR
  4. AMP-B018 Sensori i linjës dixhitale 2580 RUB
  5. ROB0049 Platforma me dy rrota MiniQ 11890 RUB
  6. SEN0019 Sensori i pengesave infra të kuqe 1390 RUB
  7. FIT0032 Montimi për sensorin e pengesave infra të kuqe 1,90 RUB
  8. A000066 Arduino Uno 1 1150 RUR

Së pari, le të montojmë platformën me rrota dhe të bashkojmë telat me motorët.

Më pas do të instalojmë raftet për montimin e pllakës Arduino UNO, të cilat janë marrë nga një motherboard i vjetër ose montime të tjera të ngjashme.

Pastaj ne lidhim tabelën Arduino UNO në këto rafte, por nuk mund të lidhim një rrufe në qiell - lidhësit janë në rrugë. Natyrisht, ju mund t'i shpërndani ato, por kjo është në diskrecionin tuaj.

Më pas ne bashkojmë sensorin e pengesave infra të kuqe në montimin e tij të veçantë. Ju lutemi vini re se rregullatori i ndjeshmërisë është vendosur në krye, kjo është për lehtësinë e rregullimit.

Tani ne instalojmë sensorë të linjës dixhitale, këtu do të duhet të kërkoni nja dy bulona dhe 4 dado për to. Ne instalojmë dy dado midis vetë platformës dhe sensorit të linjës dhe fiksojmë sensorët me pjesën tjetër.

Më pas instalojmë Motor Shield, ose ndryshe mund ta quani shofer motori. Në rastin tonë, kushtojini vëmendje kërcyesit. Ne nuk do të përdorim një furnizim të veçantë të energjisë për motorët, kështu që është instaluar në këtë pozicion. Pjesa e poshtme është e mbyllur me shirit elektrik në mënyrë që të mos ketë qarqe të shkurtra aksidentale nga lidhësi Arduino UNO USB, për çdo rast.

Ne instalojmë Troyka Shield në krye të Motor Shield. Është e nevojshme për lehtësinë e lidhjes së sensorëve. Të gjithë sensorët që përdorim janë dixhitalë, kështu që sensorët e linjës janë të lidhur me portat 8 dhe 9, siç quhen edhe kunjat, dhe sensori i pengesave infra të kuqe është i lidhur me portën 12. Sigurohuni që të vini re se nuk mund të përdorni portat 4, 5, 6, 7 pasi ato përdoren nga Motor Shield për të kontrolluar motorët. Madje i kam lyer posaçërisht këto porta me një shënues të kuq në mënyrë që studentët ta kuptojnë.

Nëse e keni vënë re tashmë, unë shtova një tufë të zezë, për çdo rast, në mënyrë që ndarja e baterisë që vendosëm të mos fluturonte jashtë. Dhe së fundi, ne e sigurojmë të gjithë strukturën me një brez gome të rregullt.

Ekzistojnë 2 lloje të lidhjeve të ndarjes së baterive. Lidhja e parë e telave me Troyka Shield. Është gjithashtu e mundur të lidhni prizën e rrymës dhe ta lidhni atë me vetë bordin e Arduino UNO.

Roboti ynë është gati. Para se të filloni programimin, do t'ju duhet të mësoni se si funksionon gjithçka, domethënë:
- Motorët:
Portat 4 dhe 5 përdoren për të kontrolluar një motor, dhe 6 dhe 7 tjetrin;
Ne rregullojmë shpejtësinë e rrotullimit të motorëve duke përdorur PWM në portat 5 dhe 6;
Përpara ose prapa duke dërguar sinjale në portat 4 dhe 7.
- Sensorët:
Ne jemi të gjithë dixhitalë, kështu që ata japin sinjale logjike në formën e 1 ose 0;
Dhe për t'i rregulluar ato kanë rregullatorë të veçantë dhe me ndihmën e një kaçavide të përshtatshme mund të kalibrohen.

Detajet mund të gjenden në Amperke. Pse këtu? Sepse ka shumë informacione për të punuar me Arduino.

Epo, ne ndoshta shikuam gjithçka sipërfaqësisht, e studiuam atë dhe, natyrisht, montuam robotin. Tani duhet të programohet, ja ku është - programi i shumëpritur!

Dhe programi u konvertua në Arduino IDE:

Konfigurimi i pavlefshëm () (pinMode (8, INPUT); pinMode (12, INPUT); pinMode (9, INPUT); pinMode (4, OUTPUT); pinMode (7, OUTPUT); pinMode (5, OUTPUT); pinMode (6 , OUTPUT); ) void loop() ( if (DigitalRead(12)) ( if (DigitalRead(8)) ( if (DigitalRead(9)) ( digitalWrite(4 , HIGH); analogWrite(5, 255); analogWrite( 6, 255); dixhitalWrite(7, LARTË); ) tjetër (dixhitalWrite(4, LARTË); analogWrite(5, 255); analogWrite(6, 50); digitalWrite(7, LOW); ) ) tjetër (nëse (dixhitalLexo (9)) ( DigitalWrite (4, LOW); analogWrite (5, 50); analogWrite (6, 255); DigitalWrite (7, LARTË); ) tjetër (digitalWrite (4, LOW); analogWrite (5, 255); analogWrite (6, 255); DigitalWrite (7 , LARTË); ) ) ) tjetër ( digitalWrite (4 , LARTË); analogWrite (5, 0); analogWrite (6, 0); DigitalWrite (7 , LARTË); ) )

Si përfundim, dua të them se ky program është thjesht një dhuratë nga perëndia për edukimin; edhe për vetë-studim, do t'ju ndihmojë të mësoni komandat Arduino IDE. Pika kryesore është se ka më shumë se 50 ikona instalimi, ajo fillon të "dështojë". Po, me të vërtetë, kjo është kulmi, pasi programimi vetëm në ArduBlok gjatë gjithë kohës nuk do t'ju mësojë programimin në Arduino IDE. E ashtuquajtura "glitch" ju jep mundësinë të mendoni dhe të përpiqeni të mbani mend komandat për korrigjimin e saktë të programeve.

Ju uroj suksese.

Prezantimi

Freeduino/Arduino është programuar në një gjuhë programimi të veçantë - bazohet në C/C++ dhe ju lejon të përdorni cilindo nga funksionet e tij. Në mënyrë të rreptë, nuk ka gjuhë të veçantë Arduino, ashtu siç nuk ka një përpilues Arduino - programet e shkruara konvertohen (me ndryshime minimale) në një program në C/C++, dhe më pas përpilohen nga përpiluesi AVR-GCC. Pra, në fakt, përdoret një variant i C/C++ i specializuar për mikrokontrolluesit AVR.

Dallimi është se ju merrni një mjedis të thjeshtë zhvillimi dhe një grup bibliotekash bazë që thjeshtojnë aksesin në pajisjet periferike të vendosura "në bordin" e mikrokontrolluesit.

Pajtohem, është shumë i përshtatshëm të filloni të punoni me një port serik me një shpejtësi prej 9600 bit në sekondë, duke bërë një telefonatë në një linjë:

Seriali.fillim(9600);

Dhe kur përdorni "lakuriq" C/C++, do të duhet të merreni me dokumentacionin për mikrokontrolluesin dhe të thërrisni diçka si kjo:

UBRR0H = ((F_CPU / 16 + 9600 / 2) / 9600 - 1) >> 8;
UBRR0L = ((F_CPU / 16 + 9600 / 2) / 9600 - 1);
sbi(UCSR0B, RXEN0);
sbi(UCSR0B, TXEN0);
sbi(UCSR0B, RXCIE0);

Këtu është një përmbledhje e shkurtër e funksioneve dhe veçorive kryesore të programimit Arduino. Nëse nuk jeni të njohur me sintaksën e gjuhëve C/C++, ju rekomandojmë që t'i referoheni ndonjë literature mbi kjo çështje, ose burime të internetit.

Nga ana tjetër, të gjithë shembujt e paraqitur janë shumë të thjeshtë dhe me shumë mundësi nuk do të keni ndonjë vështirësi në të kuptuarit tekstet burimore dhe të shkruarit programet e veta edhe pa lexuar literaturë shtesë.

Dokumentacion më i plotë (në gjuhe angleze) është paraqitur në faqen zyrtare të projektit - http://www.arduino.cc. Aty ka edhe një forum, lidhje me biblioteka shtesë dhe përshkrimin e tyre.

Ngjashëm me përshkrimin në faqen zyrtare të internetit Projekti Arduino, "port" nënkupton një kontakt mikrokontrollues të lidhur me lidhësin nën numrin përkatës. Përveç kësaj, ekziston një portë komunikimi serik (port COM).

Struktura e programit

Në programin tuaj duhet të deklaroni dy funksione kryesore: setup() dhe loop().

Funksioni setup() thirret një herë, pas çdo ndezjeje ose rivendosjeje të tabelës Freeduino. Përdoreni atë për të inicializuar variablat, për të vendosur mënyrat e funksionimit të porteve dixhitale, etj.

Funksioni loop() ekzekuton në mënyrë sekuenciale komandat e përshkruara në trupin e tij pa pushim. Ato. Pas përfundimit të funksionit, ai do të thirret përsëri.

Le të shohim një shembull të thjeshtë:

konfigurimi i zbrazët () // cilësimet fillestare
{
FillimSeriali (9600); // vendosja e shpejtësisë së funksionimit porta serike në 9600 bps
pinMode (3, INPUT); // vendosja e portës së tretë për futjen e të dhënave
}

// Programi kontrollon portin e 3-të për praninë e një sinjali në të dhe i dërgon një përgjigje
// pamje mesazh me tekst në portën serike të kompjuterit
void loop() // trupi i programit
{
nëse (DixhitalLeximi (3) == I LARTË) // kushti për votim të portit të 3-të
serialWrite ("H"); // dërgoni një mesazh në formën e shkronjës "H" në portin COM
tjetër
serialWrite ("L"); // dërgoni një mesazh në formën e shkronjës "L" në portin COM
vonesë (1000); // vonesë 1 sek.
}

pinMode (port, modalitet);

Përshkrim:

Konfiguron portën e specifikuar për të hyrë ose nxjerrë një sinjal.

Opsione:

port – numri i portit modaliteti i të cilit dëshironi të vendosni (një vlerë e plotë nga 0 në 13).

modaliteti - ose INPUT (hyrje) ose OUTPUT (dalje).

pinMode (13, OUTPUT); // Pini i 13-të do të jetë dalja
pinMode (12, INPUT); //dhe e 12-ta është hyrja

Shënim:

Hyrjet analoge mund të përdoren si hyrje/dalje dixhitale duke i aksesuar ato me numra që fillojnë me 14 ( hyrje analoge 0) në 19 (hyrja analoge 5)

digitalWrite (port, vlera);

Përshkrim:

Vendos nivelin e tensionit në të lartë (HIGH) ose të ulët (LOW) në portën e specifikuar.

Opsione:

porti: numri i portit

vlera: E LARTË ose E ULËT

digitalWrite (13, LARTË); // vendosni pinin 13 në gjendjen "e lartë".

vlera = dixhitalLeximi (porti);

Përshkrim:

Lexon vlerën në portin e specifikuar

Opsione:

porti: numri i portit të anketuar

Vlera e kthimit: Kthen vlerën aktuale në port (LARTË ose E ULËT) shkruani int

int val;
val = Leximi dixhital(12); // anketoni kunjin e 12-të

Shënim:

Nëse nuk ka asgjë të lidhur me portin që lexohet, atëherë funksioni digitalRead() mund të kthejë vlerat LARTË ose ULËTA në mënyrë të çrregullt.

Hyrja/dalja e sinjalit analog

vlera = analogLeximi (port);

Përshkrim:

Lexon një vlerë nga porta analoge e specifikuar. Freeduino përmban 6 kanale, konvertues analog në dixhital 10 bit secili. Kjo do të thotë që voltazhi i hyrjes nga 0 në 5V konvertohet në një vlerë të plotë nga 0 në 1023. Rezolucioni i leximit është: 5V/1024 vlera = 0,004883 V/vlerë (4,883 mV). Duhen afërsisht 100 nS (0.0001 C) për të lexuar vlerën e hyrjes analoge, kështu që shpejtesi maksimale lexime - afërsisht 10,000 herë në sekondë.

Opsione:

Vlera e kthimit: Kthen një numër int në rangun 0 deri në 1023 të lexuar nga porti i specifikuar.

int val;
val = analogLeximi (0); // lexoni vlerën në hyrjen e 0-të analoge

Shënim:

Portat analoge përcaktohen si hyrje të sinjalit si parazgjedhje dhe, ndryshe nga portat dixhitale, nuk kanë nevojë të konfigurohen duke thirrur funksionin pinMode.

analogWrite(port, vlera);

Përshkrim:

Nxjerr një vlerë analoge në port. Ky funksion funksionon në: 3, 5, 6, 9, 10 dhe 11 porte dixhitale Freeduino.

Mund të përdoret për të ndryshuar ndriçimin e një LED, për të kontrolluar një motor, etj. Pas thirrjes së funksionit analogWrite, porta përkatëse fillon të funksionojë në modulimin e gjerësisë së pulsit të tensionit derisa të ketë një thirrje tjetër në funksionin analogWrite (ose funksionet DigitalRead / DigitalWrite në të njëjtën portë).

Opsione:

port: numri i hyrjes analoge që po anketohet

vlera: një numër i plotë midis 0 dhe 255. Një vlerë prej 0 gjeneron 0 V në portin e specifikuar; një vlerë prej 255 gjeneron +5V në portin e specifikuar. Për vlerat midis 0 dhe 255, porti fillon të alternojë me shpejtësi midis niveleve të tensionit 0 dhe +5 V - sa më e lartë të jetë vlera, aq më shpesh porti gjeneron nivelin e LARTË (5 V).

analogWrite(9, 128); // vendos pinin 9 në një vlerë të barabartë me 2.5V

Shënim:

Nuk ka nevojë të telefononi pinMode për të vendosur portin në daljen e sinjaleve përpara se të telefononi analogWrite.

Frekuenca e gjenerimit të sinjalit është afërsisht 490 Hz.

koha = millis ();

Përshkrim:

Rikthen numrin e milisekondave që nga ekzekutimi i Freeduino programi aktual. Numërimi do të tejmbushet dhe do të rivendoset pas rreth 9 orësh.

Vlera e kthimit: kthen një vlerë të gjatë të panënshkruar

i panënshkruar për një kohë të gjatë; // deklarimi i një ndryshoreje kohore të llojit të panënshkruar long
koha = millis (); // transferoni numrin e milisekondave

vonesë (koha_ms);

Përshkrim:

Ndalon programin për numrin e caktuar të milisekondave.

Opsione:

time_ms – koha e vonesës së programit në milisekonda

vonesë (1000); //pauzë 1 sekondë

vonesëMikrosekonda

vonesaMikrosekonda (koha_μs);

Përshkrim:

Ndalon programin për numrin e caktuar të mikrosekondave.

Opsione:

koha_μs – koha e vonesës së programit në mikrosekonda

vonesaMikrosekonda (500); //pauzë 500 mikrosekonda

pulseIn(port, vlera);

Përshkrim:

Lexon një puls (i lartë ose i ulët) nga një port dixhital dhe kthen kohëzgjatjen e pulsit në mikrosekonda.

Për shembull, nëse parametri "value" është vendosur në LARTË kur thërret funksionin, atëherë pulseIn() pret që një nivel i lartë sinjali të arrijë në port. Nga momenti i mbërritjes, fillon numërimi mbrapsht deri në marrjen e portit nivel i ulët sinjal. Funksioni kthen gjatësinë e pulsit ( nivel të lartë) në mikrosekonda. Punon me impulse nga 10 mikrosekonda deri në 3 minuta. Vini re se ky funksion nuk do të japë rezultat derisa të zbulohet një impuls.

Opsione:

port: numri i portit nga i cili lexojmë pulsin

vlera: lloji i pulsit LARTË ose I ULËT

Vlera e kthimit: kthen kohëzgjatjen e pulsit në mikrosekonda (lloji int)

kohëzgjatja int; // deklarimi i një variabli kohëzgjatjeje të tipit int
kohëzgjatja = pulseIn(pin, LARTË); // mat kohëzgjatjen e pulsit

Transferimi i të dhënave serike

Freeduino ka një kontrollues të integruar për transmetimin serik të të dhënave, i cili mund të përdoret si për komunikim midis pajisjeve Freeduino/Arduino ashtu edhe për komunikim me një kompjuter. Në një kompjuter, lidhja përkatëse përfaqësohet nga një port USB COM.

Komunikimi ndodh përmes portave dixhitale 0 dhe 1, dhe për këtë arsye nuk do të mund t'i përdorni ato për hyrje/dalje dixhitale nëse përdorni funksione serike.

Serial.begin(baud_rate);

Përshkrim:

Cakton shpejtësinë e transferimit të informacionit të portës COM në bit për sekondë për transmetimin serik të të dhënave. Për të komunikuar me një kompjuter, përdorni një nga këto shpejtësi të standardizuara: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 ose 115200. Ju gjithashtu mund të përcaktoni shpejtësinë e tjera duke kontrolluar portat 0 dhe 1.

Opsione:

baud_rate: Shpejtësia e rrjedhës së të dhënave në bit për sekondë.

Seriali.fillim(9600); //vendosni shpejtësinë në 9600 bps

Seriali.i disponueshëm

count = Serial.available();

Përshkrim:

Pranuar nga porta serike bajtët përfundojnë në buferin e mikrokontrolluesit, nga ku programi juaj mund t'i lexojë ato. Funksioni kthen numrin e bajteve të grumbulluara në bufer. Buferi serial mund të ruajë deri në 128 bajt.

Vlera e kthimit:

Kthen një vlerë int - numrin e bajteve të disponueshme për lexim në buferin serial, ose 0 nëse asgjë nuk disponohet.

if (Serial.available() > 0) ( // Nëse ka të dhëna në buffer
// këtu duhet të ketë pranim dhe përpunim të të dhënave
}

char = Serial.lexo();

Përshkrim:

Lexon bajtin tjetër nga buferi porta serike.

Vlera e kthimit:

Bajti i parë i disponueshëm i të dhënave hyrëse nga porti serial, ose -1 nëse nuk ka të dhëna hyrëse.

incomingByte = Serial.lexo(); // lexuar bajt

Përshkrim:

Pastron buferin e hyrjes së portës serike. Të dhënat në bufer humbasin dhe thirrjet e mëtejshme drejt Serial.read() ose Serial.available() do të kenë kuptim për të dhënat e marra pas thirrjes Serial.flush().

Serial.flush(); // Pastro tampon - fillo të marrësh të dhëna "nga e para"

Përshkrim:

Nxjerrja e të dhënave në portën serike.

Opsione:

Funksioni ka disa forma thirrjesh në varësi të llojit dhe formatit të të dhënave dalëse.

Serial.print(b, DEC) printon një varg ASCII - paraqitjen dhjetore të numrit b.

int b = 79;

Serial.print(b, HEX) printon një varg ASCII - paraqitjen heksadecimal të numrit b.

int b = 79;

Serial.print(b, OCT) printon një varg ASCII - paraqitjen oktale të numrit b.

int b = 79;
Serial.print(b, OCT); //do të nxjerrë vargun "117" në port

Serial.print(b, BIN) printon një varg ASCII - paraqitje binare numrat b.

int b = 79;
Serial.print(b, BIN); //do të nxjerrë vargun "1001111" në port

Serial.print(b, BYTE) printon bajtin e ulët të b.

int b = 79;
Serial.print(b, BYTE); //do të shfaqë numrin 79 (një bajt). Në monitor
//nga porta serike marrim simbolin "O" - e tij
//kodi është 79

Serial.print(str) nëse str është një varg ose varg karakteresh, transferon str në bajtin e bajtit të portës COM.

char bajt = (79, 80, 81); // grup prej 3 bajtësh me vlera 79,80,81
Serial.print("Këtu bajtet tona:"); // nxjerr rreshtin "Këtu bajtet tona:"
Serial.print(bajt); // nxjerr 3 karaktere me kodet 79,80,81 -
//këto janë personazhet "OPQ"

Serial.print(b) nëse b është i tipit byte ose char, printon vetë numrin b në portë.

char b = 79;
Seriali.print(b); //do të nxjerrë karakterin "O" në port

Serial.print(b) nëse b ka lloj i tërë, nxjerr paraqitjen dhjetore të numrit b në port.

int b = 79;
Seriali.print(b); //do të nxjerrë vargun "79" në port

Përshkrim:

Funksioni Serial.println është i ngjashëm me funksionin Serial.print dhe ka të njëjtat opsione thirrjesh. Dallimi i vetëm është se dy karaktere shtesë dalin pas të dhënave - një karakter i kthimit të karrocës (ASCII 13, ose "\r") dhe një karakter i ri i linjës (ASCII 10, ose "\n").

Shembulli 1 dhe shembulli 2 do të nxjerrin të njëjtën gjë në port:

int b = 79;
Serial.print(b, DEC); //do të nxjerrë vargun "79" në port
Serial.print("\r\n"); //do të shfaqë karakteret "\r\n" - furnizimi i linjës
Serial.print(b, HEX); //do të nxjerrë vargun "4F" në port
Serial.print("\r\n");//do të printojë karakteret "\r\n" – furnizimi i linjës

int b = 79;
Serial.println(b, DEC); //do të nxjerrë vargun "79\r\n" në port
Serial.println(b, HEX); //do të nxjerrë vargun "4F\r\n" në port

Në monitorin e portit serik marrim.

Artikujt më të mirë mbi këtë temë