|
Mavzu16. Robotni harakatga keltirish dasturi. C++da robotni Arduinodagi kontroleriga dasturni yozib uni harakatga keltirish
|
bet | 122/135 | Sana | 22.05.2024 | Hajmi | 15,08 Mb. | | #250347 |
Bog'liq Fizik jarayonlarni kompyuterda modellashtirishMavzu16. Robotni harakatga keltirish dasturi. C++da robotni Arduinodagi kontroleriga dasturni yozib uni harakatga keltirish:
Fizik jarayonlarni modellashtirishda robotni harakatga keltirishda C++da dastur yozib, uni kontrollerga terilsa, robot harakatga keladi.
Rasm 61. Robotni harakati.
Dasturi quyidagicha:
LineRobot_v1.ino
// Motorlar M1+,M1-,M2+,M2- klemmalarga ulanadi
// Motor 6,5,7,4 to’rtta kontaktni ishlatadi
#define SPEED_LEFT 6
#define SPEED_RIGHT 5
#define DIR_LEFT 7
#define DIR_RIGHT 4
#define LEFT_SENSOR_PIN 8
#define RIGHT_SENSOR_PIN 9
// Biz oldinga harakat qiladigan tezlik (0-255)
Raqibni bir-ikki soniya mag'lub etishdan yaxshiroq narsa yo'q.
#define SPEED 35
// Necha marta beriladigan koeffitsientni necha marta tormozlash kerak
Burish uchun g’ildiraklardan birini
#define BRAKE_K 4
#define STATE_FORWARD 0
#define STATE_RIGHT 1
#define STATE_LEFT 2
int state = STATE_FORWARD;
void runForward()
{
state = STATE_FORWARD;
// Tezlikni tug’irlash uchun `SPEED` tezligini regulyatsiya qilish uchun 0 до 255,gacha qiymatlarni qo’llash mumkin
// qancha tez bo’lsa shuncha yahshi.
analogWrite(SPEED_LEFT, SPEED);
analogWrite(SPEED_RIGHT, SPEED);
// Agar DIR_LEFT yoki DIR_RIGHTda HIGH ni yozsak, motor unga mos g’ildirakni harakatga keltiradi
// oldinga, если LOW - orqaga.
digitalWrite(DIR_LEFT, HIGH);
digitalWrite(DIR_RIGHT, HIGH);
}
void steerRight()
{
state = STATE_RIGHT;
// chap g’ildirak hisobiga o’ngini ishini sekinlashtiramiz,
// bu burishni amalga oshirish uchun zarur
analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
analogWrite(SPEED_LEFT, SPEED);
digitalWrite(DIR_LEFT, HIGH);
digitalWrite(DIR_RIGHT, HIGH);
}
void steerLeft()
{
state = STATE_LEFT;
analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
analogWrite(SPEED_RIGHT, SPEED);
digitalWrite(DIR_LEFT, HIGH);
digitalWrite(DIR_RIGHT, HIGH);
}
void setup()
{
//P;ataning 4,5,6,7 chiqishlarini signallar chiqishiga sozlaymiz
for(int i = 4; i <= 7; i++)
pinMode(i, OUTPUT);
// Oldinga darrov boramiz
runForward();
}
void loop()
{
// Robotimiz oq maydon orqali qora trek bilan yuradi. Teskari holda keragi yo’q
// datchiklardan qiymatni invariantalashtirish zarur
boolean left = !digitalRead(LEFT_SENSOR_PIN);
boolean right = !digitalRead(RIGHT_SENSOR_PIN);
// Qaqysi holga o’tish kerak?
int targetState;
if (left == right) {
// sensorlar tagida hamma narsa oq yoki qora
// oldinga boramiz
targetState = STATE_FORWARD;
} else if (left) {
// chap sensor trekga tirgak sifatioda turadi
// chap tomonga buramiz
targetState = STATE_LEFT;
} else {
targetState = STATE_RIGHT;
}
if (state == targetState) {
// biz nimaiki kerak bo’lsa, shuni qilamiz,
// o’lchovlarni boshqatdan qilamiz
return;
}
switch (targetState) {
case STATE_FORWARD:
runForward();
break;
case STATE_RIGHT:
steerRight();
break;
case STATE_LEFT:
steerLeft();
break;
}
// tog’ri chiziqda qattiq a siljishiga yo’l qo’ymaymiz
delay(50);
}
Birinchi holda, biz haqiqatan ham yo'lning yanada dinamik o'tishi uchun robot tezligini oshiramiz, ikkinchi holda, biz tezlikni muvaffaqiyatli burilish uchun etarli qiymatga tushiramiz va biz bu tezlikni bir muncha vaqt ushlab turamiz. .
Natijada, bizning kodimiz quyidagicha ko'rinadi:
|
|
Bosh sahifa
Aloqalar
Bosh sahifa
Mavzu16. Robotni harakatga keltirish dasturi. C++da robotni Arduinodagi kontroleriga dasturni yozib uni harakatga keltirish
|