Tafuta Msimbo

Somo la 29/31: Car-7 Kudhibiti Gari la Smart la SunFounder kwa kutumia Kidhibiti cha Mbali | Robojax

Somo la 29/31: Car-7 Kudhibiti Gari la Smart la SunFounder kwa kutumia Kidhibiti cha Mbali | Robojax

Katika somo hili, tutabadilisha gari lako la smart la SunFounder kuwa gari linalodhibitiwa kwa mbali kwa kutumia kidhibiti cha infrared (IR). Badala ya kutegemea muunganisho wa waya au programu ya simu, utajifunza jinsi ya kuweka ramani ya vitufe kwenye kidhibiti cha kawaida cha IR ili kudhibiti mwendo wa gari—mbele, nyuma, kugeuka, na hata mienendo ya mshazari—pamoja na kurekebisha kasi yake papo hapo. Mradi huu ni hatua nzuri inayofuata baada ya kujifunza misingi ya udhibiti wa motor na mawasiliano ya IR, kwani unachanganya yote mawili kuwa mfumo mmoja shirikishi.

Thamani ya ulimwengu halisi hapa iko katika kuelewa jinsi ya kuunda kiolesura thabiti na rahisi cha udhibiti kwa jukwaa la robotiki. Kanuni utakazojifunza zinatumika moja kwa moja kwenye anuwai ya miradi, kama vile:

  • Kujenga roboti inayodhibitiwa kwa mbali kwa kazi za otomatiki za nyumbani, kama bot ndogo ya usafirishaji.
  • Kuunda gari linaloweza kupangwa kwa mashindano ya robotiki ya kielimu.
  • Kutengeneza kidhibiti cha mbali maalum kwa kitelezi cha kamera au mfumo wa pan-tilt.
  • Kutengeneza mfano wa kiolesura cha mtumiaji kwa mfumo mkubwa, mgumu zaidi wa kiotomatiki.

Vifaa na Vipengele

Mradi huu unajengwa juu ya kit cha SunFounder 3-in-1 Arduino. Ili kufuata, utahitaji vipengele vilivyoorodheshwa hapa chini. Uunganishaji wa waya ni rahisi, ukienea kutoka kwenye masomo yaliyopita katika kozi hii.

  • Kit cha SunFounder 3-in-1 Arduino: Hii inajumuisha chasi ya gari la smart, bodi ya kiendeshaji cha motor, na bodi ya Arduino.
  • Kidhibiti cha Infrared Remote: Kidhibiti cha kawaida kinachokuja na kit.
  • Moduli ya Kipokezi cha IR: Sensor inayotafsiri ishara kutoka kwa kidhibiti.
  • LED na Resistor ya 330-ohm: Inatumika kama kiashiria cha kuona kuthibitisha kwamba kitufe kimeshinikizwa. (katika video saa 04:08)
  • Waya za Jumper: Kwa kufanya miunganisho muhimu kwenye bodi ya mkate.

Mwongozo wa Uunganishaji wa Waya

car_9_lesson_29_wriing_for_IR

Kabla ya kuingia kwenye msimbo, hebu tuhakikishe kwamba vifaa vimeunganishwa kwa usahihi. Uunganishaji wa waya wa kipokezi cha IR na kiendeshaji cha motor unalingana na masomo yaliyopita katika mfululizo huu. Ili kufanya mradi huo uwe shirikishi zaidi, pia tutaunganisha LED ya nje kwenye pini 13 kama kiashiria cha maoni ya kuona.

Hapa kuna mwongozo wa hatua kwa hatua wa miunganisho:

  1. Kipokezi cha IR: Kipokezi cha IR kina pini tatu. Pini chanya inaunganishwa kwenye reli ya 5V kwenye bodi ya mkate. Pini ya ardhi inaunganishwa kwenye reli ya GND. Pini ya ishara, ambayo ni pini ya mwisho, inaunganishwa kwenye pini ya dijiti 11 kwenye bodi yako ya Arduino. (katika video saa 05:29)
  2. LED ya Nje: Unganisha mguu mmoja wa resistor ya 330-ohm kwenye pini ya dijiti 13 kwenye Arduino. Unganisha mguu mwingine wa resistor kwenye mguu mrefu (anode) wa LED. Mguu mfupi (cathode) wa LED unapaswa kuunganishwa kwenye reli ya GND kwenye bodi ya mkate. (katika video saa 04:08)
  3. Kiendeshaji cha Motor: Pini nne za kiendeshaji cha motor (A_1B, A_1A, B_1B, B_1A) zinaunganishwa kwenye pini 5, 6, 9, na 10 kwenye Arduino, mtawalia. Mpangilio huu umeshaelezewa katika masomo yaliyopita. (katika video saa 06:44)

Kwa marejeleo ya kuona ya miunganisho hii, tafadhali rejelea mchoro wa uunganishaji hapa chini.

Maelezo ya Msimbo

Msimbo wa mradi huu umeundwa kuwa rahisi kueleweka. Unatumia maktaba ya IRremote kushughulikia kazi ngumu ya kutafsiri ishara za IR. Hebu tuchambue sehemu zinazoweza kubadilishwa na mtumiaji ambazo unaweza kutaka kurekebisha kwa miradi yako mwenyewe.

Juu ya mchoro, utapata ufafanuzi wa pini. Hizi ni vitu vya kwanza unavyopaswa kuangalia ikiwa umeunganisha vipengele vyako kwenye pini tofauti na zile zinazotumiwa katika mfano huu.

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;
  • IR_RECEIVE_PIN: Hii ni mara kwa mara inayofafanua pini ya dijiti iliyounganishwa kwenye pini ya ishara ya kipokezi chako cha IR. Ikiwa umeiunganisha kwenye pini tofauti, ungebadilisha nambari hapa.
  • A_1B, A_1A, B_1B, B_1A: Hizi ni mara kwa mara zinazohusiana na pini nne za udhibiti kwenye kiendeshaji chako cha motor. Zinadhibiti kasi na mwelekeo wa motors za kushoto na kulia.

Ifuatayo, utapata kigezo muhimu kinachodhibiti tabia ya gari.

int speed = 150;
  • speed: Kigezo hiki kinaweka kasi ya awali ya gari. Thamani inaweza kuwa kati ya 0 hadi 255. Katika mradi huu, unaweza kuibadilisha kwa kutumia vitufe vya "+" na "-" kwenye kidhibiti. Msimbo pia unajumuisha mantiki ya kuzuia kasi isizidi 255 au isishuke chini ya 0. (katika video saa 09:22)

Mantiki kuu ya kidhibiti cha mbali inashughulikiwa katika kazi ya loop(). Wakati kitufe kinaposhinikizwa, kazi ya decodeKeyValue() hutafsiri msimbo ghafi wa IR kuwa mfuatano rahisi kama "2" kwa mbele au "+" kwa kuongeza kasi. Hii inafanya taarifa za if zinazofuata ziwe rahisi kusoma na kubadilisha. (katika video saa 07:58)

Kazi maalum kama moveForward(), turnRight(), na moveLeft() ndipo udhibiti wa motor unafanyika. Kila kazi inachukua speed ya sasa kama hoja. Kwa mfano, moveForward(speed) itaendesha motors zote mbili mbele kwa kasi iliyobainishwa. Tofauti kuu kati ya "turn" na "move" ni kwamba turn huzungusha magurudumu yote mawili katika mwelekeo tofauti, na kusababisha gari kuzunguka mahali pake, wakati move huzungusha gurudumu moja tu, na kusababisha gari kufanya arc kuzunguka gurudumu lililosimama. (katika video saa 10:14)

Maonyesho ya Moja kwa Moja ya Mradi

Kwa kodi iliyopakiwa na gari likiwa limewashwa, kidhibiti cha mbali kinakuwa kiolesura chako kikuu. Maonyesho katika video yanaangazia tabia kadhaa muhimu:

  • Udhibiti wa Kasi: Kubonyeza kitufe cha "+" huongeza kasi kwa 50, wakati kitufe cha "-" kinaipunguza. Kasi ina kikomo cha 255 na kiwango cha chini cha 0 kulinda motors. (katika video saa 11:56)
  • Mwendo wa Muda Mfupi: Unapobonyeza kitufe cha mwelekeo kama "2" (mbele) au "8" (nyuma), gari litasonga kwa sekunde moja kisha kusimama kiotomatiki. Hii ni kipengele cha usalama kilichojengwa kwenye kodi. (katika video saa 13:09)
  • Kugeuka na Kuendesha: Vitufe vilivyopangwa katika muundo wa msalaba kwenye kidhibiti hufanya kazi kama fimbo ya udhibiti. Kubonyeza "4" au "6" kutageuza gari kushoto au kulia mahali pake. Kubonyeza vitufe vya mshazari, kama "1" au "3", kutafanya "move left" au "move right," ambayo ni zamu kali zaidi ambapo gurudumu moja linasimama. (katika video saa 16:42)

Jambo moja unaloweza kuona ni kwamba gari halisongi kila wakati katika mstari ulionyooka kabisa. Hii mara nyingi hutokana na tofauti ndogo katika motors au mvutano wa mkusanyiko wa gari, ambayo ni sifa ya kawaida na ya kawaida ya vifaa hivi. (katika video saa 15:14)

Sura

  • [00:00] Utangulizi wa Udhibiti wa Mbali wa IR kwa Gari la Smart
  • [01:15] Mahitaji na Masomo ya Awali Yanayohitajika
  • [01:56] Muhtasari wa Nyaraka za Mradi
  • [02:29] Kuelewa Kazi za Vitufe vya Kidhibiti cha Mbali
  • [03:29] Mwongozo wa Hatua kwa Hatua wa Uunganishaji wa IR Receiver na LED
  • [05:51] Kufungua na Kupakia Kodi ya Mradi
  • [07:41] Maelezo ya Kodi: Loop, Usimbuaji wa Vitufe, na Vitendo
  • [09:22] Kikomo cha Kasi na Vipengele vya Usalama katika Kodi
  • [10:08] Maelezo ya Kazi za Mwendo wa Motor
  • [11:49] Maonyesho ya Moja kwa Moja: Kujaribu Udhibiti wa Kasi na Mwanga wa LED
  • [13:27] Maonyesho ya Moja kwa Moja: Mbele, Nyuma, na Kugeuka
  • [14:31] Maonyesho Kamili ya Gari kwa Nguvu na Mwendo

Bilder

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
Språk: 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";
    }
}

Resurser och referenser

Filer📁

Arduino-bibliotek (zip)