小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 17034|回复: 37

请教自定义按键

[复制链接]
发表于 2016-6-12 10:44:55 | 显示全部楼层 |阅读模式
本帖最后由 淇亮灯具 于 2016-6-17 15:35 编辑

小白菜报到,我要用51duino控制一个高速电机开关,板子上的电机控制小车的前进后退,所以另外需要一个按键控制高速电机,能不能用自定义按键?可以的话怎么弄?
想控制高速电机发射水弹

回复

使用道具 举报

发表于 2016-6-14 20:06:02 | 显示全部楼层
先贴一个你的硬件接线照片,我们可以根据接线帮你写驱动代码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-17 15:49:03 | 显示全部楼层
在单片机学习板上试过l298n,12v外接电源,共地,单个输出电机带不动,两个输出并起来可以带动。51diuno不知道怎么接 ,程序也看不懂,请教
IMG_1403b.jpg
IMG_1404b.jpg
回复 支持 反对

使用道具 举报

发表于 2016-6-17 21:02:16 | 显示全部楼层
你先选几个IO,然后把L298N 的 in1 in2 in3 in4接上
再拍个照片传上来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-17 21:06:29 | 显示全部楼层
你是位好同志 {:2_37:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-17 21:15:37 | 显示全部楼层
最好是手机也能控制
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-17 21:32:15 | 显示全部楼层
老大这样行吗?电脑手机都可以控制否?
IMG_1414a.jpg
IMG_1415a.jpg
回复 支持 反对

使用道具 举报

发表于 2016-6-17 22:26:54 | 显示全部楼层
淇亮灯具 发表于 2016-6-17 21:32
老大这样行吗?电脑手机都可以控制否?

回复我的时候要引用我的留言,否则我不知道你发了新消息。
黑色和褐色不能接到主控板那个位置,那边是VCC和GND。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-18 08:00:53 | 显示全部楼层
liuviking 发表于 2016-6-17 22:26
回复我的时候要引用我的留言,否则我不知道你发了新消息。
黑色和褐色不能接到主控板那个位置,那边是VC ...

老大按图,你说P几口
TB2TgHmoFXXXXb0XpXXXXXXXXXX_!!94674554.jpg
回复 支持 反对

使用道具 举报

发表于 2016-6-18 11:20:32 | 显示全部楼层
淇亮灯具 发表于 2016-6-18 08:00
老大按图,你说P几口

IN1接P36,IN2接P37,IN3接P21,IN4接P33,ENA和ENB接5V,在51duino板上随意找一个5V接上。
然后修改51duino_SDK_V2.0的2个地方的代码:
Motor.h:
  1. /*
  2. 版权声明:
  3. 深圳市小二极客科技(小R科技)旗下:WIFI机器人网·机器人创意工作室版权所有 www.wifi-robots.com
  4. 您可以任意修改本程序,并应用于自行研发的智能小车机器人及其他电子产品上,但是禁止用于商业牟利。
  5. 小R科技保留付诸法律起诉侵权的权利!2015-8-22
  6. By WIFI机器人网·机器人创意工作室
  7. */
  8. #ifndef _MOTOR_H_
  9. #define _MOTOR_H_


  10. #include "type.h"
  11. #include "config.h"

  12. void Motor_Init(void);//声明电机驱动函数
  13. void Delay_ForBarrier(uint32);//声明延时函数
  14. void Cruising_Mod(void);//全功能选择模式
  15. #define MOTOR_GO_FORWARD   MOTOR_A_CON1=1;MOTOR_A_CON2=0;MOTOR_B_CON1=1;MOTOR_B_CON2=0;LED1=0;LED2=1;LED3=1;LED4=1 //车体前进                                    
  16. #define MOTOR_GO_BACK           MOTOR_A_CON1=0;MOTOR_A_CON2=1;MOTOR_B_CON1=0;MOTOR_B_CON2=1;LED1=1;LED2=0;LED3=1;LED4=1 //车体后退
  17. #define MOTOR_GO_RIGHT           MOTOR_A_CON1=0;MOTOR_A_CON2=1;MOTOR_B_CON1=1;MOTOR_B_CON2=0;LED1=1;LED2=1;LED3=0;LED4=1 //车体左转
  18. #define MOTOR_GO_LEFT           MOTOR_A_CON1=1;MOTOR_A_CON2=0;MOTOR_B_CON1=0;MOTOR_B_CON2=1;LED1=1;LED2=1;LED3=1;LED4=0 //车体右转
  19. #define MOTOR_GO_STOP           MOTOR_A_CON1=0;MOTOR_A_CON2=0;MOTOR_B_CON1=0;MOTOR_B_CON2=0;LED1=1;LED2=1;LED3=1;LED4=1 //车体停止

  20. #define MOTOR2_GO_FORWARD         Beep=1;Input_Detect0=0
  21. #define MOTOR2_GO_BACKWARD         Beep=0;Input_Detect0=1
  22. #define MOTOR2_GO_STOP         Beep=0;Input_Detect0=0

  23. #define MOTOR3_GO_FORWARD         Input_Detect1=1;Input_Detect2=0
  24. #define MOTOR3_GO_BACKWARD         Input_Detect1=0;Input_Detect2=1
  25. #define MOTOR3_GO_STOP         Input_Detect1=0;Input_Detect2=0

  26. #endif
复制代码
Uart.c:
  1. /*
  2. 版权声明:
  3. 深圳市小二极客科技(小R科技)旗下:WIFI机器人网·机器人创意工作室版权所有 www.wifi-robots.com
  4. 您可以任意修改本程序,并应用于自行研发的智能小车机器人及其他电子产品上,但是禁止用于商业牟利。
  5. 小R科技保留付诸法律起诉侵权的权利!2015-8-22
  6. By WIFI机器人网·机器人创意工作室
  7. */
  8. #include "uart.h"
  9. #include <stdio.h>
  10. #include "motor.h"
  11. #include "steer.h"
  12. #include "mem.h"
  13. #include "IR.h"
  14. #include "timer.h"
  15. #include "Servo.h"
  16. #include "Light.h"
  17. uint8 xdata buffer[3];
  18. uint8 rec_flag=0;        //等于0等待接受 等于1正在接受
  19. extern uchar IR_Type;  
  20. extern uchar IR_Num;
  21. extern uchar Cruising_Flag;
  22. extern uchar ServoConfig_Flag;
  23. extern uint16 Uart_timeout_count;
  24. extern uint8 Left_Speed; //左侧速度
  25. extern uint8 Right_Speed;        //右侧速度
  26. extern uint8 Left_Speed_Hold;        //左侧速度锁存
  27. extern uint8 Right_Speed_Hold; //右侧速度锁存
  28. void UART_init(void)
  29. {
  30.         PCON |= 0x80;                //使能波特率倍速位SMOD
  31.         SCON = 0x50;                //8位数据,可变波特率
  32.         BRT = RELOAD_COUNT;                //设定独立波特率发生器重装值
  33.         AUXR |= 0x04;                //独立波特率发生器时钟为Fosc,即1T
  34.         AUXR |= 0x01;                //串口1选择独立波特率发生器为波特率发生器
  35.         AUXR |= 0x10;                //启动独立波特率发生器
  36.         ES      =   1;    //允许串口中断
  37.     EA      =   1;    //开总中断
  38.         TI      =   1;       
  39.         EX0=0;
  40.         EX1=0;
  41. }

  42. void UART_send_byte(uint8 byte)
  43. {
  44.         ES     =   0;  //关串口中断
  45.     TI     =   0;  //清零串口发送完成中断请求标志
  46.     SBUF   =   byte;
  47.     while(TI ==0); //等待发送完成
  48.     TI     =   1;  //清零串口发送完成中断请求标志
  49.     ES     =   1;  //允许串口中断
  50. }

  51. void UART_send(uint8 *Buffer, uint8 Length)
  52. {
  53.         while(Length != 0)
  54.         {
  55.                 UART_send_byte(*Buffer);
  56.                 Buffer++;
  57.                 Length--;
  58.         }

  59. }

  60. void Communication_Decode(void)  
  61. {       
  62.         uint8 i;

  63.         if(buffer[0]==0x00)
  64.         {
  65.                 switch(buffer[1])
  66.                 {       
  67.                         case 0x01:Left_Speed=Left_Speed_Hold;Right_Speed=Right_Speed_Hold;MOTOR_GO_FORWARD; return;
  68.                         case 0x02:Left_Speed=Left_Speed_Hold;Right_Speed=Right_Speed_Hold;MOTOR_GO_BACK;    return;
  69.                         case 0x03:Left_Speed=Left_Speed_Hold;Right_Speed=Right_Speed_Hold;MOTOR_GO_LEFT;    return;
  70.                     case 0x04:Left_Speed=Left_Speed_Hold;Right_Speed=Right_Speed_Hold;MOTOR_GO_RIGHT;   return;
  71.                         case 0x00:Left_Speed=Left_Speed_Hold;Right_Speed=Right_Speed_Hold;MOTOR_GO_STOP;    return;

  72.                         case 0x05:Left_Speed=4;Right_Speed=10;MOTOR_GO_FORWARD;return;
  73.                         case 0x06:Left_Speed=4;Right_Speed=10;MOTOR_GO_BACK;return;
  74.                         case 0x07:Left_Speed=10;Right_Speed=4;MOTOR_GO_FORWARD;return;
  75.                         case 0x08:Left_Speed=10;Right_Speed=4;MOTOR_GO_BACK;return;

  76.                         case 0x09:MOTOR2_GO_FORWARD;return;
  77.                     case 0x0A:MOTOR2_GO_BACKWARD;return;
  78.                         case 0x0B:MOTOR2_GO_STOP;return;

  79.                         case 0x0C:MOTOR3_GO_FORWARD;return;
  80.                     case 0x0D:MOTOR3_GO_BACKWARD;return;
  81.                         case 0x0E:MOTOR3_GO_STOP;return;
  82.                         default: return;
  83.                 }       
  84.         }
  85.         else if(buffer[0]==0x01)
  86.         {
  87.                 if(buffer[2]>180)
  88.                         return;
  89.                        
  90.                 switch(buffer[1])
  91.                 {
  92.                         case 0x01:
  93.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  94.                         {
  95.                                 if(buffer[2]>GetServoMaxAngle(1))buffer[2]=GetServoMaxAngle(1);
  96.                                 if(buffer[2]<GetServoMixAngle(1))buffer[2]=GetServoMixAngle(1);
  97.                                 SetServoAngle(1,buffer[2]); return;
  98.                         }
  99.                         else
  100.                         {
  101.                                   SetServoAngle(1,buffer[2]); return;//舵机角度设定模式下,不受角度约束
  102.                         }
  103.                
  104.                         case 0x02:
  105.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  106.                         {
  107.                                 if(buffer[2]>GetServoMaxAngle(2))buffer[2]=GetServoMaxAngle(2);
  108.                                 if(buffer[2]<GetServoMixAngle(2))buffer[2]=GetServoMixAngle(2);
  109.                                 SetServoAngle(2,buffer[2]); return;
  110.                         }
  111.                         else
  112.                         {
  113.                            SetServoAngle(2,buffer[2]); return;
  114.                         }
  115.                         case 0x03:
  116.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  117.                         {
  118.                                 if(buffer[2]>GetServoMaxAngle(3))buffer[2]=GetServoMaxAngle(3);
  119.                                 if(buffer[2]<GetServoMixAngle(3))buffer[2]=GetServoMixAngle(3);
  120.                                 SetServoAngle(3,buffer[2]); return;
  121.                         }
  122.                         else
  123.                         {
  124.                                   SetServoAngle(3,buffer[2]); return;
  125.                         }
  126.                         case 0x04:
  127.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  128.                         {
  129.                                 if(buffer[2]>GetServoMaxAngle(4))buffer[2]=GetServoMaxAngle(4);
  130.                                 if(buffer[2]<GetServoMixAngle(4))buffer[2]=GetServoMixAngle(4);
  131.                                 SetServoAngle(4,buffer[2]); return;
  132.                         }
  133.                         else
  134.                         {
  135.                                 SetServoAngle(4,buffer[2]); return;
  136.                         }
  137.                         case 0x05:
  138.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  139.                         {
  140.                                 if(buffer[2]>GetServoMaxAngle(5))buffer[2]=GetServoMaxAngle(5);
  141.                                 if(buffer[2]<GetServoMixAngle(5))buffer[2]=GetServoMixAngle(5);
  142.                                 SetServoAngle(5,buffer[2]); return;
  143.                         }
  144.                         else
  145.                         {
  146.                                   SetServoAngle(5,buffer[2]); return;
  147.                         }
  148.                         case 0x06:
  149.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  150.                         {
  151.                                 if(buffer[2]>GetServoMaxAngle(6))buffer[2]=GetServoMaxAngle(6);
  152.                                 if(buffer[2]<GetServoMixAngle(6))buffer[2]=GetServoMixAngle(6);
  153.                                 SetServoAngle(6,buffer[2]); return;
  154.                         }
  155.                         else
  156.                         {
  157.                            SetServoAngle(6,buffer[2]); return;
  158.                         }
  159.                         case 0x07:
  160.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  161.                         {
  162.                                 if(buffer[2]>GetServoMaxAngle(7))buffer[2]=GetServoMaxAngle(7);
  163.                                 if(buffer[2]<GetServoMixAngle(7))buffer[2]=GetServoMixAngle(7);
  164.                                 SetServoAngle(7,buffer[2]); return;
  165.                         }
  166.                         else
  167.                         {
  168.                            SetServoAngle(7,buffer[2]); return;
  169.                         }
  170.                         case 0x08:
  171.                         if(ServoConfig_Flag == SERVO_NORMAL_MODE)
  172.                         {
  173.                                 if(buffer[2]>GetServoMaxAngle(8))buffer[2]=GetServoMaxAngle(8);
  174.                                 if(buffer[2]<GetServoMixAngle(8))buffer[2]=GetServoMixAngle(8);
  175.                                 SetServoAngle(8,buffer[2]); return;
  176.                         }
  177.                         else
  178.                         {
  179.                            SetServoAngle(8,buffer[2]); return;
  180.                         }
  181.                         default : return;
  182.                 }  
  183.         }
  184.         else if(buffer[0]==0x02)
  185.         {
  186.                 if(buffer[2]>10)
  187.                         return;
  188.                 switch(buffer[1])
  189.                 {
  190.                         case 0x01:Left_Speed_Hold=Left_Speed  = buffer[2]; return;
  191.                         case 0x02:Right_Speed_Hold=Right_Speed = buffer[2]; return;
  192.                         default : return;
  193.                 }
  194.         }
  195.         else if        (buffer[0]==0x04)//车大灯,拉电流形式,5V
  196.         {
  197.                  if(buffer[1]==0x01)
  198.                  {
  199.                     OpenMainLight(); //开灯
  200.                  }
  201.                  else
  202.                  {
  203.                          CloseMainLight(); //关灯
  204.                  }
  205.        
  206.        
  207.         }
  208.         else if(buffer[0]==0x13)//模式切换开关
  209.         {
  210.             switch(buffer[1])
  211.                 {
  212.                   case 0x01: Cruising_Flag = 0x01; break;//跟随
  213.                   case 0x02: Cruising_Flag = 0x02; break;//巡线
  214.                   case 0x03: Cruising_Flag = 0x03; break;//避障
  215.                   case 0x04: Cruising_Flag = 0x04; break;//雷达避障
  216.                   case 0x00: Cruising_Flag = 0x00; break;//正常模式
  217.                   default:Cruising_Flag = 0x00; break;//正常模式
  218.                 }
  219.         }
  220.         else if(buffer[0]==0x32)//存储舵机上电默认角度
  221.         {
  222.                   Earse_Section(50*512);
  223.                 for(i=1;i<=8;i++)
  224.                 {
  225.                    Write_Byte(50*512+i,GetServoAngle(i));       
  226.                 }
  227.         }
  228.         else if(buffer[0]==0x33)//读取舵机上电默认角度并赋值
  229.         {
  230.                  Init_Steer();
  231.         }
  232.         else if(buffer[0]==0x36)//进入舵机配置模式
  233.         {
  234.                  ServoConfig_Flag=SERVO_CONFIG_MODE;
  235.         }
  236.         else if(buffer[0]==0x37)//从舵机配置模式切换到正常模式
  237.         {
  238.              ServoConfig_Flag=SERVO_NORMAL_MODE;
  239.         }
  240.         else if(buffer[0]==0x34) //保存最大舵机角度值
  241.         {
  242.                 if(ServoConfig_Flag == SERVO_CONFIG_MODE)
  243.                 {
  244.                            SetServoMaxAngle();
  245.                 }
  246.         }
  247.         else if(buffer[0]==0x35)  //保存最小舵机角度值
  248.         {
  249.                 if(ServoConfig_Flag == SERVO_CONFIG_MODE)
  250.                 {
  251.                            SetServoMixAngle();
  252.             }
  253.         }
  254.         else
  255.         {
  256.                 return;
  257.         }
  258. }

  259. void UART_Interrupt_Receive(void) interrupt 4
  260. {
  261.         static uint8 i;

  262.     if(RI==1)
  263.     {
  264.         RI  =   0;
  265.         if(rec_flag==0)
  266.                 {
  267.                         if(SBUF==0xff)
  268.                         {
  269.                                 rec_flag=1;       
  270.                                 Uart_timeout_count = 0;
  271.                                 i=0;
  272.                         }                       
  273.                 }
  274.                 else
  275.                 {
  276.                         if(SBUF==0xff)
  277.                         {       
  278.                                 rec_flag=0;       
  279.                                 if(i==3)
  280.                                 {
  281.                                         Communication_Decode();       
  282.                                         //UART_init(); //        解决串口死机问题
  283.                                 }
  284.                                 i=0;
  285.                         }
  286.                         else
  287.                         {
  288.                                 buffer[i]=SBUF;
  289.                                 i++;
  290.                         }
  291.                 }               
  292.     }
  293.     else
  294.     {
  295.         TI  =  0;
  296.     }
  297.                
  298. }
复制代码
修改后编译出固件。附件为已编译的固件,可以直接刷入51duino运行。
第三路电机正转/反转/停止指令为:FF000900FF/FF000A00FF/FF000B00FF
第四路电机正转/反转/停止指令为:FF000C00FF/FF000D00FF/FF000E00FF
可在上位机的“自定义命令”里面设置如上指令,就可以用上位机发送给下位机。

51duino_SDK.hex (15.42 KB, 下载次数: 13)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-3-28 21:47 , Processed in 1.086548 second(s), 22 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表