Szukaj kodu

Lekcja 29/31: Samochód-7 Sterowanie inteligentnym samochodem SunFounder za pomocą pilota | Robojax

Lekcja 29/31: Samochód-7 Sterowanie inteligentnym samochodem SunFounder za pomocą pilota | Robojax

W tej lekcji przekształcimy Twój inteligentny samochód SunFounder w pojazd sterowany zdalnie za pomocą pilota na podczerwień (IR). Zamiast polegać na połączeniu przewodowym lub aplikacji na smartfona, nauczysz się, jak przypisać przyciski standardowego pilota IR do sterowania ruchem samochodu—do przodu, do tyłu, skręty, a nawet manewry po skosie—oraz jak regulować jego prędkość w locie. Ten projekt to idealny kolejny krok po opanowaniu podstaw sterowania silnikami i komunikacji IR, ponieważ łączy oba te zagadnienia w jeden interaktywny system.

Praktyczna wartość tego projektu polega na zrozumieniu, jak stworzyć solidny i przyjazny dla użytkownika interfejs sterowania platformą robotyczną. Zasady, których się nauczysz, mają bezpośrednie zastosowanie w szerokiej gamie projektów, takich jak:

  • Budowa robota sterowanego zdalnie do zadań związanych z automatyzacją domową, na przykład małego robota dostawczego.
  • Tworzenie programowalnego pojazdu do edukacyjnych zawodów robotycznych.
  • Opracowanie niestandardowego pilota do suwaka kamerowego lub mechanizmu obrotowo-nachylanego.
  • Prototypowanie interfejsu użytkownika dla większego, bardziej złożonego systemu zautomatyzowanego.

Sprzęt i komponenty

Ten projekt opiera się na zestawie SunFounder 3-in-1 Arduino. Aby go wykonać, będziesz potrzebować komponentów wymienionych poniżej. Okablowanie jest proste i stanowi rozwinięcie wcześniejszych lekcji w tym kursie.

  • Zestaw SunFounder 3-in-1 Arduino: Zawiera podwozie inteligentnego samochodu, płytkę sterownika silników oraz płytkę Arduino.
  • Pilot na podczerwień: Standardowy pilot dołączony do zestawu.
  • Moduł odbiornika IR: Czujnik, który będzie dekodować sygnały z pilota.
  • Dioda LED i rezystor 330 omów: Używane jako wskaźnik wizualny potwierdzający naciśnięcie klawisza. (na filmie w 04:08)
  • Przewody połączeniowe: Do wykonania niezbędnych połączeń na płytce stykowej.

Schemat połączeń

car_9_lesson_29_wriing_for_IR

Zanim przejdziemy do kodu, upewnijmy się, że sprzęt jest poprawnie podłączony. Okablowanie odbiornika IR i sterownika silników jest zgodne z wcześniejszymi lekcjami w tej serii. Aby projekt był bardziej interaktywny, podłączymy również zewnętrzną diodę LED do pinu 13 jako wizualny wskaźnik informacji zwrotnej.

Oto instrukcja krok po kroku dotycząca połączeń:

  1. Odbiornik IR: Odbiornik IR ma trzy piny. Pin dodatni łączy się z szyną 5V na płytce stykowej. Pin masy łączy się z szyną GND. Pin sygnałowy, który jest ostatnim pinem, łączy się z pinem cyfrowym 11 na płytce Arduino. (na filmie w 05:29)
  2. Zewnętrzna dioda LED: Podłącz jedną nóżkę rezystora 330 omów do pinu cyfrowego 13 na Arduino. Podłącz drugą nóżkę rezystora do dłuższej nóżki (anody) diody LED. Krótsza nóżka (katoda) diody LED powinna być podłączona do szyny GND na płytce stykowej. (na filmie w 04:08)
  3. Sterownik silników: Cztery piny sterownika silników (A_1B, A_1A, B_1B, B_1A) są podłączone odpowiednio do pinów 5, 6, 9 i 10 na Arduino. Ta konfiguracja została omówiona w poprzednich lekcjach. (na filmie w 06:44)

Aby uzyskać wizualne odniesienie do tych połączeń, zapoznaj się z poniższym schematem połączeń.

Wyjaśnienie kodu

Kod tego projektu został zaprojektowany tak, aby był intuicyjny. Używa biblioteki IRremote do obsługi złożonego zadania dekodowania sygnałów IR. Rozbijmy konfigurowalne przez użytkownika części, które możesz chcieć dostosować do własnych projektów.

Na górze szkicu znajdziesz definicje pinów. To pierwsze rzeczy, które powinieneś sprawdzić, jeśli podłączyłeś komponenty do innych pinów niż te użyte w tym przykładzie.

const int IR_RECEIVE_PIN = 12;  // Definiuje numer pinu dla czujnika IR
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
  • IR_RECEIVE_PIN: Ta stała definiuje pin cyfrowy podłączony do pinu sygnałowego odbiornika IR. Jeśli podłączyłeś go do innego pinu, zmieniłbyś tutaj numer.
  • A_1B, A_1A, B_1B, B_1A: Te stałe odwzorowują cztery piny sterujące na sterowniku silników. Kontrolują one prędkość i kierunek lewego i prawego silnika.

Następnie znajdziesz kluczową zmienną kontrolującą zachowanie samochodu.

int speed = 150;
  • speed: Ta zmienna ustawia początkową prędkość samochodu. Wartość może wynosić od 0 do 255. W tym projekcie możesz ją zmienić za pomocą klawiszy "+" i "-" na pilocie. Kod zawiera również logikę zapobiegającą przekroczeniu 255 lub spadkowi poniżej 0. (na filmie w 09:22)

Podstawowa logika sterowania zdalnego jest obsługiwana w funkcji loop(). Po naciśnięciu klawisza funkcja decodeKeyValue() tłumaczy surowy kod IR na prosty ciąg znaków, taki jak "2" dla jazdy do przodu lub "+" dla zwiększenia prędkości. Dzięki temu instrukcje if, które następują po tym, są bardzo łatwe do odczytania i modyfikacji. (na filmie w 07:58)

Funkcje niestandardowe, takie jak moveForward(), turnRight() i moveLeft(), to miejsca, w których odbywa się sterowanie silnikami. Każda funkcja przyjmuje bieżącą wartość speed jako argument. Na przykład moveForward(speed) wprawi oba silniki w ruch do przodu z określoną prędkością. Kluczowa różnica między „skrętem” a „ruchem” polega na tym, że skręt obraca oba koła w przeciwnych kierunkach, powodując obrót auta w miejscu, podczas gdy ruch obraca tylko jedno koło, powodując łukowanie auta wokół nieruchomego koła. (na filmie w 10:14)

Prezentacja na żywo projektu

Po wgraniu kodu i włączeniu zasilania auta pilot zdalnego sterowania staje się Twoim głównym interfejsem. Demonstracja na filmie podkreśla kilka kluczowych zachowań:

  • Kontrola prędkości: Naciśnięcie klawisza „+” zwiększa prędkość o 50, a klawisz „-” ją zmniejsza. Prędkość jest ograniczona do 255 i nie spada poniżej 0, aby chronić silniki. (na filmie w 11:56)
  • Ruch chwilowy: Po naciśnięciu klawisza kierunkowego, takiego jak „2” (do przodu) lub „8” (do tyłu), auto porusza się przez jedną sekundę, a następnie automatycznie się zatrzymuje. To funkcja bezpieczeństwa wbudowana w kod. (na filmie w 13:09)
  • Skręcanie i manewrowanie: Klawisze ułożone w kształt krzyża na pilocie działają jak joystick. Naciśnięcie „4” lub „6” obróci auto w lewo lub w prawo w miejscu. Naciśnięcie klawiszy po przekątnej, takich jak „1” lub „3”, wykona „ruch w lewo” lub „ruch w prawo”, czyli ostrzejszy skręt, w którym jedno koło pozostaje nieruchome. (na filmie w 16:42)

Jedną rzeczą, którą możesz zauważyć, jest to, że auto nie zawsze jedzie idealnie prosto. Często wynika to z niewielkich różnic w silnikach lub napięcia montażu auta, co jest powszechną i normalną cechą tych zestawów. (na filmie w 15:14)

Rozdziały

  • [00:00] Wprowadzenie do sterowania zdalnego na podczerwień dla smart cara
  • [01:15] Wymagania wstępne i wymagane wcześniejsze lekcje
  • [01:56] Przegląd dokumentacji projektu
  • [02:29] Zrozumienie funkcji klawiszy pilota zdalnego sterowania
  • [03:29] Instrukcja podłączania krok po kroku dla odbiornika IR i diody LED
  • [05:51] Otwieranie i ładowanie kodu projektu
  • [07:41] Wyjaśnienie kodu: pętla, dekodowanie klawiszy i akcje
  • [09:22] Ograniczanie prędkości i funkcje bezpieczeństwa w kodzie
  • [10:08] Wyjaśnienie funkcji ruchu silników
  • [11:49] Prezentacja na żywo: testowanie kontroli prędkości i migania diody LED
  • [13:27] Prezentacja na żywo: jazda do przodu, do tyłu i skręcanie
  • [14:31] Pełna demonstracja auta z zasilaniem i ruchem

Obrazy

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
Język: 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";
    }
}

Zasoby i odniesienia

Pliki📁

Biblioteki Arduino (zip)