Micropython만 있으면 UTF-8의 한자를 표시할 수 있습니다
8739 단어 esp32MicroPythontech
개시하다
요즘 ESP32+Micropython.을 하고 있는데 C에 비해 시행착오가 수월하고 일요일 프로그래밍의 소재로도 좋다. 이렇게 OLED를 연결해서 같이 놀고 있다.
이것을 하면서 다음과 같은 과제에 도전해 보았습니다.
폰트 형식의 디자인과 폰트 제작 도구 구현
200KB 정도의 글꼴 파일과 Micropython 150줄 정도의 파일을 추가하면 한자 하나를 처리할 수 있는 그레버가 있어 일본어 표시를 더하면 편리하다.
다음은 제 비망록을 작성하면서 설명을 꼼꼼히 쓰고 싶습니다.
한번 써보세요.
어떤 물건인지 먼저 시험해 보자.
GiitHub부터 clone pinot 시작
git clone https://github.com/yoshinari-nomura/pinot
마이크로소프트 파이톤으로 시작하기 전에 먼저 손 옆에 있는 컴퓨터 파이톤으로 테스트해 보세요.
python3 -c 'from src.lib.pnfont import Font; f = Font("src/fonts/shnmk16u.pfn"); print(f.glyph("山").banner())'
........#.......
........#.......
........#.......
........#.......
........#.......
..#.....#.....#.
..#.....#.....#.
..#.....#.....#.
..#.....#.....#.
..#.....#.....#.
..#.....#.....#.
..#.....#.....#.
..#.....#.....#.
..#.....#.....#.
..#############.
................
그리프의 발전은 pnfont이다.py만 완성되어 150줄 정도 짜임새가 있습니다.Micropython이 실행하는 마이크로컴퓨터 보드를 PC의 USB에 연결하고 글꼴 파일과 코드를 PC에서 보드로 전송합니다.
export AMPY_PORT=/dev/ttyUSB0
ampy put src/fonts/shnmk12u.pfn /fonts/shnmk12u.pfn
ampy put src/lib/display.py /lib/display.py
ampy put src/lib/pnfont.py /lib/pnfont.py
ampy put src/lib/ssd1306.py /lib/ssd1306.py
shnmk12u.pfn은 130KB 정도이고 전송 시간이 조금 필요하며 나머지는 한순간에 불과하다.다음은 디스플레이 테스트입니다.py라는 이름으로 PC 옆에 놓고 ampy로 돌려보세요.
from machine import Pin, SoftI2C
from ssd1306 import SSD1306_I2C
from pnfont import Font
from display import PinotDisplay
i2c = SoftI2C(scl = Pin(22), sda = Pin(21))
disp = PinotDisplay(panel = SSD1306_I2C(128, 32, i2c, addr = 0x3c),
font = Font('/fonts/shnmk12u.pfn'))
disp.text('本日は晴天なり\nってほどでもない')
ampy run display-test.py
참고로 하드웨어는 이 근처에 있어요. 아마존 근처에서도 살 수 있어요.
PFN(Pinot Font) 형식
이것은 글꼴 파일 구조에 관한 필기다.
PFN 피쳐
Pinot Font(PFN)는 마이크로컴퓨터 등에 사용될 Fixed 글꼴을 구상한 파일 형태로 다음과 같은 특징이 있다.
비교적 작은 파일 크기
ASCII+JISX0201+JISX0208의 동운 글씨체를 PFN으로 변환한 후 사이즈는 다음과 같습니다.
12시: 139258바이트
14:188043바이트
16:23670바이트
하나의 파일 완성
UTF-8(UCS4) 받침대라서 UTF-8→ShiftJIS와 같은 코드 변환표도 필요 없고 ASCII용/JISX0208용 등의 차이도 없다.
파일 seek만 있으면 그레브를 찾을 수 있습니다
이것은 검색 코드를 실현하는 것에 의존하는 이야기이기 때문에 특징이 아니지만, 나는 전체적으로 메모리에 넣지 않고 그레이프를 얻으려고 의식적으로 한다.
PFN의 전체 구조
Pinot font(font-file) 형식을 BNF라고 쓰면 이런 느낌이다.
font-file = font-header font-block{1,}
font-block = block-header glyph-entry{num_glyphs}
glyph-entry = codepoint bitmap
요소별 세부 사항
다음은 font-header,block-header,glyph-entry의 구조에 대한 상세한 설명입니다. 또한 거절하지 않으면 숫자는 모두 기호가 없는 작은 절순입니다.
font-header (16 bytes):
크기
필드 이름
예제
설명
7
signature
"PINOTFN"
고정 문자열
1
version
0x01
버전 번호
8
fontname
"shnmk14u"
8자 글꼴 이름
block-header (6 bytes):
크기
필드 이름
설명
1
width
계속glypeentry 내bitmap 너비
1
height
다음은 glypeentry 내bitmap 높이입니다.
1
codepoint_size
다음은glypeentry 내codepoint 사이즈 (1/2/4 중 임의)
1
attribute
장래(목 63;)확장성
2
num_glyphs
계속glypeentry 개수
각 블록 헤더 필드에서 font- 블록의 크기를 계산할 수 있습니다.
sizeof(font-block) = ((width * height + 7) / 8 + codepoint_size) * num_glyphs
이렇게 하면 다음 font-block의 시작을 단숨에 검색할 수 있습니다.glyph-entry (codepoint_size + (width * height + 7 )/8 bytes):
크기
필드 이름
예제
설명
codepoint_size
codepoint
0x41 ('A')
UTF-32LE에 필요한 자릿수
(width * height + 7)/8
bitmap
0b00110000….
MSB → LSB 를 가로로 시작
특별 기재 사항
(width * height + 7) // 8
인지 따라서 PFN 형식은 코드point에서 정렬할 때 자주 변하는 glyph entry 집합을 처리하기에 적합하지 않습니다.Fixed 글꼴
검색 예
글꼴 파일에서 그리프를 검색하는 코드의 예는 pinot 창고의 pnfont입니다.py Font.glyph근방에서 각 문자에 대해 다음과 같이 처리합니다.
끝말
실험을 위해 사용했다동운 글꼴. 작가님들께 감사드립니다. 동운 글씨체의 14시는 K14에서 유래했겠죠. 그동안 많은 사랑을 받았습니다.
이번에 나는 처음으로 Micropytohon(또는 Python)을 썼다. 너무 익숙하지 않아서 대부분이 Ruby로 썼고 손으로 Python을 번역해서 영문을 몰랐다(이 덕분에 PFN 글씨체의 코드는 판으로 이동하는 것이 아니어서 줄곧 Ruby의 모습이었다).
그러나 이 방법은 논리를 고려하는 부분과 조사 기법을 고려하는 부분이 독립적이기 때문에 새로운 언어를 배우는 것이 오히려 효율적이라고 생각한다.
ampy로 손으로 개발한 코드를 컴퓨터에서 보드로 복사하는 것이 번거로워졌기 때문에 뒷면에는 ampy로 rsync 같은 스크립트를 썼다.
이것도 pinot에 받았어요. 괜찮으면 써보세요. 기회가 된다면 다른 기사도 쓰고 싶어요.
Reference
이 문제에 관하여(Micropython만 있으면 UTF-8의 한자를 표시할 수 있습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/nom/articles/20211016-micropython-code-to-display-utf8-kanji텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)