2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

概要

CoreMP135のLCDバックライトの明るさはaxp2101のLDLO1から供給される電圧によって、設定することができます。
CoreMP135のLCDはややまぶしいため、LCDバックライトを調整できるプログラムを作成しました。

image

CoreMP135のLCDの明るさ調整

image1

CoreMP135のLCDバックライトはaxp2101のLDLO1と接続されており、LDLO1に設定する電圧によって、バックライトの明るさを設定することができます。

image2

AXP2101のLDLO1は、レジスタのアドレスが0x99であり、レジスタに値を書き込むことで、100mVずつ、0.5V~3.5Vの範囲で設定することができますが、FT6336Uの範囲を鑑みて0.5V~3.3Vで設定します

Cross Compile Enviroment

$ arm-linux-gnueabihf-g++ -o coremp135_i2c_backlight_ctrl coremp135_i2c_backlight_ctrl.cpp 
coremp135_i2c_backlight_ctrl.cpp
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <unistd.h>

#include <bitset>
#include <iostream>

// I2C通信のための定数定義
#define AXP2101_ADDR 0x34  // AXP2101のアドレス
#define AXP2101_REG_DLDO1_CFG 0x99  // 書き込むレジスタのアドレス
#define AXP2101_MAX_BACKLIGHT_REG 28  // バックライトの最大レジスタ値 (3.3V)

// メイン関数
int main() {
  int file;  // I2Cバスのファイルディスクリプタ
  const char *filename = "/dev/i2c-0";  // I2Cバスデバイスファイル
  int deviceAddress = AXP2101_ADDR;  // I2Cデバイスアドレス
  __u8 regAddress = AXP2101_REG_DLDO1_CFG;  // 書き込むレジスタのアドレス
  unsigned int number;  // 入力される整数を保持する変数

  // I2Cバスを開く
  if ((file = open(filename, O_RDWR)) < 0) {
    std::cerr << "I2Cバスのオープンに失敗しました" << std::endl;
    return 1;
  }

  // I2Cデバイスアドレスを設定する
  if (ioctl(file, I2C_SLAVE, deviceAddress) < 0) {
    std::cerr << "バスアクセスの取得またはスレーブとの通信に失敗しました。"
              << std::endl;
    close(file);
    return 1;
  }

  // 標準入力から符号なし整数を読み取る
  std::cout << "AXP2101 DLDO1 設定値を入力してください: ";
  std::cin >> number;

  // 数値がバックライトの最大レジスタ値を超えないようにする
  if (number > AXP2101_MAX_BACKLIGHT_REG) {
    number = AXP2101_MAX_BACKLIGHT_REG;
  }

  // 数値を10進数、16進数、2進数で表示
  std::cout << "---------------------------" << std::endl;
  std::cout << "AXP2101 DLDO1 電圧: " << number * 0.1 + 0.5 << "[V]" << std::endl;
  std::cout << "Dec: " << number << std::endl;
  std::cout << std::hex << "Hex: " << number << std::endl;
  std::cout << std::dec << "Bi: " << std::bitset<8>(number) << std::endl;
  std::cout << "---------------------------" << std::endl;

  // レジスタにデータを書き込む
  __u8 buffer[2] = {regAddress, static_cast<__u8>(number)};
  if (write(file, buffer, 2) != 2) {
    std::cerr << "I2Cバスへの書き込みに失敗しました。" << std::endl;
    close(file);
    return 1;
  }

  // I2Cバスを閉じる
  close(file);
  std::cout << "データの書き込みが成功しました。" << std::endl;

  return 0;
}

Run with CoreMP135

$ sudo ./coremp135_i2c_backlight_ctrl
Enter AXP2101 DLDO1 Setting integer: 22
AXP2101 DLDO1 Valtage: 2.7[V]
Dec: 22
Hex: 16
Bi: 00000000000000000000000000010110
Data written successfully.

22のあたりが良さそうです。

補足

CoreMP135_buildroot-external-stのcommit d621106(24/6/27)以降から、
バックライトへアクセスして明るさ調節できるドライバーが導入されました。(0~100の範囲で指定する)

 echo 0 > /sys/class/backlight/axp2101_m5stack_bl/brightness
 echo 80 > /sys/class/backlight/axp2101_m5stack_bl/brightness
 echo 100 > /sys/class/backlight/axp2101_m5stack_bl/brightness

Reference

M5Stack CoreMP135のI2C/SPI内部配線まとめ (上級開発者向け)
https://qiita.com/memetan/items/2c1ca1e34b06a2eaaeb8

M5CoreMP135
https://docs.m5stack.com/en/core/M5CoreMP135

AXP2101
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/products/core/Core2%20v1.1/axp2101.pdf

Backport drivers from CoreMP135-Arch project, take 1 #4
https://github.com/m5stack/CoreMP135_buildroot-external-st/pull/4

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?