制作简单的小车运动控制程序,使用遥控器给小车发指令,遥控器和接收器都使用STM32。

遥控器端发不同的指令,小车接收器端解析指令再控制步进电机不同的运转。基于NRF24L01,作如下具体事项。

遥控器端main程序:

#include "sys.h"
#include "misc.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "24l01.h"//#include "timer.h"
//
//int main(void){u8 key;u8 tmp_buf[33];u8 t;SystemInit();           //系统时钟等初始化delay_init(72);           //初始化延时NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);     //串口初始化波特率为9600,停止位1LED_Init();              //初始化LED灯KEY_Init();     //按键初始化NRF24L01_Init();        //初始化NRF24L01while(NRF24L01_Check())//检测不到24L01{delay_ms(1000);LED0=!LED0; //D2闪烁}TX_Mode();//发送模式for(t=0;t<6;t++){tmp_buf[t]='0';}while(1){key=KEY_Scan(0);switch(key){case KEY_FORWARD:for(t=0;t<6;t++){tmp_buf[t]='1';}NRF24L01_TxPacket(tmp_buf);LED1=!LED1;   //D3闪烁//LCD_ShowString(100,210,239,32,16,"forward   ");break;case KEY_BACKWARD:for(t=0;t<6;t++){tmp_buf[t]='2';}NRF24L01_TxPacket(tmp_buf);LED1=!LED1;  //D3闪烁//LCD_ShowString(100,210,239,32,16,"backward   ");break;case KEY_LEFT:for(t=0;t<6;t++){tmp_buf[t]='3';}NRF24L01_TxPacket(tmp_buf);LED1=!LED1; //D3闪烁//LCD_ShowString(100,210,239,32,16,"turn left");break;case KEY_RIGHT:for(t=0;t<6;t++){tmp_buf[t]='4';}NRF24L01_TxPacket(tmp_buf);LED1=!LED1;  //D3闪烁//LCD_ShowString(100,210,239,32,16,"turn right");break;case KEY_STOP:tmp_buf[0] = '1';tmp_buf[1] = '1';tmp_buf[2] = '1';tmp_buf[3] = '0';tmp_buf[4] = '1';tmp_buf[5] = '1';LED1=!LED1;   //D3闪烁NRF24L01_TxPacket(tmp_buf);//LCD_ShowString(100,210,239,32,16,"Stop        ");break;case KEY_VACUUMPUMP:tmp_buf[0] = '1';tmp_buf[1] = '1';tmp_buf[2] = '1';tmp_buf[3] = '0';tmp_buf[4] = '1';tmp_buf[5] = '2';LED1=!LED1;    //D3闪烁NRF24L01_TxPacket(tmp_buf);//LCD_ShowString(100,210,239,32,16,"Vacuumonoff");break;case KEY_FASTVEL:tmp_buf[0] = '1';tmp_buf[1] = '1';tmp_buf[2] = '1';tmp_buf[3] = '0';tmp_buf[4] = '1';tmp_buf[5] = '4';LED1=!LED1;    //D3闪烁NRF24L01_TxPacket(tmp_buf);// LCD_ShowString(100,210,239,32,16,"fastVel    ");break;case KEY_FAST:tmp_buf[0] = '1';tmp_buf[1] = '1';tmp_buf[2] = '1';tmp_buf[3] = '0';tmp_buf[4] = '1';tmp_buf[5] = '5';LED1=!LED1;  //D3闪烁NRF24L01_TxPacket(tmp_buf);//LCD_ShowString(100,210,239,32,16,"slowVel    ");break;case KEY_MIDDVEL:tmp_buf[0] = '1';tmp_buf[1] = '1';tmp_buf[2] = '1';tmp_buf[3] = '0';tmp_buf[4] = '1';tmp_buf[5] = '6';LED1=!LED1;    //D3闪烁NRF24L01_TxPacket(tmp_buf);// LCD_ShowString(100,210,239,32,16,"steermotor1");break;case KEY_SLOW:tmp_buf[0] = '1';tmp_buf[1] = '1';tmp_buf[2] = '1';tmp_buf[3] = '0';tmp_buf[4] = '1';tmp_buf[5] = '7';LED1=!LED1;  //D3闪烁NRF24L01_TxPacket(tmp_buf);//LCD_ShowString(100,210,239,32,16,"steermotor2");break;case KEY_SLOWVEL:tmp_buf[0] = '1';tmp_buf[1] = '1';tmp_buf[2] = '1';tmp_buf[3] = '0';tmp_buf[4] = '1';tmp_buf[5] = '8';LED1=!LED1;    //D3闪烁NRF24L01_TxPacket(tmp_buf);//LCD_ShowString(100,210,239,32,16,"spare1     ");break;}delay_ms(5);}}

小车接收端main程序:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "spi.h"
#include "key.h"
#include "24l01.h"
#include "misc.h"
#include"stdio.h"
#include <stdlib.h>
#include "stm32f4xx_adc.h"#include "Motorcontrol.h"
#include "steermotor.h"
#include "beep.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"//
//
int Vacuum=0; //关闭
int motorbrake=0;//抱闸关闭
extern int motion;//电机停止
int index=0;//按钮索引int main(void)
{u8 key, mode;u16 t = 0;u8 tmp_buf[33];int decode;//系统时钟初始化SystemInit()使原频率15750000HZ变成26880000HZSystemInit();         //系统时钟等初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);  //初始化延时函数uart_init(115200);    //初始化串口波特率为115200LED_Init();                    //初始化LEDLCD_Init();                 //LCD初始化KEY_Init();                 //按键初始化NRF24L01_Init();         //初始化NRF24L01Adc_Init();         //初始化ADC//BEEP_Init();             //初始化蜂鸣器端口Initialization();//步进电机控制初始化POINT_COLOR = RED;//设置字体为红色LCD_ShowString(30, 50, 200, 16, 16, "Explorer STM32F4");LCD_ShowString(30, 70, 200, 16, 16, "NRF24L01 ");LCD_ShowString(30, 90, 200, 16, 16, "SIASUN Co.,Ltd");LCD_ShowString(30, 110, 200, 16, 16, "2016/8");while (NRF24L01_Check()){LCD_ShowString(30, 130, 200, 16, 16, "NRF24L01 Error");delay_ms(200);LCD_Fill(30, 130, 239, 130 + 16, WHITE);delay_ms(200);}LCD_ShowString(30, 130, 200, 16, 16, "NRF24L01 OK");while (1){key = KEY0_PRES;// key = KEY_Scan(0);if (key == KEY0_PRES){mode = 0;break;}else if (key == KEY1_PRES){mode = 1;break;}t++;if (t == 100)LCD_ShowString(10, 150, 230, 16, 16, "KEY0:RX_Mode  KEY1:TX_Mode"); //闪烁显示提示信息if (t == 200){LCD_Fill(10, 150, 230, 150 + 16, WHITE);t = 0;}delay_ms(5);}LCD_Fill(10, 150, 240, 166, WHITE);//清空上面的显示POINT_COLOR = BLUE;//设置字体为蓝色decode = 0;if (mode == 0)//RX模式{LCD_ShowString(30, 150, 200, 16, 16, "NRF24L01 RX_Mode");LCD_ShowString(30, 170, 200, 16, 16, "Received DATA:");NRF24L01_RX_Mode();while (1){if (NRF24L01_RxPacket(tmp_buf) == 0)//一旦接收到信息,则显示出来.{tmp_buf[32] = 0;//加入字符串结束符LCD_ShowString(0, 190, lcddev.width - 1, 32, 16, tmp_buf);decode = atoi(tmp_buf);switch (decode){case 111111:if(index!=1){LCD_ShowString(100, 210, 239, 32, 16, "forward   ");LED1 = !LED1;Brakeon();//电机抱闸打开forward();motion=1;//电机运动index=1;}break;case 222222:if(index!=2){LCD_ShowString(100, 210, 239, 32, 16, "backward   ");LED1 = !LED1;Brakeon();//电机抱闸打开backward();motion=1;//电机运动index=2;}break;case 333333:if(index!=3){LCD_ShowString(100, 210, 239, 32, 16, "turn left");LED1 = !LED1;Brakeon();//电机抱闸打开turnleft();motion=1;//电机运动index=3;}break;case 444444:if(index!=4){LCD_ShowString(100, 210, 239, 32, 16, "turn right");LED1 = !LED1;Brakeon();//电机抱闸打开turnright();motion=1;//电机运动index=4;}break;case 111011:if(index!=5){LCD_ShowString(100, 210, 239, 32, 16, "Stop        ");LED1 = !LED1;stop();delay_ms(25);Brakeoff();motion=0;//电机运动index=5;}break;case 111012:LCD_ShowString(100, 210, 239, 32, 16, "Vacuumonoff");LED1 = !LED1;Vacuumpump = !Vacuumpump;if( Vacuum==0){Vacuum=1;//打开}else{Vacuum=0;//关闭}index=6;break;case 111013:LCD_ShowString(100, 210, 239, 32, 16, "motorbrake ");LED1 = !LED1;index=7;break;case 111014:if(index!=8){LCD_ShowString(100, 210, 239, 32, 16, "fastVel    ");LED1 = !LED1;fastVel();index=8;}break;case 111015:LCD_ShowString(100, 210, 239, 32, 16, "fast       ");LED1 = !LED1;fast();index=9;break;case 111016:if(index!=10){LCD_ShowString(100, 210, 239, 32, 16, "midVel     ");LED1 = !LED1;middVel();index=10;}break;case 111017:LCD_ShowString(100, 210, 239, 32, 16, "slow       ");LED1 = !LED1;slow();index=11;break;case 111018:if(index!=12){LCD_ShowString(100, 210, 239, 32, 16, "slowVel    ");LED1 = !LED1;slowVel();index=12;}break;case 111019:if(index!=13){LCD_ShowString(100, 210, 239, 32, 16, "auto       ");LED1 = !LED1;if( motorbrake==1){forward();delay_ms(500);turnleft();delay_ms(500);forward();delay_ms(500);backward();delay_ms(500);turnright();delay_ms(500);backward();delay_ms(500);stop();}index=13;}break;}}else{delay_us(5);t++;if (t == 10000)//大约1s钟改变一次状态{t = 0;LED1 = !LED1;}}}}else//TX模式{LCD_Fill(10, 150, 240, 166, WHITE);//清空上面的显示POINT_COLOR = BLUE;//设置字体为蓝色LCD_ShowString(60, 150, 200, 16, 16, "NRF24L01 TX_Mode");LCD_ShowString(60, 170, 200, 16, 16, "please select key");NRF24L01_TX_Mode();for (t = 0; t<6; t++){tmp_buf[t] = '0';}while (1){key = KEY_Scan(0);switch (key){case WKUP_PRES:for (t = 0; t<6; t++){tmp_buf[t] = '1';}NRF24L01_TxPacket(tmp_buf);LCD_ShowString(60, 190, 239, 32, 16, "Sended DATA:");LCD_ShowString(0, 210, 239, 32, 16, tmp_buf);LCD_ShowString(100, 210, 239, 32, 16, "forward   ");break;case KEY1_PRES:for (t = 0; t<6; t++){tmp_buf[t] = '2';}NRF24L01_TxPacket(tmp_buf);LCD_ShowString(60, 190, 239, 32, 16, "Sended DATA:");LCD_ShowString(0, 210, 239, 32, 16, tmp_buf);LCD_ShowString(100, 210, 239, 32, 16, "backward   ");break;case KEY2_PRES:for (t = 0; t<6; t++){tmp_buf[t] = '3';}NRF24L01_TxPacket(tmp_buf);LCD_ShowString(60, 190, 239, 32, 16, "Sended DATA:");LCD_ShowString(0, 210, 239, 32, 16, tmp_buf);LCD_ShowString(100, 210, 239, 32, 16, "turn left");break;case KEY0_PRES:for (t = 0; t<6; t++){tmp_buf[t] = '4';}NRF24L01_TxPacket(tmp_buf);LCD_ShowString(60, 190, 239, 32, 16, "Sended DATA:");LCD_ShowString(0, 210, 239, 32, 16, tmp_buf);LCD_ShowString(100, 210, 239, 32, 16, "turn right");break;}delay_ms(5);}}}

STM32——使用NRF24L01无线模块遥控器与接收器指令下发控制小车运动相关推荐

  1. 2.4G NRF24L01无线模块总结

    前言   最近野火STM32论坛(www.firebbs.cn)发起了一个开源平衡车的项目,于是就跟着大家一起动手做起了开源平衡车,其中就用到了2.4G NRF24L01无线模块.通过对NRF24L0 ...

  2. STM32CubeMX系列08——SPI通信(W25Q64、NRF24L01无线模块)

    文章目录 1. 准备工作 1.1. 所用硬件 1.2. SPI 简介 1.3. 生成工程 1.3.1. 创建工程选择主控 1.3.2. 系统配置 1.3.3. 配置工程目录 2. 读写EEPROM实验 ...

  3. NRF24L01无线模块设置发射接受模式方法

    NRF24L01无线模块设置发射接受模式 NRF24L01无线模块通过设置CONFIG寄存器的最后一位,实现发射和接收模式的设定. CONFIG寄存器的内容: 具体程序如下: /函数:void Set ...

  4. Arduino开发遥控小车(三)基于nRF24L01无线模块实现舵机转向和直流电机调速

    Arduino开发遥控小车(三)基于nRF24L01无线模块实现舵机转向和直流电机调速 前面和大家分享了通过nRF24L01无线模块实现数据发送和接收的基本方法,本次继续和大家分享最终实现遥控小车转向 ...

  5. nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)

    俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经 ...

  6. 使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动

    使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动 文章目录 使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动 1 前言 2 硬件连接 2.1 硬件构 ...

  7. STM32控制NRF24L01无线模块进行通信

    一.NRF2401无线模块 1.模块介绍 功能介绍 (1)2.4Ghz 全球开放ISM 频段免许可证使 2) 最高工作速率2Mbps,高效GFSK调制,抗干扰能力强,特别适合工业控制场合 (3)126 ...

  8. c语言射频接受程序,NRF24L01无线模块C语言程序

    闭门造车第三十五天. 所有零件在三号到我手中,下午组装起来,架上我古董般的51开发板,拉出我最熟悉的红外遥控程序,第二天便灵动了起来,之后陆陆续续做了什么?太琐碎理不顺了似乎.光电传感器做了两个小板, ...

  9. NRF24l01无线模块调试心得!STM32_SPI驱动NRF24L01+

    原文链接:链接 经过两日的调试nRF24L01终于调试成功.耐心,细心.有想法.资料.数据手册.总就会成功. 下面是调试的基本方法:                24L01是收发双方都需要编程的器件 ...

最新文章

  1. 计算机网络相关知识 参考博客 子网掩码怎么理解 网关及网关的作用 路由器基础知识详解
  2. 在网上找了一些j2ee的视频教程,有需要的朋友可以看看
  3. 微信小程序无法获取UnionId的情况及处理
  4. 2、运行.py文件、字符串、保留字符、行和缩进、多行语句、引号、注释、等待用户输入、同一行显示多条语句、命令行参数
  5. SpringBoot内部配置:“application.properties配置”和”使用XML配置”,读取属性文件中的内容,日志配置,Profile配置(学习:SpringBoot实战)
  6. 震惊!递推与递归竟然可以这么编!%99的程序员都不知道!
  7. button 和input 的区别及在表单form中的用法
  8. Python 之pdb调试
  9. 【基础教程】基于matlab局部特征检测与提取【1749期】
  10. socket编程之服务器端与客户端(代码实例)
  11. 信息学奥赛一本通(c++):1336:【例3-1】找树根和孩子
  12. ssh登录极路由后台_OpenWrt刷机详细流程(极路由)
  13. 模拟人生5显示与服务器,模拟人生5之人生无限
  14. 介绍下我的Phx框架-A Tiny assembled RESTful PHP Frame...
  15. 中小学试卷组卷系统php源码,在线组卷系统
  16. 【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
  17. Kubernetes 存活探针和就绪探针的最佳实践
  18. Java实战项目之 [含文档+PPT+源码等]精品基于ssm的足球联赛管理系统的设计与实现
  19. java循环链表实现魔术师发牌问题
  20. 万能遥控程序c语言,单片机解码万能红外遥控器的C51程序

热门文章

  1. 基于Java+Swing实现推箱子游戏
  2. list遍历的四种方法及效率对比
  3. 浅谈《帧同步网络游戏》之“框架”实现思路
  4. 王朝的更迭:那个最不受微软员工待见的高管走了
  5. 百度收录批量查询_鸿叔教你操作百度霸屏,一个月赚5000块!(内附详细操作笔记!)...
  6. 未定义标识符 “uint“ “uint8_t” 解决
  7. 第一篇51博文:思想决定行为。
  8. java qq验证手机号码_java正则表达式表单验证类工具类(验证邮箱、手机号码、qq号码等)...
  9. 【产品经理交互常用软件】axure软件详细教程与学习指南
  10. 高并发下如何保证缓存和数据库的数据一致性?