2017-12-23 19:05:28 Romantic_C 阅读数 2599
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1111 人正在学习 去看看 王全

相关文章:
http://blog.csdn.net/Romantic_C/article/details/78676056

C语言中的关键字及常用语句:
http://blog.csdn.net/Romantic_C/article/details/78660805

常用C语言操作符:
http://blog.csdn.net/romantic_c/article/details/78235116

简单寻迹与使用识别红绿灯停车即颜色传感器 下面使用GY-33

这里写图片描述
代码如下:

//////////////////////////////////////////////////////////
/*GY-33
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND*/
//////////////////////////////////////////////////////////

#include <inttypes.h>
#include <compat/twi.h>
#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#define SCL_CLOCK 50000L

#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif


#define I2C_READ    1
#define I2C_WRITE   0
#define i2c_read(ack)  (ack) ? i2c_readAck() : i2c_readNak();
////////////////////////////////////////////////

#define uint16_t unsigned int //无符号整型 重命名为 uint16_t
typedef struct  //结构体
{
uint16_t Red;
uint16_t Green;
uint16_t Blue;
uint16_t Clear;
} RGB;

unsigned char Re_buf;
unsigned char sign = 0;
RGB rgb;
uint16_t CT = 0, Lux = 0, temp = 0;
int bug = 1, bugg = 0;
int i = 0, select = 0, p = 0, k = 0;
double  j = 0;
byte  color = 0, rgb_data[3] = { 0 }; 
///////////////////////////////////////////
int l_g = 13;       // 左前电机 前进
int l_b = 12;       // 后退

int ll_g = 9;      //左后电机  前进
int ll_b = 8;      //后退

int r_g = 4;       // 右前电机  前进
int r_b = 7;       //后退

int rr_g = 2;      //右后电机   前进
int rr_b = 3;      //后退

int l_pwm = 11;     // 左前电机 控速
int ll_pwm = 10;     // 左后

int r_pwm = 6;     // 左后电机 控速
int rr_pwm = 5;     // 右后
int on_off = 1;

const int x1 = A0;    // 红外传感 定义
const int x2 = A1;   //
const int x3 = A2;   //
const int x4 = A3;   //
int l1;       //
int l2;       //
int l3;       //
int l4;       //
int pd;       //
//////////////////////////////////////////////////////////
void setup() //定义每个口的模式
{

Serial.begin(115200);
i2c_init();
delay(1);

pinMode(l_g, OUTPUT);  
pinMode(ll_g, OUTPUT);
pinMode(l_b, OUTPUT);
pinMode(ll_b, OUTPUT);

pinMode(r_g, OUTPUT);
pinMode(rr_g, OUTPUT);
pinMode(r_b, OUTPUT);
pinMode(rr_b, OUTPUT);

pinMode(r_pwm, INPUT);
pinMode(rr_pwm, INPUT);
pinMode(r_pwm, INPUT);
pinMode(rr_pwm, INPUT);

pinMode(l1, INPUT);
pinMode(l2, INPUT);
pinMode(l3, INPUT);
pinMode(l4, INPUT);
pinMode(on_off, INPUT);

digitalWrite(l1, HIGH);
digitalWrite(l2, HIGH);
digitalWrite(l3, HIGH);
digitalWrite(l4, HIGH);
digitalWrite(on_off, HIGH);

}
//********************************************************

void i2c_init(void)
{

TWSR = 0;                        
TWBR = ((F_CPU / SCL_CLOCK) - 16) / 2;  

}

//********************************************************
unsigned char i2c_start(unsigned char address)
{
uint8_t   twst;
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
twst = TW_STATUS & 0xF8;
if ((twst != TW_START) && (twst != TW_REP_START)) return 1;
TWDR = address;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
twst = TW_STATUS & 0xF8;
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) return 1;

return 0;
}

//********************************************************
void i2c_start_wait(unsigned char address)
{
    uint8_t   twst;
    while (1)
    {
      TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
      while (!(TWCR & (1 << TWINT)));
      twst = TW_STATUS & 0xF8;
      if ((twst != TW_START) && (twst != TW_REP_START)) continue;
      TWDR = address;
      TWCR = (1 << TWINT) | (1 << TWEN);
      while (!(TWCR & (1 << TWINT)));
      twst = TW_STATUS & 0xF8;
      if ((twst == TW_MT_SLA_NACK) || (twst == TW_MR_DATA_NACK))
        {
          TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
          while (TWCR & (1 << TWSTO));
          continue;
        }
        break;
    }
}

//********************************************************
unsigned char i2c_rep_start(unsigned char address)
{
return i2c_start(address);
}

//********************************************************
void i2c_stop(void)
{
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
while (TWCR & (1 << TWSTO));
}
//********************************************************
unsigned char i2c_write(unsigned char data)
{
uint8_t   twst;
TWDR = data;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
twst = TW_STATUS & 0xF8;
if (twst != TW_MT_DATA_ACK) return 1;
return 0;

}


//********************************************************
unsigned char i2c_readAck(void)
{
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);
while (!(TWCR & (1 << TWINT)));
return TWDR;
}


//********************************************************
unsigned char i2c_readNak(void)
{
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
return TWDR;
}
//////////////////////////////////////////////////////////

void Go (int l_speed, int ll_speed, int r_speed, int rr_speed)    // 向前走
{
digitalWrite(l_g, HIGH);
digitalWrite(l_b, LOW);
analogWrite(l_pwm, l_speed);

digitalWrite(ll_g, HIGH);
digitalWrite(ll_b, LOW);
analogWrite(ll_pwm, ll_speed);

digitalWrite(r_g, HIGH);
digitalWrite(r_b, LOW);
analogWrite(r_pwm, r_speed);

digitalWrite(rr_g, HIGH);
digitalWrite(rr_b, LOW);
analogWrite(rr_pwm, rr_speed);

}
//////////////////////////////////////////////////////////
void Turn_Left (int l_speed, int ll_speed, int r_speed, int rr_speed)    // 90度左转弯
{
digitalWrite(l_g, LOW);
digitalWrite(l_b, HIGH);
analogWrite(l_pwm, l_speed);

digitalWrite(ll_g, LOW);
digitalWrite(ll_b, HIGH);
analogWrite(ll_pwm, ll_speed);

digitalWrite(r_g, HIGH);
digitalWrite(r_b, LOW);
analogWrite(r_pwm, r_speed);

digitalWrite(rr_g, HIGH);
digitalWrite(rr_b, LOW);
analogWrite(rr_pwm, rr_speed);

}
//////////////////////////////////////////////////////////
void Back (int l_speed, int ll_speed, int r_speed, int rr_speed)    // 倒车
{
digitalWrite(l_g, LOW);
digitalWrite(l_b, HIGH);

digitalWrite(ll_g, LOW);
digitalWrite(ll_b, HIGH);

analogWrite(l_pwm, l_speed);
analogWrite(ll_pwm, ll_speed);



digitalWrite(r_g, LOW);
digitalWrite(r_b, HIGH);

digitalWrite(rr_g, LOW);
digitalWrite(rr_b, HIGH);

analogWrite(r_pwm, r_speed);
analogWrite(rr_pwm, rr_speed);
}
//////////////////////////////////////////////////////////
void loop()
{
  pd = digitalRead(on_off);
  if (pd == HIGH)
  {
    select = 1;
  }
  switch (select)
  {
    case 1:   //////////////////////// 数字接口1不接任何地方 默认高电平 
    {

      unsigned char data[9] = { 0 };
      if (!sign)
      {

      //////////////////////////////////////////////////
      //原始 RGBC 计算                  即 Byte2=0x15 时

      iic_read(0x00, data, 8);
      rgb.Red = (data[0] << 8) | data[1];
      rgb.Green = (data[2] << 8) | data[3];
      rgb.Blue = (data[4] << 8) | data[5];
      rgb.Clear = (data[6] << 8) | data[7];
      //   Serial.print("Red: ");
      //   Serial.print(rgb.Red);
      //   Serial.print(",Green: ");
      //   Serial.print( rgb.Green);
      //   Serial.print(",Blue");
      //   Serial.print( rgb.Blue);
      //   Serial.print(",Clear");
      //   Serial.println(rgb.Clear);

      ///////////////////////////////////////////////////  
      //亮度、色温、简单颜色的计算方法   即 Byte2=0x25 时

      iic_read(0x08, data, 4);
      Lux = (data[0] << 8) | data[1];
      CT = (data[2] << 8) | data[3];
      temp = (data[4] << 8) | data[5];
      //  Serial.print("CT:");
      //  Serial.print(CT);
      //  Serial.print(",Lux:");
      //  Serial.println( Lux);

      ///////////////////////////////////////////////////
      //处理后的 RGB 值计算方法          即 Byte2=0x45 时

      iic_read(0x0c, data, 3);
      rgb_data[0] = data[0];
      rgb_data[1] = data[1];
      rgb_data[2] = data[2];
      Serial.print("r:");
      Serial.print(rgb_data[0]);
      Serial.print(",g:");
      Serial.print(rgb_data[1]);
      Serial.print(",b:");
      Serial.print(rgb_data[2]);

      /////////////////////////////////////////////////////////////  主要判别方式 其他辅助 确保安全
      //哪位置 1 表示该位的颜色    具体在arduino软件上打印串口输出  举例:绿色为8  红色为4
      //////color  bit7  bit6  bit5  bit4  bit3  bit2  bit1  bit0
      ////
      ///// 颜色   蓝色 深蓝色 绿色  黑色  白色  粉色  黄色  红色

      iic_read(0x0f, data, 1);
      color = data[0];
      Serial.print(",color:");
      Serial.println(color, HEX);

      ///////////////////////////////////////////////////
      ////小车跑n      



      if (bug && (bugg || (8 == color) && (rgb_data[1] >= 180))) // 理论绿色 G值为255
      //bugg 识别绿色灯后 使此函数一直可以被调用   
      {
         bugg = 1;
          for(;k<1;k++)    // 冲出其所设定的无黑带区
          {
           Go(255,255,255,255);
           delay(400);
      }
      l1 = digitalRead(x1);    //灯灭  HIGH 没扫到黑带
      l2 = digitalRead(x2);
      l3 = digitalRead(x3);
      l4 = digitalRead(x4);
       // 下列参数根据跑直线速度  自行设定 电机不可能没有相对误差 相同的电压可能转速不同
        if (l2 == LOW && l1 == HIGH  && l3 == HIGH && l4 == HIGH)   // 左 一灯 半圆弧
        {
         Go  (60,70,243,245);
        }

        if (l2 == HIGH && (!(l1  && l3)) && l4 == HIGH)   //直走
        {
         Go ( 150,150,150,150 );
        }

        if (l2 == LOW && l1 == LOW && l3 == LOW && l4 == HIGH)    //左 90度 转弯 
        {
          // Back ( 200, 200, 200, 200 ); 速度过快时可设定使电机反转 倒退 然后转弯 防止冲出赛道
          // delay(200);
           Turn_Left (200,200,180,180) ;
           delay (400);   //   1000是一秒
          // p=1;  用法下面有介绍
        }

        if (l2 == LOW && l1 == LOW && l3 == HIGH && l4 == HIGH)   //左微转 双灯
        {
         Go ( 175,175,150,150 ) ; 
        }

        if (l2 == HIGH && l1 == HIGH  && l3 == LOW && l4 == LOW)    //右微转   双灯  
       {
         Go ( 150,150,175,175 ) ; 
       }

        if (l2 == HIGH && l1 == HIGH && l3 == HIGH && l4 == LOW)   //右 一灯 转
        {
         Go ( 150,150,185,185 ) ; 
        }

        if (l2 == HIGH && l1 == HIGH && l3 == HIGH && l4 == HIGH)   //全部没扫到
        {
         Go ( 80,80,80,80 ) ;//存在可能 速度小点 使其运动一下 检测黑带 防止静止   
        }

       if (l2 == LOW && l1 == LOW  && l3 == LOW  && l4 == LOW)   // 四路全扫到 可能为90度弯 自行设定
       {
        ;
       }
       if (l2 == LOW && l1 == LOW  && l3 == LOW  && l4 == LOW)
         {
          //Back ( 200, 220, 250, 255 );
         // delay(100);
          Turn_Left (200,200,180,180) ;
          delay (400);   //   1000是一秒
        //  i=1;  用法下面有介绍     
         }

      } //endif 绿灯条件




      if ((4 == color ) && (rgb_data[0]  > 220)  ) // 红色R值 理论为255
      {
        bug = 0;
       // Back (200,200,200,200) ;
       // delay(100);
        Go (0,0,0,0) ;
       }

 //再不违反赛题的可能下,可用此相关变量实现可控距离停车


        /*if(i == 1 || p == 1) 
        {
          j--;
            if(j == 0 )
             {
                while(1)
                   {
                      zou (0 , 0 , 0 , 0 ) ;
                   }
              }
        }*/

    } //endif sign

    if (sign == 1)
    {
      iic_read(0x10, &data[8], 1);
      i2c_start_wait(0xb4);
      i2c_write(0x10);
      i2c_write(0x31);
      i2c_write((data[8] | 0x01));
      i2c_stop();
      sign = 3;
    }
    delay(200);

  }// case1
 break;
 /////////////////////////////////////////////////////////

  default: ///////////////////////////////////数字1接口接地
  {
   //  其他模式  自行设计  尽量不违反参赛规定  

    ;

  }//default

 }//switch

}//loop

void iic_read(unsigned char add, unsigned char *data, unsigned char len)
{
  i2c_start_wait(0xb4); //  将一个字节发送到设备数据字节进行传输
  i2c_write(add);      //  从器件读取一个字节,请求器件提供更多数据       1 write failed
  i2c_start_wait(0xb5);//  将一个字节发送到设备数据字节进行传输         0 write successful  
  while (len - 1)
  {
    *data++ = i2c_readAck();// 从器件读取一个字节后,出现stop条件(1继续 0停止)
    len--;
  }
  *data = i2c_readNak();  //
  i2c_stop();           //发出启动条件并发送地址和传输方向
}

void serialEvent() {
  while (Serial.available()) {
    Re_buf = (unsigned char)Serial.read();
    if (Re_buf == 'a')
      sign = 0;
    if (Re_buf == 'b')
      sign = 1;
    Re_buf = 0;
  }
}
2019-09-28 17:36:25 yanwennian 阅读数 620
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1111 人正在学习 去看看 王全

Arduino 初级编程示例

硬件平台:使用Arduino Nano V3.2开发板。

软件平台:使用Arduino 官方 IDE。

硬件 I/O:D13。

示例:详细记录Arduino 控制LED灯闪烁的编程,烧录,验证等步骤。

 


目录

Arduino 编程  :  LED灯闪烁

第一步:开发板选择:

第二步:通讯端口选择:

第三步:编写代码:

第四步:编译代码:

第五步:烧录代码:

第六步:结果验证----LED以500ms为间隔闪烁。


Arduino 编程  :  LED灯闪烁

严文年 -- 记于苏州

 

第一步:开发板选择:

 

第二步:通讯端口选择:

 

第三步:编写代码:

 

第四步:编译代码:

 

第五步:烧录代码:

 

第六步:结果验证----LED以500ms为间隔闪烁。

2017-01-07 19:03:52 ling3ye 阅读数 37889
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1111 人正在学习 去看看 王全

 

家中电视机,空调家电都是用红外遥控的,

这次实验,就是看看其接收与发射的原理。

所以需要两块Arduino Uno 分别做接收&发射

 

上篇 (本篇) Arduino Uno 红外遥控的接收

下篇                  Arduino Uno  红外遥控 接收 和 发射信号 实验 (下)

 

先看看这个模块

 

实验效果

 

实验接收红外信号,并记录其信号。

在试验中,我用的是一个LED彩色灯条的红外遥控器,遥控按下开关键,电脑串口就会接收到信号

 

 

在试验中可以看到,我按下开关键的时候,会有接收到信号,并以16进制显示,其实可以转换成10进制就理解成我们常用的数值。

在不停的按开关的时候,会有时有不一样的数值,

我估计这情况是接收不完全导致的。

不知道是不是,请指正。

 

然后我记录下了这个值 FF02FD

留到下篇,红外发射使用,看能不能控制LED灯条。

 

BOM表

Arduino Uno      *1

红外接收管         *1

跳线若干

 

接线

Arduino Uno    <----->    红外接收管(or 红外接收模块) 

5V                      <----->       VCC

GND                  <----->      GND

pin 11                <----->      OUT

 

 

程序源码

此程序 需要用到库函数

https://github.com/z3t0/Arduino-IRremote

请到上面这个链接,下载库文件,然后把文件解压到Arduino对应的libraries文件夹里面

可能有些安装Arduino IDE的时候就以及安装过一个IRremote库,如果有的话,试试行不行,不行就把原来的删除,然后解压这个库文件。

 

安装好库文件可以这样调出程序:

 

会看到以下代码

 

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>     // IRremote库声明

int RECV_PIN = 11;        //定义红外接收器的引脚为11

IRrecv irrecv(RECV_PIN); 

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // 启动接收器
}

void loop() {
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value, HEX);//以16进制换行输出接收代码
    irrecv.resume(); e// 接收下一个值
  }
  delay(100);
}

 

 

 

 

 

 

2016-06-01 22:59:22 bruce1993 阅读数 2132
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1111 人正在学习 去看看 王全
近日由于实习工作的原因,开始接触手上一款Arduino开发板,基于AtmelGA328P-PU芯片。

先把编程环境搭建起来,我安装的是arduino-1.6.9-windows在官网可以下载。

下载后正常安装即可在桌面看到Arduino图标,单击图标可以进入编程界面,界面比较简洁。

如果发现驱动安装成功,在Arduino安装目录Arduino\drivers下,可以找到驱动,安装即可。

编写一个简单的LED闪烁,同时串口以9600波特率给PC机发送“helloworld”的例子,代码如下

//引脚定义
int led =13; 
//复位后初始化内容 
void setup() { 
pinMode(led,OUTPUT); //初始化数字端口为输出模式
Serial.begin(9600); 
} 
//主循环 
void loop() { 
digitalWrite(led,HIGH);//led引脚置高电平 
delay(1000);//延时1秒 
digitalWrite(led,LOW);//led引脚变为低电平 
delay(1000);//延时1秒 
Serial.println("hello world"); 
}

代码编写完毕后,点击编程界面左上方的编译按钮,编译成功后点击上传按钮,

进度条完成后既可以看到LED以0.5Hz的频率在闪烁,同时打开串口监视器,可以看到片上微处理器发送的代码:hello world。

收工!
2018-08-16 06:54:36 qq_38351824 阅读数 10910
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1111 人正在学习 去看看 王全

遥控小车是每个人童年的最爱,不仅好奇它的奇妙,更是喜欢它带来的刺激。小编为大家带来几篇博客,来给大家讲讲制作遥控小车的程序。

看大标题可知我们一共有五个方法去制作一款带有遥控功能的小车,小编分开来给大家讲解。

本文是基于arduino的红外遥控小车

基于arduino的手机蓝牙遥控小车

基于arduino的红外遥控小车

基于arduino的无线NRF24L01遥控小车

基于ardunio的无线手柄遥控小车

基于ardunio的有线手柄遥控小车

 

从0到1教你做:基于红外遥控模块的Arduino的遥控小车

bilibili:https://www.bilibili.com/video/av74669242/

腾讯视频:https://v.qq.com/x/page/a301789lmwp.html

 

1、CSDN下载:

https://download.csdn.net/download/qq_38351824/11107043

2、可以关注点赞并在下方评论,我给你邮箱发过去。

3、关注微信公众号下载:

     ① 关注微信公众号:Tech云  

     ②

 

 

红外遥控小车,用的就是遥控器来控制小车的移动,遥控部分分为发射端和接收端。如下图

第一个是遥控器为发射端,第二个为接收端。

我们只需要记录下来每个按键对应的码值,然后就可以像按键那样写程序啦,就是if(串口接收到是) 那么......

那么如何测出每个按键的码值呢?
我们先来连接线路吧

一、接线:

(1)红外遥控接线:

(2)电机接线:

四个逻辑通道从左到右(即IN1到IN4)分别接5、6、9、10

12v供电,5伏输出给arduino供电

注意:此处驱动一定要和arduino共地!!!否则无法传输数据。

输出A接左边电机,输出B做右边电机

 

二、书写代码:

然后复制以下代码到编译器:

#include <IRremote.h>  // 使用IRRemote函数库
///////////////选择///////////////
#define choose 2    //1为通过串口打印码值模式  
                    //2为主函数运行模式



//-------------------------------------------------------------------//
//*******************************************************************//
///////////////////////////////////////////////////////////////////////
//////////////////////////////电机设置/////////////////////////////////
///////////////////////////////////////////////////////////////////////

#define leftA_PIN 5
#define leftB_PIN 6
#define righA_PIN 9
#define righB_PIN 10
void motor_pinint( );     //引脚初始化
void forward( );          //前进
void back( );             //后退
void turnLeftOrigin( );   //原地左
void turnRightOrigin( );  //原地右
void turnRightforword( ); //右前
void turnLeftforword( );  //左前
void turnLeftback( );     //左后
void turnRightback( );    //右后
void _stop();             //停车

//-------------------------------------------------------------------//
//*******************************************************************//
///////////////////////////////////////////////////////////////////////
//////////////////////////////红外遥控/////////////////////////////////
///////////////////////////////////////////////////////////////////////

const int irReceiverPin = 2;  // 红外接收器的 OUTPUT 引脚接在 PIN2 接口 定义irReceiverPin变量为PIN2接口
IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
decode_results results;    // 定义results变量为红外结果存放位置
void rev(void); 
void scan(void);

//-------------------------------------------------------------------------//

void setup()
{
  Serial.begin(9600); //9600(PC端使用)
  motor_pinint();        //电机引脚初始化
  irrecv.enableIRIn();   // 启动红外解码

}
void loop()
{
  if(choose==1) scan();
  else if(choose==2) rev();  
}

/*电机引脚初始化*/
void motor_pinint( )
{
  pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚
  }
/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward( )
{
  analogWrite(leftA_PIN,180);      
  analogWrite(leftB_PIN,0);         //左轮前进
  analogWrite(righA_PIN,180);      
  analogWrite(righB_PIN,0);         //右轮前进
}
/**************************************************
back子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,180);        //左轮后退
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,180);        //右轮后退
}
/**************************************************
turnLeftOrigin子函数——原地左转子函数
函数功能:控制车原地左转
**************************************************/
void turnLeftOrigin( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,120);        //左轮后退
  analogWrite(righA_PIN,120);      
  analogWrite(righB_PIN,0);          //右轮前进
}
/**************************************************
turnRightOrigin子函数——原地右转子函数
函数功能:控制车原地右转
**************************************************/
void turnRightOrigin( )
{
  analogWrite(leftA_PIN,120);      
  analogWrite(leftB_PIN,0);        //左轮前进
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,120);      //右轮后退
}
/**************************************************
turnRightforword子函数——右前运动子函数
函数功能:控制车右前
**************************************************/
void turnRightforword( )
{
  analogWrite(leftA_PIN,200);      
  analogWrite(leftB_PIN,0);        //左轮快前进
  analogWrite(righA_PIN,120);      
  analogWrite(righB_PIN,0);        //右轮慢前进
}
/**************************************************
turnLeftforword子函数——左前运动子函数
函数功能:控制车左前
**************************************************/
void turnLeftforword( )
{
  analogWrite(leftA_PIN,120);      
  analogWrite(leftB_PIN,0);       //左轮慢前进
  analogWrite(righA_PIN,200);      
  analogWrite(righB_PIN,0);       //右轮快前进
}
/**************************************************
turnRightforword子函数——右后运动子函数
函数功能:控制车右后
**************************************************/
void turnRightback( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,200);        //左轮快后退
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,120);        //右轮慢后退
}
/**************************************************
turnLeftforword子函数——左后运动子函数
函数功能:控制车左后
**************************************************/
void turnLeftback( )
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,120);        //左轮慢后退
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,200);        //右轮快后退
}
/**************************************************
stop子函数—停止子函数
函数功能:控制车停止
**************************************************/
void _stop()
{
  analogWrite(leftA_PIN,0);      
  analogWrite(leftB_PIN,0);         //左轮静止不动
  analogWrite(righA_PIN,0);      
  analogWrite(righB_PIN,0);         //右轮静止不动
}

void rev(void)
{
  if   (irrecv.decode(&results)) {   // 解码成功,把数据放入results.value变量中
  if   ((results.value==16718055)||(results.value==1033561079))
       {forward( )         ;delay(500);_stop();}//2前进
  else if((results.value==465573243)||(results.value==16730805)||(results.value==304335233)||(results.value==891929274)||(results.value==93040025))
       {back( )            ;delay(500);_stop();}//8后退
  else if((results.value==16724175)||(results.value==814588342)||(results.value==2534850111)||(results.value==16724175))
       {turnLeftforword( ) ;delay(500);_stop();}//1左前
  else if((results.value==16743045)||(results.value==1635910171)||(results.value==16743045))     
       {turnRightforword( );delay(500);_stop();}//3右前
  else if((results.value==1209942246)||(results.value==851901943)||(results.value==16728765)) 
       {turnLeftback( )    ;delay(500);_stop();}//7左后
  else if((results.value==16732845)||(results.value==1623741183))    
       {turnRightback( )   ;delay(500);_stop();}//9右后
  else if((results.value==2351064443)||(results.value==16716015)||(results.value==3640844469)||(results.value==3606423579))    
       {turnLeftOrigin( )   ;delay(250);_stop();}//4原地左转
  else if((results.value==16734885)||(results.value==71952287))    
       {turnRightOrigin( )   ;delay(250);_stop();}//6原地右转
    irrecv.resume();    // 继续等待接收下一组信号
  }if(results.value==0x16) 
  delay(600); //延时600毫秒,做一个简单的消抖
}
void scan(void)
{
 if (irrecv.decode(&results)) {   // 解码成功,把数据放入results变量中
    // 把数据输入到串口
    Serial.print("irCode: ");            
    Serial.print(results.value, DEC); // 显示红外编码
    Serial.print(",  bits: ");           
    Serial.println(results.bits); // 显示红外编码位数
    irrecv.resume();    // 继续等待接收下一组信号
  }if(results.value==0x16)
  digitalWrite(9, HIGH);  
  delay(600); //延时600毫秒,做一个简单的消抖
}

将以下截图中的2改为1,即开始测码值,然后下载程序

然后打开串口监视器,波特率设置为9600,使用遥控器对着红外头按下按键,串口监视器上就会出来当前按键的红外编码与位数。

显示irCode:FFFFFFFF,bits:32是因为遥控器上没有做中断,误码导致,只要按一下松开,再按一下松开就没问题。

这样我们就能获得每个按键的码值啦。

小编用的是遥控器上的1-9九个按键,分别对应着小车的不同状态如下图:

然后开始一个按键一个按键进行测试记录数据,将数据填入程序中即可(下图对应按键数据的红圈)

由于小编手头的材料比较劣质,所以往往是一个按键对应多个码值,为了减少误码,特意多写了几个数据;如下图:

将这部分数据测量更改后,准备工作就结束啦!

将以下截图中的1改为2,即开始主程序,然后下载程序

然后感受下,小车的转速、转角是否符合心意,如果想更改,请去每个按键对应的运动指令下,分别更改PWM和延时(对应下图的绿圈和红圈)

这样一个红外遥控小车就做完啦!

 

可能出现的问题https://blog.csdn.net/qq_38351824/article/details/88551999

 

如果大家在制作过程中有什么问题或者思路可以在下方留言和我一起交流噢!

如果发现本文有错误,也请在下方评论区指出,感激不尽!

 

 

 

无线Arduino编程板

阅读数 244

ArduinoYun教程之Arduino编程环境搭建

博文 来自: u014621518
没有更多推荐了,返回首页