GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
がじぇるね岡宮です。
ルネナイ11を前にしてまとめサイトも作っておらずすみませんが、ちょっと遊んでしまいました。シールドはAmazonで買いました。4903円でした。
実は海外の方からお問合せがあり、GR-PEACHでILI9341が使えない→解決→スピードが出ない(0.2fpsぐらい)→5 fpsぐらい出せた、というものです。AdafruitのGitHubライブラリから若干変更が必要でしたので、こちらに添付したいと思います。少し嵌りました。320 x 240だと思ったら、240 x 320のため画像の回転が必要になりました。
遊んではいたのですが、GR-LYCHEEのライブラリにCameraクラスを追加して、必要になりそうなメンバー関数などを考えてました。今週中6/15までに一度V-upしたいと思います。
https://www.youtube.com/watch?v=9evulLSi32w
#include "Arduino.h"#include "Adafruit_GFX.h"#include "Adafruit_ILI9341.h"#include "camera_if.h"#define TFT_DC 9#define TFT_CS 10// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DCAdafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);// If using the breakout, change pins as desired//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);uint16_t buf_rgb565[VIDEO_PIXEL_HW * VIDEO_PIXEL_VW];void yuv2rgb565(unsigned char *in_adr, unsigned char *out_adr, int w, int h) { int y0, y1, u, v; int r, g, b; for (int i = 0; i < h; i++) { for (int j = 0; j < (w*2); j += 4) { y0 = (int)*in_adr; in_adr++; u = (int)*in_adr; in_adr++; y1 = (int)*in_adr; in_adr++; v = (int)*in_adr; in_adr++; r = (int) ((y0 - 16) + (1.370705 * (v - 128))); g = (int) ((y0 - 16) - (0.698001 * (v - 128)) - (0.337633 * (u - 128))); b = (int) ((y0 - 16) + (1.732446 * (u - 128))); if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; *out_adr = (uint8_t)(((g << 3) & 0xe0) | ((b >> 3) & 0x1f)); out_adr++; *out_adr = (uint8_t)((r & 0xF8) | ((g >> 5) & 0x07)); out_adr++; r = (int) ((y1 - 16) + (1.370705 * (v - 128))); g = (int) ((y1 - 16) - (0.698001 * (v - 128)) - (0.337633 * (u - 128))); b = (int) ((y1 - 16) + (1.732446 * (u - 128))); if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; *out_adr = (uint8_t)(((g << 3) & 0xe0) | ((b >> 3) & 0x1f)); out_adr++; *out_adr = (uint8_t)((r & 0xF8) | ((g >> 5) & 0x07)); out_adr++; } }}void rgb565_rotate90(uint16_t *in_adr, int w, int h){ uint16_t* buf; buf = (uint16_t*)malloc(sizeof(uint16_t)*w*h); memcpy(buf, in_adr, sizeof(uint16_t)*w*h); for(uint16_t i = 0; i < w; i++){ for(uint16_t j = 0; j < h; j++){ in_adr[i*h+j] = buf[w*(h-j-1)+i]; } } free(buf);}void setup() { Serial.begin(9600); tft.begin(); camera_start(); Serial.println("start");}void loop(void) { uint8_t* buf_yuv; static unsigned long old_time; old_time = millis(); buf_yuv = get_image_adr(); yuv2rgb565(buf_yuv, (uint8_t*)buf_rgb565, VIDEO_PIXEL_HW, VIDEO_PIXEL_VW); rgb565_rotate90(buf_rgb565, VIDEO_PIXEL_HW, VIDEO_PIXEL_VW); tft.drawRGBBitmap((int16_t)0, (int16_t)0, (uint16_t*)buf_rgb565, (int16_t)VIDEO_PIXEL_VW, (int16_t)VIDEO_PIXEL_HW); Serial.print((float)1/(millis()-old_time)*1000); Serial.println(" fps");#if 0 // slow in use of writePixel for(uint16_t i = 0; i < VIDEO_PIXEL_VW; i++){ for(uint16_t j = 0; j < VIDEO_PIXEL_HW; j++){ tft.writePixel(i,j,buf_rgb565[j+i*VIDEO_PIXEL_HW]); } }#endif}
matsuuraさん、ILI9341の設定まで見ていただいてすみません。
いずれの値も試してみたのですが、うまくいかないですね。値の変更と一緒にrgb565_rotate90のコメントアウト、drawRGBBitmapの引数HWとVWの入れ替えをしてますが、画像としては90°回転せず240x320のままといった感じです。