2022年9月10日土曜日

7セグメント液晶を使ってみた。

 aitendoでSVM343-1っていう7セグメント液晶が安く売っていたので試しに使ってみた。SPIで制御できるようなコントローラチップが乗っているっぽい。液晶部分は秋月で売ってるSP-521に似ているんだけど、SVM343-1に搭載されている液晶は全部の桁が7セグらしい。

コントローラチップはHT1621やHT1632ではないだろうかと製品ページには書いてあったのでとりあえずArduinoで動かしてみることに。

ピンアサインは基板に直接書いてあるんだけど、ケーブルの色が全然あっていないので注意かも。
VDD(5V):黒
CLOCK:赤
DATA IN:白
バックライト:青
CS:黄色
VSS(GND):緑

とりあえずArduinoのHT1632ライブラリで動かしてみた。これは6桁の7セグ用のライブラリっぽくて一部のセグがとりあえず表示されるぐらいだった。

やっぱりこのモジュールに合わせてどのセグがどのアドレスに割り振られているのかを解析する必要がありそう…。

ということでシリアルコンソールからアドレスとデータを送ってどこのセグメントがどのアドレスなのかを調べるためのスケッチを作ってみた。

#define CLOCK 12
#define DATA 13
#define CS 11

#define COMMAND_MODE 0b10000000
#define WRITE_MODE 0b10100000

#define SYS_EN 0b00000010  //LCDバイアス発生機と発振器有効化
#define LCD_OFF 0b00000100 //LCDバイアス発生機無効化
#define LCD_ON 0b00000110  //LCDバイアス発生機有効化
#define RC256K 0b00110000  //内蔵RC発振器使用 (256kHz)

void writeBits(uint8_t data, uint8_t cnt) {
  for (uint8_t i = 0; i < cnt; i++, data <<= 1) {
    digitalWrite(CLOCK, LOW);
    digitalWrite(DATA, data & 0x80 ? HIGH : LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

void write(uint8_t address, uint8_t data) {
  digitalWrite(CS, LOW);
  writeBits(WRITE_MODE, 3);
  writeBits(address << 3, 6);
  writeBits(data, 8);
  digitalWrite(CS, HIGH);
}

void cmd(uint8_t data) {
  digitalWrite(CS, LOW);
  writeBits(COMMAND_MODE, 4);
  writeBits(data, 8);
  digitalWrite(CS, HIGH);
}

void setup() {
  Serial.begin(115200);

  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  cmd(RC256K);
  cmd(0b01010010);// 1/3バイアス 1/4デューティー
  cmd(SYS_EN);
  cmd(LCD_ON);

  for (uint8_t i = 0; i < 16; i++) {
    write(i, 0);
  }
}

void loop() {
  static int i = 0;
  if (Serial.available() > 0) {
    char in = Serial.read();
    if (in == 'c') {
      Serial.println("Clear LCD");
      for (uint8_t i = 0; i < 16; i++) {
        write(i, 0);
      }
    } else if (in == 'a') {
      unsigned int input = Serial.parseInt();
      i = input;
      Serial.print("address=");
      Serial.println(input);
    } else if (in == 'd') {
      unsigned int input = Serial.parseInt();
      Serial.print("data=");
      Serial.println(input);
      write(i, input);
    }
  }
}

これでシリアルコンソールからa0と送ったあとにd255みたいにデータを送って行くとどこかが点灯するはず…
地道に試していくとデータ4と8ビット目しか使ってなかった(d8とd128にしか反応しない)

アドレスを変えながらデータを送ってみるとこんな感じになっていた。左側がアドレス、右側がデータで、結構セグメントによってバラバラ…
なので通常のHT1621ライブラリではうまく表示できないわけ。
規則性もあまりないような気がするのでちょっと使いにくいかも…

SVM343-1

同じアドレスを隣の桁でも使ってたりするので少し面倒だけど、時計用の「:」も付いてるし、小数点も付いてるのでベースのスケッチさえ作ってしまえば使えるかも。

追記:
Arduinoで扱いやすいようにライブラリまではいかないけどスケッチを作ってみた

0 件のコメント:

コメントを投稿