Wio Terminal でカメラ画像を表示
Wio Terminalには320×240サイズのLCDディスプレイがついてますので
カメラ画像をリアルタイムに表示したいと思い、ここではAIカメラのUnitVを繋いでみました!
目次
UnitV
以前 AIカメラ UnitVをM5StickCに繋いでLCD表示したことがございますので
今回はWio Terminalに表示してみました。
MaixPy IDEコード
UnitVでの撮影画像(QQVGA: 160×120)をUART送信します。
demo_uart.py とdemo_camera.pyを参考にコーディングしました。
転送ボーレートは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 35 |
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.QQVGA) 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) clock = time.clock() while(True): clock.tick() img = sensor.snapshot() 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]) fps =clock.fps() #img.draw_string(0, 5, '{:.1f}'.format(fps), scale=2) uart.write(data_packet) uart.write(img) |
Wio Terminal接続
UnitVをWio Terminalの裏面40ピンヘッダの5Vとシリアル受信ピン(Serial1)に接続しました。
Wio Terminal Arduinoコード
ディスプレイ表示については以下を参考にしました。
https://wiki.seeedstudio.com/Wio-Terminal-LCD-Basic/
裏面のシリアルピン(Serial1)でUnitVからの画像データを受信します。
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 45 46 47 48 49 50 51 52 53 54 55 |
#include <TFT_eSPI.h> TFT_eSPI tft = TFT_eSPI(); int x = 160, y = 120; uint8_t *rx_buffer1; uint16_t *rx_buffer2; static const uint8_t packet_begin[3] = { 0xFF, 0xD8, 0xEA }; void setup() { Serial.begin(115200); Serial1.begin(1152000); tft.begin(); tft.setRotation(3); tft.fillScreen(TFT_WHITE); } 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) * x * y * 2); if (rx_buffer1 == NULL) { Serial.println("rx_buffer1 NG!"); free(rx_buffer1); }else{ Serial.println("rx_buffer1 OK!"); rx_size = Serial1.readBytes(rx_buffer1, dataLength); rx_buffer2 = (uint16_t *)malloc(sizeof(uint16_t) * x * y); if (rx_buffer2 == NULL) { Serial.println("rx_buffer2 NG!"); free(rx_buffer2); }else{ Serial.println("rx_buffer2 OK!"); for(int i = 0; i < x*y; i++){ rx_buffer2[i] = (rx_buffer1[2*i+1] << 8) + rx_buffer1[2*i]; } tft.pushImage(0, 0, x, y, rx_buffer2); free(rx_buffer2); } free(rx_buffer1); } } } } } |
動作
色なおった
UnitV -UART-> Wio Terminal#WioTerminal #UnitV pic.twitter.com/O3Z21W0knF
— HomeMadeGarbage (@H0meMadeGarbage) May 17, 2020
カメラ画像をWio TerminalのLCDディスプレイに表示することができました。
全画面表示(320×240)もやってみたいのですが
ビットマップですとメモリが足りないので、jpeg表示もできるようになりたいですね。