Satura rādītājs:
- 1. darbība: apkopojiet savus materiālus
- 2. darbība: lejupielādējiet Roomba rīkkopas MATLAB
- 3. darbība: izveidojiet savienojumu ar savu Roomba
- 4. solis: izvēlieties, kā vēlaties kontrolēt savu Roomba
- 5. darbība: brauciet ar savu Roomba
Video: Jūsu Roomba pārvēršana Mars Rover: 5 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:51
1. darbība: apkopojiet savus materiālus
Lai pabeigtu šo projektu, jums būs jāapkopo šādi materiāli:
1 Roomba robots
1 Raspberry Pi komplekts
1 Video kamera
Piekļuve MATLAB
2. darbība: lejupielādējiet Roomba rīkkopas MATLAB
Izpildiet šo kodu, lai instalētu nepieciešamos rīku komplektus, lai pabeigtu šo projektu.
funkcija roombaInstall
clc;
% instalējamo failu saraksts
faili = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% atrašanās vieta, no kuras instalēt
options = weboptions ('CertificateFilename', ''); % liek tai ignorēt sertifikātu prasības
serveris = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomba instalēšana/atjaunināšana';
% displeja mērķis un saņemt apstiprinājumu
uzvedne = {
"Šī programma lejupielādēs šos EF 230 Roomba failus:"
''
strjoin (faili, "")
''
"uz šo mapi:"
''
cd
''
'Vai vēlaties turpināt? '
};
pīkstiens;
yn = questdlg (uzvedne,…
dlgTitle,…
“Jā”, “Nē”, “Jā”);
ja ~ strcmp (yn, 'Jā'), atgriezties; beigas
% get esošo failu saraksts
esošie_faili = faili (cellfun (@exist, files)> 0);
ja ~ ir tukšs (esošie_faili)
% pārliecinieties, ka ir patiešām labi tos nomainīt
prompt = {'Jūs aizstājat šos failus:'
''
strjoin (esošie_faili, "")
''
'Labi, lai nomainītu?'
};
pīkstiens;
yn = questdlg (uzvedne,…
dlgTitle,…
“Jā”, “Nē”, “Jā”);
ja ~ strcmp (yn, 'Jā'), atgriezties; beigas
beigas
% lejupielādēt failus
cnt = 0;
i = 1: garums (faili)
f = faili {i};
disp (['Lejupielāde' f]);
pamēģini
url = [serveris f];
tīmekļa saglabāšana (f, url, opcijas); % pievienotas iespējas, lai izvairītos no drošības kļūdām
cnt = cnt + 1;
noķert
disp (['Kļūda lejupielādējot' f]);
fiktīvs = [f '.html'];
ja pastāv (fiktīvs, 'fails') == 2
dzēst (fiktīvs)
beigas
beigas
beigas
ja cnt == garums (faili)
msg = 'Instalēšana veiksmīga';
gaidīt (msgbox (msg, dlgTitle));
citādi
msg = 'Instalācijas kļūda - sīkāku informāciju skatīt komandu logā';
waitfor (errordlg (msg, dlgTitle));
beigas
end %roombaInstall
3. darbība: izveidojiet savienojumu ar savu Roomba
Tagad ir pienācis laiks izveidot savienojumu ar savu Roomba, izmantojot WiFi. Izmantojot divus pirkstus, vienlaikus nospiediet dokstacijas un vietas pogas, lai ieslēgtu vai atiestatītu Roomba. Pēc tam MATLAB komandu logā palaidiet kodu r = roomba (# no jūsu Roomba), lai izveidotu savienojumu ar savu robotu. Kad esat izpildījis šo komandu, jūsu Roomba jābūt gatavam darbam.
4. solis: izvēlieties, kā vēlaties kontrolēt savu Roomba
Ir divi veidi, kā kontrolēt savu Roomba: autonomi vai izmantojot viedtālruni kā kontrolieri.
Ja izvēlaties vadīt Roomba autonomi, jums būs jāizmanto trīs iebūvētie sensori: klints sensori, trieciena sensori un gaismas sensori.
Lai izmantotu viedtālruni, vispirms viedtālrunis jāpievieno datoram, veicot tālāk norādītās darbības.
PIEZĪME. Lai pareizi izveidotu savienojumu, jūsu datoram un viedtālrunim jābūt vienā WiFi tīklā!
1. Lejupielādējiet lietotni MATLAB no lietotņu veikala savā ierīcē.
2. Komandu logā ierakstiet "Savienotājs ieslēgts" un iestatiet paroli, kas būs jāievada abās ierīcēs.
3. Pēc tam MATLAB jums piešķirs jūsu datora IP adresi. Viedtālruņa lietotnē MATLAB jāiet uz iestatījumu lapu un jāpievieno dators, izmantojot norādīto IP adresi un iepriekš ievadīto paroli.
4. Datora komandu logā ierakstiet kodu m = mobiledev, un tam vajadzētu inicializēt viedtālruni kā jūsu Roomba kontrolieri.
5. Jūsu datoram un viedtālrunim vajadzētu būt gatavam tūlītējai lietošanai.
5. darbība: brauciet ar savu Roomba
Tagad, kad jums ir visi nepieciešamie rīki, lai izveidotu savu Mars Rover, jūs esat gatavs izveidot savu kodu. Tālāk ir pievienots koda paraugs gan autonomai braukšanai, gan braukšanai ar viedtālruni.
Autonomā braukšana
funkcija Explore_modified (r)
%ievades argumenti: 1 roomba objekts, r
%izejas argumenti: nav
%apraksts:
Funkcija %izmanto bezgalīgu cilpu, lai nodrošinātu autonomu
%robota apkārtnes izpēte.
%
%funciton sniedz arī norādījumus roomba, kā rīkoties
%šādās situācijās: ritenis (-i) zaudē kontaktu ar zemi, an
%objekts tiek atklāts robota priekšā vai uz abām pusēm, un a
%pēkšņs kritums tiek atklāts robota priekšā vai uz abām pusēm.
%
Tipiski norādījumi %ietver kustības komandas, kuru mērķis ir maksimizēt
%izpēti vai izvairīšanos no atklātām briesmām un komandas sazināties
%informācija par robotprogrammatūras atklājumiem (attēli), atrašanās vieta (grafiks), %un norādiet (balasta brīdinājums) ar lietotāju, izmantojot matlab un/vai e -pastu. Vairāki
Baudām tiek pievienotas %skaņas komandas.
%iestatīšanas e -pasta iespējas
pasts = '[email protected]';
parole = 'EF230Roomba';
setpref ('Internets', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internets', 'E -pasts', pasts);
setpref ('Internets', 'SMTP_Lietotājvārds', pasts);
setpref ('Internets', 'SMTP_Password', parole);
rekvizīti = java.lang. System.getProperties;
props.setProperty ('mail.smtp.starttls.enable', 'true');
props.setProperty ('mail.smtp.auth', 'true');
props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');
props.setProperty ('mail.smtp.socketFactory.port', '465');
% r = roomba (19)
r.pīkstiens ('G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C1 ^^, C1 ^^, D1 ^^, C1 ^^, D2 ^^, E4 ^^, G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C2 ^^, E1 ^^, E1 ^^, E1 ^^, D1 ^^, C4 ^^ ');
v =.1;
atspoguļot_datums = 2700; %iestatīta klints sensoru atsauces vērtība
lightBumper_datum = 200; %iestatīta gaisma Bufera sensoru atsauces vērtība
poz = [0, 0]; %mainīgais pozīcijas saglabāšanai ar inicializētu nulles punktu
leņķis = 0; %iestatītais atskaites leņķis
netangle = 0; %neto leņķa pārvietojums
i = 2; %iterators rindu pievienošanai pozīcijas krātuves mainīgajam
dist = 0;
r.setDriveVelocity (v, v); %start roomba virzās uz priekšu
kamēr taisnība
Klints = r.getCliffSensors;
Bump = r.getBamperi;
Gaisma = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %rada 1 nejaušu leņķi starp 20 un 60 grādiem. Izmanto, lai novērstu robota iestrēgšanu cilpā
%Ko darīt, ja viens vai vairāki riteņi zaudē kontaktu ar zemi:
%apturēt kustību, nosūtīt brīdinājuma e -pastu ar apkārtnes attēlu, %un jautājiet lietotājam, vai turpināt vai gaidīt palīdzību
ja Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r. apstāties
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
r.pīkstiens ('F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^ ')
img = r.getImage;
imwrite (img, 'iestrēdzis.png');
%--------------------------
imfile = 'iestrēdzis.png';
pozīcija = savepos (pos);
%---------------------------
sendmail (pasts, 'PALĪDZIET!', 'Es esmu iesprostots klintī!', {imfile, position})
list = {'Turpināt', 'Apturēt'};
idx = menu ('Ko man darīt?', saraksts);
ja idx == 2
pārtraukums
beigas
%Ko darīt, ja robota priekšā tiek atklāts objekts:
%apstāties, pārvietoties atpakaļ, nofotografēt, brīdināt lietotāju par atklājumu
%pa e -pastu, pagriezieties par 90 grādiem un turpiniet pētīt
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r.stop;
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
r.pīkstiens ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')
img = r.getImage;
imwrite (img, 'FrontBump.png')
%--------------------------
imfile = 'FrontBump.png';
pozīcija = savepos (pos);
%---------------------------
sendmail (pasts, “Brīdinājums!”, “Es kaut ko atradu!”, {imfile, position})
leņķis = 90;
netangle = netangle+leņķis;
r.pagrieziena leņķis (leņķis);
r.setDriveVelocity (v, v);
%Ko darīt, ja pa kreisi no robota tiek atklāts objekts:
%apstāties, pagriezties pret objektu, dublēties, fotografēt, brīdināt
%atklāšanas lietotāju, izmantojot e -pastu, pagrieziet par 90 grādiem un turpiniet pētīt
elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Sasist.pa kreisi == 1
r.stop;
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
leņķis = 30;
netangle = netangle+leņķis;
r.pagrieziena leņķis (leņķis);
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
r.pīkstiens ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')
img = r.getImage;
imwrite (img, 'LeftBump.png')
%--------------------------
imfile = 'LeftBump.png';
pozīcija = savepos (pos);
%---------------------------
sendmail (pasts, “Brīdinājums!”, “Es kaut ko atradu!”, {imfile, position})
leņķis = -90;
netangle = netangle+leņķis;
r.pagrieziena leņķis (leņķis);
r.setDriveVelocity (v, v);
%Ko darīt, ja pa labi no robota tiek atklāts objekts:
%apstāties, pagriezties pret objektu, dublēties, fotografēt, brīdināt
%atklāšanas lietotāju, izmantojot e -pastu, pagrieziet par 90 grādiem un turpiniet pētīt
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Sasist.pareizi == 1
r.stop;
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
leņķis = -30;
netangle = netangle+leņķis;
r.pagrieziena leņķis (leņķis);
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
pauze (1,5);
r.pīkstiens ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
pozīcija = savepos (pos);
%---------------------------
sendmail (pasts, 'Brīdinājums!', 'Es kaut ko atradu!', {imfile, position});
leņķis = 90;
netangle = netangle+leņķis;
r.pagrieziena leņķis (leņķis);
r.setDriveVelocity (v, v);
%Ko darīt, ja pa kreisi no robota tiek konstatēta klints:
%apstāties, pārvietoties atpakaļ, pagriezties pa labi, turpināt izpētīt
elseif Klints.pa kreisi <atspoguļot_datums || Cliff.leftFront <atspoguļot_datums
r.stop;
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu
poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu
i = i+1;
leņķis = -RandAngle;
netangle = netangle+leņķis;
r.pagrieziena leņķis (leņķis);
r.setDriveVelocity (v, v);
%Ko darīt, ja pa labi no robota tiek konstatēta klints:
%apstāties, pārvietoties atpakaļ, pagriezties pa kreisi, turpināt izpēti
elseif Cliff.right <atspoguļot_datums || Cliff.rightFront <atspoguļot_datums
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (leņķis); %iegūst x koordinātu
pos (i, 2) = dist * cosd (leņķis); %iegūst y koordinātu
i = i+1;
r.moveDistance (-. 125);
leņķis = RandAngle;
netangle = netangle+leņķis;
r.pagrieziena leņķis (leņķis);
r.setDriveVelocity (v, v);
beigas
beigas
Viedtālruņa kontrolieris
Opcijas = {'Autonoma', 'Manuāla vadība'}
Prompt = menu ('Kā jūs vēlaties vadīt roveri?', Opcijas)
m = mobiledev
r = roomba (19)
ja uzvedne == 1
Izpētīt (r)
citādi
kamēr taisnība
pauze (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Side = PhoneData (3);
ja sāns> 130 || Sānos <-130 %, ja tālrunis ir pagriezts ar seju uz leju, pārtrauciet Roomba un izejas cilpu
r. apstāties
r. pīkstiens ('C, C, C, C')
pārtraukums
elseif Side> 25 && Side <40 %, ja tālrunis ir pagriezts uz sāniem no 25 līdz 40 grādiem, pagriezieties pa kreisi par 5 grādiem
r.pagrieziena leņķis (-5);
elseif sāns> 40 %, ja tālrunis ir pagriezts uz sāniem vairāk par 40 grādiem, pagriezieties pa kreisi par 45 grādiem
r.turnAngle (-45)
elseif Side -40 %, ja tālrunis ir pagriezts uz sāniem starp -25 un -40 grādiem, pagriezieties pa labi par 5 grādiem
r.pagrieziena leņķis (5);
elseif sāns <-40 %, ja tālrunis ir pagriezts uz sāniem mazāk par -40 grādiem, pagriezieties pa kreisi par 45 grādiem
r.turnAngle (45)
beigas
%Ja tālrunis tiek turēts netālu no vertikāles, uzņemiet attēlu un uzzīmējiet to
ja piķis <-60 && attēls <= 9
r.pīkstiens
img = r.getImage;
apakšplāksne (3, 3, attēls)
parādīt (img)
beigas
%virzās uz priekšu un atpakaļ, pamatojoties uz priekšējo un aizmugurējo orientāciju
ja solis> 15 && solis <35 %, ja solis starp 15 un 35 grādiem virzās uz priekšu nelielu attālumu
%pirms pārvietošanas iegūst vieglus bufera datus
litBump = r.getLightBumpers;
ja litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, ja kaut kas atrodas istabas priekšā un trāpīs, ja tas virzās uz priekšu, rada troksni un parāda ziņojumu
r.pīkstiens ('C ^^, F#^, C ^^, F#^')
cits %kustēties
r.moveDistance (.03);
%Iegūstiet bufera datus pēc pārvietošanas
Bump = r.getBamperi;
ja Bump.pareizais == 1 || Sasist.pa kreisi == 1 || Bump.front == 1
r. pīkstiens ('A, C, E')
r.moveDistance (-. 01)
beigas
%iegūst klints sensora datus
Klints = r.getCliffSensors;
ja klints pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē
r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
beigas
beigas
elseif Pitch> 35 %, ja piķis ir lielāks par 35 grādiem, virzieties uz priekšu garāku attālumu
%pirms pārvietošanas iegūst vieglus bufera datus
litBump = r.getLightBumpers;
ja litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, ja kaut kas atrodas istabas priekšā un trāpīs, ja tas virzās uz priekšu, rada troksni un parāda ziņojumu
r.pīkstiens ('C ^^, F#^, C ^^, F#^')
cits %kustēties
r.moveDistance (.3)
%Iegūstiet bufera datus pēc pārvietošanas
Bump = r.getBamperi;
ja Bump.pareizais == 1 || Sasist.pa kreisi == 1 || Bump.front == 1 %, ja kaut ko uzsit, rada troksni, parāda ziņojumu un dublē
r. pīkstiens ('A, C, E')
r.moveDistance (-. 01)
beigas
%iegūst kraujas sensora datus pēc pārvietošanās
Klints = r.getCliffSensors;
ja klints.pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē
r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
beigas
beigas
elseif Pitch -35 %, ja piķis starp -15 un -35 grādiem pārvietojas atpakaļ nelielā attālumā
r.moveDistance (-. 03);
%iegūst kraujas sensora datus pēc pārvietošanās
Klints = r.getCliffSensors;
ja klints pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē
r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
beigas
elseif Pitch -60 %, ja piķis starp -35 un -60 grādiem pārvietojas atpakaļ garāku attālumu
r.moveDistance (-. 3)
%iegūst kraujas sensora datus pēc pārvietošanās
Klints = r.getCliffSensors;
ja klints pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē
r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
beigas
beigas
beigas
beigas
Ieteicams:
Neizmantotā viedtālruņa pārvēršana viedā displejā: 6 soļi (ar attēliem)
Pārvērtiet neizmantoto viedtālruni viedā displejā: Deze apmācība ir pieejama Engels, vai nu Nederlandse versie klik hier. Vai jums ir (vecs) neizmantots viedtālrunis? Pārvērtiet to par viedo displeju, izmantojot Google izklājlapas un kādu pildspalvu un papīru, izpildot šo vienkāršo soli pa solim apmācību. Kad esat pabeidzis
Automātisks lapas pārvēršana: 8 soļi
Automātiskais lapas pārvēršana: pamati: navy = servoyellow = šarnīrsavienojums = PLA vai kaut kas cits - tas ir diezgan pamatjēdziens, un jūs ieliekat salocīto roku zem savas lapas un pēc tam, kad esat pabeidzis lasīt lapu, nospiediet otru roku (plakano) un pāršķirsim lapu
Stepper pārvēršana spēļu kustībās: 4 soļi
Stepper pārveidošana par spēļu kustībām: Ievads Šī ierīce pārvērš kustību no mājās gatavota stepera (soļu mašīnas) par spēles kustību. Tas darbosies jebkurā spēlē, kas saņem ("w") kā kustību uz priekšu. Tas var darboties arī VR spēlēs, ja tās pieņem tastatūras ievadi. Tas droši vien uzvarēja
Pārvēršana no Sabertooth uz RoboClaw motora kontrolieri: 3 soļi
Pārveidošana no Sabertooth uz RoboClaw motora kontrolieri: Sabertooth motoru kontrolieru dimensiju inženierijas līnija un RoboClaw regulatoru BasicMicro līnija ir populāra izvēle sākuma līmeņa robotikas projektiem. Tomēr kontroliera konfigurēšanai tiek izmantotas divas ļoti atšķirīgas sistēmas. Sabs
Jebkura R/C automašīnas pārvēršana Bluetooth lietotnes vadības R/C automašīnā: 9 soļi
Jebkura R/C automašīnas pārvēršana Bluetooth lietotnes vadības R/C automašīnā: Šis projekts parāda darbības, lai parastu tālvadības automašīnu nomainītu uz Bluetooth (BLE) vadības automašīnu, izmantojot Wombatics SAM01 robotikas dēli, lietotni Blynk un MIT App Inventor. ir daudz zemu izmaksu RC automašīnu ar daudzām funkcijām, piemēram, LED lukturiem un