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

Përshkrimi i gjuhës Arduino me komente. Përshkrimi i Arduino IDE

Pasi të njiheni me elementët bazë të Arduino, si dhe të shkruani një program " Përshendetje Botë! Është koha për t'u njohur me një gjuhë programimi.

Struktura e gjuhës bazohet kryesisht në C/C++, kështu që ata që kanë programuar më parë në këtë gjuhë nuk do të kenë vështirësi të mësojnë Programimi Arduino. Të tjerët duhet të mësojnë informacion bazë rreth komandave të kontrollit, llojeve të të dhënave dhe funksioneve.

Pjesa më e madhe e informacionit të përmbajtur këtu do të jetë në përputhje me çdo kurs C/C++, duke marrë parasysh dallimet në llojet e të dhënave, si dhe disa udhëzime specifike në lidhje me programimin e portit I/O.

Bazat

Disa gjëra formale, pra ato që të gjithë i dinë, por ndonjëherë i harrojnë...

Arduino IDE, si në C/C++, duhet të jeni të vetëdijshëm për rastet e karaktereve. Fjalë kyçe, të tilla si nëse, për shkruhen gjithmonë në shkronja të vogla. Çdo udhëzim përfundon me ";". Pikëpresja i tregon përpiluesit se cilën pjesë të interpretojë si udhëzim.

Kllapat (..) përdoren për të treguar blloqet e programit. Ne i përdorim ato për të kufizuar trupat e funksionit (shih më poshtë), unazat dhe deklaratat e kushtëzuara.

Është një praktikë e mirë të shtoni komente në përmbajtjen e programit, kjo e bën kodin të lehtë për t'u kuptuar. Komentet me një linjë fillojnë me // (pjesë e dyfishtë). Komentet me shumë rreshta fillojnë me /* dhe përfundoni me */

Nëse duam të përfshijmë ndonjë bibliotekë në programin tonë, ne përdorim komandën include. Këtu janë shembuj të lidhjes së bibliotekave:

#përfshi // biblioteka standarde #include "svoya_biblioteka.h" // biblioteka në drejtorinë e projektit

Funksionet në Arduino

Një funksion (nënrutinë) është pjesë e veçantë programe që kryejnë veprime të caktuara. Funksionet përdoren për të thjeshtuar programin kryesor dhe për të përmirësuar lexueshmërinë e kodit. Është e dobishme të përdorim funksione pasi mund t'i përdorim lehtësisht në shumë nga projektet tona.

Një kurs standard programimi përmban informacion rreth funksioneve që do të paraqiten në artikujt vijues. Në rastin e Arduino, funksionet do të diskutohen në fillim sepse madje programi më i thjeshtë duhet të ketë dy funksione të veçanta. Kjo tashmë është përmendur në artikujt e mëparshëm, por këtu ne e sistemojmë këtë informacion.

Deklarata e Funksionit

Diagrami i deklarimit të funksionit duket si ky:

Shkruani emrin_funksioni(parametri) ( // udhëzime për ekzekutim (trupi i funksionit) kthimi (/* vlera e kthimit*/); )

llojiështë emri i kujtdo lloji i disponueshëm të dhënat mbi gjuhën e dhënë programimit. Ne do të ofrojmë një listë të llojeve të disponueshme kur programoni Arduino në një artikull të veçantë.

Pas ekzekutimit, funksioni do të kthejë vlerën e tipit të deklaruar. Nëse funksioni nuk pranon asnjë vlerë të kthimit, atëherë lloji i të dhënave do të jetë "i pavlefshëm".

emri_funksionit lejon që ajo të identifikohet në mënyrë unike. Për të thirrur (drejtuar) një funksion, ne i japim një emër.

parametri— parametri i thirrjes së funksionit. Parametrat nuk kërkohen, por shpesh janë të dobishëm. Nëse shkruajmë një funksion që nuk ka argumente, largohemi kllapa të rrumbullakëta bosh.

Brenda kllapave "(...)" është trupi aktual i funksionit ose instruksionit që duam të ekzekutojmë. Ne do të ofrojmë një përshkrim të udhëzimeve specifike në një artikull të veçantë.

Të gjitha funksionet që kthejnë një vlerë përfundojnë me një deklaratë kthimi të ndjekur nga vlera e kthimit. Vetëm funksionet e deklaruara me një tregues null ("void") nuk përmbajnë një deklaratë kthimi. Duhet të dini se deklarata e kthimit përfundon funksionin pavarësisht vendndodhjes.

Më poshtë janë disa shembuj të deklaratave të funksionit.

Void f1() ( //trupi i funksionit) —————————————— int minus() ( //kthimi i trupit të funksionit (0); ) ———————————— ——— int plus(int a, int b) (kthim (a+b); )

Siç mund ta shihni nga shembujt, një deklaratë funksioni mund të marrë shumë forma në varësi të nevojave tuaja.

Ne ju rekomandojmë fuqimisht që të mësoni dhe përdorni funksione kur shkruani programet e veta. Me kalimin e kohës, çdo programues grumbullon bibliotekën e tij të funksioneve "për të gjitha rastet", gjë që e bën më të lehtë dhe më të shpejtë shkrimin e programeve të reja.

Tani që dimë se si të shkruajmë funksionin tonë, duhet të mësojmë se si ta përdorim atë.

Thirrja e një funksioni

Ne i shkruajmë të gjitha funksionet në një skedar/program. Sigurisht, ka një zgjidhje më elegante, por ne do të përpiqemi ta përshkruajmë herën tjetër.

Pasi të deklarojmë një funksion, ne mund ta përdorim atë në funksione të tjera me emrin e duhur dhe çdo parametër të kërkuar. Më poshtë janë shembuj të thirrjes së funksioneve që dhamë më sipër:

F1 (); plus (2,2); y=plus (1.5);

Siç mund ta shihni në shembujt, një thirrje funksioni bëhet duke specifikuar emrin e tij dhe numrin e kërkuar të parametrave. Është e rëndësishme që gjithmonë të thirret një funksion siç është deklaruar.

Nëse funksioni f1() deklarohet pa parametra, atëherë nuk mund të specifikohet asnjë parametër gjatë thirrjes së tij, d.m.th. thirrja e f1(0) do të jetë e pasaktë.

Funksioni plus(int a, int b) kërkon saktësisht dy parametra, kështu që thirrja me një ose tre parametra nuk është e mundur.

Thirrja y=plus(1,5) do të ekzekutojë funksionin "plus" me parametrat "1" dhe "5" dhe do të ruajë vlerën e kthyer në ndryshoren "y".

funksionet setup() dhe loop().

Me njohuri rreth deklarimit dhe thirrjes së funksioneve, ne mund të kalojmë në sistem Funksionet Arduino: konfigurimi () Dhe lak (). Arduino IDE kërkohet për të deklaruar këto dy funksione.

setup() është një funksion që thirret automatikisht kur ndizet energjia ose shtypet butoni RESET.

Siç sugjeron emri i tij, përdoret për të vendosur vlerat fillestare të variablave, deklaratat e hyrjeve dhe daljeve të sistemit, të cilat zakonisht specifikohen në parametrat fillestarë. Për shkak të specifikës së tij, ky funksion nuk kthen një vlerë dhe nuk thirret me parametra. Deklarata e saktë e funksionit setup() është më poshtë:

Konfigurimi i zbrazët () ( // trupi i funksionit - inicializimi i sistemit )

loop() është një funksion që thirret në lak i pafund. Ky funksion gjithashtu nuk kthen vlerë dhe nuk thirret me parametra. Deklarata e saktë e funksionit loop() tregohet më poshtë:

Cikli i zbrazët () ( // trupi i funksionit - kodi i programit)

Siç mund ta shihni, deklarata e funksionit loop() është identike me deklaratën e funksionit setup(). Dallimi qëndron në kryerjen e këtyre funksioneve nga mikrokontrolluesi.

Tani do të analizojmë pseudokodin e mëposhtëm:

Konfigurimi i zbrazët () ( on_led1 (); //ndiz led1 off_led1 (); //fik led1) void loop () ( on_led2 (); //ndiz led2 off_led2 (); //fik led2)

Ekzistojnë dy udhëzime në funksionin setup(): i pari ndez led1 të lidhur me tabelën (p.sh. pin 13) dhe i dyti fiket led1.

Funksioni loop() ka udhëzime identike për të ndezur dhe fikur LED2 të lidhur me tabelën (p.sh. pin 12).

Si rezultat i ekzekutimit të programit, led1 do të pulsojë një herë, ndërsa led2 do të ndizet dhe do të fiket për sa kohë që Arduino është i ndezur.

Shtypja e butonit RESET do të bëjë që led1 të pulsojë përsëri dhe led2 të pulsojë përsëri vazhdimisht.

Përmblidhni:

  • Funksionet setup() dhe loop() janë funksionet e sistemit, të cilat duhet të përcaktohen në çdo projekt. Edhe në një situatë ku ne nuk shkruajmë asnjë kod në njërën prej tyre, përsëri duhet të deklarojmë këto dy funksione;
  • Funksioni setup() ekzekutohet një herë, loop() ekzekutohet vazhdimisht;
  • Ne krijojmë funksionet tona në një skedar;
  • Ne mund t'i thërrasim funksionet tona si nga setup() dhe loop(), ashtu edhe nga funksione të tjera;
  • Funksionet tona mund të thirren me parametra dhe të kthejnë një vlerë;
  • Një thirrje funksioni duhet të bëhet në përputhje me deklaratën e tij.

Ky mësim ofron njohuritë minimale të nevojshme për të programuar sistemet Arduino në C. Mund ta shikoni vetëm dhe më pas ta përdorni si informacion në sfond. Për ata që kanë programuar në C në sisteme të tjera, mund ta kaloni artikullin.

E përsëris se ky është informacion minimal. Përshkrimi i treguesve, klasave, variablave të vargut, etj. do të jepet në mësimet vijuese. Nëse diçka është e paqartë, mos u shqetësoni. Do të ketë shumë shembuj dhe shpjegime në mësimet e ardhshme.

Struktura e programit Arduino.

Struktura e programit Arduino është mjaft e thjeshtë dhe, në formën e tij minimale, përbëhet nga dy pjesë setup() dhe loop().

konfigurimi i zbrazët () (

void loop() (

Funksioni setup() ekzekutohet një herë, kur kontrolluesi aktivizohet ose rivendoset. Zakonisht ndodh cilësimet fillestare variabla, regjistra. Funksioni duhet të jetë i pranishëm në program, edhe nëse nuk ka asgjë në të.

Pasi të përfundojë setup(), kontrolli kalon në funksionin loop(). Ai ekzekuton komandat e shkruara në trupin e tij (midis kllapave kaçurrelë) në një lak të pafund. Në fakt, këto komanda kryejnë të gjitha veprimet algoritmike të kontrolluesit.

Rregullat origjinale të sintaksës së gjuhës C.

; pikëpresje Shprehjet mund të përmbajnë sa më shumë hapësira dhe ndërprerje rreshtash sipas dëshirës. Fundi i një shprehjeje tregohet me simbolin e pikëpresjes.

z = x + y;
z=x
+ y;

( ) mbajtëse kaçurrelë Përcaktoni një bllok funksionesh ose shprehjesh. Për shembull, në funksionet setup() dhe loop().

/* … */ bllok komentesh, sigurohuni që ta mbyllni.

/* ky është një bllok komentesh */

// koment me një rresht, nuk ka nevoje per mbyllje, e vlefshme deri ne fund te rreshtit.

// ky është një rresht komenti

Variablat dhe llojet e të dhënave.

Variabla është një qelizë kujtesë e gjallë, në të cilin ruhet informacioni. Programi përdor variabla për të ruajtur të dhënat e ndërmjetme të llogaritjes. Të dhënat mund të përdoren për llogaritjet formate të ndryshme, me thellësi bit të ndryshme, kështu që variablat në gjuhën C kanë llojet e mëposhtme.

Lloji i të dhënave Thellësia, copa Gama e numrave
logjike 8 e vërtetë, e rreme
karakter 8 -128 … 127
karakter i panënshkruar 8 0 … 255
bajt 8 0 … 255
ndër 16 -32768 … 32767
i panënshkruar int 16 0 … 65535
fjalë 16 0 … 65535
gjatë 32 -2147483648 … 2147483647
i panënshkruar gjatë 32 0 … 4294967295
i shkurtër 16 -32768 … 32767
noton 32 -3.4028235+38 … 3.4028235+38
dyfishtë 32 -3.4028235+38 … 3.4028235+38

Llojet e të dhënave zgjidhen bazuar në saktësinë e kërkuar të llogaritjes, formatet e të dhënave, etj. Për shembull, për një numërues që numëron deri në 100, nuk duhet të zgjidhni lloji i gjatë. Do të funksionojë, por operacioni do të marrë më shumë memorie të dhënat dhe programet do të kërkojnë më shumë kohë.

Deklarimi i variablave.

Lloji i të dhënave është specifikuar, i ndjekur nga emri i ndryshores.

int x; // deklarimi i një ndryshoreje të quajtur x të tipit int
float widthBox; // deklarimi i një ndryshoreje të quajtur widthBox e tipit float

Të gjitha variablat duhet të deklarohen përpara se të përdoren.

Një variabël mund të deklarohet kudo në një program, por kjo përcakton se cilat blloqe programi mund ta përdorin atë. Ato. Variablat kanë shtrirje.

  • Variablat e deklaruar në fillim të programit, përpara funksionit void setup(), konsiderohen globale dhe janë të disponueshme kudo në program.
  • Variablat lokale deklarohen brenda funksioneve ose blloqeve të tilla si një cikli for, dhe mund të përdoren vetëm brenda blloqeve të deklaruara. Është e mundur që të ketë variabla të shumtë me të njëjtin emër, por me shtrirje të ndryshme.

modaliteti int; // variabël i disponueshëm për të gjitha funksionet

konfigurimi i zbrazët () (
// bllok bosh, nuk kërkohen cilësime fillestare
}

void loop() (

numërim i gjatë; // variabli count është i disponueshëm vetëm në funksionin loop().

për (int i=0; i< 10;) // переменная i доступна только внутри цикла
{
i++;
}
}

Kur deklaroni një ndryshore, mund ta vendosni atë vlera fillestare(inicializoj).

int x = 0; // ndryshorja x deklarohet me vlerë fillestare 0
char d = 'a'; // ndryshorja d deklarohet me vlerën fillestare të barabartë me kodin e karakterit "a"

veprimet aritmetike Me tipe te ndryshme ndodhin të dhënat konvertim automatik llojet e të dhënave. Por është gjithmonë më mirë të përdoret një konvertim i qartë.

int x; // ndryshore int
char y; // ndryshore char
int z; // ndryshore int

z = x + (int)y; // ndryshorja y konvertohet në mënyrë eksplicite në int

Veprimet aritmetike.

Operacionet e marrëdhënieve.

Operacionet logjike.

Operacionet në tregues.

Operacionet me bit.

& DHE
| OSE
^ EKSKLUZIVE OSE
~ INVERSION
<< SHIFT ME LEJTA
>> SHIFT Djathtas

Operacionet e caktimit të përzier.

Zgjedhja e opsioneve, menaxhimi i programit.

operatori IF kontrollon gjendjen në kllapa dhe ekzekuton shprehjen ose bllokimin pasues mbajtëse kaçurrelë, nëse kushti është i vërtetë.

nëse (x == 5) // nëse x=5, atëherë ekzekutohet z=0
z=0;

nëse (x > 5) // nëse x >
(z=0; y=8;)

NESE TJETER ju lejon të zgjidhni midis dy opsioneve.

nëse (x > 5) // nëse x > 5, atëherë blloku ekzekutohet z=0, y=8;
{
z=0;
y=8;
}

{
z=0;
y=0;
}

TJETER NESE– ju lejon të bëni zgjedhje të shumta

nëse (x > 5) // nëse x > 5, atëherë blloku ekzekutohet z=0, y=8;
{
z=0;
y=8;
}

ndryshe nëse (x > 20) // nëse x > 20, ky bllok ekzekutohet
{
}

else // përndryshe ky bllok ekzekutohet
{
z=0;
y=0;
}

KALUTA E KALUARËS- zgjedhje e shumfishte. Ju lejon të krahasoni një ndryshore (në shembull kjo është x) me disa konstante (në shembullin 5 dhe 10) dhe të ekzekutoni një bllok në të cilin ndryshorja është e barabartë me konstanten.

kaloni (x) (

rasti 5:
// kodi ekzekutohet nëse x = 5
pushim;

rasti 10:
// kodi ekzekutohet nëse x = 10
pushim;

default:
// kodi ekzekutohet nëse asnjë nuk përputhet vlera e mëparshme
pushim;
}

FOR Loop. Dizajni ju lejon të organizoni sythe me një numër të caktuar përsëritjesh. Sintaksa duket si kjo:

për (veprim përpara fillimit të ciklit;
gjendja e vazhdimit të lakut;
veprim në fund të çdo përsëritjeje) (

// Kodi i trupit të lakut

Një shembull i një cikli prej 100 përsëritjesh.

për (i=0; i< 100; i++) // начальное значение 0, конечное 99, шаг 1

{
shuma = shuma + I;
}

WHILE lak. Operatori ju lejon të organizoni sythe me ndërtimin:

ndërsa (shprehje)
{
// Kodi i trupit të lakut
}

Cikli funksionon për aq kohë sa shprehja në kllapa është e vërtetë. Një shembull i një cikli për 10 përsëritje.

x = 0;
ndërsa (x< 10)
{
// Kodi i trupit të lakut
x++;
}

BEJ NDERKOHE– një lak me një kusht në dalje.

bëj
{
// Kodi i trupit të lakut
) ndërsa (shprehje);

Cikli funksionon për aq kohë sa shprehja është e vërtetë.
THYES– operatori i daljes së ciklit. Përdoret për të ndërprerë ekzekutimin për sythe, ndërsa, bëj ndërkohë.

x = 0;
ndërsa (x< 10)
{
nëse (z > 20) thyejnë; // nëse z > 20, atëherë dilni nga cikli
// Kodi i trupit të lakut
x++;
}

SHKO– operator i tranzicionit të pakushtëzuar.

gotometka1; // shko te metka1
………………
metka1:

VAZHDO- anashkalimi i deklaratave deri në fund të trupit të lakut.

x = 0;
ndërsa (x< 10)
{
// Kodi i trupit të lakut
nëse (z > 20) vazhdon; // nëse z > 20, atëherë kthehuni në fillim të trupit të lakut
// Kodi i trupit të lakut
x++;
}

Vargjeve.

Një grup është një zonë memorie ku disa variabla ruhen në mënyrë sekuenciale.

Një grup deklarohet si kjo:

ndër moshat; // grup prej 10 variablat e tipit ndër

peshë notuese // grup prej 100 variablash float

Kur deklarohen, vargjet mund të inicializohen:

mes moshave = ( 23, 54, 34, 24, 45, 56, 23, 23, 27, 28);

Ndryshoret e grupit arrihen si kjo:

x = moshat; // x i caktohet vlera nga elementi i 5-të i grupit.
mosha = 32; // Elementi i 9-të i grupit është vendosur në 32

Numri i elementeve të grupit është gjithmonë nga zero.

Funksione.

Funksionet ju lejojnë të kryeni të njëjtat veprime me të dhëna të ndryshme. Funksioni ka:

  • emri me të cilin quhet ajo;
  • argumente – të dhëna që funksioni përdor për llogaritje;
  • lloji i të dhënave të kthyer nga funksioni.

Përshkruan një funksion të përcaktuar nga përdoruesi jashtë funksioneve setup() dhe loop().

konfigurimi i zbrazët () (
// kodi ekzekutohet një herë kur programi fillon
}

void loop() (
// kodi kryesor, i ekzekutuar në një lak
}

// njoftim funksion me porosi me emrin Emri i funksionit
shkruani emrin e funksionit (lloji argument1, shkruani argument1, … , shkruani argument)
{
// funksion trup
return();
}

Një shembull i një funksioni që llogarit shumën e katrorëve të dy argumenteve.

int sumQwadr(int x, int y)
{
kthye (x* x + y*y);
}

Thirrja e funksionit shkon si kjo:

d= 2; b= 3;
z= shumaQwadr(d, b); // z do të jetë shuma e katrorëve të ndryshoreve d dhe b

Funksionet mund të jenë të integruara, të personalizuara ose shtesë.

Shumë e shkurtër, por këto të dhëna duhet të jenë të mjaftueshme për të filluar të shkruani programe C për sistemet Arduino.

Gjëja e fundit që dua t'ju them në këtë mësim është se si është zakon të formatoni programet në C. Unë mendoj se nëse po e lexoni këtë mësim për herë të parë, duhet ta kaloni këtë pjesë dhe t'i ktheheni më vonë, kur të keni diçka për të formatuar.

objektivi kryesor dizajn i jashtëm programet duhet të përmirësojnë lexueshmërinë e programeve dhe të zvogëlojnë numrin e gabimeve formale. Prandaj, për të arritur këtë qëllim, mund të shkelni me siguri të gjitha rekomandimet.

Emrat në gjuhën C.

Emrat që përfaqësojnë llojet e të dhënave duhet të shkruhen në shkronja të përziera. Shkronja e parë e emrit duhet të jetë me shkronja të mëdha (të mëdha).

Sinjali, numërimi i kohës

Variablat duhet të shkruhen me emra të përzier, me shkronjën e parë të vogël (të vogël).

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ë, ju 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 propozojmë udhëzime hap pas hapi në 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, gjithçka ndodh njësoj 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 atë 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 problem real. 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.

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. Ndoshta kjo nuk është më këshilla të këqija, 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. Aktiv sisteme të ndryshme do të duket ndryshe. Për të zbuluar opsionin tuaj, hapni Arduino IDE dhe kontrolloni kutinë "Trego daljen me fjalë gjatë ngarkimit" në cilësimet.

Tani ne ngarkojmë në Arduino çdo skico dhe shiko 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). Nese e jotja redaktori 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!

Ky simulator funksionon më së miri në shfletuesin Chrome
Le të hedhim një vështrim më të afërt në Arduino.

Arduino nuk është një kompjuter i madh që mund të lidhet me qarqe të jashtme. Arduino Uno përdor Atmega 328P
Ky është çipi më i madh në tabelë. Ky çip ekzekuton programe që janë të ruajtura në memorien e tij. Ju mund ta shkarkoni programin përmes usb duke përdorur Arduino IDE. Porta USB gjithashtu siguron energji për arduino.

Ka një lidhës të veçantë të energjisë. Pllaka ka dy kunja të etiketuara 5v dhe 3.3v, të cilat nevojiten për të fuqizuar pajisje të ndryshme. Do të gjeni gjithashtu kunja të shënuara GND, këto janë kunjat e tokës (toka është 0V). Platforma Arduino ka gjithashtu 14 kunja dixhitale, të etiketuara nga 0 në 13, të cilat lidhen me nyjet e jashtme dhe kanë dy gjendje, të larta ose të ulëta (ndezur ose fikur). Këto kontakte mund të funksionojnë si dalje ose si hyrje, d.m.th. ata ose mund të transmetojnë disa të dhëna dhe të kontrollojnë pajisjet e jashtme, ose të marrin të dhëna nga pajisjet. Kunjat e ardhshme në tabelë janë etiketuar A0-A5. Këto janë hyrje analoge që mund të marrin të dhëna nga sensorë të ndryshëm. Kjo është veçanërisht e përshtatshme kur duhet të matni një diapazon të caktuar, siç është temperatura. Hyrjet analoge kanë funksione shtesë që mund të aktivizohen veçmas.

Si të përdorni një bord zhvillimi.

Pllaka e bukës nevojitet për të lidhur përkohësisht pjesët, për të kontrolluar se si funksionon pajisja, përpara se të bashkoni gjithçka.
Të gjithë shembujt e mëposhtëm janë montuar në një tabelë në mënyrë që të mund të bëni shpejt ndryshime në qark dhe të ripërdorni pjesët pa u shqetësuar me saldimin.

Pllaka e bukës ka rreshta vrimash në të cilat mund të futni pjesë dhe tela. Disa nga këto vrima janë të lidhura elektrike me njëra-tjetrën.

Dy rreshtat e sipërm dhe të poshtëm janë të lidhur në rreshta përgjatë gjithë tabelës. Këto rreshta përdoren për të furnizuar qarkun me energji elektrike. Mund të jetë 5V ose 3.3V, por sido që të jetë, gjëja e parë që duhet të bëni është të lidhni 5V dhe GND me tabelën e bukës siç tregohet në foto. Ndonjëherë këto lidhje rreshtash mund të prishen në mes të tabelës, atëherë nëse keni nevojë mund t'i lidhni siç tregohet në figurë.








Vrimat e mbetura, të vendosura në mes të tabelës, grupohen në grupe me pesë vrima. Ato përdoren për të lidhur pjesët e qarkut.


Gjëja e parë që do të lidhim me mikrokontrolluesin tonë është një LED. Diagrami i lidhjes elektrike është paraqitur në foto.

Pse nevojitet një rezistencë në një qark? Në këtë rast, ajo kufizon rrymën që kalon nëpër LED. Çdo LED është projektuar për një rrymë të caktuar, dhe nëse kjo rrymë është më e lartë, LED do të dështojë. Ju mund të zbuloni se çfarë vlere duhet të ketë rezistenca duke përdorur ligjin e Ohm-it. Për ata që nuk e dinë ose e kanë harruar, ligji i Ohmit thotë se ekziston një marrëdhënie lineare midis rrymës dhe tensionit. Kjo do të thotë, sa më shumë tension të aplikojmë në rezistencë, aq më shumë rrymë do të rrjedhë nëpër të.
V=I*R
Ku V- Tensioni në të gjithë rezistencën
I- rryma përmes rezistencës
R- rezistenca që duhet gjetur.
Së pari, ne duhet të zbulojmë tensionin në të gjithë rezistencën. Shumica e LED-ve 3 mm ose 5 mm që do të përdorni kanë një tension funksionimi prej 3V. Kjo do të thotë që ne duhet të shuajmë 5-3 = 2V në rezistencë.

Më pas do të llogarisim rrymën që kalon nëpër rezistencë.
Shumica e LED-ve 3 mm dhe 5 mm shkëlqejnë me shkëlqim të plotë në 20 mA. Një rrymë më e madhe se kjo mund t'i çaktivizojë ato, ndërsa një rrymë me intensitet më të vogël do të ulë shkëlqimin e tyre pa shkaktuar ndonjë dëm.

Pra, ne duam të lidhim LED-in me qarkun 5V në mënyrë që të mbajë një rrymë prej 20 mA. Meqenëse të gjitha pjesët janë të përfshira në një qark, rezistenca do të ketë gjithashtu një rrymë prej 20 mA.
marrim
2V = 20 mA * R
2V = 0,02A * R
R = 100 Ohm

100 Ohm është rezistenca minimale, është më mirë të përdorni pak më shumë, sepse LED-të kanë disa ndryshime në karakteristika.
Në këtë shembull, përdoret një rezistencë 220 ohm. Vetëm se autori ka shumë prej tyre: wink: .

Fusni LED-in në vrimat në mes të tabelës, në mënyrë që priza e saj e gjatë të lidhet me një nga kapakët e rezistencës. Lidhni skajin e dytë të rezistencës në 5 V dhe lidhni prizën e dytë të LED me GND. LED duhet të ndizet.

Ju lutemi vini re se ka një ndryshim në mënyrën se si e lidhni LED. Rryma rrjedh nga terminali më i gjatë në atë më të shkurtër. Në diagram mund të imagjinoni se rryma rrjedh në drejtimin ku drejtohet trekëndëshi. Provoni ta ktheni LED-in me kokë poshtë dhe do të shihni që nuk do të ndizet.

Por mënyra se si e lidhni rezistencën nuk ka fare ndryshim. Mund ta ktheni ose të provoni ta lidhni me një kunj tjetër të LED, kjo nuk do të ndikojë në funksionimin e qarkut. Ajo do të vazhdojë të kufizojë rrymën përmes LED.

Anatomia e Skicës Arduino.

Programet për Arduino quhen sketch. Ato përbëhen nga dy funksione kryesore. Funksioni konfigurimi dhe funksionin lak
Brenda këtij funksioni do të vendosni të gjitha cilësimet bazë. Cilat kunja do të funksionojnë si hyrje ose dalje, cilat biblioteka të lidhen, inicializojnë variablat. Funksioni Konfigurimi () ekzekutohet vetëm një herë gjatë skicës, kur fillon ekzekutimi i programit.
ky është funksioni kryesor që ekzekutohet më pas konfigurimi (). Në fakt, është vetë programi. Ky funksion do të funksionojë për një kohë të pacaktuar derisa të fikni energjinë.

LED ndezës Arduino



Në këtë shembull, ne do të lidhim një qark LED me një nga kunjat dixhitale të Arduino dhe do ta ndezim dhe fikim atë duke përdorur një program, dhe gjithashtu do të mësoni disa funksione të dobishme.

Ky funksion përdoret në konfigurimi () pjesë e programit dhe shërben për të inicializuar kunjat që do të përdorni si hyrje (HYRJE) ose dalje (OUTPUT). Ju nuk do të jeni në gjendje të lexoni ose shkruani të dhëna nga pini derisa t'i vendosni ato në përkatësisht pinMode. Ky funksion ka dy argumente: pinNumërështë numri pin që do të përdorni.

Modaliteti-përcakton se si do të funksionojë kunja. Në hyrje (HYRJE) ose dalje (OUTPUT). Për të ndezur LED duhet të japim një sinjal NGA Arduino. Për ta bërë këtë, ne konfigurojmë pinin e daljes.
- ky funksion përdoret për të vendosur gjendjen (shteti) pinë (Numri i kunjit). Ka dy shtete kryesore (në fakt 3 prej tyre), një është I LARTË, do të ketë 5V në pin, kjo është diçka tjetër E ulët dhe pin do të jetë 0v. Kjo do të thotë që për të ndezur LED duhet të vendosim kunjin e lidhur me LED në një nivel të lartë I LARTË.

Vonesa. Shërben për të vonuar funksionimin e programit për një periudhë të specifikuar në msec.
Më poshtë është kodi që bën LED të pulsojë.
//LED Blink int ledPin = 7;//Pinën Arduino me të cilën është lidhur LED-ja void setup() ( pinMode(ledPin, OUTPUT);// vendosja e pinit si OUTPUT) void loop() ( digitalWrite(ledPin, HIGH) ;// aktivizoni vonesën LED (1000);// vononi 1000 ms (1 sek) dixhital Shkrimi (ledPin, LOW);//Fikni vonesën LED (1000);//prit 1 sekondë)

Shpjegime të vogla mbi kodin.
Rreshtat që fillojnë me "//" janë komente dhe injorohen nga Arduino.
Të gjitha komandat përfundojnë me një pikëpresje; nëse i harroni ato, do të merrni një mesazh gabimi.

ledPinështë një variabël. Variablat përdoren në programe për të ruajtur vlerat. Në këtë shembull, ndryshorja ledPin vlera i është caktuar 7, ky është numri pin Arduino. Kur programi Arduino ndeshet me një linjë me një ndryshore ledPin, do të përdorë vlerën që kemi specifikuar më parë.
Pra regjistroni pinMode (ledPin, OUTPUT) të ngjashme me regjistrimin pinMode (7, OUTPUT).
Por në rastin e parë, ju duhet vetëm të ndryshoni variablin dhe ai do të ndryshojë në çdo rresht ku përdoret, dhe në rastin e dytë, për të ndryshuar variablin, duhet të bëni ndryshime manualisht në secilën komandë.

Rreshti i parë tregon llojin e ndryshores. Kur programoni Arduino, është e rëndësishme që gjithmonë të deklaroni llojin e variablave. Tani për tani mjafton që ju ta dini këtë INT shpall numrat negativë dhe pozitivë.
Më poshtë është një simulim i skicës. Kliko start për të parë qarkun në veprim.

Siç pritej, LED fiket dhe ndizet përsëri pas një sekonde. Provoni të ndryshoni vonesën për të parë se si funksionon.

Kontrolli i shumë LED-ve.

Në këtë shembull, do të mësoni se si të kontrolloni shumë LED. Për ta bërë këtë, instaloni 3 LED të tjera në tabelë dhe lidhni ato me rezistorët dhe kunjat Arduino siç tregohet më poshtë.

Për të ndezur dhe fikur LED-et një nga një, duhet të shkruani një program të ngjashëm me këtë:
//Multi LED Blink int led1Pin = 4; int led2Pin = 5; int led3Pin = 6; int led4Pin = 7; void setup() ( //cakto kunjat si OUTPUT pinMode(led1Pin, OUTPUT); pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); pinMode(led4Pin, OUTPUT); ) void loop() ( digitalWrite(led1Pin, HIGH );//ndiz vonesën LED(1000);//vonesë 1 sek dixhitalWrite(led1Pin, LOW);//fike vonesën LED(1000);//vonesë 1 sek //bëj të njëjtën gjë për 3 të tjerat LED dixhitalWrite(led2Pin , LARTË);//ndizni vonesën LED(1000);//vonesë 1 sek dixhitaleWrite(led2Pin, LOW);//fikja e vonesës LED(1000);//vonesë 1 sek dixhitaleWrite(led3Pin, LARTË );//ndiz vonesën LED(1000);// vonesë 1 sek dixhitalWrite(led3Pin, LOW);//fikja e vonesës LED(1000);//vonesë 1 sek dixhitaleWrite(led4Pin, LARTË);//ndiz vonesa LED (1000);// vonesë 1 sek dixhitalWrite (led4Pin, LOW);//fikja e vonesës LED (1000);//vonesa 1 sekondë)

Ky program do të funksionojë mirë, por nuk është zgjidhja më racionale. Kodi duhet të ndryshohet. Në mënyrë që programi të funksionojë vazhdimisht, ne do të përdorim një ndërtim të quajtur .
Sythet janë të dobishme kur duhet të përsërisni të njëjtin veprim disa herë. Në kodin e mësipërm ne përsërisim rreshtat

DigitalWrite (led4Pin, LARTË); vonesë (1000); digitalWrite (led4Pin, LOW); vonesë (1000);
kodi i plotë i skicës në bashkëngjitje (Shkarkime: 1187)

Rregullimi i ndriçimit LED

Ndonjëherë do t'ju duhet të ndryshoni ndriçimin e LED-ve në program. Kjo mund të bëhet duke përdorur komandën analogWrite() . Kjo komandë ndez dhe fiket LED aq shpejt sa syri nuk mund të shohë dridhjen. Nëse LED është ndezur gjysmën e kohës dhe fiket gjysmën e kohës, vizualisht do të duket se po shkëlqen në gjysmën e shkëlqimit të saj. Ky quhet modulim i gjerësisë së pulsit (PWM ose PWM në anglisht). Shim përdoret mjaft shpesh, pasi mund të përdoret për të kontrolluar një komponent "analog" duke përdorur një kod dixhital. Jo të gjitha kunjat Arduino janë të përshtatshme për këto qëllime. Vetëm ato përfundime pranë të cilave është nxjerrë një përcaktim i tillë " ~ ". Do ta shihni pranë kunjave 3,5,6,9,10,11.
Lidhni një nga LED-et tuaja me një nga kunjat PWM (për autorin kjo është pin 9). Tani ekzekutoni skicën e ndezjes LED, por së pari ndryshoni komandën DigitalWrite()analogWrite(). analogWrite() ka dy argumente: i pari është numri i pinit, dhe i dyti është vlera PWM (0-255), në lidhje me LED-të kjo do të jetë shkëlqimi i tyre, dhe për motorët elektrikë shpejtësia e rrotullimit. Më poshtë është një kod shembull për ndriçime të ndryshme LED.
//Ndrysho ndriçimin e LED-së int ledPin = 9;//një LED është i lidhur me këtë setup void pin() ( pinMode(ledPin, OUTPUT);// inicializimi i pinit në dalje ) void loop() ( analogWrite( ledPin, 255);// ndriçim i plotë (255/255 = 1) vonesë (1000);//pauzë 1 sek dixhitalWrite(ledPin, LOW);//fike vonesën LED (1000);//pauzë 1 sekondë analogeWrite( ledPin, 191);//shkëlqimi me 3/4 (191/255 ~= 0,75) vonesë (1000);//pauzë 1 sekondë dixhitaleWrite(ledPin, LOW);//fikni vonesën LED (1000);// pauzë 1 sek analogWrite (ledPin, 127); //gjysmë ndriçimi (127/255 ~= 0,5) vonesë (1000);//pauzë 1 sekondë DigitalWrite (ledPin, LOW);//fikja e vonesës LED (1000);/ /pauzë 1 sekondë analogeWrite(ledPin, 63); //dritë çerek (63/255 ~= 0,25) vonesë (1000);//pauzë 1 sekondë dixhitaleWrite(ledPin, LOW);//fikni vonesën LED (1000) ;//pauzë 1 sekondë)

Provoni të ndryshoni vlerën PWM në komandë analogWrite() për të parë se si kjo ndikon në ndriçimin.
Më pas, do të mësoni se si ta rregulloni ndriçimin pa probleme nga e plotë në zero. Sigurisht, ju mund të kopjoni një pjesë të kodit 255 herë
analogWrite (ledPin, shkëlqim); vonesë (5);//shkëlqim me vonesë të shkurtër = shkëlqim + 1;
Por, ju e kuptoni, kjo nuk do të jetë praktike. Mënyra më e mirë për ta bërë këtë është përdorimi i ciklit FOR që kemi përdorur më parë.
shembullin e mëposhtëm përdoren dy cikle, një për të ulur ndriçimin nga 255 në 0
për (shkëlqimi int=0; ndriçimi=0; ndriçimi--) (shkrimi analog (ledPin, ndriçimi); vonesa (5); )
vonesë (5) përdoret për të ngadalësuar shpejtësinë e zbehjes së ndriçimit 5*256=1280ms=1.28s)
Rreshti i parë përdor " shkëlqim -" për të bërë që vlera e ndriçimit të zvogëlohet me 1 sa herë që qarku përsëritet. Vini re se cikli do të funksionojë derisa ndriçimi >=0.Zëvendësimi i shenjës > në shenjë >= ne kemi përfshirë 0 në diapazonin e ndriçimit. Kjo skicë është modeluar më poshtë. //ndryshoni pa probleme ndriçimin int ledPin = 9;//një LED është i lidhur me këtë setup void pin() ( pinMode(ledPin, OUTPUT);// inicializimi i pinit të daljes) void loop() ( //rritni pa probleme ndriçimi (0 deri në 255 ) për (ndritshmëri int=0; ndriçim=0; ndriçim--)( analogWrite(ledPin, ndriçim); vonesë(5); ) vonesë (1000);//prit 1 sek //zvogëloje pa probleme ndriçimin (255 deri në 0) për (shkëlqim int=255; ndriçim>=0; ndriçim--) (shkrim analog(ledPin, ndriçim); vonesë (5); ) vonesë (1000);//prit 1 sekondë) )
Nuk është shumë e dukshme, por ideja është e qartë.

RGB LED dhe Arduino

Një LED RGB është në të vërtetë tre LED me ngjyra të ndryshme në një paketë.

Duke përfshirë LED të ndryshëm me ndriçim të ndryshëm, ju mund të kombinoni dhe merrni ngjyra të ndryshme. Për Arduino, ku numri i niveleve të ndriçimit është 256, do të merrni 256^3=16581375 ngjyra të mundshme. Në realitet, sigurisht, do të ketë më pak prej tyre.
LED që do të përdorim është katoda e zakonshme. Ato. të tre LED-et janë të lidhura strukturisht me katodë në një terminal. Ne do ta lidhim këtë kunj me pinin GND. Kunjat e mbetura, nëpërmjet rezistorëve kufizues, duhet të lidhen me kunjat PWM. Autori ka përdorur kunjat 9-11. Në këtë mënyrë do të jetë e mundur të kontrollohet çdo LED veç e veç. Skica e parë tregon se si të ndizni çdo LED individualisht.



//RGB LED - test //lidhjet me pin int të kuqe = 9; int jeshile = 10; blu int = 11; void setup())( pinMode(e kuqe, OUTPUT); pinMode(blu, OUTPUT); pinMode(jeshile, OUTPUT); ) void loop())( //ndizni/fikni LED-in e kuq dixhitalWrite(e kuqe, LARTË); vonesë (500) ; Shkrim dixhital (e kuqe, E ULËT); vonesë (500); //ndezni/fikni LED-in e gjelbër DigitalWrite (jeshile, LARTË); vonesë (500); Shkrimi dixhital (jeshile, LOW); vonesë (500); // ndizni/fikni LED-in blu dixhital Shkrimi (blu, LARTË); vonesë (500); dixhital Shkrimi (blu, ULËT); vonesë (500); )

Shembulli i mëposhtëm përdor komandat analogWrite() dhe për të marrë vlera të ndryshme të rastësishme të ndriçimit për LED. Do të shihni ngjyra të ndryshme që ndryshojnë rastësisht.
//RGB LED - ngjyra të rastësishme //lidhjet me pin int e kuqe = 9; int jeshile = 10; blu int = 11; void setup())( pinMode(e kuqe, OUTPUT); pinMode(blu, OUTPUT); pinMode(jeshile, OUTPUT); ) void loop())( //zgjedh një analog me ngjyra të rastësishmeWrite(e kuqe, rastësore(256)); analogWrite (blu, rastësore (256)); analogWrite (jeshile, rastësore (256)); vonesë (1000);//prit një sekondë)

E rastësishme (256)-kthehet numër i rastësishëm në rangun nga 0 në 255.
Bashkangjitur është një skicë që do të demonstrojë tranzicione të qetë ngjyrat nga e kuqja në jeshile, pastaj në blu, e kuqe, jeshile etj. (Shkarkime: 326)
Skica e shembullit funksionon, por ka shumë kode të kopjuara. Ju mund ta thjeshtoni kodin duke shkruar tuajin funksioni ndihmës, e cila do të ndryshojë pa probleme nga një ngjyrë në tjetrën.
Ja si do të duket: (Shkarkime: 365)
Le të shohim përcaktimin e funksionit pjesë-pjesë. Funksioni thirret fader dhe ka dy argumente. Çdo argument ndahet me presje dhe ka një lloj të deklaruar në rreshtin e parë të përkufizimit të funksionit: zbehës i zbrazët (int color1, int color2). Ju shikoni që të dy argumentet janë deklaruar si ndër, dhe atyre u jepen emra ngjyra 1 Dhe ngjyra2 si variabla të kushteve për të përcaktuar një funksion. E pavlefshme do të thotë që funksioni nuk kthen asnjë vlerë, ai thjesht ekzekuton komanda. Nëse do t'ju duhej të shkruanit një funksion që kthente rezultatin e shumëzimit, do të dukej kështu:
shumëzuesi int(numri int1, numri int2) (produkti int = numri1*numri2; produkti kthese; )
Vini re se si kemi deklaruar Type ndër si një lloj kthimi në vend
i pavlefshëm.
Brenda funksionit ka komanda që i keni përdorur tashmë në skicën e mëparshme, vetëm numrat e pin janë zëvendësuar me ngjyra 1 Dhe ngjyra2. Funksioni thirret fader, argumentet e tij llogariten si ngjyra 1 = e kuqe Dhe ngjyra2 = jeshile. Arkivi përmban një skicë të plotë duke përdorur funksione (Shkarkime: 272)

Butoni

Skica tjetër do të përdorë një buton me kontakte normalisht të hapura, pa mbërthyer.


Kjo do të thotë që ndërsa butoni nuk shtypet, nuk kalon rrymë nëpër të dhe pasi të lëshohet, butoni kthehet në pozicioni fillestar.
Përveç butonit, qarku përdor një rezistencë. NË në këtë rast nuk kufizon rrymën, por "tërheq" butonin në 0V (GND). Ato. derisa të shtypet butoni në pinin Arduino me të cilin është lidhur, do të ndodhë nivel i ulët. Rezistenca e përdorur në qark është 10 kOhm.


//përcaktoni kur shtypet butoni int buttonPin = 7; void setup())( pinMode(buttonPin, INPUT);//initialize pin në hyrje Serial.begin(9600);//initialize porta serike) void loop())( if (digitalRead(buttonPin)==HIGH)(//nëse butoni shtypet Serial.println("shtypet"); // print "shtypet" ) else (Serial.println("pa shtypur" ); // ndryshe "i pa shtypur" ) )
Ka disa komanda të reja në këtë skicë.
-Kjo komandë merr vlerën High ( nivel të lartë) dhe të ulët (niveli i ulët), prodhimi që po kontrollojmë. Ky dalje duhet së pari të konfigurohet si një hyrje në setup().
; //ku buttonPin është numri i pinit ku është lidhur butoni.
Porta serike lejon Arduino të dërgojë mesazhe në kompjuter ndërsa vetë kontrolluesi po ekzekuton programin. Kjo është e dobishme për korrigjimin e një programi, dërgimin e mesazheve në pajisje ose aplikacione të tjera. Për të mundësuar transferimin e të dhënave nëpërmjet një porti serik (i quajtur gjithashtu UART ose USART), duhet ta inicializoni atë në setup()

Serial.begin() ka vetëm një argument - kjo është shpejtësia e transferimit të të dhënave midis Arduino dhe kompjuterit.
Skica përdor një komandë për të shfaqur një mesazh në ekran në Arduino IDE (Tools >> Serial Monitor).
- dizajni ju lejon të kontrolloni ecurinë e ekzekutimit të programit duke kombinuar disa kontrolle në një vend.
Nëse digitalRead kthen LARTË, atëherë fjala "shtypet" shfaqet në monitor. Përndryshe (përndryshe) fjala "lëshuar" shfaqet në monitor. Tani mund të provoni të ndizni dhe fikni LED duke shtypur një buton.
//Zbulimi i shtypjes së butonit me dalje LED butoni intPin = 7; int ledPin = 8; void setup())( pinMode(buttonPin, INPUT);//këtë herë do të vendosim pinin e butonit si INPUT pinMode(ledPin, OUTPUT); Serial.begin(9600); ) void loop())( if (digitalRead(buttonPin )= = LARTË) (DixhitalWrite (ledPin, LARTË); Serial.println ("shtypur"); ) tjetër ( digitalWrite (ledPin, LOW); Serial.println ("pa shtypur"); ) )

Hyrja analoge.

analogLexo ju lejon të lexoni të dhëna nga një nga kunjat analoge të Arduino dhe shfaq një vlerë në intervalin nga 0 (0V) në 1023 (5V). Nëse voltazhi në hyrjen analoge është 2.5 V, atëherë do të shtypet 2.5 / 5 * 1023 = 512
analogLexo ka vetëm një argument - ky është numri hyrje analoge(A0-A5). Skica e mëposhtme tregon kodin për leximin e tensionit nga potenciometri. Për ta bërë këtë, lidheni rezistencë e ndryshueshme, kunjat më të jashtme shkojnë te kunjat 5V dhe GND, dhe kunja e mesme shkon në hyrjen A0.

Drejtoni kodin e mëposhtëm dhe shikoni në monitorin serial se si ndryshojnë vlerat në varësi të rrotullimit të dorezës së rezistencës.
//hyrja analoge int potPin = A0;// kunja qendrore e potenciometrit është e lidhur me këtë konfigurim të pavlefshëm të pinit())( //pina analoge është përfshirë si hyrje si parazgjedhje, kështu që nuk nevojitet inicializimi Serial.begin(9600 ); ) void loop())( int potVal = analogRead(potPin);//potVal është një numër midis 0 dhe 1023 Serial.println(potVal); )
Skica e mëposhtme kombinon skicën e klikimit të butonit dhe skicën e kontrollit të ndriçimit LED. LED do të ndizet nga butoni dhe ndriçimi do të kontrollohet nga një potenciometër.
//Zbulimi i shtypjes së butonit me dalje LED dhe intensitet të ndryshueshëm butoni intPin = 7; int ledPin = 9; int potPin = A0; void setup())( pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); ) void loop())( if (DigitalRead(buttonPin)==HIGH)(//nëse shtypet butoni int analogVal = analogRead(potPin);int scaledVal = hartë(analogVal, 0, 1023, 0, 255); analogWrite(ledPin, scaledVal);//ndiz led me intensitetin e vendosur nga tenxherja Serial.println("shtypet"); ) else (DixhitalWrite(ledPin, LOW);//fikni nëse butoni nuk shtypet Serial.println("pa shtypur"); ) )

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