あけましておめでとうございます。
前回までの実験で、信号発生器の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:1 Phase:0の時の波形
SPI Polarity:1 Phase:1の時の波形
最初、データシートのように初期化すると、記載されたように、ごみが残っているらしく、下記の様な感じになってしまう。
これは、初期化する際に、全部の画像メモリにゼロを書き込む必要があるようだ。
縦48ドットなのであまり複雑なことはできないが、せっかくなので、まずグラフィックディスプレイらしく、画像を書いてみた。
何とかサイン波に見えるレベルだ。無線機につけることを考えてこれから実験してみることにする。
実験に使用したコードは、下記だ。
#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