聚丰项目 > 基于IDT 15W的智能小车站台充电小系统
该系统旨在给蓝牙遥控智能小车进行停靠充电功能。底板使用12V直流供电,小车使用12V7AH蓄电池供电。IDT充电板安装在小车的车头,当小车驶向充电站台时,IDT充电板和IDT底板接触,底板就将12V电压通过线圈传给蓄电池充电。充电时,小车电路板与12V蓄电池相连的动力系统切断,以防意外发生。(本项目采用的是IDT 15W无线充电开发套件)
donatello1996
分享donatello1996
团队成员
李明 创客
IDT无线充电套件,负责停靠时充电;
HC-05模块两个;
Nucleo-F446RE开发板,用作小车控制板;
L298N模块,驱动小车的动力轮和转向轮;
小车动力轮电机;
小车转向轮电机;
12V转5V转接板,用于蓄电池给Nucleo-F446RE开发板供电和动力轮供电;
Nucleo-F412ZG开发板,用作遥控板。
小车遥控板代码:
#include <stdio.h>
#include <stdlib.h>
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "adc.h"
int main()
{
int adcval,pwmval=0,pres;
uint8_t dir;
HAL_Init();
SystemClock_Config();
USART2_Init(115200);
USART3_Init(115200);
ADC1_Init(2);
while(1)
{
ADC1_GetValue();
if(x_val>1000&&x_val<3000&&y_val>1000&&y_val<3000)
dir='0';
if(x_val>1000&&x_val<3000&&y_val<1000)
dir='1';
if(x_val>3000&&y_val<1000)
dir='2';
if(x_val>3000&&y_val>1000&&y_val<3000)
dir='3';
if(x_val>3000&&y_val>3000)
dir='4';
if(x_val>1000&&x_val<3000&&y_val>3000)
dir='5';
if(x_val<1000&&y_val>3000)
dir='6';
if(x_val<1000&&y_val>1000&&y_val<3000)
dir='7';
if(x_val<1000&&y_val<1000)
dir='8';
HAL_UART_Transmit(&UART2_Handler,&dir,1,0);
}
}
小车控制板代码:
#include "stm32f4xx.h"
#include "usart.h"
#include "mico_periph.h"
#include "hts221.h"
#include "uvis25.h"
#include "oled.h"
#include "adc.h"
#include "lps25hb.h"
#include "exti.h"
#include "spi1.h"
#define B1_Pin GPIO_PIN_13
#define B1_GPIO_Port GPIOC
#define LD2_Pin GPIO_PIN_5
#define LD2_GPIO_Port GPIOA
int motor_status=0;
void SystemClock_Config()
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 180;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
HAL_PWREx_EnableOverDrive();
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
static void MX_GPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LD2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD2_GPIO_Port,&GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
}
char Get_Direction()
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)==0&&HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==1)
return 'L';
else if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)==1&&HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8)==0)
return 'R';
else return 'M';
}
void Turn_Left()
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
void Turn_Right()
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
void Fix_Forword()
{
if(Get_Direction()=='L')
while(Get_Direction()=='L'||Get_Direction()=='M')
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
if(Get_Direction()=='R')
while(Get_Direction()=='R'||Get_Direction()=='M')
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
}
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
int tflag=0;
void Car_Directions(int dir)
{
switch(dir)
{
case 0://停止
tflag=0;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,0);
Fix_Forword();
break;
case 1://前进
tflag=0;
Fix_Forword();
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,1);
break;
case 2:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,1);
if(tflag==0)
{
tflag=1;
Turn_Right();
}
else if(tflag==1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
break;
case 3:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,0);
if(tflag==0)
{
tflag=1;
Turn_Right();
}
else if(tflag==1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
break;
case 4:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,0);
if(tflag==0)
{
tflag=1;
Turn_Right();
}
else if(tflag==1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
break;
case 5://后退
tflag=0;
Fix_Forword();
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,0);
break;
case 6:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,0);
if(tflag==0)
{
tflag=1;
Turn_Left();
}
else if(tflag==1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
break;
case 7:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,0);
if(tflag==0)
{
tflag=1;
Turn_Left();
}
else if(tflag==1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
break;
case 8:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,1);
if(tflag==0)
{
tflag=1;
Turn_Left();
}
else if(tflag==1)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
}
break;
default:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,0);
Fix_Forword();
break;
}
}
int main()
{
uint8_t s='0';
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,0);
USART2_Init(115200);
USART3_Init(115200);
Motor_Init();
OLED_Init();
HTS221_Init();
HTS221_Calibration();
UVIS25_I nit();
RGBLED_Init();
RGB_LED_Set(10,10,20);
ADC1_Init();
EXTI_IRQHandler_Config(0,0);
Fix_Forword();
while(1)
{
HAL_UART_Receive(&huart3,&s,1,1);
printf("%c\n",s);
Car_Directions(s-'0');
}
}
void SysTick_Handler()
{
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}
初始化,打开小车12V供电和遥控板5V供电,小车控制板循环接收遥控板的指令,遥控板使用一个ADC摇杆发送小车行动指令,控制小车前进、后退、左转、右转、停止。
snake7674: 好大的蓄电池啊
回复