راهنما راه اندازی ربات کنترلی با وای فای با میکرو آرم سری ST

پروژه ربات کنترلی با وای فای با میکرو آرم سری ST

0

راهنما راه اندازی ربات کنترلی با وای فای با میکرو آرم سری ST

هدف از انجام این پروژه به حرکت درآوردن و کنترل ربات در چهار جهت اصلی

توسط وای فای (به طور مثال از طریق برنامه Hercules) می باشد.

شما در این پروژه، موارد زیر را فرا خواهید گرفت:

  1. کار با ماژول وای فای ESP8266
  2. کار با درایور موتور L298
  3. راه‌اندازی درگاه UART میکروکنترلر ARM ST
  4. کار با GPIO های مختلف میکروکنترل ARM ST

موارد مورد نیاز:

  1. برد 2 wheels controller
  2. پروگرمر ST-Link
  3. منبع تغذیه
  4. شاسی ربات 4 چرخ
  5. ماژول WiFi ESP8266

توضیحات برنامه:

ابتدا تنظیمات مربوط به ماژول WiFi را انجام می‌دهیم؛ نام و رمز برای آن انتخاب کرده و نوع پروتکل ارتباطی آن را مشخص می‌کنیم (TCP/IP).

سپس وقفه دریافت درگاه UART را فعال می‌کنیم. پس از فراخوانی تابع وقفه، بیت وقفه پاک شده و دوباره باید تنظیم شود. برای همین در تابع وقفه دوباره این کد تکرار شده‌است.

وقفه دریافت درگاه uart

در ادامه تایمر 6 را نیز فعال کرده‌ایم و LED روی برد را توسط این تایمر کنترل می‌کنیم.

فعال کردن تایمر 6

تابع فراخوانی وقفه تایمر در انتهای سربرگ main.c اورده شده‌است.

1تابع-فراخوانی-وقفه-تایمر

نکته: دقت داشته باشید در برنامه CubeMX حتما وقفه تایمرها، UART و دیگر وقفه‌های مورد نیاز را فعال سازید.

interrupts

درادامه وارد حلقه اصلی برنامه می‌شویم. در این حلقه، وظیفه‌ای تعریف نشده‌است. برنامه کنترلی در سربرگ وقفه نوشته شده‌است.

همانطور که قبلا گفته شد، وقفه دریافت را دوباره فعال می‌کنیم:

فعال کردن دوباره وقفه دریافت

دستوراتی که از طرف کاربر ارسال می‌شوند، با کاراکتر ‘@’ شروع می‌شوند. پس برای جلوگیری از بروز خطا، از دستوراتی که غیر از این الگو باشند،  صرف نظر می‌شود.

کاربر می‌تواند 5 دستور کنترلی را ارسال کند ( در این پروژه‌ها از نرم‌افزار Hercules برای ارتباط با برد و ارسال فرامین استفاده شده‌است).

hercules

دستورات قابل قبول عبارتند از:

  1. @F: حرکت رو به جلو
  2. @B: حرکت رو به عقب
  3. @R: حرکت به راست
  4. @L: حرکت به چپ
  5. @S: توقف

5 دستور کنترلی ربات

در صورتی که ارتباط با ماژول WiFi قطع شود، ربات از حرکت باز خواهد ایستاد.

قطع ارتباط با wifi

کد سر برگ main.c به صورت زیر خواهد بود:

/* Includes ------------------------------*/
#include "main.h"
#include "stm32f3xx_hal.h"

/* USER CODE BEGIN Includes */
#include "string.h"
#define mux "AT+CIPMUX=1\r\n"
#define server "AT+CIPSERVER=1,8626\r\n"
#define RST "AT+RST\r\n"
#define NAM "AT+CWSAP=\"RoboWiFi\",\"123456789\",1,4\r\n" // WiFi SSID & Password
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c2;

TIM_HandleTypeDef htim6;

UART_HandleTypeDef huart3;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t uart_rx[2];
char Rx_indx, Rx_data[2], Rx_Buffer[100], Transfer_cplt;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_I2C2_Init(void);
static void MX_TIM6_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  MX_I2C2_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
	HAL_Delay(1000);
	/******************* config esp8266 in TCP/IP mode*********************************/
	
	HAL_UART_Transmit(&huart3,(uint8_t *)RST,sizeof(RST),1000);		HAL_Delay(4000);
	HAL_UART_Transmit(&huart3,(uint8_t *)mux,sizeof(mux),1000);		HAL_Delay(2000);
	HAL_UART_Transmit(&huart3,(uint8_t *)server,sizeof(server),1000);		HAL_Delay(2000);
	HAL_UART_Transmit(&huart3,(uint8_t *)NAM,sizeof(NAM),1000);		HAL_Delay(3000);
	
	/***********************************************************************************/
	HAL_UART_Receive_IT(&huart3,uart_rx,2);// Enable intrupt mode
	HAL_TIM_Base_Start_IT(&htim6);
	

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
//		HAL_GPIO_TogglePin(GPIOA,LED_Pin);//blinking LED

		HAL_Delay(1);

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  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.PLLMUL = RCC_PLL_MUL8;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART3|RCC_PERIPHCLK_I2C2;
  PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
  PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_HSI;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* I2C2 init function */
static void MX_I2C2_Init(void)
{

  hi2c2.Instance = I2C2;
  hi2c2.Init.Timing = 0x2000090E;
  hi2c2.Init.OwnAddress1 = 0;
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Analogue filter 
    */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure Digital filter 
    */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* TIM6 init function */
static void MX_TIM6_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;

  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 1401;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 1501;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* USART3 init function */
static void MX_USART3_UART_Init(void)
{

  huart3.Instance = USART3;
  huart3.Init.BaudRate = 38400;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, L298_1_Pin|GPIO_PIN_6|LED_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, L298_2_Pin|L298_3_Pin|L298_4_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);

  /*Configure GPIO pins : L298_1_Pin PA6 LED_Pin */
  GPIO_InitStruct.Pin = L298_1_Pin|GPIO_PIN_6|LED_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : L298_2_Pin L298_3_Pin L298_4_Pin PB6 
                           PB7 */
  GPIO_InitStruct.Pin = L298_2_Pin|L298_3_Pin|L298_4_Pin|GPIO_PIN_6 
                          |GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

	/**************Timer Interrupt***********************/

	void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance == TIM6) {
		
		HAL_GPIO_TogglePin(GPIOA,LED_Pin);//LED Blinking		
    }
}


/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 

کد سربرگ xx_it.c به صورت زیر خواهد بود:

/**
  ******************************************************************************
  * @file    stm32f3xx_it.c
  * @brief   Interrupt Service Routines.
  ******************************************************************************
  *
  * COPYRIGHT(c) 2019 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "stm32f3xx_hal.h"
#include "stm32f3xx.h"
#include "stm32f3xx_it.h"

/* USER CODE BEGIN 0 */
#include "string.h"
uint8_t receive[2];
char buff[3];
/* USER CODE END 0 */

/* External variables --------------------------------------------------------*/
extern TIM_HandleTypeDef htim6;
extern UART_HandleTypeDef huart3;

/******************************************************************************/
/*            Cortex-M4 Processor Interruption and Exception Handlers         */ 
/******************************************************************************/

/**
* @brief This function handles Non maskable interrupt.
*/
void NMI_Handler(void)
{
  /* USER CODE BEGIN NonMaskableInt_IRQn 0 */

  /* USER CODE END NonMaskableInt_IRQn 0 */
  /* USER CODE BEGIN NonMaskableInt_IRQn 1 */

  /* USER CODE END NonMaskableInt_IRQn 1 */
}

/**
* @brief This function handles Hard fault interrupt.
*/
void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
    /* USER CODE END W1_HardFault_IRQn 0 */
  }
  /* USER CODE BEGIN HardFault_IRQn 1 */

  /* USER CODE END HardFault_IRQn 1 */
}

/**
* @brief This function handles Memory management fault.
*/
void MemManage_Handler(void)
{
  /* USER CODE BEGIN MemoryManagement_IRQn 0 */

  /* USER CODE END MemoryManagement_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
    /* USER CODE END W1_MemoryManagement_IRQn 0 */
  }
  /* USER CODE BEGIN MemoryManagement_IRQn 1 */

  /* USER CODE END MemoryManagement_IRQn 1 */
}

/**
* @brief This function handles Pre-fetch fault, memory access fault.
*/
void BusFault_Handler(void)
{
  /* USER CODE BEGIN BusFault_IRQn 0 */

  /* USER CODE END BusFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_BusFault_IRQn 0 */
    /* USER CODE END W1_BusFault_IRQn 0 */
  }
  /* USER CODE BEGIN BusFault_IRQn 1 */

  /* USER CODE END BusFault_IRQn 1 */
}

/**
* @brief This function handles Undefined instruction or illegal state.
*/
void UsageFault_Handler(void)
{
  /* USER CODE BEGIN UsageFault_IRQn 0 */

  /* USER CODE END UsageFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
    /* USER CODE END W1_UsageFault_IRQn 0 */
  }
  /* USER CODE BEGIN UsageFault_IRQn 1 */

  /* USER CODE END UsageFault_IRQn 1 */
}

/**
* @brief This function handles System service call via SWI instruction.
*/
void SVC_Handler(void)
{
  /* USER CODE BEGIN SVCall_IRQn 0 */

  /* USER CODE END SVCall_IRQn 0 */
  /* USER CODE BEGIN SVCall_IRQn 1 */

  /* USER CODE END SVCall_IRQn 1 */
}

/**
* @brief This function handles Debug monitor.
*/
void DebugMon_Handler(void)
{
  /* USER CODE BEGIN DebugMonitor_IRQn 0 */

  /* USER CODE END DebugMonitor_IRQn 0 */
  /* USER CODE BEGIN DebugMonitor_IRQn 1 */

  /* USER CODE END DebugMonitor_IRQn 1 */
}

/**
* @brief This function handles Pendable request for system service.
*/
void PendSV_Handler(void)
{
  /* USER CODE BEGIN PendSV_IRQn 0 */

  /* USER CODE END PendSV_IRQn 0 */
  /* USER CODE BEGIN PendSV_IRQn 1 */

  /* USER CODE END PendSV_IRQn 1 */
}

/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  HAL_SYSTICK_IRQHandler();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

/******************************************************************************/
/* STM32F3xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f3xx.s).                    */
/******************************************************************************/

/**
* @brief This function handles USART3 global interrupt / USART3 wake-up interrupt through EXTI line 28.
*/
void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */
//	#define AT "AT\r\n"

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */
	HAL_UART_Receive_IT(&huart3,receive,2);
	/*************************************************/
	/***************UART Receive data Interrupt*******/
	/*************************************************/
	/**To control The robot, you must send command that is list below:**/
	/**Move forward: @F Move backward: @B Move left: @L Move Right: @R**/
	/**You can connect from PC to wifi module and send command by hercules soft**/

	if(receive[0]==0x40)//if receive '@' first
	{
		
	switch(receive[1])
	{
		case 0x46 ://F(forward)
			HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_RESET);
			break;
		case 0x42 ://B(backward)
			HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_RESET);
			break;
		case 0x52 ://R(turn right)
			HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_RESET);
			break;
		case 0x4C://L(turn left)
			HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_RESET);
			break;
		case 0x53 ://Stop
			HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_RESET);
			break;
	}
}
	if(receive[1]==0x40)//if receive '@' first
	{
		
	switch(receive[0])
	{
		case 0x46 ://F(forward)
			HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_RESET);
			break;
		case 0x42 ://B(backward)
			HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_RESET);
			break;
		case 0x52 ://R(turn right)
			HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_RESET);
			break;
		case 0x4C://L(turn left)
			HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_SET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_RESET);
			break;
		case 0x53 ://Stop
			HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_RESET);
		  HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_RESET);
			break;
//		case 0x48://M(low speed)
//			HAL_TIM_Base_Stop(&htim6);
//		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
//		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
//			break;
//		case 0x4D://H(High speed)
//			HAL_TIM_Base_Start(&htim6);
//	    HAL_TIM_Base_Start_IT(&htim6);
//			break;
		 default:
			
			break;
	 }
			
	
	
}
	else if(receive[0]==0x0A |receive[0]==0x0D)// If disconnect from wifi, Robot will be STOP!
	{
		HAL_GPIO_WritePin(GPIOB,L298_3_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,L298_4_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,L298_2_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOA,L298_1_Pin, GPIO_PIN_RESET);
	}
	
		


  /* USER CODE END USART3_IRQn 1 */
}

/**
* @brief This function handles Timer 6 interrupt and DAC underrun interrupts.
*/
void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  /* USER CODE END TIM6_DAC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  /* USER CODE END TIM6_DAC_IRQn 1 */
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 
Choose your Reaction!
دیدگاه خود را بنویسید

آدرس ایمیل شما منتشر نخواهد شد.

redronic.com