マカロニペンギンの健忘録

特にテーマを決めているわけじゃないが、私が気になったことを書いていく予定です。

MicroPythonでI2CインターフェースのLCDに表示する 第3弾

2022年04月23日 | 電子工作

今回はカタカナ文字に対応しました。
入力はあくまでも半角のカタカナでお願いします。

書き込むスクリプト名をacm.pyとした場合

import acm
acm.clear()
acm.send_text('キョウハイイテンキ')

とすれば表示します。

さらにこのlcdには「千」とか「万」とか「円」とか表示できるのですが、これは

acm.cmd(0x80,0xfa)   → 千
acm.cmd(0x80,0xfb) → 万
acm.cmd(0x80,0xfc) → 円

で、直接コードを叩いてください。

最後に一ついいわけなのですが、本当はencodeする際にshift-jisを指定すればよいのですが、本家のPythonはうまくエンコードできたのですが、MicroPythonのほうが対応していなくてうまく動作しませんでした。 MicroPythonのフォーラムに書き込みましたが、対応してくれるかどうか・・・・ 
なんとかカタカナが表示できたので、やっと次のステップに進めそうです。

#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin
#Version 2022.04.15 Choco-Tips.comバージョンをESP32に対応 ブログバージョン
#Version 2022.04.20 様々なプラットフォームに対応
#Version 2022.04.23 カタカナ表示に対応

import sys
from time import sleep
from machine import Pin
LCD_ADDR = 0x50
platform_name = sys.platform
if 'esp8266' == platform_name:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)
elif 'esp32' == platform_name:
    from machine import SoftI2C
    i2c = SoftI2C(scl = Pin(22),sda = Pin(21),freq = 100000)
else:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)

def cmd(a, b, msec = 0):
    buff = bytearray(2)
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    for ch in text:
        list_t = []
        list_t1 = []
        list_t = ch.encode("utf-8")
        for i in list_t:
#            print ("i",hex(i))
            if i < 0x80 or 0x9f < i:
                list_t1.append(i)
            else:
                list_t1.append(i+0x40)
        cmd(0x80,list_t1[-1])

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("タズネツヅケナサイ")
    move_cur(0, 1)
    send_text("モトメツヅケナサイ")

if __name__ == '__main__':
    print_test()


MicroPythonでI2CインターフェースのLCDに表示する on ESP32 第2弾

2022年04月21日 | ドローン

今回はESP32 と ESP8266に同じスクリプトで対応できるようにしました。
私がこの2台以外にMicroPythonを駆動することができるマイコンボードを所有していないのでこれだけです。

それとまだまだ改良の余地がありますが、カタカナを表示できるようにしました。
使い方としてはスクリプト名をacm.pyとした場合
import acm
acm.send_kana(0b10110001)
でカーソルのある場所に「ア」を表示するはずです。
カタカナ表示に関しては今後どのようなスクリプトにしたら良いのか検討中です。

今回公開のスクリプトは以下のものです
#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin
#Version 2022.04.15 Choco-Tips.comバージョンをESP32に対応 ブログバージョン
#Version 2022.04.20 様々なプラットフォームに対応


import sys
from time import sleep
from machine import Pin
LCD_ADDR = 0x50
platform_name = sys.platform
if 'esp8266' == platform_name:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)
elif 'esp32' == platform_name:
    from machine import SoftI2C
    i2c = SoftI2C(scl = Pin(22),sda = Pin(21),freq = 100000)
else:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)

def cmd(a, b, msec = 0):
    buff = bytearray(2)
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    bin = text.encode("utf-8")
    for ch in bin:
        cmd(0x80, ch)
#    print(bin)

def send_kana(text_bin):
    cmd(0x80,text_bin)

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("Keep on asking, ")
    move_cur(0, 1)
    send_text("Keep on seeking.")

if __name__ == '__main__':
    print_test()

MicroPythonでI2CインターフェースのLCDに表示する on ESP32

2022年04月15日 | 電子工作
久しぶりにマイコンボードに触りたくなって、MicroPythonを書き込んだESP32でI2CインターフェースのLCDに表示することにしました。

以下の内容は記載しません。MicroPythonのオフィシャルなどのホームページを参考にしてください。
ESP32にMicroPythonのファームウェアを書き込む方法
ESP32にPythonのスクリプトを書き込み方法
対話型ウィンドウ=REPLの操作方法

MicroPythonでI2CインターフェースのLCDにアクセスしている記事は多々ありましたが、参考にしたのはhttps://choco-tips.comの「ラズベリーパイ I2Cキャラクターモジュールを使う」です。Raspberry PiでI2CインターフェースのLCDのアクセスしている記事でした。 importしているライブラリー名などを多少変更するだけで使用することができました。
あと、私が持っているESP32がI2Cと相性が悪いのかわからないですが、ハードウェアI2Cだとうまく動作せず、ソフトウェアI2Cを使用しています。
#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin

from time import sleep
from machine import Pin,SoftI2C
i2c = SoftI2C(scl = Pin(21),sda = Pin(22),freq = 100000)
LCD_ADDR = 0x50
buff = bytearray(2)

def cmd(a, b, msec = 0):
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    bin = text.encode("utf-8")
    for ch in bin:
        cmd(0x80, ch)

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("Keep on asking, ")
    move_cur(0, 1)
    send_text("Keep on seeking.")

if __name__ == '__main__':
    print_test()