Кодты іздеу

Сабақ 29/31: Car-7 SunFounder Smart Car басқару пульті арқылы басқару | Robojax

Бұл сабақтың бөлігі: Arduino Course based on SunFounder's 3-in-1 Learning Kit

Сабақ 29/31: Car-7 SunFounder Smart Car басқару пульті арқылы басқару | Robojax

Бұл сабақта біз SunFounder смарт көлігіңізді инфрақызыл (ИҚ) пульт арқылы қашықтан басқарылатын көлікке айналдырамыз. Сымды қосылымға немесе смартфон қолданбасына сүйенудің орнына, стандартты ИҚ пульттегі түймелерді көліктің қозғалысын басқаруға—алға, артқа, бұрылуға, тіпті диагональды маневрлерге—сонымен қатар жылдамдығын сол сәтте реттеуге қалай байланыстыруды үйренесіз. Бұл жоба моторды басқару және ИҚ байланыс негіздерін үйренгеннен кейінгі тамаша келесі қадам, өйткені ол екеуін бір интерактивті жүйеге біріктіреді.

Мұндағы нақты әлемдік құндылық робототехника платформасы үшін сенімді, пайдаланушыға ыңғайлы басқару интерфейсін құруды түсінуде жатыр. Сіз үйренетін принциптер кең ауқымды жобаларға тікелей қолданылады, мысалы:

  • Үй автоматтандыру тапсырмаларына арналған қашықтан басқарылатын робот құру, мысалы, шағын жеткізу боты.
  • Білім беру робототехника жарыстарына арналған бағдарламаланатын көлік жасау.
  • Камера слайдері немесе панорамалық-көлбеу механизмі үшін арнайы қашықтан басқару пультін әзірлеу.
  • Үлкенірек, күрделірек автоматтандырылған жүйе үшін пайдаланушы интерфейсінің прототипін жасау.

Аппараттық құралдар мен компоненттер

Бұл жоба SunFounder 3-і-1 Arduino жинағына негізделген. Орындау үшін сізге төменде көрсетілген компоненттер қажет болады. Сым қосылымдары қарапайым және курстың алдыңғы сабақтарынан жалғасады.

  • SunFounder 3-і-1 Arduino жинағы: Бұл смарт көлік шассиін, мотор драйвер тақтасын және Arduino тақтасын қамтиды.
  • Инфрақызыл қашықтан басқару пульті: Жинақпен бірге келетін стандартты пульт.
  • ИҚ қабылдағыш модулі: Пульттен келетін сигналдарды декодтайтын сенсор.
  • Жарықдиод және 330 Ом резистор: Перненің басылғанын растау үшін көрнекі индикатор ретінде қолданылады. (бейнеде 04:08)
  • Жалғау сымдары: Макет тақтасында қажетті қосылымдарды жасау үшін.

Сым қосылым нұсқаулығы

car_9_lesson_29_wriing_for_IR

Кодқа кіріспес бұрын, аппараттық құралдардың дұрыс қосылғанына көз жеткізейік. ИҚ қабылдағыш пен мотор драйверінің сым қосылымдары осы сериядағы алдыңғы сабақтармен сәйкес келеді. Жобаны интерактивті ету үшін біз 13-пинге сыртқы жарықдиодты көрнекі кері байланыс индикаторы ретінде қосамыз.

Міне, қосылымдарға арналған қадамдық нұсқаулық:

  1. ИҚ қабылдағыш: ИҚ қабылдағыштың үш пині бар. Оң пині макет тақтасындағы 5V шинасына қосылады. Жер пині GND шинасына қосылады. Сигнал пині, яғни соңғы пин, Arduino тақтаңыздағы 11-цифрлық пинге қосылады. (бейнеде 05:29)
  2. Сыртқы жарықдиод: 330 Ом резистордың бір ұшын Arduino-дағы 13-цифрлық пинге қосыңыз. Резистордың екінші ұшын жарықдиодтың ұзын (анод) ұшына қосыңыз. Жарықдиодтың қысқа (катод) ұшы макет тақтасындағы GND шинасына қосылуы керек. (бейнеде 04:08)
  3. Мотор драйвері: Мотор драйверінің төрт пині (A_1B, A_1A, B_1B, B_1A) сәйкесінше Arduino-дағы 5, 6, 9 және 10 пиндеріне қосылады. Бұл орнату алдыңғы сабақтарда қарастырылған. (бейнеде 06:44)

Осы қосылымдардың көрнекі анықтамасы үшін төмендегі сым қосылым диаграммасын қараңыз.

Код түсіндірмесі

Бұл жобаның коды интуитивті болуға арналған. Ол ИҚ сигналдарды декодтаудың күрделі тапсырмасын орындау үшін IRremote кітапханасын пайдаланады. Өз жобаларыңыз үшін реттегіңіз келетін пайдаланушы конфигурациялайтын бөліктерді қарастырайық.

Эскиздің жоғарғы жағында пин анықтамаларын табасыз. Егер компоненттеріңізді осы мысалда қолданылғаннан басқа пиндерге қосқан болсаңыз, бұл бірінші тексеру керек нәрселер.

const int IR_RECEIVE_PIN = 12;  // ИҚ сенсоры үшін пин нөмірін анықтаңыз
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
  • IR_RECEIVE_PIN: Бұл тұрақты ИҚ қабылдағыштың сигнал пиніне қосылған цифрлық пинді анықтайды. Егер оны басқа пинге қосқан болсаңыз, осындағы нөмірді өзгертесіз.
  • A_1B, A_1A, B_1B, B_1A: Бұл тұрақтылар мотор драйверіңіздегі төрт басқару пиніне сәйкес келеді. Олар сол және оң моторлардың жылдамдығы мен бағытын басқарады.

Әрі қарай, көліктің мінез-құлқын басқаратын маңызды айнымалыны табасыз.

int speed = 150;
  • speed: Бұл айнымалы көліктің бастапқы жылдамдығын орнатады. Мән 0-ден 255-ке дейін болуы мүмкін. Бұл жобада оны пульттегі "+" және "-" пернелері арқылы өзгертуге болады. Код сонымен қатар жылдамдықтың 255-тен асуына немесе 0-ден төмен түсуіне жол бермейтін логиканы қамтиды. (бейнеде 09:22)

Қашықтан басқарудың негізгі логикасы loop() функциясында өңделеді. Перне басылғанда, decodeKeyValue() функциясы шикі ИҚ кодты алға жүру үшін "2" немесе жылдамдықты арттыру үшін "+" сияқты қарапайым жолға аударады. Бұл келесі if операторларын оқу мен өзгертуді өте оңай етеді. (бейнеде 07:58)

moveForward(), turnRight() және moveLeft() сияқты арнайы функциялар моторды басқару орындалатын жер болып табылады. Әрбір функция ағымдағы speed мәнін аргумент ретінде қабылдайды. Мысалы, moveForward(speed) екі моторды да көрсетілген жылдамдықпен алға қарай жүргізеді. "Бұрылыс" пен "қозғалыс" арасындағы негізгі айырмашылық - бұрылыс кезінде екі дөңгелек те қарама-қарсы бағытта айналады, бұл көліктің орнында айналуына әкеледі, ал қозғалыс кезінде тек бір дөңгелек айналады, бұл көліктің қозғалмайтын дөңгелектің айналасында доға жасап жүруіне әкеледі. (бейнеде 10:14)

Тірі Жобаны Көрсету

Код жүктелгеннен және көлік қосылғаннан кейін қашықтан басқару пульті сіздің негізгі интерфейсіңізге айналады. Бейнедегі көрсетілім бірнеше негізгі әрекеттерді ерекшелейді:

  • Жылдамдықты Басқару: "+" пернесін басу жылдамдықты 50-ге арттырады, ал "-" пернесі оны азайтады. Жылдамдық моторларды қорғау үшін 255-пен шектеледі және 0-ге дейін төмендейді. (бейнеде 11:56)
  • Қысқа Мерзімді Қозғалыс: "2" (алға) немесе "8" (артқа) сияқты бағыт пернесін басқанда, көлік бір секунд қозғалады, содан кейін автоматты түрде тоқтайды. Бұл кодқа енгізілген қауіпсіздік функциясы. (бейнеде 13:09)
  • Бұрылу және Маневрлеу: Пульттегі крест тәрізді орналасқан пернелер джойстик сияқты жұмыс істейді. "4" немесе "6" пернелерін басу көлікті орнында солға немесе оңға бұрады. "1" немесе "3" сияқты диагональды пернелерді басу "солға жылжу" немесе "оңға жылжу" әрекетін орындайды, бұл бір дөңгелек қозғалмайтын өткір бұрылыс. (бейнеде 16:42)

Сіз байқайтын бір нәрсе - көлік әрқашан мінсіз түзу сызықпен жүрмейді. Бұл көбінесе моторлардағы шамалы айырмашылықтарға немесе көлік құрастыруының керілуіне байланысты, бұл осы жинақтардың жалпы және қалыпты сипаттамасы. (бейнеде 15:14)

Бөлімдер

  • [00:00] Ақылды көлікке арналған ИК қашықтан басқару пультіне кіріспе
  • [01:15] Алғышарттар және қажетті алдыңғы сабақтар
  • [01:56] Жоба құжаттамасына шолу
  • [02:29] Қашықтан басқару пультінің перне функцияларын түсіну
  • [03:29] ИК қабылдағыш пен ЖЭД қосуға арналған қадамдық нұсқаулық
  • [05:51] Жоба кодын ашу және жүктеу
  • [07:41] Кодты түсіндіру: Цикл, пернені декодтау және әрекеттер
  • [09:22] Кодтағы жылдамдықты шектеу және қауіпсіздік функциялары
  • [10:08] Мотор қозғалыс функцияларын түсіндіру
  • [11:49] Тірі көрсетілім: Жылдамдықты басқаруды және ЖЭД жыпылықтауын тексеру
  • [13:27] Тірі көрсетілім: Алға, артқа және бұрылу
  • [14:31] Қуат пен қозғалыспен толық көлік көрсетілімі

Суреттер

Car 9 lesson 29 wiring for IR
Car 9 lesson 29 wiring for IR
896-Lesson 29/31: Car-7 Controlling SunFounder Smart Car using Remote Controller
Тіл: C++
/*
Lesson 29/31: Car-7 Controlling SunFounder Smart Car using Remote Controller
Get this code and watch video Download and resource page https://robojax.com/RJT612

*/
#include <IRremote.h>

const int IR_RECEIVE_PIN = 12;  // Define the pin number for the IR Sensor

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;


int speed = 150;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //IR remote
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the IR receiver // Start the receiver
  Serial.println("REMOTE CONTROL START");

}

void loop() {

  if (IrReceiver.decode()) {
    //    Serial.println(results.value,HEX);
    String key = decodeKeyValue(IrReceiver.decodedIRData.command);
    if (key != "ERROR") {
      Serial.println(key);

      if (key == "+") {
        speed += 50;
      } else if (key == "-") {
        speed -= 50;
      } else if (key == "2") {
        moveForward(speed);
        delay(1000);
      } else if (key == "1") {
        moveLeft(speed);
      } else if (key == "3") {
        moveRight(speed);
      } else if (key == "4") {
        turnLeft(speed);
      } else if (key == "6") {
        turnRight(speed);
      } else if (key == "7") {
        backLeft(speed);
      } else if (key == "9") {
        backRight(speed);
      } else if (key == "8") {
        moveBackward(speed);
        delay(1000);
      }

      if (speed >= 255) {
        speed = 255;
      }
      if (speed <= 0) {
        speed = 0;
      }
      delay(500);
      stopMove();
    }

    IrReceiver.resume();  // Enable receiving of the next value
  }
}

void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void turnRight(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void turnLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void moveLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void moveRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}


String decodeKeyValue(long result)
{
  switch(result){
    case 0x16:
      return "0";
    case 0xC:
      return "1"; 
    case 0x18:
      return "2"; 
    case 0x5E:
      return "3"; 
    case 0x8:
      return "4"; 
    case 0x1C:
      return "5"; 
    case 0x5A:
      return "6"; 
    case 0x42:
      return "7"; 
    case 0x52:
      return "8"; 
    case 0x4A:
      return "9"; 
    case 0x9:
      return "+"; 
    case 0x15:
      return "-"; 
    case 0x7:
      return "EQ"; 
    case 0xD:
      return "U/SD";
    case 0x19:
      return "CYCLE";         
    case 0x44:
      return "PLAY/PAUSE";   
    case 0x43:
      return "FORWARD";   
    case 0x40:
      return "BACKWARD";   
    case 0x45:
      return "POWER";   
    case 0x47:
      return "MUTE";   
    case 0x46:
      return "MODE";       
    case 0x0:
      return "ERROR";   
    default :
      return "ERROR";
    }
}

Сізге қажет болуы мүмкін нәрселер

Ресурстар мен сілтемелер

Файлдар📁

Arduino кітапханалары (zip)