自制麦克纳姆轮遥控小车

自制麦克纳姆轮遥控小车

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);
}




  1. 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

在这里插入图片描述

  1. 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';
  1. 7
    51的就不贴上来了,因为写的有点乱,分了好几个文件,不好贴代码。

    8
    最后效果还是可以的,不管咋说,无线相信还是挺快的,可能距离不是多远,毕竟才入门,慢慢加一些其他传感器,慢慢玩,反正就是个不断学习的过程,嘿嘿。
    刚开始写,CSDN的这玩意不大会用,代码贴过来,注释都没了,有点可惜,凑活着看吧
    模块图片
    在这里插入图片描述
    在这里插入图片描述降压模块
    在这里插入图片描述TB6612

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值