Wio Terminal でカメラ画像を表示2 ー LovyanGFX 編 ー
前回はAIカメラのUnitVの撮影画像をビットマップで Wio Terminalに送信して表示しました。
メモリ不足のためビットアップでは160×120サイズでの表示にとどまりましたが、
今回LovyanGFXライブラリを使用させていただきJPEGでの画像取得・表示が可能となり、
全画面表示(320×240)できましたのでご報告します。
目次
UnitV用 MaixPy IDEコード
UnitVでの撮影画像(QVGA: 320×240)をJPEGに圧縮(圧縮率 50%)してUART送信します。
転送ボーレートは1152000にしました。
35ピンから画像ビットマップデータを送信しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
from machine import UART from board import board_info from fpioa_manager import fm from Maix import GPIO import sensor, lcd sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_vflip(1) sensor.set_hmirror(1) sensor.run(1) sensor.skip_frames() fm.register(35, fm.fpioa.UART1_TX, force=True) fm.register(34, fm.fpioa.UART1_RX, force=True) uart = UART(UART.UART1, 1152000,8,0,0, timeout=1000, read_buf_len=4096) while(True): img = sensor.snapshot() img_buf = img.compress(quality=50) img_size1 = (img.size()& 0xFF0000)>>16 img_size2 = (img.size()& 0x00FF00)>>8 img_size3 = (img.size()& 0x0000FF)>>0 data_packet = bytearray([0xFF,0xD8,0xEA,0x01,img_size1,img_size2,img_size3,0x00,0x00,0x00]) uart.write(data_packet) uart.write(img_buf) |
Wio Terminal接続
前回と同様に、UnitVをWio Terminalの裏面40ピンヘッダの5Vとシリアル受信ピン(Serial1)に接続しました。
LovyanGFX ライブラリ
LovyanGFX は、@lovyan03さんによって開発された高機能・高速動作グラフィックライブラリです。
JPEG表示機能 も兼ね備えており、今回ありがたく使用させていただきました。
Arduino IDEのライブラリマネージャより簡単に導入できます。
Wio Terminal Arduinoコード
裏面のシリアルピン(Serial1)でUnitVからのJPEG画像データを受信します。
LovyanGFXのdrawJpg()でJPEG画像をWio TerminalのLCDに表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include <LovyanGFX.hpp> static LGFX lcd; static LGFX_Sprite sprite(&lcd); int x = 320, y = 240; uint8_t *rx_buffer1; static const uint8_t packet_begin[3] = { 0xFF, 0xD8, 0xEA }; void setup() { Serial.begin(115200); Serial1.begin(1152000); lcd.init(); lcd.setRotation(1); lcd.setBrightness(255); lcd.setColorDepth(16); lcd.clear(); } void loop() { if (Serial1.available()) { uint8_t rx_buffer[10]; int rx_size = Serial1.readBytes(rx_buffer, 10); if (rx_size == 10) { if ((rx_buffer[0] == packet_begin[0]) && (rx_buffer[1] == packet_begin[1]) && (rx_buffer[2] == packet_begin[2])) { uint32_t dataLength = (uint32_t)(rx_buffer[4] << 16) | (rx_buffer[5] << 8) | rx_buffer[6]; Serial.println(dataLength); rx_buffer1 = (uint8_t *)malloc(sizeof(uint8_t) * dataLength); if (rx_buffer1 == NULL) { Serial.println("rx_buffer1 NG!"); }else{ rx_size = Serial1.readBytes(rx_buffer1, dataLength); //jpegバイナリポインタ, jpegファイルlength, 開始座標x, y, 最大幅x, y, オフセットx, y, スケール(jpeg_div_t) lcd.drawJpg(rx_buffer1, dataLength, 0, 0, x, y ,0, 0, JPEG_DIV_NONE); free(rx_buffer1); } } } } } |
参考
.@lovyan03 さんのlovyanGFX使ってWio TerminalでJPEG表示できたわ。とりあえずバイナリをヘッダーファイルにbyte配列で突っ込んで入れたhttps://t.co/YoFQHaI5G8 pic.twitter.com/vv31jRXh7m
— じてんしゃっぷ (@jitenshap) May 18, 2020
動作
JPEG送受信&表示でカメラ画像をWio TerminalのLCDディスプレイ前面に表示することができました!!