Micropython만 있으면 UTF-8의 한자를 표시할 수 있습니다

8739 단어 esp32MicroPythontech

개시하다


요즘 ESP32+Micropython.을 하고 있는데 C에 비해 시행착오가 수월하고 일요일 프로그래밍의 소재로도 좋다. 이렇게 OLED를 연결해서 같이 놀고 있다.
Image
이것을 하면서 다음과 같은 과제에 도전해 보았습니다.
  • Micropythhon이 공식적으로 발표한 이미지로만 한자를 표시합니다. (재구성과 C는 사용하지 않습니다.)
  • UTF-8 문자열을 솔직하게 받아들인다(UTF-8→Shift JIS의 변환표 등은 필요없다).

  • 폰트 형식의 디자인과 폰트 제작 도구 구현
  • 작성된 코드는 GiitHub에 놓습니다.
    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
    
  • 처음에 이런 말이 있었다.
    Image
    참고로 하드웨어는 이 근처에 있어요. 아마존 근처에서도 살 수 있어요.
  • 유기농 EL 모니터 128×흰색
  • ESP32-devKitC ESP-WROOM-32 개발판
  • pinot의 창고에는 BDF 글꼴에서 이번에 사용한 독특한 글꼴(PFN 형식이라는 이름) 파일을 만드는 스크립트가 곁들여져 있고, 좋아하는 BDF에서 PFN을 만들고 선택적으로 필요한 그레버(한자+그림문자 등)만 추가하는 것도 흥미롭다.

    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-file는 시작하는 font-header와 그 다음에 하나 이상의 font-block로 구성되어 있다.
  • 모든 font-block는 시작하는 Block-header와 그 다음num을 포함한다glyphs개glyphentry로 구성(numglyphs는 Block-header에서 제공됨).
  • 각 glyph entry는 UCS4(UTF-32)의 코드점과 비트맵의 연결입니다.
  • 요소별 세부 사항


    다음은 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 를 가로로 시작
  • 특별 기재 사항

  • 모든glyphentry는font-block를 넘어서codepoint 순서대로 배열해야 합니다.
  • codepoint_사이즈는 원래 UTF-32의 4바이트, ASCII는 1바이트로 일본어를 사용해도 2바이트만 필요하기 때문에 Block-header에 가장 적합한 길이를 설정할 수 있다
  • bitmap의 사이즈에 대해 예를 들어 7x14의 격자는 7*14=98비트가 필요하고 바이트 경계에 적응하기 위해 끝에 6비트를 채우고 104비트(13바이트)로 설정한다.
  • 파이톤이 (width * height + 7) // 8인지
  • 인지
  • BDF 글꼴 인코딩과는 다릅니다. BDF는 수평선마다 0을 채우는 방법입니다.
  • font-block의 개수는 임의이지만 구조상 그리프의 width,height,codepoint사이즈의 어떤 변화가 생겼을 때 새로운 font-block이 필요하죠.
    따라서 PFN 형식은 코드point에서 정렬할 때 자주 변하는 glyph entry 집합을 처리하기에 적합하지 않습니다.Fixed 글꼴
  • 에 적용됩니다

    검색 예


    글꼴 파일에서 그리프를 검색하는 코드의 예는 pinot 창고의 pnfont입니다.py Font.glyph근방에서 각 문자에 대해 다음과 같이 처리합니다.
  • UTF-8→UTF-32 codepoint 변환
  • seek
  • codepoint를 목표로 font-block에서 2분 동안 검색
  • 끝말


  • 실험을 위해 사용했다동운 글꼴. 작가님들께 감사드립니다. 동운 글씨체의 14시는 K14에서 유래했겠죠. 그동안 많은 사랑을 받았습니다.

  • 이번에 나는 처음으로 Micropytohon(또는 Python)을 썼다. 너무 익숙하지 않아서 대부분이 Ruby로 썼고 손으로 Python을 번역해서 영문을 몰랐다(이 덕분에 PFN 글씨체의 코드는 판으로 이동하는 것이 아니어서 줄곧 Ruby의 모습이었다).
    그러나 이 방법은 논리를 고려하는 부분과 조사 기법을 고려하는 부분이 독립적이기 때문에 새로운 언어를 배우는 것이 오히려 효율적이라고 생각한다.

  • ampy로 손으로 개발한 코드를 컴퓨터에서 보드로 복사하는 것이 번거로워졌기 때문에 뒷면에는 ampy로 rsync 같은 스크립트를 썼다.
    이것도 pinot에 받았어요. 괜찮으면 써보세요. 기회가 된다면 다른 기사도 쓰고 싶어요.
  • 좋은 웹페이지 즐겨찾기