H-ko'prikli sxemaning ishlashi - Arduino taraqqiyoti ma’ruza #5 Mavzu: Arduino yordamida motorlarni boshqarish texnologiyalari

uchun yana bir ajoyib imkoniyat . Siz dvigatelni to'xtatish funktsiyasini yozishingiz mumkin ,
bunda u belgilangan
tezlikda oldinga siljiydi, ikkinchisi esa belgilangan tezlikda orqaga
aylanadi . Dvigatel rejimini o'zgartirishdan oldin, funktsiya boshida H-ko'prigini to'g'ri o'chirib
qo'yganingizga ishonch hosil qiling ; bu sizning xato qilish ehtimolini kamaytiradi va tasodifan H-
ko'prigini qisqartiradi.
Yuqoridagi rasmdagi mantiqiy diagrammadan so'ng, kerakli natijalarga erishish uchun pinlarni
qanday boshqarish kerakligini tezda aniqlashingiz mumkin :
■■ Qurilma orqali oqim oqimini to'xtatish uchun yoqish pinini past qilib qo'ying.
■■ Kalitlarni bir tomonga burilishga o'rnatish uchun birini baland, ikkinchisini past qilib qo'ying.
■■ Kalitlarni teskari yo'nalishda aylantirish uchun, baland va pastni almashtiring .
■■ Dvigatel zudlik bilan to'xtab qolishi uchun ikkala kalitni ham pastga qo'ying.
ESLATMA. Kalitlarning holatini o'zgartirmasdan oldin, oqim oqimini har doim o'chirib qo'ying,
shunda kalitlar aylanayotganda bir lahzalik qisqa tutashuvni yaratib bo'lmaydi.
Birinchidan, siz ilgari tasvirlangan harakatlarni xavfsiz bajaradigan funktsiyalarni o'ylab
topishingiz kerak. Yangi Arduino eskizini yarating va yangi funktsiyalarni yozishdan boshlang :
//Motor oldinga harakatlanadi
void forward (int rate)
{
digitalWrite(EN, LOW);
digitalWrite(MC1, HIGH);
digitalWrite(MC2, LOW);
analogWrite(EN, rate);
}
//Motor orqaga harakatlanadi
void reverse (int rate)
{
digitalWrite(EN, LOW);
digitalWrite(MC1, LOW);
digitalWrite(MC2, HIGH);
analogWrite(EN, rate);
//Motor
tormoz
void brake ()
{
digitalWrite(EN, LOW);
digitalWrite(MC1, LOW);
digitalWrite(MC2, LOW);
digitalWrite(EN, HIGH);
}
E'tibor bering, har bir funktsiyaning boshida EN pin har doim past bo'ladi, keyin esa MC1 va MC2
pinlari (Dvigatelni boshqarish pini) o'rnatiladi. Bu bajarilganda, oqim oqimi qayta yoqilishi
mumkin. Tezlikni o'zgartirish uchun avval qilgan texnikadan foydalaning . PWM dan foydalanib,
siz EN pinining almashtiriladigan burchini o'zgartirishingiz va
tezlikni boshqarishingiz
mumkin. Tezlik
o'zgaruvchisi 0
dan
255
gacha bo'lishi
kerak .
Asosiy
tsikl kirish
potentsiometrining ma'lumotlaridan to'g'ri tezlikni yaratishga e'tibor beradi .
Endi, dasturning asosiy tsiklini ko'rib chiqing:
void loop()
{
val = analogRead(POT);
//go forward
if (val > 562)
{
velocity = map(val, 563, 1023, 0, 255);
forward(velocity);
}
//go backward
else if (val < 462)
{
velocity = map(val, 461, 0, 0, 255);
reverse(velocity);
}
//brake
else
{
brake();
}
}
Asosiy tsiklda potentsiometr qiymati o'qiladi va potentsiometr qiymatiga qarab tegishli funktsiyani
chaqirish mumkin. Eslatib o'tamiz, analog kirish 0 dan 1023 gacha raqamli qiymatlarga o'tkaziladi.
Potentsiometr o'rta nuqtani o'rab turgan 100 birlik ichida bo'lsa , tormoz funktsiyasi chaqiriladi.
Potentsiometr qiymati 562 dan 1023 gacha oshishi bilan oldinga tezlik oshadi. Xuddi shunday,
tezlik 462 va 0 potentsiometrlari orasidagi teskari yo'nalishda ortadi. Xarita
funktsiyasi sizga
oldingi bobdan tanish bo'lishi kerak . Bu erda, teskari tezlikni aniqlayotganda, o'zgaruvchilar
tartibiga e'tibor bering: 461 - 0 ga, 0 - 255 ga teng; xarita funktsiyasi o'zgaruvchilar kamayish
tartibida o'tkazilganda xaritani o'zgartirishi mumkin . Loopni funktsiyalar va sozlamalar bilan
birlashtirib, siz Quyidagi kodda ko'rsatilgan dasturga o'xshab tugallangan dasturni olasiz . Sizning
dasturingiz bu yerga mos kelishiga ishonch hosil qiling va uni Arduinoga yuklang .
//Hbridge Motor
kontrol
const int EN=9; //Half Bridge 1 Enable
const int MC1=3; //Motor kontrol 1
const int MC2=2; //Motor kontrol 2
const int POT=0; //POT Analog Pin 0da
int val = 0; // POTdan keluvchi signal qiymatini o’qish uchun
int velocity = 0; //Mo’ljallangan tezlikni to’plash uchun ( 0-255)
void setup()
{
pinMode(EN, OUTPUT);
pinMode(MC1, OUTPUT);
pinMode(MC2, OUTPUT);
brake(); //Motor tormozlangan
holatda boshlash
}
void loop()
{
val = analogRead(POT);
//oldinga
if (val > 562)
{
velocity = map(val, 563, 1023, 0, 255);
forward(velocity);
}
//oldinga
else if (val < 462)
{
velocity = map(val, 461, 0, 0, 255);
reverse(velocity);
}
//tormoz
else
{
brake();
}
}
//Motor goes forward at given rate (from 0-255)
void forward (int rate)
{
digitalWrite(EN, LOW);
digitalWrite(MC1, HIGH);
digitalWrite(MC2, LOW);
analogWrite(EN, rate);
}
//Motor goes backward at given rate (from 0-255)
void reverse (int rate)
{
digitalWrite(EN, LOW);
digitalWrite(MC1, LOW);
digitalWrite(MC2, HIGH);
analogWrite(EN, rate);
}
//Stops motor
void brake ()
{
digitalWrite(EN, LOW);
digitalWrite(MC1, LOW);
digitalWrite(MC2, LOW);
digitalWrite(EN, HIGH);
}
Hammasi kutilganidek ishlayaptimi? Agar yo'q bo'lsa, kontaktlarning to’g’ri ulanganligiga
ishonch hosil qiling. Qo'shimcha qiyinchilik sifatida, ikkinchi o’zgarmas tok motorini oling va uni
H-ko'prik chipining boshqa yarmiga ulang. Siz minimal
harakat bilan bir vaqtning
o'zida ikkita dvigatelni boshqarishingiz mumkin.
Foydalanilgan Adabiyotlar
• Jeremy Blum, “Exploring arduino: Tools and techniques for engineering
wizardry”, 2013
• Electronics: A Systems Approach (6th edition), Neil Storey,Pearson
Education
UK, 2017
• Arduino.cc veb sayti ma’lumotlari