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を選択し、新しいプロジェクトを作成する。
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
/* 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) プログラムの説明
3.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
その他:
・CubeIDEの使い方(起動~デバック実行) - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary