卯月に入ったのに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-GEEK www.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年頃に開発されたものらしく、サンプルとメモの中身が合ってない(トライアングルなんて無いよ?)がサンプルがあるだけ有り難いのだろう。