ja1yaz’s diary

感動したいおやじの備忘録的ブログ 

AQM1248Aを使いこなしたい。(1)

あけましておめでとうございます。

前回までの実験で、信号発生器のSi5351とAD9833はどうにか使いこなせそうだ。

しかし、ディスプレイは、キャラクタディスプレイで、依然借りものだ。

以前から購入していたAQM1248Aというグラフィックディスプレイを引っ張り出してきた。

 

AQM1248Aも一度Arduino に接続して、テキストを好きな場所に表示するドライバがあったので試してはみた。しかし、せっかくのグラフィックディスプレイだ、もう少し楽しみかたがあるのではないかということで、早速実験だ。

マニュアルを半日見ていたが、今一つよくわからない。

わからないなりにコードを書いてみた。

まず、一番基本の基の、SPIでつまずいた。

AD9833とはまた異なるようなのだ。

spi = SPI(0, baudrate=8000000, polarity=1, phase=1, bits=8, firstbit=SPI.MSB,sck=Pin(18),mosi=Pin(19))

の設定だ

polarity=1,

phase=1,

の意味するところが根本的にわかっていないので、ここからかとも思いながらオシロスコープでそれぞれの設定を確認してみた。

下記を見ると、Polarityは、Idle時の極性らしい。

Polarity=1とすると、Idle時には、LevelはHiになっているようだ。

また、Phase=1とすると、Dataが、半周期遅くなるようだ。

だから、今回のようにSCLKの立ち上がりでデータを読む場合は、Polarity:0/Phase:0、Polarity:1/phase:1のようにPolarityとPhaseが同じでないといけないようだ。

データシートを見ると、SCLKは、Idle時は、Hiなので、Polarity:1/phase:1のように設定すればよいことが分かった。

こんな基本的なことすらわかっていなくてプログラムしようというのだから笑ってしまう。

 

Polarity:0  Phase:0の時の波形

 

SPI Polarity:0   Phase:1の時の波形

SPI Polarity:0 Phase:1

SPI Polarity:1   Phase:0の時の波形

SPI Polarity:1 Phase:0

SPI Polarity:1   Phase:1の時の波形

SPI Polarity:1 Phase:1

最初、データシートのように初期化すると、記載されたように、ごみが残っているらしく、下記の様な感じになってしまう。

 

random_dusty_pattern

これは、初期化する際に、全部の画像メモリにゼロを書き込む必要があるようだ。

縦48ドットなのであまり複雑なことはできないが、せっかくなので、まずグラフィックディスプレイらしく、画像を書いてみた。

何とかサイン波に見えるレベルだ。無線機につけることを考えてこれから実験してみることにする。

AQM1248A_sine wave

実験に使用したコードは、下記だ。

 

#RaspberryPi pico AQM1248A practice 1 draw sine wave
from machine import SPI, Pin
import time
import math
spi = SPI(0, baudrate=8000000, polarity=1, phase=1, bits=8, firstbit=SPI.MSB,sck=Pin(18),mosi=Pin(19))
cs=Pin(17,Pin.OUT)
rs=Pin(15,Pin.OUT)

def lcd_cmd_write(cmd):
    cs.value(0)
    rs.value(0)
    spi.write(cmd.to_bytes(1,"big"))
    cs.value(1)
    
def lcd_data_write(data):
    cs.value(0)
    rs.value(1)
    spi.write(data.to_bytes(1,"big"))
    rs.value(0)
    cs.value(1)
    
def lcd_reset():
    
    i=0
    j=0
    data=0xe1#colum address increment when write 
    lcd_cmd_write(data)
    while i<8:
        data=0xb0+i#Page address set  0xb0+Page
        lcd_cmd_write(data)
        #print(i,data.to_bytes(1,"big"))
        data=0x10#colum address set upperbit
        lcd_cmd_write(data)
        data=0x00#colum address set lowerbit 
        lcd_cmd_write(data)
        j=0
        while j<128:
            data=0x00
            lcd_data_write(data)
            j+=1
        i+=1
  
def init_lcd():
    #data=0xe2#Reset
    #lcd_cmd_write(data)
    #time.sleep_ms(2)
    data=0xae#Display OFF  ON:0xaf   OFF:0xae
    lcd_cmd_write(data)
    data=0xa0#ADC=normal   normal:0xa0    reverse:0xa1
    lcd_cmd_write(data)
    data=0xc8#Command output=reverse  nornal:0xc8    reverse:0xc0
    lcd_cmd_write(data)
    data=0xa3#bias=1/7  1/9:0xc2   1/7(ST7565R):0xc3
    lcd_cmd_write(data)
    
    #regurator settings
    data=0x2c#power control 1
    lcd_cmd_write(data)
    time.sleep_ms(2)
    data=0x2e#power control 2
    lcd_cmd_write(data)
    time.sleep_ms(2)
    data=0x2f#power control 3
    lcd_cmd_write(data)
    time.sleep_ms(2)
    #data=0x2c#power control 1
    #lcd_cmd_write(data)
    #time.sleep_ms(2)
    
    #Contrast setting
    data=0x23#Vo voltage resistor ratio set
    lcd_cmd_write(data)
    data=0x81#Electronic volume mode set
    lcd_cmd_write(data)
    data=0x1c#Electronic volume value set
    lcd_cmd_write(data)
    
    #Display setting
    data=0xa4#display all point=normal
    lcd_cmd_write(data)
    data=0x40#display start line=0
    lcd_cmd_write(data)
    data=0xa6#Display normal/reverse=normal 
    lcd_cmd_write(data)
    lcd_reset()
    data=0xaf#Dosplay =ON
    lcd_cmd_write(data)
    #lcd_reset()
def incr_set():
    data=0xe1#colum address increment when write 
    lcd_cmd_write(data)
    data=0x10#colum address set upperbit
    lcd_cmd_write(data)
    data=0x00#colum address set lowerbit 
    lcd_cmd_write(data)
    
init_lcd()
i=0
j=0
incr_set()
while i<129:
    y=int(24-24*math.sin(4*3.141/128*i))
    Page_add=int(y/0x08)
    datay=2**(y%0x08)
    data=0xb0+Page_add#Page address set  0xb0+Page
    lcd_cmd_write(data)
    lcd_data_write(datay)
    #print(y,Page_add,datay)
    i+=1