Mundarija:
- 1 -qadam: Materiallaringizni to'plang
- 2 -qadam: MATLAB uchun Roomba asboblar qutilarini yuklab oling
- 3 -qadam: Roomba -ga ulaning
- 4 -qadam: Roomba -ni qanday boshqarishni tanlang
- 5 -qadam: Roomba -ni haydang
Video: Roombani Mars sayyorasiga aylantirish: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:23
1 -qadam: Materiallaringizni to'plang
Loyihani bajarish uchun siz quyidagi materiallarni to'plashingiz kerak bo'ladi.
1 xonali robot
1 ta Raspberry Pi to'plami
1 videokamera
MATLAB -ga kirish
2 -qadam: MATLAB uchun Roomba asboblar qutilarini yuklab oling
Ushbu loyihani bajarish uchun kerakli asboblar qutilarini o'rnatish uchun quyidagi kodni ishga tushiring.
roombaInstall funksiyasi
clc;
% o'rnatiladigan fayllar ro'yxati
fayllar = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% joylashuvi
variantlar = weboptions ('CertificateFilename', ''); % sertifikat talablarini e'tiborsiz qoldirishni aytadi
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomba o'rnatish/yangilash';
% ko'rsatish maqsadi va tasdiqni oling
taklif = {
'Bu dastur EF 230 Roomba fayllarini yuklaydi:'
''
strjoin (fayllar, '')
''
'bu papkaga:'
''
CD
''
'Davom etishni xohlaysizmi? '
};
ovozli signal;
yn = questdlg (tezkor,…
dlgTitle,…
"Ha", "Yo'q", "Ha");
if ~ strcmp (yn, 'Ha'), qaytish; oxiri
% mavjud fayllar ro'yxatini oladi
mavjud_files = fayllar (cellfun (@exist, files)> 0);
if ~ isempty (mavjud_fayllar)
% ularni almashtirish haqiqatan ham to'g'ri ekanligiga ishonch hosil qiling
prompt = {'Siz bu fayllarni almashtiryapsiz:'
''
strjoin (mavjud_fayllar, '')
''
'O'zgartirish yaxshimi?'
};
ovozli signal;
yn = questdlg (tezkor,…
dlgTitle,…
"Ha", "Yo'q", "Ha");
if ~ strcmp (yn, 'Ha'), qaytish; oxiri
oxiri
% fayllarni yuklab oladi
cnt = 0;
i = 1 uchun: uzunlik (fayllar)
f = fayllar {i};
disp (['Yuklanmoqda' f]);
harakat qilib ko'ring
url = [server f];
veb -saqlash (f, url, variantlar); % xavfsizlik xatolarining oldini olish uchun variantlarni qo'shdi
cnt = cnt + 1;
tutmoq
disp (['Yuklab olishda xatolik' f]);
qo'g'irchoq = [f '.html'];
agar mavjud bo'lsa (qo'g'irchoq, 'fayl') == 2
o'chirish (qo'g'irchoq)
oxiri
oxiri
oxiri
agar cnt == uzunligi (fayllar)
msg = 'O'rnatish muvaffaqiyatli bo'ldi';
kutish (msgbox (msg, dlgTitle));
boshqa
msg = 'O'rnatish xatosi - tafsilotlar uchun buyruq oynasiga qarang';
kutish (errordlg (msg, dlgTitle));
oxiri
end %roombaInstall
3 -qadam: Roomba -ga ulaning
Endi Wi -Fi orqali Roomba -ga ulanish vaqti keldi. Roomba -ni yoqish yoki tiklash uchun 2 barmog'ingiz bilan Dock va Spot tugmalarini bir vaqtning o'zida bosing. Keyin, robotingizga ulanish uchun MATLAB buyruqlar oynasida r = roomba (Roomba raqamingiz) kodini ishga tushiring. Siz ushbu buyruqni bajarganingizdan so'ng, Roomba ishga tayyor bo'lishi kerak.
4 -qadam: Roomba -ni qanday boshqarishni tanlang
Roomba -ni boshqarishning ikkita usuli bor: avtonom yoki smartfonni boshqaruvchi sifatida ishlatish.
Agar siz Roomba-ni avtonom boshqarishni tanlasangiz, siz uchta o'rnatilgan sensorlardan foydalanishingiz kerak bo'ladi: jarlik, zarba va yorug'lik sezgichlari.
Smartfondan foydalanish uchun avval quyidagi amallarni bajarib, smartfonni kompyuterga ulash lozim.
DIQQAT: To'g'ri ulanish uchun sizning kompyuteringiz va smartfoningiz bitta Wi -Fi tarmog'ida bo'lishi kerak!
1. Qurilmangizdagi ilovalar do'konidan MATLAB ilovasini yuklab oling.
2. Buyruqlar oynasiga "ulagich yoqilgan" yozing va ikkala qurilmaga kiritilishi kerak bo'lgan parolni o'rnating.
3. Buni qilganingizdan so'ng, MATLAB sizga kompyuteringizning IP -manzilini beradi. Siz smartfoningizdagi MATLAB ilovasidagi sozlash sahifasiga kirishingiz va berilgan IP -manzil va avval kiritgan parolingiz yordamida kompyuter qo'shishingiz kerak.
4. Kompyuteringizning buyruqlar oynasida m = mobiledev kodini kiriting va bu sizning smartfoningizni Roomba -ni boshqaruvchi sifatida ishga tushirishi kerak.
5. Sizning kompyuteringiz va smartfoningiz hozir ishga tayyor bo'lishi kerak.
5 -qadam: Roomba -ni haydang
Endi sizda Mars Rover -ni yaratish uchun barcha kerakli vositalar mavjud, siz o'z kodingizni yaratishga tayyormiz. Biz avtonom haydash uchun ham, smartfon boshqariladigan haydash uchun ham misol kodini biriktirdik.
Avtonom haydash
Explor_modified funktsiyasi (r)
%kiritish argumentlari: 1 roomba obyekti, r
%chiqish argumentlari: yo'q
%tavsifi:
%funktsiyasi avtonomga ruxsat berish uchun cheksiz while loopidan foydalanadi
%bot atrofini o'rganish.
%
%funciton shuningdek, Roomba -ga nima qilish kerakligi haqida ko'rsatma beradi
%quyidagi holatlar: g'ildirak (lar) ning er bilan aloqasi yo'qoladi
%obyekti bot oldida yoki uning yon tomonida aniqlanadi va a
botning oldida yoki yon tomonida %to'satdan pasayish aniqlanadi.
%
%odatdagi ko'rsatmalarni maksimal darajada oshirish uchun mo'ljallangan harakat buyruqlari kiradi
%tadqiqot yoki aniqlangan xavfdan qochish va muloqot qilish buyruqlari
botlarning kashfiyotlari haqida %ma'lumot (rasmlar), pozitsiya (grafik), Matlab va/yoki elektron pochta orqali foydalanuvchi bilan %va davlat (yopiq ogohlantirish). Bir nechta
zavqlanish uchun %ovozli buyruqlar qo'shiladi.
%elektron pochta imkoniyatlarini sozlash
pochta = '[email protected]';
parol = 'EF230Roomba';
setpref ("Internet", "SMTP_Server", "smtp.gmail.com");
setpref ("Internet", "E_mail", pochta);
setpref ("Internet", "SMTP_Username", pochta);
setpref ("Internet", "SMTP_Password", parol);
rekvizitlar = java.lang. System.getProperties;
props.setProperty ('mail.smtp.starttls.enable', 'rost');
props.setProperty ('mail.smtp.auth', 'rost');
props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');
props.setProperty ('mail.smtp.socketFactory.port', '465');
% r = xona (19)
r.beep ('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;
aks_datum = 2700; %o'rnatilgan jarlik sensorlar mos yozuvlar qiymati
yorug'likBumper_datum = 200; %o'rnatilgan yorug'lik Bamper sensorlar mos yozuvlar qiymati
pos = [0, 0]; Ma'lumotni ishga tushirgan holda joylashuvni saqlash uchun %o'zgaruvchi
burchak = 0; mos yozuvlar burchagi %
aniq burchak = 0; %aniq burchak siljishi
i = 2; joylashishni saqlash o'zgaruvchisiga qatorlarni qo'shish uchun %iterator
dist = 0;
r.setDriveVelocity (v, v); %Roomba oldinga siljishni boshlang
rost bo'lsa ham
Cliff = r.getCliffSensors;
Bump = r.getBampers;
Yorug'lik = r.getLightBampers;
RandAngle = randi ([20, 60], 1); %20 dan 60 gradusgacha bo'lgan 1 tasodifiy burchak hosil qiladi. Botning pastadirda qolishini oldini olish uchun ishlatiladi
%Agar bir yoki bir nechta g'ildirak er bilan aloqa qilmasa nima qilish kerak:
%harakatni to'xtating, atrof tasviri bilan ogohlantiruvchi elektron pochta xabarini yuboring, %va foydalanuvchidan davom etishini yoki yordam kutishini so'rang
agar Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
r.beep ('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, 'stuck.png');
%--------------------------
imfile = 'stuck.png';
pozitsiya = saqlash joylari (pos);
%---------------------------
sendmail (pochta, 'YARDIM!', 'Men qoyada qolib ketdim!', {imfile, pozitsiya})
list = {'Davom etish', 'To'xtatish'};
idx = menyu ('Nima qilishim kerak?', ro'yxat);
agar idx == 2 bo'lsa
tanaffus
oxiri
%Agar bot oldida ob'ekt aniqlansa nima qilish kerak:
%to'xtating, orqaga qayting, rasmga oling, foydalanuvchini kashfiyot haqida ogohlantiring
%elektron pochta orqali, 90 gradusga buriling va o'rganishni davom eting
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
r.beep ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')
img = r.getImage;
imwrite (img, 'FrontBump.png')
%--------------------------
imfile = 'FrontBump.png';
pozitsiya = saqlash joylari (pos);
%---------------------------
sendmail (pochta, "Ogohlantirish!", "Men nimadir topdim!", {imfile, position})
burchak = 90;
to'r burchak = to'r+burchak;
r.turnAngle (burchak);
r.setDriveVelocity (v, v);
%Botning chap tomonida ob'ekt aniqlansa nima qilish kerak:
%to'xtating, ob'ekt tomon buriling, zaxira qiling, rasmga oling, ogohlantiring
Elektron pochta orqali kashfiyotning %foydalanuvchisi, 90 gradusga burilib, o'rganishda davom eting
elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
burchak = 30;
to'r burchak = to'r+burchak;
r.turnAngle (burchak);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
r.beep ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')
img = r.getImage;
imwrite (img, 'LeftBump.png')
%--------------------------
imfile = 'LeftBump.png';
pozitsiya = saqlash joylari (pos);
%---------------------------
sendmail (pochta, "Ogohlantirish!", "Men nimadir topdim!", {imfile, position})
burchak = -90;
to'r burchak = to'r+burchak;
r.turnAngle (burchak);
r.setDriveVelocity (v, v);
%Agar ob'ekt botning o'ng tomonida aniqlansa nima qilish kerak:
%to'xtating, ob'ekt tomon buriling, zaxira qiling, rasmga oling, ogohlantiring
Elektron pochta orqali kashfiyotning %foydalanuvchisi, 90 gradusga burilib, o'rganishda davom eting
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
burchak = -30;
to'r burchak = to'r+burchak;
r.turnAngle (burchak);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
pauza (1,5);
r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
pozitsiya = saqlash joylari (pos);
%---------------------------
sendmail (pochta, 'Ogohlantirish!', 'Men nimadir topdim!', {imfile, position});
burchak = 90;
to'r burchak = to'r+burchak;
r.turnAngle (burchak);
r.setDriveVelocity (v, v);
%Botning chap tomonida jarlik aniqlansa nima qilish kerak:
%to'xtang, orqaga o'ting, o'ngga buriling, o'rganishni davom ettiring
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x koordinatasini oladi
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %y koordinatasini oladi
i = i+1;
burchak = -RandAngle;
to'r burchak = to'r+burchak;
r.turnAngle (burchak);
r.setDriveVelocity (v, v);
%Botning o'ng tomonida jarlik aniqlansa nima qilish kerak:
%to'xtang, orqaga o'ting, chapga buriling, o'rganishni davom ettiring
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (burchak); %x koordinatasini oladi
pos (i, 2) = dist * cosd (burchak); %y koordinatasini oladi
i = i+1;
r.moveDistance (-. 125);
burchak = RandAngle;
to'r burchak = to'r+burchak;
r.turnAngle (burchak);
r.setDriveVelocity (v, v);
oxiri
oxiri
Smartfon boshqaruvchisi
Variantlar = {'Avtonom', 'Qo'lda boshqarish'}
Prompt = menyu ('Roverni qanday boshqarishni xohlaysiz?', Tanlovlar)
m = mobil
r = xona (19)
agar so'rov == 1 bo'lsa
O'rganish (r)
boshqa
rost bo'lsa ham
pauza (.5)
PhoneData = m yo'nalishi;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Yon = PhoneData (3);
agar Side> 130 || Yon <-130 %, agar telefon pastga qaragan bo'lsa, xonani to'xtating va pastadirdan chiqing
r.stop
r.beep ('C, C, C, C')
tanaffus
elseif Side> 25 && Side <40 %, agar telefon 25 dan 40 darajagacha yon tomonga burilsa, 5 gradus chapga buriladi
r.turnAngle (-5);
elseif Yon> 40 %, agar telefon 40 gradusdan yuqori tomonga burilsa, chapga 45 gradus buriladi
r.turnAngle (-45)
elseif Yon -40 %, agar telefon -25 dan -40 darajagacha yon tomonga burilsa, o'ngga 5 gradusga buriladi
r.turnAngle (5);
elseif Yon <-40 %, agar telefon -40 darajadan pastroqqa burilsa, chapga 45 gradus buriladi
r.turnAngle (45)
oxiri
%Agar telefon vertikal yonida bo'lsa, tasvirni oling va uni tuzing
agar Pitch <-60 && image <= 9
r. ovozli ovoz
img = r.getImage;
kichik reja (3, 3, rasm)
imshow (img)
oxiri
%old va orqa yo'nalishga qarab oldinga va orqaga siljiydi
agar Pitch> 15 && Pitch <35 %, agar 15 dan 35 gradusgacha bo'lgan qadam qisqa masofaga oldinga siljiydi
%ko'chishdan oldin engil bamper ma'lumotlarini oladi
litBump = r.getLightBampers;
agar litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, agar biror narsa xonaning oldida bo'lsa va u oldinga siljiganida uriladi, shovqin va xabarni ko'rsatish
r.beep ('C ^^, F#^, C ^^, F#^')
boshqa %harakatlaning
r.moveDistance (.03);
Ko'chib o'tgandan keyin bamper ma'lumotlarini oling
Bump = r.getBampers;
agar Bump.right == 1 || Bump.left == 1 || Bump.front == 1
r. ovozli signal ('A, C, E')
r.moveDistance (-. 01)
oxiri
%jarlik sensori ma'lumotlarini oladi
Cliff = r.getCliffSensors;
agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
oxiri
oxiri
Boshqa pitch> 35 %, agar balandligi 35 daraja bo'lsa, uzoqroq masofaga oldinga siljiydi
%ko'chishdan oldin engil bamper ma'lumotlarini oladi
litBump = r.getLightBampers;
agar litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, agar biror narsa xonaning oldida bo'lsa va u oldinga siljiydigan bo'lsa, u uriladi va xabarni ko'rsatadi
r.beep ('C ^^, F#^, C ^^, F#^')
boshqa %harakatlaning
r.moveDistance (.3)
Ko'chib o'tgandan keyin bamper ma'lumotlarini oling
Bump = r.getBampers;
agar Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, agar biror narsaga tegsa, shovqin, xabarni ko'rsatish va zaxiralash
r. ovozli signal ('A, C, E')
r.moveDistance (-. 01)
oxiri
%harakatdan keyin jarlik sensori ma'lumotlarini oladi
Cliff = r.getCliffSensors;
agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
oxiri
oxiri
elseif Pitch -35 %, agar -15 dan -35 gradusgacha bo'lgan masofa qisqa masofaga orqaga qaytsa
r.moveDistance (-. 03);
%harakatdan keyin jarlik sensori ma'lumotlarini oladi
Cliff = r.getCliffSensors;
agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
oxiri
elseif Pitch -60 %, agar -35 dan -60 gradusgacha bo'lgan masofa uzoqroq masofaga qaytsa
r.moveDistance (-. 3)
%harakatdan keyin jarlik sensori ma'lumotlarini oladi
Cliff = r.getCliffSensors;
agar Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, agar biror narsa jarlik sezgichini ishga tushirsa, uni lava va zaxira sifatida ko'rib chiqing
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
oxiri
oxiri
oxiri
oxiri
Tavsiya:
FuseLight: Eski/eritish naychasini studiyaga/ziyofatga aylantirish: 3 qadam (rasmlar bilan)
FuseLight: Eski/eritish naychasini studiyaga/ziyofatga aylantiring: Bu erda men bir necha asosiy vositalar, rgb chiroqlar va 3D bosib chiqarish yordamida birlashtirilgan nurli yoritgichni studiya/qismli nurga aylantirdim
230V AC lampochkasini USB quvvatiga aylantirish: 6 qadam (rasmlar bilan)
230V kuchlanishli AC lampochkasini USB quvvatiga aylantirish !: Men eBay-da yonib turadigan va yonib turadigan nozik animatsiyali olovli lampochkalarga duch keldim. Ular odatda 85-265V kuchlanishli AC tarmog'idan ishlaydi, lekin portativ ilovalar uchun. soxta olovli mash'ala yoki chiroq, bu ideal emas, men o'zgartiraman
Boshqa 3D bosma aylantirish tugmasi: 7 qadam (rasmlar bilan)
Yana 3D -bosma rotatorli kalit: Men bir muddat oldin, asosan, Minivac 601 Replica loyihasi uchun asosan 3D bosilgan aylanadigan kalitni yaratdim. "Think-a-Tron 2020" yangi loyiham uchun men o'zimni boshqa aylantirgichga muhtojman. Men SP5T paneli o'rnatish kalitini qidiraman. Qo'shiq
Lcd monitorni aylantirish yoki aylantirish: 6 qadam
Lcd monitorni aylantirish yoki aylantirish: bu moslama hujjatlarni portret tarzda o'qilishini ko'rish uchun monitorni 90 daraja burish uchun juda foydalidir, bu rejimlarni qo'llab -quvvatlaydigan video karta drayverlari bor, men buni pdf fayllarini o'qish uchun ishlataman
Zerikarli aylantirish g'ildiragi Eliminatorni bosing (silliq aylantirish): 5 qadam
Zerikarli aylantirish g'ildiragi Eliminator -ni bosing (silliq aylantirish): aylantirish g'ildiragining ovozidan bezovta bo'lasizmi? Mana, bu sichqonchani bu varaqdan chiqarib olish imkoniyati! Agar sichqonchani sindirib qo'ysang, bu mening aybim emas. Men bu modani logitech sichqonchasi bilan qilaman. Ishonchim komilki, u boshqa sichqonchada ishlaydi