Hľadať kód

Ovládanie servomotorov pomocou infračerveného diaľkového ovládača s Arduinom

Ovládanie servomotorov pomocou infračerveného diaľkového ovládača s Arduinom

```html

Ovládanie servomotorov pomocou infračerveného diaľkového ovládača a Arduina

Tento projekt ukazuje, ako ovládať servomotor pomocou infračerveného (IR) diaľkového ovládača a Arduina. Toto zapojenie umožňuje bezdrôtové ovládanie polohy serva, čo ho robí ideálnym pre rôzne aplikácie.

diaľkový ovládač
IR remote receiver VS1838B pins
Piny IR prijímača VS1838B

Tu je niekoľko nápadov na projekty využívajúce toto zapojenie:

  • Diaľkové nastavovanie naklápania a otáčania kamery.
  • Ovládanie pohybov robotického ramena.
  • Automatizácia žalúzií alebo záclon.
  • Vytváranie interaktívnych umeleckých inštalácií.
  • Stavba diaľkovo ovládaného auta alebo vozidla.

Hardvér/Komponenty

  • Doska Arduino (napr. Uno, Nano)
  • Servomotor
  • IR diaľkový ovládač (bude fungovať akýkoľvek štandardný ovládač, ale kód je nakonfigurovaný pre konkrétne ovládače)
  • IR prijímač (napr. TSOP1838)
  • Prepojovacie vodiče
  • Nepájivé pole (voliteľné)

Návod na zapojenie

Servomotor má tri vodiče: uzemnenie (zvyčajne hnedý alebo čierny), napájanie (zvyčajne červený) a signál (často oranžový alebo biely). IR prijímač má tiež tri vodiče: uzemnenie, napájanie (VCC) a signál.

(vo videu o 01:46)

IR_remote_servo_wring

  • Uzemnenie serva na uzemnenie Arduina
  • Napájanie serva na 5V Arduina
  • Signál serva na pin 8 Arduina (vo videu o 02:23)
  • Uzemnenie IR prijímača na uzemnenie Arduina
  • VCC IR prijímača na 5V Arduina
  • Signál IR prijímača na pin 11 Arduina (vo videu o 02:38)

Vysvetlenie kódu

Kód začína zahrnutím potrebných knižníc pre IR komunikáciu a ovládanie serva. (vo videu o 03:16)


#include <IRremote.h>
#include <Servo.h>

Ďalej sú definované základné premenné. Tieto budete musieť nakonfigurovať podľa vášho konkrétneho zapojenia. (vo videu o 03:44)


const char type = 'B'; // 'W' pre biely ovládač, 'B' pre čierny ovládač
const boolean PCB = 0;   // 1 ak má IR prijímač PCB, 0 ak je to holý modul
const int SERVO_PIN = 8; // Pin pripojený k signálnemu vodiču serva
int angleStep = 10;      // O koľko stupňov sa servo pohne pri každom stlačení tlačidla
const int ANGLE_CENTRE = 90; // Stredová/resetovacia poloha serva

(vo videu o 05:06)

Najdôležitejším krokom konfigurácie je priradenie tlačidiel diaľkového ovládača ku konkrétnym akciám. Kód obsahuje polia pre rôzne typy ovládačov (biely/čierny, PCB/bez PCB) a ich zodpovedajúce kódy tlačidiel. Budete musieť identifikovať správne kódy pre váš ovládač a priradiť ich k požadovaným akciám (doprava, doľava, stred). (vo videu o 05:16)


const String RIGHT = ">"; // Nahraďte kódom pre vaše tlačidlo "doprava"
const String LEFT = "<";  // Nahraďte kódom pre vaše tlačidlo "doľava"
const String CENTRE = "OK"; // Nahraďte kódom pre vaše tlačidlo "stred"

(vo videu o 08:12)

Funkcia servoAction() spracováva pohyb serva na základe prijatého IR signálu. Skontroluje prijatý príkaz a podľa toho upraví uhol serva. Premenná angleStep riadi prírastok alebo úbytok polohy serva. (vo videu o 08:06)

Živý projekt/Demonštrácia

(vo videu o 09:56)

Video demonštruje, ako ovládať servo pomocou rôznych diaľkových ovládačov. Ukazuje, ako upraviť kód pre rôzne typy ovládačov a prijímacích modulov. Demonštrácia tiež pokrýva, ako zachytiť IR kódy z vašich vlastných ovládačov a integrovať ich do kódu. (vo videu o 12:48)

Kapitoly

  • [00:00] Úvod a prehľad projektu
  • [00:36] Komponenty a materiály
  • [01:46] Pokyny na zapojenie
  • [03:16] Vysvetlenie kódu
  • [09:56] Demonštrácia projektu
  • [12:48] Použitie vlastného diaľkového ovládača

```

Obrázky

IR remote receiver VS1838B pins
IR remote receiver VS1838B pins
SG90_servo_motor-1
SG90_servo_motor-1
remote
remote
IR_remote_servo_wring
IR_remote_servo_wring
139-Source for controlling a servo motor with an IR remote controller using Arduino
Jazyk: C++
/*
 * Original library from - http://arcfn.com
 * 
 * This Arduino code controls a servo motor with an IR remote controller or any TV remote.
 * 
 * You have to select the type of your remote as Black or White in the code below
 * and also select your receiver 1838 as either a PCB or bare module. See video for details.
 * 
 * You have to watch this video: https://youtu.be/muAkBQb24NI
 * before proceeding with this code. 
 * 
 * Modified/Written by Ahmad Shamshiri
 * on August 02, 2018 at 20:35 in Ajax, Ontario, Canada
 * for Robojax.com
 * Watch video instructions for this code: https://youtu.be/Wp7hX9UErSQ
 * Get other Arduino codes from Robojax.com
 * 
 */

#include <IRremote.h>

int RECV_PIN = 11;
const char type ='B';// W for white, B for black. Must keep single quotes like 'B' or 'W'
const boolean PCB = 0;// if receiver is PCB set to 1, if not set to 0. See video for details
boolean displayCode = true;// to display remote code. if not, set to false

//***** Servo settings begins
#include <Servo.h>
Servo RJservo;  // create servo object to control a servo
const int SERVO_PIN = 8;  // analog pin used to connect the potentiometer
int angle =90;    // initial angle  for servo
int angleStep =10;
const int ANGLE_CENTRE =90;// the centre/reset angle of your servo
//**** Servo settings ends

// remote settings 
const String RIGHT=">";// move servo to the right with this key on remote
const String LEFT ="<";// move servo to the left with this key on remote
const String CENTRE ="OK";// move servo to centre with this key on remote
// remote settings end

IRrecv irrecv(RECV_PIN);

// this is array holding codes for White Remote when used with PCB version of receiver
unsigned int whiteRemotePCB[] ={
            0xE318261B, // CH-
            0x511DBB,   // CH
            0xEE886D7F,  // CH+

            0x52A3D41F, // |<<
            0xD7E84B1B, // >>|
            0x20FE4DBB, // >||          

            0xF076C13B, // -
            0xA3C8EDDB, // +
            0x12CEA6E6, // EQ

            0xC101E57B, // 0
            0x97483BFB, // 100+
            0xF0C41643, // 200+

            0x9716BE3F, // 1
            0x3D9AE3F7, // 2
            0x6182021B, // 3           

            0x8C22657B, // 4 
            0x488F3CBB, // 5
            0x449E79F,  // 6

            0x32C6FDF7, // 7
            0x1BC0157B, // 8
            0x3EC3FC1B  // 9                          
            };

// this is array holding codes for White Remote when used with non-PCB version of receiver            
unsigned int whiteRemote[] ={
            0xFFA25D, // CH-
            0xFF629D,   // CH
            0xFFE21D,  // CH+

            0xFF22DD, // |<<
            0xFF02FD, // >>|
            0xFFC23D, // >||          

            0xFFE01F, // -
            0xFFA857, // +
            0xFF906F, // EQ

            0xFF6897, // 0
            0xFF9867, // 100+
            0xFFB04F, // 200+

            0xFF30CF, // 1
            0xFF18E7, // 2
            0xFF7A85, // 3           

            0xFF10EF, // 4 
            0xFF38C7, // 5
            0xFF5AA5,  // 6

            0xFF42BD, // 7
            0xFF4AB5, // 8
            0xFF52AD  // 9                          
            };
// key lables of white remote
 String whiteRemoteKey[] ={
            "CH-",
            "CH",
            "CH+",

            "|<<",
            ">>|",
            ">||",

            "-",
            "+",
            "EQ",

            "0",
            "100+",
            "200+",

            "1",
            "2",
            "3",

            "4",
            "5",
            "6",

            "7",
            "8",
            "9"
            };

// this is array holding codes for Black Remote when used with non-PCB version of receiver
 unsigned int blackRemote[] ={
            0xFF629D, // ^
            0xFF22DD,   // <
            0xFF02FD,  // OK
            0xFFC23D, // >
            0xFFA857, // v

            0xFF6897, // 1
            0xFF9867, // 2
            0xF0C41643, // 3           

            0xFF30CF, // 4 
            0xFF18E7, // 5
            0xFF7A85,  // 6

            0xFF10EF, // 7
            0xFF38C7, // 8
            0xFF5AA5,  // 9 

            0xFF42BD, // *
            0xFF4AB5, // 0
            0xFF52AD  // #                                      
            };

// this is array holding codes for Black Remote when used with PCB version of receiver
 unsigned int blackRemotePCB[] ={
            0x511DBB, // ^
            0x52A3D41F,   // <
            0xD7E84B1B,  // OK
            0x20FE4DBB, // >
            0xA3C8EDDB, // v


            0xC101E57B, // 1
            0x97483BFB, // 2
            0xF0C41643, // 3           

            0x9716BE3F, // 4 
            0x3D9AE3F7, // 5
            0x6182021B,  // 6

            0x8C22657B, // 7
            0x488F3CBB, // 8
            0x449E79F,  // 9 

            0x32C6FDF7, // *
            0x1BC0157B, // 0
            0x3EC3FC1B  // #                                      
            };

// Black remote key names
 String blackRemoteKey[] ={
            "^",
            "<",
            "OK",
            ">",
            "v",

            "1",
            "2",
            "3",

            "4",
            "5",
            "6",

            "7",
            "8",
            "9",
            
            "*",
            "0",
            "#"
            };

decode_results results;


void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Robojax IR Decode");
  Serial.println("Servo Control with Remote");
  irrecv.enableIRIn(); // Start the receiver

   RJservo.attach(SERVO_PIN);  // attaches the servo on pin servoPin to the servo object

}

void loop() {

  if (irrecv.decode(&results)) {
    if(displayCode)Serial.println(results.value, HEX);
    robojaxValidateCode(results.value);// used the "robojaxValidateCode" bellow
    irrecv.resume(); // Receive the next value
  }
  delay(50);// 50 millisecond delay
}

/*
 * function: robojaxValidateCode
 * validates the remote code and prints the correct key name.
 * cd is the code passed from the loop.
 * Written by A. S. for Robojax
 */
void robojaxValidateCode(int cd)
{

  // Robojax IR Remote decoder
  int found=0;

 if(type =='W' && !PCB)
 {
    // Robojax IR White Remote decoder
    // if type is set to 'W' (white remote) and PCB=0 then check White remote code
      for(int i=0; i< sizeof(whiteRemote)/sizeof(int); i++)
      {
        if(whiteRemote[i] ==cd)
        {
          
          Serial.print("Key pressed:");
          Serial.println(whiteRemoteKey[i]);
          servoAction(whiteRemoteKey[i]);// take action
          found=1;
        }// if matched
      }// for
 }else if(type =='W' && PCB){
    // Robojax IR White Remote decoder
    // if type is set to 'W' (white remote) and PCB=1 then check White remote code
      for(int i=0; i< sizeof(whiteRemotePCB)/sizeof(int); i++)
      {
        if(whiteRemotePCB[i] ==cd)
        {
          
          Serial.print("Key pressed:");
          Serial.println(whiteRemoteKey[i]);
          servoAction(whiteRemoteKey[i]);// take action 
          found=1;
        }// if matched
      }// for  
 }else if(type =='B' && PCB){
    // Robojax IR Black Remote decoder
       // if type is set to 'B' (black remote) and PCB=1 then check Black remote code
       for(int i=0; i< sizeof(blackRemotePCB)/sizeof(int); i++)
      {
        // Robojax IR black Remote decoder
        if(blackRemotePCB[i] ==cd)
        {

          Serial.print("Key pressed:");
          Serial.println(blackRemoteKey[i]);
         servoAction(blackRemoteKey[i]);// take action     
          found=1;
        }// if matched
      }// for   
 }else{

      // if type is set to 'B' (black remote) and PCB =0 then check Black remote code
       for(int i=0; i< sizeof(blackRemote)/sizeof(int); i++)
      {
        // Robojax IR black Remote decoder
        if(blackRemote[i] ==cd)
        {

          Serial.print("Key pressed:");
          Serial.println(blackRemoteKey[i]);
          servoAction(blackRemoteKey[i]);// take action          
    
          found=1;
        }// if matched
      }// for  
 }// else
  if(!found){
    if(cd !=0xFFFFFFFF)
      {
    Serial.println("Key unknown");
      }
  }// found
}// robojaxValidateCode end

/*
 * 
 * servoAction()
 * receives string "value" as input and based on the settings, 
 * sends translates it to servo value and controls servo, either by:
 * rotating servo to the right
 * rotating servo to the left
 * moving the servo to the middle
 * 
 */
void servoAction(String value)
{
  // Servo button demo with IR remote by Robojax.com
  while(value == RIGHT){

    if (angle > 0 && angle <= 180) {
      angle = angle - angleStep;
       if(angle < 0){
        angle = 0;
       }else{
      RJservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }// if
    value =".";
    delay(100);
  }// while for RIGHT
  while(value == LEFT){

    // Servo button demo with IR remote by Robojax.com
    if (angle >= 0 && angle <= 180) {
      angle = angle + angleStep;
      if(angle >180){
        angle =180;
       }else{
      RJservo.write(angle); // move the servo to desired angle
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
       }
    }
    value =".";
    delay(100);
  }// while for LEFT

  if(value == CENTRE)
  {
    angle = ANGLE_CENTRE;
    RJservo.write(angle); // move the servo to centre at 90 degree angle
  }
    // Robojax IR Servo control
}//servoAction end

Veci, ktoré by ste mohli potrebovať

Zdroje a referencie

Zatiaľ žiadne zdroje.

Súbory📁

Žiadne súbory nie sú k dispozícii.