自制麦克纳姆轮遥控小车
1 疫情期间,在家里实在是有大把时间,也不想浪费在游戏上,就想着造一个遥控小车,但是在家里啥都没有,就要买全套的东西,还好过年有压岁钱,学生党,实在是穷,买个东西之前都要货比三家,逛遍了淘宝,京东,拼多多和1688最后买的东西也算是有性价比吧
2
下面先统计一下花的钱吧,因为之前学的是STM32F4,就买了个stm32vet6的最小系统板,没有选择更便宜的f1系统板,花了大约40元;然后是车轮,之前看到麦克纳姆轮的时候就觉着挺好玩,就买了四个塑料橡胶的那种,80mm车轮四个,带联轴器40元;电机本来想用编码电机,后来看了看价格,算了吧,另一个也是我不会用,就选了tt马达,四个14元吧,电机驱动方面,开始买的是一个L298N和一个tb6612,想着两个都学着用用,结果是我想多了,这两个功能有点不同,相同的pwm波,但是输出的电机速率不同,麦克纳姆轮无法平移,这就少了很多乐趣,就又买了一个tb6612,这三个大概花了20元左右;电池,当时也想着用航模电池,但是一个两千多的航模电池要60多,还得花好几十块钱买充电器,后来又想着用18650,想想不如充电锂电池划算,就买了一块5000多ma的7.4V的锂电池,还带充电器,别问,问就是穷,记得是花了32;因为想弄遥控的,就买了NRF2401两个,也就五块钱左右,大件就差不多了。还有焊枪焊锡,稳压芯片,连接线,开关等等这些也没记住多少钱。开始的时候小车地盘忘了买,就用从家里找了一块铁板,自己打了几个孔,用扎带固定的电机,也算是能用。前前后后花的钱很杂,也不知道值不值,主要是学到东西了就行。
3
下面先说说电源板,自己焊接的,买的电路板,两个LM2596S降压芯片,一个调成7.4,给电机模块供电,另一个调成3.3v,给单片机供电,电源就解决了。
4
然后是代码部分,因为是四个电机,就用了一个定时器输出四路pwm,STM32f4的定时器有pwm模式,拿过来直接用就行,贴一下代码:
下面展示一些 内联代码片
。
// An highlighted block
#include "PWM.h"
#include "led.h"
#include "move.h"
//¶¨Ê±Æ÷4ͨµÀ1 PD12
//¶¨Ê±Æ÷4ͨµÀ2 PD13
//¶¨Ê±Æ÷4ͨµÀ3 PD14
//¶¨Ê±Æ÷4ͨµÀ4 PD15
void TIM4_PWM_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM4ʱÖÓʹÄÜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //ʹÄÜPORT AʱÖÓ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //ʹÄÜPORT BʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//GPIOD12,13,14,15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //ËÙ¶È100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ
GPIO_Init(GPIOD,&GPIO_InitStructure); //³õʼ»¯PD12/13/14/15
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4); //GPIOD12¸´ÓÃΪ¶¨Ê±Æ÷4
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4); //GPIOD13¸´ÓÃΪ¶¨Ê±Æ÷4
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4); //GPIOD14¸´ÓÃΪ¶¨Ê±Æ÷4
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_TIM4); //GPIOD15¸´ÓÃΪ¶¨Ê±Æ÷4
//¶¨Ê±Æ÷4µÄƵÂÊÉèÖà f = 84/(psc+1)*(arr+1)
TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷4
//³õʼ»¯TIM4 Channel 1 PWMģʽ 1 ÊýÖµ<ccrʱ£¬ÎªÓÐЧֵ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔµÍ ¾ÍÊÇµÍµçÆ½ÎªÓÐЧ
TIM_OC1Init(TIM4, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM4 4OC1
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //ʹÄÜTIM4ÔÚCCR1ÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷
TIM_OC2Init(TIM4, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM1 4OC2
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //ʹÄÜTIM4ÔÚCCR2ÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM1 4OC3
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //ʹÄÜTIM4ÔÚCCR3ÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM1 4OC4
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //ʹÄÜTIM4ÔÚCCR4ÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷
TIM_ARRPreloadConfig(TIM4,ENABLE);//ARPEʹÄÜ
TIM_Cmd(TIM4, ENABLE); //ʹÄÜTIM3
}
void motor_100()
{
TIM_SetCompare1(TIM4,0);
TIM_SetCompare2(TIM4,0);
TIM_SetCompare3(TIM4,0);
TIM_SetCompare4(TIM4,0);
}
void motor_50()
{
TIM_SetCompare1(TIM4,100);
TIM_SetCompare2(TIM4,100);
TIM_SetCompare3(TIM4,100);
TIM_SetCompare4(TIM4,100);
}
void motor_10()
{
TIM_SetCompare1(TIM4,150);
TIM_SetCompare2(TIM4,150);
TIM_SetCompare3(TIM4,150);
TIM_SetCompare4(TIM4,150);
}
void motor_0()
{
TIM_SetCompare1(TIM4,300);
TIM_SetCompare2(TIM4,300);
TIM_SetCompare3(TIM4,300);
TIM_SetCompare4(TIM4,300);
}
void motor_right()
{
TIM_SetCompare1(TIM4, 20);
TIM_SetCompare2(TIM4,100);
TIM_SetCompare3(TIM4,100);
TIM_SetCompare4(TIM4,100);
}
void motor_left()
{
TIM_SetCompare1(TIM4,100);
TIM_SetCompare2(TIM4, 20);
TIM_SetCompare3(TIM4,100);
TIM_SetCompare4(TIM4,100);
}
- 5
下面是电机方向控制,直流减速电机就两根线,正接正传,反接就反转,简单的很,下面是控制方向的代码:
move.c
// move.c
#include "move.h"
#include "sys.h"
void move_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//ʱÖÓ|RCC_AHB1Periph_GPIOD
//µç»ú1
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//µç»ú1
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_OType =GPIO_OType_OD; //¿ªÂ©Êä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;//ÉÏÀ
GPIO_Init(GPIOD, &GPIO_InitStructure);
//µç»ú2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType =GPIO_OType_OD; //¿ªÂ©Êä³ö
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÏÂÀ
GPIO_Init(GPIOD, &GPIO_InitStructure);
//µç»ú3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType =GPIO_OType_OD; //¿ªÂ©Êä³ö
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÏÂÀ
GPIO_Init(GPIOD, &GPIO_InitStructure);
//µç»ú4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType =GPIO_OType_OD; //¿ªÂ©Êä³ö
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÏÂÀ
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
//ÂÖ×Ó·Ö×é 1¡¢3λAÂÖ 2¡¢4λBÂÖ
void move_go()
{
motor1_GO
motor2_GO
motor3_GO
motor4_GO
}
void move_back()
{
motor1_BACK
motor2_BACK
motor3_BACK
motor4_BACK
}
void move_left()
{
motor1_BACK
motor2_GO
motor3_BACK
motor4_GO
}
void move_right()
{
motor1_GO
motor2_BACK
motor3_GO
motor4_BACK
}
void go_left()
{
motor1_BACK
motor2_GO
motor3_GO
motor4_BACK
}
void go_right()
{
motor1_GO
motor2_BACK
motor3_BACK
motor4_GO
}
move.h
// An highlighted block
#ifndef _MOVE_H
#define _MOVE_H
#include "sys.h"
#define motor1_BACK {GPIO_SetBits(GPIOD,GPIO_Pin_0);GPIO_ResetBits(GPIOD,GPIO_Pin_1);}//ÄæÊ±Õë
#define motor1_GO {GPIO_ResetBits(GPIOD,GPIO_Pin_0);GPIO_SetBits(GPIOD,GPIO_Pin_1);}//˳ʱÕë
#define motor2_BACK {GPIO_SetBits(GPIOD,GPIO_Pin_2);GPIO_ResetBits(GPIOD,GPIO_Pin_3);}//ÄæÊ±Õë
#define motor2_GO {GPIO_ResetBits(GPIOD,GPIO_Pin_2);GPIO_SetBits(GPIOD,GPIO_Pin_3);}//˳ʱÕë
#define motor3_BACK {GPIO_ResetBits(GPIOD,GPIO_Pin_4);GPIO_SetBits(GPIOD,GPIO_Pin_5);}//ÄæÊ±Õë
#define motor3_GO {GPIO_SetBits(GPIOD,GPIO_Pin_4);GPIO_ResetBits(GPIOD,GPIO_Pin_5);}//˳ʱÕë
#define motor4_BACK {GPIO_ResetBits(GPIOD,GPIO_Pin_6);GPIO_SetBits(GPIOD,GPIO_Pin_7);}//ÄæÊ±Õë
#define motor4_GO {GPIO_SetBits(GPIOD,GPIO_Pin_6);GPIO_ResetBits(GPIOD,GPIO_Pin_7);}//˳ʱÕë
void move_init(void);
void move_go(void);
void move_back(void);
void move_left(void);
void move_right(void);
void go_left(void);
void go_right(void);
#endif
- 6
最后是无线通信模块,用的是nrf2401,作为入门小白,看着数据手册一点一点的写,然后再看看网上的代码,终于是调了出来,因为无线通信吗,我就用了另一个单片机,之前学习用的51单片机,对我来说写一种单片机的代码都费劲,更别说写51和32的了,最后也是看着正点原子的例程改出来了,小车用的nrf代码:
#include "24l01.h"
#include "delay.h"
#include "spi.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32F407¿ª·¢°å
//NRF24L01Çý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2014/5/9
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ·
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ·
void NRF24L01_SPI_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_Cmd(SPI1, DISABLE); //ʧÄÜSPIÍâÉè
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //ÉèÖÃSPIµ¥Ïò»òÕßË«ÏòµÄÊý¾Ýģʽ:SPIÉèÖÃΪ˫ÏßË«Ïòȫ˫¹¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //ÉèÖÃSPI¹¤×÷ģʽ:ÉèÖÃΪÖ÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //ÉèÖÃSPIµÄÊý¾Ý´óС:SPI·¢ËͽÓÊÕ8λ֡½á¹¹
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //´®ÐÐͬ²½Ê±ÖӵĿÕÏÐ״̬ΪµÍµçƽ
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //´®ÐÐͬ²½Ê±ÖӵĵÚ1¸öÌø±äÑØ£¨ÉÏÉý»òϽµ£©Êý¾Ý±»²ÉÑù
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSSÐźÅÓÉÓ²¼þ£¨NSS¹Ü½Å£©»¹ÊÇÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀí:ÄÚ²¿NSSÐźÅÓÐSSIλ¿ØÖÆ
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //¶¨Òå²¨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //Ö¸¶¨Êý¾Ý´«Êä´ÓMSBλ»¹ÊÇLSBλ¿ªÊ¼:Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRCÖµ¼ÆËãµÄ¶àÏîʽ
SPI_Init(SPI1, &SPI_InitStructure); //¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèSPIx¼Ä´æÆ÷
SPI_Cmd(SPI1, ENABLE); //ʹÄÜSPIÍâÉè
}
//³õʼ»¯24L01µÄIO¿Ú
void NRF24L01_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ʹÄÜGPIOBʱÖÓ
//GPIOB0³õʼ»¯ÉèÖÃ:ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ÆÕͨÊä³öģʽ
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ
GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯PB14
//GPIOG6,7ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ÆÕͨÊä³öģʽ
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ
GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯PG6,7
//GPIOG.8ÉÏÀÊäÈë
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//ÊäÈë
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ
GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯PG8
GPIO_SetBits(GPIOB,GPIO_Pin_0);//PB14Êä³ö1,·ÀÖ¹SPI FLASH¸ÉÈÅNRFµÄͨÐÅ
SPI1_Init(); //³õʼ»¯SPI1
NRF24L01_SPI_Init();//Õë¶ÔNRFµÄÌØµãÐÞ¸ÄSPIµÄÉèÖÃ
NRF24L01_CE=0; //ʹÄÜ24L01
NRF24L01_CSN=1; //SPIƬѡȡÏû
}
//¼ì²â24L01ÊÇ·ñ´æÔÚ
//·µ»ØÖµ:0£¬³É¹¦;1£¬Ê§°Ü
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8 i;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spiËÙ¶ÈΪ10.5Mhz£¨24L01µÄ×î´óSPIʱÖÓΪ10Mhz£©
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//дÈë5¸ö×ֽڵĵØÖ·.
NRF24L01_Read_Buf(TX_ADDR,buf,5); //¶Á³öдÈëµÄµØÖ·
for(i=0;i<5;i++)if(buf[i]!=0XA5)break;
if(i!=5)return 1;//¼ì²â24L01´íÎó
return 0; //¼ì²âµ½24L01
}
//SPIд¼Ä´æÆ÷
//reg:Ö¸¶¨¼Ä´æÆ÷µØÖ·
//value:дÈëµÄÖµ
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
u8 status;
NRF24L01_CSN=0; //ʹÄÜSPI´«Êä
status =SPI1_ReadWriteByte(reg);//·¢ËͼĴæÆ÷ºÅ
SPI1_ReadWriteByte(value); //дÈë¼Ä´æÆ÷µÄÖµ
NRF24L01_CSN=1; //½ûÖ¹SPI´«Êä
return(status); //·µ»Ø×´Ì¬Öµ
}
//¶ÁÈ¡SPI¼Ä´æÆ÷Öµ
//reg:Òª¶ÁµÄ¼Ä´æÆ÷
u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;
NRF24L01_CSN = 0; //ʹÄÜSPI´«Êä
SPI1_ReadWriteByte(reg); //·¢ËͼĴæÆ÷ºÅ
reg_val=SPI1_ReadWriteByte(0XFF);//¶ÁÈ¡¼Ä´æÆ÷ÄÚÈÝ
NRF24L01_CSN = 1; //½ûÖ¹SPI´«Êä
return(reg_val); //·µ»Ø×´Ì¬Öµ
}
//ÔÚÖ¸¶¨Î»ÖöÁ³öÖ¸¶¨³¤¶ÈµÄÊý¾Ý
//reg:¼Ä´æÆ÷(λÖÃ)
//*pBuf:Êý¾ÝÖ¸Õë
//len:Êý¾Ý³¤¶È
//·µ»ØÖµ,´Ë´Î¶Áµ½µÄ״̬¼Ä´æÆ÷Öµ
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
u8 status,u8_ctr;
NRF24L01_CSN = 0; //ʹÄÜSPI´«Êä
status=SPI1_ReadWriteByte(reg);//·¢ËͼĴæÆ÷Öµ(λÖÃ),²¢¶Áȡ״ֵ̬
for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//¶Á³öÊý¾Ý
NRF24L01_CSN=1; //¹Ø±ÕSPI´«Êä
return status; //·µ»Ø¶Áµ½µÄ״ֵ̬
}
//ÔÚÖ¸¶¨Î»ÖÃдָ¶¨³¤¶ÈµÄÊý¾Ý
//reg:¼Ä´æÆ÷(λÖÃ)
//*pBuf:Êý¾ÝÖ¸Õë
//len:Êý¾Ý³¤¶È
//·µ»ØÖµ,´Ë´Î¶Áµ½µÄ״̬¼Ä´æÆ÷Öµ
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
u8 status,u8_ctr;
NRF24L01_CSN = 0; //ʹÄÜSPI´«Êä
status = SPI1_ReadWriteByte(reg);//·¢ËͼĴæÆ÷Öµ(λÖÃ),²¢¶Áȡ״ֵ̬
for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI1_ReadWriteByte(*pBuf++); //дÈëÊý¾Ý
NRF24L01_CSN = 1; //¹Ø±ÕSPI´«Êä
return status; //·µ»Ø¶Áµ½µÄ״ֵ̬
}
//Æô¶¯NRF24L01·¢ËÍÒ»´ÎÊý¾Ý
//txbuf:´ý·¢ËÍÊý¾ÝÊ×µØÖ·
//·µ»ØÖµ:·¢ËÍÍê³É×´¿ö
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spiËÙ¶ÈΪ10.5Mhz£¨24L01µÄ×î´óSPIʱÖÓΪ10Mhz£©
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//дÊý¾Ýµ½TX BUF 32¸ö×Ö½Ú
NRF24L01_CE=1;//Æô¶¯·¢ËÍ
while(NRF24L01_IRQ!=0);//µÈ´ý·¢ËÍÍê³É
sta=NRF24L01_Read_Reg(STATUS); //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
if(sta&MAX_TX)//´ïµ½×î´óÖØ·¢´ÎÊý
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//Çå³ýTX FIFO¼Ä´æÆ÷
return MAX_TX;
}
if(sta&TX_OK)//·¢ËÍÍê³É
{
return TX_OK;
}
return 0xff;//ÆäËûÔÒò·¢ËÍʧ°Ü
}
//Æô¶¯NRF24L01·¢ËÍÒ»´ÎÊý¾Ý
//txbuf:´ý·¢ËÍÊý¾ÝÊ×µØÖ·
//·µ»ØÖµ:0£¬½ÓÊÕÍê³É£»ÆäËû£¬´íÎó´úÂë
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spiËÙ¶ÈΪ10.5Mhz£¨24L01µÄ×î´óSPIʱÖÓΪ10Mhz£©
sta=NRF24L01_Read_Reg(STATUS); //¶Áȡ״̬¼Ä´æÆ÷µÄÖµ
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //Çå³ýTX_DS»òMAX_RTÖжϱêÖ¾
if(sta&RX_OK)//½ÓÊÕµ½Êý¾Ý
{
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//¶ÁÈ¡Êý¾Ý
NRF24L01_Write_Reg(FLUSH_RX,0xff);//Çå³ýRX FIFO¼Ä´æÆ÷
return 0;
}
return 1;//ûÊÕµ½ÈκÎÊý¾Ý
}
//¸Ãº¯Êý³õʼ»¯NRF24L01µ½RXģʽ
//ÉèÖÃRXµØÖ·,дRXÊý¾Ý¿í¶È,Ñ¡ÔñRFƵµÀ,²¨ÌØÂʺÍLNA HCURR
//µ±CE±ä¸ßºó,¼´½øÈëRXģʽ,²¢¿ÉÒÔ½ÓÊÕÊý¾ÝÁË
void NRF24L01_RX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//дRX½ÚµãµØÖ·
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//ʹÄÜͨµÀ0µÄ½ÓÊÕµØÖ·
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,0x40); //ÉèÖÃRFͨÐÅÆµÂÊ
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//Ñ¡ÔñͨµÀ0µÄÓÐЧÊý¾Ý¿í¶È
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒæ¿ªÆô
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//ÅäÖûù±¾¹¤×÷ģʽµÄ²ÎÊý;PWR_UP,EN_CRC,16BIT_CRC,½ÓÊÕģʽ
NRF24L01_CE = 1; //CEΪ¸ß,½øÈë½ÓÊÕģʽ
// delay_us(20);
}
//¸Ãº¯Êý³õʼ»¯NRF24L01µ½TXģʽ
//ÉèÖÃTXµØÖ·,дTXÊý¾Ý¿í¶È,ÉèÖÃRX×Ô¶¯Ó¦´ðµÄµØÖ·,Ìî³äTX·¢ËÍÊý¾Ý,Ñ¡ÔñRFƵµÀ,²¨ÌØÂʺÍLNA HCURR
//PWR_UP,CRCʹÄÜ
//µ±CE±ä¸ßºó,¼´½øÈëRXģʽ,²¢¿ÉÒÔ½ÓÊÕÊý¾ÝÁË
//CEΪ¸ß´óÓÚ10us,ÔòÆô¶¯·¢ËÍ.
void NRF24L01_TX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//дTX½ÚµãµØÖ·
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //ÉèÖÃTX½ÚµãµØÖ·,Ö÷ҪΪÁËʹÄÜACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //ʹÄÜͨµÀ0µÄ½ÓÊÕµØÖ·
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//ÉèÖÃ×Ô¶¯ÖØ·¢¼ä¸ôʱ¼ä:500us + 86us;×î´ó×Ô¶¯ÖØ·¢´ÎÊý:10´Î
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //ÉèÖÃRFͨµÀΪ40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒæ¿ªÆô
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //ÅäÖûù±¾¹¤×÷ģʽµÄ²ÎÊý;PWR_UP,EN_CRC,16BIT_CRC,½ÓÊÕģʽ,¿ªÆôËùÓÐÖжÏ
NRF24L01_CE=1;//CEΪ¸ß,10usºóÆô¶¯·¢ËÍ
}
var foo = 'bar';
-
7
51的就不贴上来了,因为写的有点乱,分了好几个文件,不好贴代码。8
最后效果还是可以的,不管咋说,无线相信还是挺快的,可能距离不是多远,毕竟才入门,慢慢加一些其他传感器,慢慢玩,反正就是个不断学习的过程,嘿嘿。
刚开始写,CSDN的这玩意不大会用,代码贴过来,注释都没了,有点可惜,凑活着看吧
模块图片
降压模块
TB6612