반응형

https://youtube.com/live/X9i3F1bRd_M

[STM32#34] 블루필보드로 로봇하드웨어개발기사 공개문제에 있는 i2c가 아닌 1602lcd를 작동시키는 방법을 데이터시트로 알아보기!(녹칸다 내맘대로 STM32)

심심한녹칸다의 내맘대로 STM32시리즈이다!

STM32시리즈의 모든 자료는 구글 슬라이드에 작성하고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1myA5iYbjuKsLWLqtRLKAiRfwUwvqB1d1RGjiMIIgp3I/edit?slide=id.g3bd7e320f89_10_229#slide=id.g3bd7e320f89_10_229

로봇하드웨어개발기사에 있는 일부 내용을 STM32보드로 한번 접근해보는 것입니다!

1.블루필보드에 1602LCD를 회로도에 맞게 연결한다음 데이터시트를 해석해서 첫번째 줄에는 “NOCKANDA”라고 출력하고 두번째 줄에는 “SUBSCRIBE!”라고 출력해보도록 한다!

/* USER CODE BEGIN 0 */
void lcd_write4(uint8_t n)
{
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (n >> 0) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (n >> 1) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (n >> 2) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (n >> 3) & 1);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
  HAL_Delay(1);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
  HAL_Delay(1);
}
void lcd_write8(uint8_t data, uint8_t rs)
{
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, rs);
  lcd_write4(data >> 4);   // 상위 4비트
  lcd_write4(data & 0x0F); // 하위 4비트
}
void lcd_cmd(uint8_t cmd)
{
  lcd_write8(cmd, 0);
}
void lcd_data(uint8_t data)
{
  lcd_write8(data, 1);
}
void lcd_puts(char *s)
{
  while(*s)
  	lcd_data(*s++);
}
/* USER CODE END 0 */

/* USER CODE BEGIN 2 */
 //STM32가 부팅된 후 15ms이상 기다려줘야한다!
 HAL_Delay(15);
 //그다음 0b0011을 전송한다
 lcd_write4(0b0011);
 HAL_Delay(5); //4.1ms이상 대기
 lcd_write4(0b0011);
 HAL_Delay(1); //100us(0.1ms)이상 대기
 lcd_write4(0b0011);
 //HAL_Delay(1);
 lcd_write4(0b0010);
 lcd_cmd(0b00101000);  // 4bit, 2line
 lcd_cmd(0b00001000);  // Display OFF
 lcd_cmd(0b00000001);  // Clear
 //HAL_Delay(5);
 lcd_cmd(0b00000110);  // Entry mode
 lcd_cmd(0b00001100);  // Display ON
 lcd_cmd(0x80);
 lcd_puts("NOCKANDA");
 lcd_cmd(0xC0);
 lcd_puts("SUBSCRIBE!");
 /* USER CODE END 2 */


2.첫번째줄에 왼쪽부터 2번째칸에서 시작해서 NOCKANDA라고 출력하고 두번째줄의 3번째 칸부터 시작해서 SUBSCRIBE!를 출력하시오!

/* USER CODE BEGIN 0 */
void lcd_write4(uint8_t n)
{
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (n >> 0) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (n >> 1) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (n >> 2) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (n >> 3) & 1);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
  HAL_Delay(1);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
  HAL_Delay(1);
}
void lcd_write8(uint8_t data, uint8_t rs)
{
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, rs);
  lcd_write4(data >> 4);   // 상위 4비트
  lcd_write4(data & 0x0F); // 하위 4비트
}
void lcd_cmd(uint8_t cmd)
{
  lcd_write8(cmd, 0);
}
void lcd_data(uint8_t data)
{
  lcd_write8(data, 1);
}
void lcd_puts(char *s)
{
  while(*s)
  	lcd_data(*s++);
}


void set_cursor(uint8_t x, uint8_t y){
	uint8_t cursor = 0b10000000;
	if(y != 0){
		cursor = cursor | 0b01000000;
	}
	cursor = cursor + x;
	lcd_cmd(cursor);
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
 //STM32가 부팅된 후 15ms이상 기다려줘야한다!
 HAL_Delay(15);
 //그다음 0b0011을 전송한다
 lcd_write4(0b0011);
 HAL_Delay(5); //4.1ms이상 대기
 lcd_write4(0b0011);
 HAL_Delay(1); //100us(0.1ms)이상 대기
 lcd_write4(0b0011);
 //HAL_Delay(1);
 lcd_write4(0b0010);
 lcd_cmd(0b00101000);  // 4bit, 2line
 lcd_cmd(0b00001000);  // Display OFF
 lcd_cmd(0b00000001);  // Clear
 //HAL_Delay(5);
 lcd_cmd(0b00000110);  // Entry mode
 lcd_cmd(0b00001100);  // Display ON
 set_cursor(2,0);
 lcd_puts("NOCKANDA");
 set_cursor(3,1);
 lcd_puts("SUBSCRIBE!");
 /* USER CODE END 2 */


3.로봇하드웨어개발기사에서 공개되어있는 부분만 STM32보드로 간단하게 구현해보시오!(조이스틱x축PA0, y축PA1, 서보모터PB11)

/* USER CODE BEGIN 0 */
void lcd_write4(uint8_t n)
{
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (n >> 0) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (n >> 1) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (n >> 2) & 1);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (n >> 3) & 1);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
  HAL_Delay(1);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
  HAL_Delay(1);
}
void lcd_write8(uint8_t data, uint8_t rs)
{
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, rs);
  lcd_write4(data >> 4);   // 상위 4비트
  lcd_write4(data & 0x0F); // 하위 4비트
}
void lcd_cmd(uint8_t cmd)
{
  lcd_write8(cmd, 0);
}
void lcd_data(uint8_t data)
{
  lcd_write8(data, 1);
}
void lcd_puts(char *s)
{
  while(*s)
  	lcd_data(*s++);
}


void set_cursor(uint8_t x, uint8_t y){
	uint8_t cursor = 0b10000000;
	if(y != 0){
		cursor = cursor | 0b01000000;
	}
	cursor = cursor + x;
	lcd_cmd(cursor);
}
void set_servo(uint8_t degree){
	//degree는 0~180도 범위이고 CCR4는 600부터 2400의 범위이다!
	TIM2->CCR4 = (uint32_t)(600+(2400-600)*degree/180.0);
}
uint16_t map(uint16_t analog){
	return 180*analog/4095.0;
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
 //STM32가 부팅된 후 15ms이상 기다려줘야한다!
 HAL_Delay(15);
 //그다음 0b0011을 전송한다
 lcd_write4(0b0011);
 HAL_Delay(5); //4.1ms이상 대기
 lcd_write4(0b0011);
 HAL_Delay(1); //100us(0.1ms)이상 대기
 lcd_write4(0b0011);
 //HAL_Delay(1);
 lcd_write4(0b0010);
 lcd_cmd(0b00101000);  // 4bit, 2line
 lcd_cmd(0b00001000);  // Display OFF
 lcd_cmd(0b00000001);  // Clear
 //HAL_Delay(5);
 lcd_cmd(0b00000110);  // Entry mode
 lcd_cmd(0b00001100);  // Display ON
 set_cursor(0,0);
 lcd_puts("ROBOT ARM       ");
 set_cursor(0,1);
 lcd_puts("NUMBER:001      ");
 HAL_Delay(5000);
 uint16_t adc_value0 = 0;
 uint16_t adc_value1 = 0;
 uint8_t line1[20];
 uint8_t line2[20];
 /* USER CODE END 2 */

while (1)
 {
	  //M1:AAAA  M2:BBBB
	  //M3:CCCC
	  //PA0 ADC1 RANK1
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value0 = HAL_ADC_GetValue(&hadc1);
	  //PA1 ADC1 RANK2
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value1 = HAL_ADC_GetValue(&hadc1);
	  sprintf(line1,"M1:%4d  M2:%4d",adc_value0,adc_value1);
	  sprintf(line2,"M3:%13d",HAL_GetTick());
	  set_cursor(0,0);
	  lcd_puts(line1);
	  set_cursor(0,1);
	  lcd_puts(line2);
	  //서보모터제어
	  set_servo(map(adc_value1));
	  HAL_Delay(100);
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
반응형
Posted by 덕력킹
,