aki_iic’s blog

己の欲せざる処人に施す事無かれ、狂人の真似するは即ち狂人なり

卯月

 卯月に入ったのに10℃前半の日があったりでコートとマフラーがまだ手放せない今日この頃。台湾でM7レベルの大地震があったり311から10年以上経過するも地学(懐かし)上は10年なんて誤差だから備えは必要だろうし、それ故の量産型アシモの通勤電車への配備が進んでいるのだろう(蛇足ですが揶揄です。巨大なリックサックを背負ったオッサンらが地下鉄に充足される態様がその様に見えて。。。悪趣味ですかね:)。

 個人的には今年度から週休3日体制になり(来年度は週休7日、とか?)、通勤ルートも1つになり中継駅で今日は右か左かを記憶する必要が無くなったのは良い事だけど仕事量は変わらないから契約上の縛りであります。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

 話は変わって今日佐川/UPSのおっさんがRenesas R9A評価ボードを配達してくれた。名刺サイズぐらいのボードで実装部品も少ないBreakout boardだからNXPフリスケ(しつこい)のFRDM-MCXN947に比べると用途が異なるから当然とは言え、いささかの残念感も:

RTK9FPG021S00001BJ(R9A breakout board)

 きっと最初に動かすにはシンプルで好ましいのだろうが、ガッカリ感を克服できぬ私は放置プレイ脳内決定:)

 次はスイッチサイエンスに注文していたRP2040-GEEKなるrpi picoの箱入りLCD付きモジュールというかドングルというかで最近よく見かけるWAVESHARE社の製品:

RP2040-GEEKwww.switch-science.com

RP2040 GEEK (bottom)

RP2040-GEEK

 よく見かけるRP2040を用いた小物の一種でOpenOCDとしても使える様だから財団のそれとpico+LCDの付加価値で9.99USDで商売になると支那ベンダさんは算段したらしく、こうしてカモが釣られている訳であります。

 実態としてpicoの如き基板にはんだ付けするのが面倒/困難な方や教材向けには良い商品ではないでしょうか。価格も安いし供給が安定してくれたらそこそこ需要もありそう(まあ、私の感覚が世間とズレてるから当たった例は無いのだが:)だし、これにpico-wバージョンが追加されるとM5Stack系に対抗出来るやもしれず(願望)。

 で、中身はRP2040だからフレームワークもそのままで私はmicropython+Thonnyでi2cマスタモードで動かそうと思っている(実はそれ用にMCP2221モジュールも入手済だがどうしようか思案中)。

 商品名がGEEKというのがちと恥ずかしいというか中二病的な何かを感じなくもないがそれが気にならない(気持ち含めて)熱いお方には受けるかもしれない。

 開発元のwiki(上記サイトにもリンクあり):

www.waveshare.com

 このベンダ、RP2040内蔵の丸いLCDモジュール作ったり、支那にしては(毎度比較して悪いが例えばM5Stackと比べて)プラの整形やデザインも良好(あくまで個人の見方です)故、着目している。今回の商品は中身はRP2040だから別段支那が止めても代替手段はあるから気にならないし(常にリスクには備える心構えは必要)。

20240406 14:22追記:上記サイトから一番下のresourceからdemoサンプルをgoole drive経由で入手し、lcd text専用に簡素化してLCDに表示。

RP2040-GEEK LCD test

 同拡大:

RP2040-GEEK LCD test

 1.14インチと小さいが近づけば私の目でも見える(日によって異なる:)。16bit colorらしいのでそれなりの表現力はあるがSPI経由なのでそれなりの表示。サンプルコードは呪文が書かれてLCDに詳しくない私には今時点では謎なので触れないでおこう。

from machine import Pin,SPI,PWM
import framebuf
import time

BL = 25
DC = 8
CS = 9
SCK = 10
MOSI = 11
RST = 12


class LCD_1inch14(framebuf.FrameBuffer):
    def __init__(self):
        self.width = 240
        self.height = 135
        
        self.cs = Pin(CS,Pin.OUT)
        self.rst = Pin(RST,Pin.OUT)
        
        self.cs(1)
        self.spi = SPI(1)
        self.spi = SPI(1,1000_000)
        self.spi = SPI(1,50_000_000,polarity=0, phase=0,sck=Pin(SCK),mosi=Pin(MOSI),miso=None)
        self.dc = Pin(DC,Pin.OUT)
        self.dc(1)
        self.buffer = bytearray(self.height * self.width * 2)

        super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
        self.init_display()
        
        self.red   =   0x07E0
        self.green =   0x001f
        self.blue  =   0xf800
        self.white =   0xffff
        
    def write_cmd(self, cmd):
        self.cs(1)
        self.dc(0)
        self.cs(0)
        self.spi.write(bytearray([cmd]))
        self.cs(1)

    def write_data(self, buf):
        self.cs(1)
        self.dc(1)
        self.cs(0)
        self.spi.write(bytearray([buf]))
        self.cs(1)

    def init_display(self):
        """Initialize dispaly"""  
        self.rst(1)
        self.rst(0)
        self.rst(1)
        
        self.write_cmd(0x36)
        self.write_data(0x70)

        self.write_cmd(0x3A) 
        self.write_data(0x05)

        self.write_cmd(0xB2)
        self.write_data(0x0C)
        self.write_data(0x0C)
        self.write_data(0x00)
        self.write_data(0x33)
        self.write_data(0x33)

        self.write_cmd(0xB7)
        self.write_data(0x35) 

        self.write_cmd(0xBB)
        self.write_data(0x19)

        self.write_cmd(0xC0)
        self.write_data(0x2C)

        self.write_cmd(0xC2)
        self.write_data(0x01)

        self.write_cmd(0xC3)
        self.write_data(0x12)   

        self.write_cmd(0xC4)
        self.write_data(0x20)

        self.write_cmd(0xC6)
        self.write_data(0x0F) 

        self.write_cmd(0xD0)
        self.write_data(0xA4)
        self.write_data(0xA1)

        self.write_cmd(0xE0)
        self.write_data(0xD0)
        self.write_data(0x04)
        self.write_data(0x0D)
        self.write_data(0x11)
        self.write_data(0x13)
        self.write_data(0x2B)
        self.write_data(0x3F)
        self.write_data(0x54)
        self.write_data(0x4C)
        self.write_data(0x18)
        self.write_data(0x0D)
        self.write_data(0x0B)
        self.write_data(0x1F)
        self.write_data(0x23)

        self.write_cmd(0xE1)
        self.write_data(0xD0)
        self.write_data(0x04)
        self.write_data(0x0C)
        self.write_data(0x11)
        self.write_data(0x13)
        self.write_data(0x2C)
        self.write_data(0x3F)
        self.write_data(0x44)
        self.write_data(0x51)
        self.write_data(0x2F)
        self.write_data(0x1F)
        self.write_data(0x1F)
        self.write_data(0x20)
        self.write_data(0x23)
        
        self.write_cmd(0x21)

        self.write_cmd(0x11)

        self.write_cmd(0x29)
    @micropython.viper
    def swap(self):
        buf=ptr8(self.buffer)
        for x in range(0,240*135*2,2):
            tt=buf[x]
            buf[x]=buf[x+1]
            buf[x+1]=tt
    @micropython.viper
    def ins(self,ins_data,ins_len:int,start:int):
        ins_buf=ptr8(ins_data)
        buf=ptr8(self.buffer)
        for x in range(ins_len):
            buf[start+x]=ins_buf[x]
    @micropython.viper
    def mirror(self):
        buf=ptr8(self.buffer)
        for y in range(0,135):
            for x in range(0,120):
                temp_x=(240-x)*2
                temp_y=y*480
                t1=buf[x*2+temp_y]
                t2=buf[x*2+temp_y+1]
                buf[x*2+temp_y]=buf[temp_x+temp_y]
                buf[x*2+temp_y+1]=buf[temp_x+temp_y+1]
                buf[temp_x+temp_y]=t1
                buf[temp_x+temp_y+1]=t2
            
            
    def show(self):
        self.write_cmd(0x2A)
        self.write_data(0x00)
        self.write_data(0x28)
        self.write_data(0x01)
        self.write_data(0x17)
        
        self.write_cmd(0x2B)
        self.write_data(0x00)
        self.write_data(0x35)
        self.write_data(0x00)
        self.write_data(0xBB)
        
        self.write_cmd(0x2C)
        
        self.cs(1)
        self.dc(1)
        self.cs(0)
        self.swap()
        self.spi.write(self.buffer)
        self.swap()
        self.cs(1)
  
if __name__=='__main__':
    #from bmp_reader import BMPReader
    import os
    import gc
    gc.enable()
    pwm = PWM(Pin(BL))
    pwm.freq(1000)
    pwm.duty_u16(32768)#max 65535

    LCD = LCD_1inch14()
    #color BRG
    LCD.fill(0xfff0)
    LCD.show()
    LCD.text("RP2040-GEEK",60,40,0XF800)
    LCD.text("1.14inch LCD test",60,80,0X001F)
    LCD.show()
    #img = BMPReader('./RP2040-GEEK.bmp')

    while(1):
        time.sleep(1)


        
    
    LCD.fill(0xFFFF)

 引用おわり。2021年頃に開発されたものらしく、サンプルとメモの中身が合ってない(トライアングルなんて無いよ?)がサンプルがあるだけ有り難いのだろう。