Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン28(LCDに数値を表示する)

STM32 (LCDに取得した数値を表示)

1.本日の内容

 (1) STM32マイコン(nucleof401re)を使用して、

   LCD(ACM1602)に取得した数値を表示する。

  文字列は、そのまま出力することが出来るが、LCDに数値を表示する場合、

  取得した数値を文字列に変換する必要がある。

  取得した数値を文字列に変換し、その値をLCDに出力する方法について

  記載する。

 

・目次

 

2.内容

(1) やる内容の詳細

 ・CubeMXでI2C通信の設定を行う。

 ・nucleof401REとLCD(ACM1602)を接続する。

 ・プログラム起動時に、I2C通信を行い、LCDの制御を行う。

 ・int型の数値を宣言する。

 ・数値を文字列に変換する。

 ・変換した数値をLCDに表示する。

 

(2) 使用部品
個数 部品名 型番
1 接続ケーブル  ジャンパーワイヤ​​
1 mbed(マイコンボード) ​​ nucleo f401RE
1 USBケーブル USBミニBタイプ
1 ブレッドボード ​​ ​​EIC104j
1 LCD ACM1602NI-FLW-FBW-M01
2 カーボン抵抗(10kΩ) RD25S
1 多回転半固定ボリューム(1kΩ) 3296W-1-102LF

 

LCD(ACM1602)データシート:

https://akizukidenshi.com/download/ds/xiamen/ACM1602NI-FLW-FBW-M01_20190219.pdf

 

(3) 接続
nucleof401re側 LCD
pin番号 役割 pin番号 役割
GND GND 1 GND
3.3V 3.3V電源 2 VDD
3.3V(可変抵抗接続) 3.3V電源-可変抵抗 3 Vo
D15(PB8) I2C_SCL 4 I2C_SCL
D14(PB9) I2C_SDA 5 I2C_SDA
3.3V 3.3V電源 6 BL+(バックライト)
GND GND 7 BL-(バックライトGND)

※Voは、LCDのコンストラクタの為、可変抵抗で入力する電圧を変化させ、調整する。

 

 ・LCDのデータシートより

 

 接続は下記記事を参考にしました。 

ArduinoでI2C制御LCD ACM1602を使う(1) | wsnakのブログ

・上記記事では、SCDとSDAに5Vが接続されているが、3.3Vを使用。

 

(2) CubeMXの設定

 ・File→New ProjectでSTM32F401を選択し、新しいプロジェクトを作成する。

  (a) Pin設定画面の下記ピンを設定する。

    ・PB9をI2C1_SDA   (LCD制御用 I2C_SDA)

    ・PB8をI2C1_SCL          (LCD制御用 I2C_SCL)

    ・PA5をGPIO_Output     (LED点灯用)

    ・PC13をGPIO_EXTI13 (今回は使わないが、デバック用にあると良い)

  (b) それぞれのピンの名前を右クリック、Enter User Labelで

    画像の名前に変更する。(変更しなくてもよい。)

 

 

  (b) ConnectivityのI2C1を選択し、LCDの仕様に合わせて、下記設定を行う。

Mater Feature
  I2C Speed Mode Standard Mode
  I2C Clock Speed 70000
Slave Features
      Clock No Stretch Mode Disable
 Primary Address Length selection 7-bit
 Dual Address Acknowledged Disable
 Primary slave address 0
 Generala Call address detection Disabled

 

   下記に簡単に、それぞれの設定の意味を示す。

設定項目 説明
Master Features I2C通信のマスター側の設定項目
I2C Speed Mode

I2Cのスピードモード設定。

標準モード、Fastモードが選択可能

※今回はそこまで速度が必要ないので標準。

I2C Clock Speed

I2Cのクロック速度設定。Hz単位で設定可能

※データシートより100kHzに設定

Slave Features I2C通信のスレーブ側の設定項目
Clock No Stretch Mode スレーブデバイスによるクロックのストレッチを禁止するか選択可能。
Primary Address Length selection

プライマリアドレスのビット数を7ビット

または10ビットで設定可能。

Dual Address Acknowledged スレーブデバイスが2つのアドレスを認識するかどうか選択可能。
Primary slave address スレーブデバイスのプライマリアドレスを設定可能。
General Call address detection ジェネラルコールアドレスの受信を有効にするか選択可能。

※仕様上、LCDのI2Cクロックスピードは100kHzまで可能ですが。

線の長さなどによっては、そのスピードだと通信できない可能性があります。

その場合は、70kHzなどクロックスピードを落とすと通信出来るようになります。

 

 

 

  (c)NVICを設定

 

  (d) 割り込みの優先順位を下げる。

 

  (e) プロジェクト名を付け、Toolchain/IEDをTrueSTUDIOに設定

 

 

 (f)GENERATE CODEでコードを生成し、AtricTrueStdioを起動する。

  ※Open PROJECTをクリックすると、AtricTrueStdioが自動的に起動される。

 

 LED及びボタン設定に関しては下記記事を参照 

 ・STM32マイコン_6(スイッチ入力(INT割り込み)とLED出力) - Project_OKI’s diary

 

(3) プログラムの作成

動作:

 ・LCDの初期化

 ・LCDのカーソル位置を左上(0,0)に設定

 ・数値を表示

 

main.c
/* USER CODE BEGIN Includes */
#include	"stdio.h"	///< 標準関数
/* USER CODE END Includes */
/* USER CODE BEGIN PD */
//コマンド送信用定数
#define LCDADRESS 0xa0	//LCDのスレーブアドレス
#define CMDSEND 0x00	//コマンド送信
#define	DATASEND 0x80	//データ送信
/* USER CODE END PD */
/* USER CODE BEGIN 0 */

///コマンド送信用関数
///引数:送信コマンド
///返り値:無し
void writeCmd(uint8_t cmd)
{
	uint8_t buf[] = {CMDSEND,cmd};
	HAL_I2C_Master_Transmit(&hi2c1,LCDADRESS,buf,sizeof(buf),HAL_MAX_DELAY);
}

///データ送信用関数
///引数:送信データ
///返り値:無し
void writeData(uint8_t data)
{
	uint8_t buf[] = {DATASEND,data};
	HAL_I2C_Master_Transmit(&hi2c1 ,LCDADRESS , buf,sizeof(buf),HAL_MAX_DELAY);
}

///LCD初期化関数
///引数:無し
///返り値:無し
void Lcd_init(){
	writeCmd(0x01);		///画面クリア
	HAL_Delay(5);		///5msまち
	writeCmd(0x38);		///ファンクション設定
	HAL_Delay(5);		///5ms
	writeCmd(0x0f);		///ディスプレイON、CURSOR-ON、blinking-ON
	HAL_Delay(5);		///5msまち
	writeCmd(0x06);		///データ書き込み後アドレス加算モード設定
	HAL_Delay(5);		///5msまち
}

//LCD画面クリア
///引数:送信データ
///返り値:無し
void LCD_Clear(void){
	writeCmd(0x01);	//0x01コマンドを送信
	HAL_Delay(2);
}

///LCDのカーソル位置設定
///引数:uint8_t col:横の位置、uint8_t row:縦の位置(1段目、2段目)
///返り値:無し
void LCD_SetCursor(uint8_t col,uint8_t row)
{
	///
	uint8_t row_offsets[] = { 0x00, 0x40};
	if (row > 1) {		///2段目以上はない。
	row = 1;
	}
	writeCmd(0x80 | (col + row_offsets[row]));
}

//LCD文字出力
///引数:char str:送信する文字
///返り値:無し
void LCD_Print(char* str) { while (*str) { writeData((uint8_t)*str++); } } /* USER CODE END 0 */
/* USER CODE BEGIN 2 */
char str[255]; //文字列 uint8_t a; //数値を用意 a = 10; sprintf(str,"%d[mV]",a); ///< 数値を文字列に変換 Lcd_init(); //LCD初期化 LCD_SetCursor(0, 0); //カーソル位置を0,0に設定(1行目の左端) LCD_Print(str); //数値をLCDに出力
/* USER CODE END 2 */
 
(4) プログラムの説明
 (a) sprintf(str,"%d[mV]",a); ///< 数値を文字列に変換
  ・数値を文字列に置き換える関数として、sprintf関数を使用。
  ・これは、標準関数(stdio.h)に用意されている。
  ・a = 10 の数値をsprintfでstrに文字列として格納
  ・strをLCDに文字列として出力する。
 
  sprintf関数の詳細は下記記事を参照。
 
 (b) LCDの出力に関しては下記記事を参照
  ・C言語基礎知識30(数値を文字列に変換)
 

3.関連記事

関連記事一覧:
 
組み込みC言語: