搜索代码

使用Arduino和L293D通过红外遥控器控制直流电动机

使用Arduino和L293D通过红外遥控器控制直流电动机

该项目展示了如何使用红外(IR)遥控器、Arduino Uno 和 L293D 电机驱动芯片控制直流电机的方向和速度。该设置允许精确控制电机,使其适用于多种应用。

这个项目为您的DIY电子项目打开了一扇可能性的大门。以下是一些可以帮助您入门的想法:

  • 遥控机器人:使用红外遥控器控制小机器人的运动。
  • 自动窗帘系统:远程打开和关闭窗帘或百叶窗。
  • 互动艺术装置:创作动态艺术作品,其中的活动部分由红外遥控器控制。
  • 平移和俯仰系统:使用红外遥控器控制摄像头或传感器的平移和倾斜。

硬件/组件

  • Arduino Uno
  • L293D电机驱动IC
  • 直流电机
  • 红外遥控器和接收器
  • 二极管 (1N4001 x4)
  • 连接线
  • 电源(例如,电动机的9V电池)

布线指南

%%WIRING%%

(in video at 02:14)

L293D芯片需要连接Arduino和外部电源供给电机。二极管用于防反击保护。红外接收器连接到Arduino的5V和GND引脚,信号引脚连接到数字引脚11(可在代码中配置)。电机连接到L293D的输出引脚,这些引脚由Arduino控制。

代码解释

(视频中在07:30)

提供的Arduino代码利用IRremote库解码来自红外遥控器的信号。代码中重要的可配置参数包括:


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

设置type将变量设置为'W'表示白色遥控器,'B'表示黑色遥控器(在视频的07:41)。PCB如果您的红外接收器有PCB,则变量应设置为1;如果是裸模块,则应设置为0(在视频的07:50处)。


const String RIGHT=">";// move motor to the right (CW) with this key on remote
const String LEFT ="<";// move motor to the left (CCW) with this key on remote
const String STOP ="OK";// stop motor with this key on remote

这些行定义了用于控制电动机的红外遥控按钮标签。确保这些标签与您的遥控器上的标签匹配(视频中在 08:12)。您可以自定义这些标签以使用遥控器上的不同按钮。


#define P1A 2 // define pin 2 as for P1A
#define P2A 7 // define pin 7 as for P2A
#define EN12 8 // define pin 8 as for 1,2EN enable
int RECV_PIN = 11;

这些行定义了用于控制 L293D 电机驱动器的 Arduino 引脚(在视频中为 09:52)。P1AP2A控制方向,和EN12启用电机。RECV_PIN是连接到红外接收器信号输出的引脚(视频中的 06:52)。如果使用不同的引脚,请修改这些。

现场项目/演示

(视频中在14:15)

该视频演示了项目的实际操作,展示了直流电机如何响应红外遥控命令。演示说明了如何控制电机顺时针和逆时针旋转,以及如何使用不同的遥控按钮停止电机。

章节

  • [00:00] 介绍与项目概述
  • 项目组件和先决条件
  • [02:14] 接线说明
  • [07:30] 代码说明和配置
  • [14:15] 使用黑色遥控器和电路板的项目演示
  • [16:04] 使用银色遥控器和PCB的演示
  • [17:42] 使用银色遥控器和裸模块的演示
  • [18:23] 使用黑色遥控器和裸露模块的演示
142-Source for controlling a servo motor with an IR remote controller using Arduino
语言: C++
/*
 * Original Infrared library from - http://arcfn.com
 * 
 * This is Arduino code for the L293D DC motor driver.
 * It uses an IR remote control to rotate the DC motor clockwise (CW), counter-clockwise (CCW), and stop it.
 * Watch instructions for this video: https://youtu.be/e0pvfJbdw_o
 * To get the library and files related to this code, visit http://robojax.com/learn/arduino
 // Written for Robojax.com video 

 * Code is available at http://robojax.com/learn/arduino

 * 
 // Written by Ahmad S. for Robojax.com on 
// August 10, 2018 at 22:03 in Ajax, Ontario, Canada
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/
// DC motor control
#define P1A 2 // define pin 2 as for P1A
#define P2A 7 // define pin 7 as for P2A
#define EN12 8 // define pin 8 as for 1,2EN enable

// remote settings start
#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 = false;// to display remote code. if not, set to false

// IR remote settings 
const String RIGHT=">";// move motor to the right (CW) with this key on remote
const String LEFT ="<";// move motor to the left (CCW) with this key on remote
const String STOP ="OK";// stop motor 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;



/*
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

void setup() {
  // L293 Motor Control Code by Robojax.com 2018025
  Serial.begin(9600);// setup Serial Monitor to display information
  pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
  pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
  pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN

  Serial.println("Robojax IR Decode");
  Serial.println("Motor Control with Remote");
  irrecv.enableIRIn(); // Start the receiver

  
  // L293 Motor Control Code by Robojax.com 20180810   
}

void loop() {
  // L293d Motor Control Code with IR by Robojax.com 20180810

  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
  // L293d Motor Control Code with IR by Robojax.com 20180810 
}//loop end


/*
 * 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]);
          motorAction(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]);
          motorAction(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]);
         motorAction(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]);
          motorAction(blackRemoteKey[i]);// take action          
    
          found=1;
        }// if matched
      }// for  
 }// else
  if(!found){
    if(cd !=0xFFFFFFFF)
      {
    Serial.println("Key unknown");
      }
  }// found
}// robojaxValidateCode end

/*
 * 
 * motorAction()
 * receives string "value" as input and based on the settings, 
 * turns motor CW, CCW or STOP
 */
void motorAction(String value)
{
  // Robojax IR motor control
   if(value == RIGHT)
   {
    L293D('R',1);// rotate motor to the right (CCW)
   }

   if(value == LEFT)
   {
    L293D('L',1);// rotate motor to the left (CW)
   }

   if(value == STOP)
   {
    L293D('R',0);// stop motor
   }   
}//motorAction end



/*
 * L293D(char dir, int en)
 * dir is character either L for CW direction
 *  or R for CCW direction
 *  en is integer 1 to rotate, 0 for stop
 */
void L293D(char dir, int en)
{
  if(dir =='L')
  {
    if(en ==0){
       Serial.println("CW Motor Stopped");
    }else{
       Serial.println("Rotating CW");      
    }
    digitalWrite(EN12 ,en);// Enable 1A and 2A 
    digitalWrite(P1A,HIGH);// send + or HIGH signal to P1A
    digitalWrite(P2A,LOW);// send - or LOW signal to P2A       
   
  }else{
    if(en ==0){
       Serial.println("CCW Motor Stopped");
    }else{
       Serial.println("Rotating CCW");      
    }    
    digitalWrite(EN12 ,en);// Disable 1A and 2A    
    digitalWrite(P1A,LOW);// send + or HIGH signal to P1A
    digitalWrite(P2A,HIGH);// send - or LOW signal to P2A  
  }
}//L293D end
143-Source for a simple L293 motor controller using Arduino
语言: C++
++
/*
 * This is the Arduino code for L293d DC motor Driver
 * watch LE18-D80NK video for details https://youtu.be/MrYsmAwzfrM
 * Code is available at http://robojax.com/learn/arduino
 * 
 * Written by Ahmad S. for Robojax.com on
 * August 9, 2018 at 22:03 in Ajax, Ontario, Canada
*/

// DC motor 1 control
#define P1A 2 // define pin 2 as for P1A
#define P2A 7 // define pin 7 as for P2A
#define EN12 8 // define pin 8 as for 1,2EN enable



/*
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

void setup() {
  // L293 Motor Control Code by Robojax.com 2018025
  Serial.begin(9600);// setup Serial Monitor to display information
  pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
  pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
  pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN
  
  // L293 Motor Control Code by Robojax.com 2018025   
}

void loop() {
  // L293 Motor Control Code by Robojax.com 2018025
  L293D_con('L',1);
  delay(4000);
  L293D_con('L',0); 
  delay(2000);
  
  L293D_con('R',1);
  delay(4000);
  L293D_con('R',0); 
  delay(2000);  


  Serial.println("=========== Loop done"); 
  delay(500);
  // L293 Motor Control Code by Robojax.com 2018025 
}


void L293D_con(char dir, int en)
{
  if(dir =='L')
  {
    if(en ==0){
       Serial.println(" CW Motor Stopped");
    }else{
       Serial.println(" Rotating CW");      
    }
    digitalWrite(EN12 ,en);// Enable 1A and 2A 
    digitalWrite(P1A,HIGH);// send + or HIGH signal to P1A
    digitalWrite(P2A,LOW);// send - or LOW signal to P2A       
   
  }else{
    if(en ==0){
       Serial.println(" CCW Motor Stopped");
    }else{
       Serial.println(" Rotating CCW");      
    }    
    digitalWrite(EN12 ,en);// Disable 1A and 2A    
    digitalWrite(P1A,LOW);// send + or HIGH signal to P1A
    digitalWrite(P2A,HIGH);// send - or LOW signal to P2A  
  }
}//L293D_con end

文件📁

没有可用的文件。