聚豐項(xiàng)目 > 基于IDT 15W的智能小車站臺(tái)充電小系統(tǒng)
該系統(tǒng)旨在給藍(lán)牙遙控智能小車進(jìn)行停靠充電功能。底板使用12V直流供電,小車使用12V7AH蓄電池供電。IDT充電板安裝在小車的車頭,當(dāng)小車駛向充電站臺(tái)時(shí),IDT充電板和IDT底板接觸,底板就將12V電壓通過線圈傳給蓄電池充電。充電時(shí),小車電路板與12V蓄電池相連的動(dòng)力系統(tǒng)切斷,以防意外發(fā)生。(本項(xiàng)目采用的是IDT 15W無線充電開發(fā)套件)
donatello1996
分享donatello1996
團(tuán)隊(duì)成員
李明 創(chuàng)客
IDT無線充電套件,負(fù)責(zé)停靠時(shí)充電;
HC-05模塊兩個(gè);
Nucleo-F446RE開發(fā)板,用作小車控制板;
L298N模塊,驅(qū)動(dòng)小車的動(dòng)力輪和轉(zhuǎn)向輪;
小車動(dòng)力輪電機(jī);
小車轉(zhuǎn)向輪電機(jī);
12V轉(zhuǎn)5V轉(zhuǎn)接板,用于蓄電池給Nucleo-F446RE開發(fā)板供電和動(dòng)力輪供電;
Nucleo-F412ZG開發(fā)板,用作遙控板。
小車遙控板代碼:
#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://前進(jìn)
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供電,小車控制板循環(huán)接收遙控板的指令,遙控板使用一個(gè)ADC搖桿發(fā)送小車行動(dòng)指令,控制小車前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止。
snake7674: 好大的蓄電池啊
回復(fù)