can, rf 통신 모듈까지 장착한 후면 계기판 모습

저 모듈에서 방향지시등, 브레이크스위치 등등을 제어한다.







솔라카 계기판에 사용할 2.7인치 oled를 출력했다. (모델명: NHD-2.7-12864UCY3)

프로세서는 cortex-m3 계열 stm32f103을 사용

그래픽 라이브러리는 가장 많이 사용하는 u8g라이브러리를 이용했으며, 병렬방식이아닌 직렬방식으로 oled에 신호를 인가했다.

HAL라이브러리와 u8g라이브러리를 같이 사용했다.

속도는 직렬방식이라 느릴줄 알았는데, 계기판으로 사용하기에 전혀 지장이 없을정도로 업데이트가 빨랐다.

어느 각도에서든지 글자가 잘 보였고, 햇빛에서도 문제가 없어보였다.

이제 CAN트랜시버와 모듈화를 거쳐 CAN통신으로 값을 전달하면 값이 출력되게 만들예정이다.




아래는 데이터시트에서 발취한 시리얼 인터페이스








HAL라이브러리에 u8g_arm.c , u8g_arm.h 를 추가하여 소스를 추가한다.







u8g_arm.c
 #include "u8g_arm.h"  
 void u8g_Delay(uint16_t val)  
 {  
      HAL_Delay(val);  
 }  
 void u8g_MicroDelay(void)  
 {  
      HAL_Delay(1);  
 }  
 void u8g_10MicroDelay(void)  
 {  
      HAL_Delay(1);  
 }  
 uint8_t u8g_com_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)  
 {  
  switch(msg)  
  {  
   case U8G_COM_MSG_STOP:  
    break;  
   case U8G_COM_MSG_INIT:  
    u8g_MicroDelay();  
    break;  
   case U8G_COM_MSG_ADDRESS:           /* define cmd (arg_val = 0) or data mode (arg_val = 1) */  
    u8g_10MicroDelay();  
    HAL_GPIO_WritePin(PORT, DC, arg_val);  
    u8g_10MicroDelay();  
    break;  
   case U8G_COM_MSG_CHIP_SELECT:  
    if ( arg_val == 0 )  
    {  
         HAL_Delay(1);  
         HAL_GPIO_WritePin(PORT, CS, GPIO_PIN_SET);  
    }  
    else  
      HAL_GPIO_WritePin(PORT, CS, GPIO_PIN_RESET);  
    u8g_MicroDelay();  
    break;  
   case U8G_COM_MSG_RESET:  
    break;  
   case U8G_COM_MSG_WRITE_BYTE:  
     HAL_SPI_Transmit(&SPI_HANDLER, &arg_val, 1, 10000);  
     while(HAL_SPI_GetState(&SPI_HANDLER) != HAL_SPI_STATE_READY);  
     u8g_MicroDelay();  
     break;  
   case U8G_COM_MSG_WRITE_SEQ:  
   case U8G_COM_MSG_WRITE_SEQ_P:  
    {  
         HAL_SPI_Transmit(&SPI_HANDLER, (uint8_t *)arg_ptr, arg_val, 10000);  
         while(HAL_SPI_GetState(&SPI_HANDLER) != HAL_SPI_STATE_READY);  
         u8g_MicroDelay();  
         arg_val = 0;  
    }  
    break;  
  }  
  return 1;  
 }  

u8g_arm.h:

 #ifndef _U8G_ARM_H  
 #define _U8G_ARM_H  
 #include "u8g.h"  
 #include "stm32f1xx_hal.h"  
 #define SPI_HANDLER hspi2 // use your SPI hadler  
 extern SPI_HandleTypeDef SPI_HANDLER;  
 #define DC GPIO_PIN_11  
 #define CS GPIO_PIN_12  
 #define PORT GPIOB  
 uint8_t u8g_com_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);  
 #endif  

and part of main.c:  메인소스는 재량껏 수정한다.
 #include "stm32f1xx_hal.h"  
   
 /* USER CODE BEGIN Includes */  
 #include "u8g.h"  
 #include "u8g_arm.h"  
 /* USER CODE END Includes */  
   
 /* Private variables ---------------------------------------------------------*/  
 SPI_HandleTypeDef hspi2;  
   
 TIM_HandleTypeDef htim1;  
   
 /* USER CODE BEGIN PV */  
 u8g_t u8g;  
 /* Private variables ---------------------------------------------------------*/  
   
 /* USER CODE END PV */  
   
 /* Private function prototypes -----------------------------------------------*/  
 void SystemClock_Config(void);  
 static void MX_GPIO_Init(void);  
 static void MX_SPI2_Init(void);  
   
   
 /* USER CODE BEGIN PFP */  
 /* Private function prototypes -----------------------------------------------*/  
   
 /* USER CODE END PFP */  
   
 /* USER CODE BEGIN 0 */  
   
 /* USER CODE END 0 */  
   
 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();  
   
  /* Configure the system clock */  
  SystemClock_Config();  
   
  /* Initialize all configured peripherals */  
  MX_GPIO_Init();  
  MX_SPI2_Init();  
   
   
  /* USER CODE BEGIN 2 */  
  u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x64_hw_spi, u8g_com_hw_spi_fn); //이부분은 자신의 디스플레이에 맞춰야함 
  HAL_Delay(100);  
  /* USER CODE END 2 */  
   
  /* Infinite loop */  
  /* USER CODE BEGIN WHILE */  
  while (1)  
  {  
  /* USER CODE END WHILE */  
   
  /* USER CODE BEGIN 3 */  
       u8g_FirstPage(&u8g);  
       do  
       {  
            u8g.font = u8g_font_profont22;  
            u8g_DrawStr(&u8g, 20, 55, "Hello");  
       } while ( u8g_NextPage(&u8g) );  
    HAL_Delay(100);  
  }  
  /* USER CODE END 3 */  
   
 }  




spi+hal+u8g 

도움받은곳 http://elastic-notes.blogspot.kr/p/stm32-spi-oled-ssd1306-u8glib-cubemx.html






'프로젝트 > 솔라카' 카테고리의 다른 글

2017 WSC 사진  (0) 2018.03.25
솔라카 전류측정[adc 정확도 향상]  (0) 2017.07.10
솔라카 고전압 측정회로  (0) 2017.05.16
MPPT 모니터링 프로그램  (0) 2016.11.25
솔라카 더미카  (0) 2016.10.15

+ Recent posts