M5StickCのキャプチャ M5StickCのキャプチャできないか試してみました。まだ実験中です。
こちらの記事を参考にさせて頂きました。
raspberrypi.mongonta.com
これによると、ライブラリの「In_eSPI_Setup.h」というファイルを修正すると、「readPixel」が使えるようになるとのこと。readPixelは指定座標の画面のカラーコードを読み取るための関数です。
具体的な手順は以下のとおり。
「C:\Users\(ユーザー名)\Documents\Arduino \libraries\M5StickC\src\utility」フォルダの中にある「In_eSPI_Setup.h」をテキストエディタ で開いて、次の2点を修正します。
修正1 (修正1)「TFT _SDA_READ」の左側にある「//」を削除する。
修正2 (修正2)「SPI_READ_FREQUENCY」の値を変更する。適切な値がわかりませんが「4000000」にしました。ビットレート が大きいと通信に失敗するようです。
↓が実験用のプログラムです。M5StickCに書き込むArduino のスケッチです。Aボタン(M5ボタン)が押されたら、画面のデータをシリアルポートから出力します。
#include <M5StickC.h>
void capture(void ){
unsigned int color;
int x,y;
if (digitalRead(M5_BUTTON_HOME) == HIGH)return ;
while (digitalRead(M5_BUTTON_HOME) == LOW);
for (y=0 ; y<80 ; y++){
for (x=0 ; x<160 ; x++){
color = M5.Lcd.readPixel(x,y);
Serial.write((unsigned char )(color & 0xff ));
Serial.write((unsigned char )(color >> 8 ));
Serial.flush();
}
}
}
void setup() {
M5.begin();
M5.Lcd.setRotation(3 );
M5.Lcd.setTextSize(3 );
M5.Lcd.setTextColor(RED);
M5.Lcd.print("HELLO WORLD" );
M5.Lcd.setTextColor(BLUE);
M5.Lcd.print("HELLO WORLD" );
M5.Lcd.setTextColor(GREEN);
M5.Lcd.print("HELLO WORLD" );
}
void loop() {
capture();
}
そして、
↓がパソコン側の受信用のプログラムです。HSP3(Windows )で動きます。シリアルポートから受信した内容を画面に描画します。
#include "hspext.as"
#define LEDWIDTH 160
#define LEDHEIGHT 80
#define OFFSETX 0
#define OFFSETY 0
#define DOTSZ 3
#define BAUDRATE 115200
sdim livebuf,LEDWIDTH*LEDHEIGHT
screen 0 ,800 ,512 ,0 ,0 ,0
dispw = DOTSZ*LEDWIDTH
disph = DOTSZ*LEDHEIGHT
flag_comm =0
objsize 70 ,25
pos 0 ,400
button gosub "Open" ,*connect
pos 70 *3 +10 ,400
print "COMM"
pos 70 *3 +50 ,400
comnum=0
combox comnum,150 ,"com \n com1 \n com2 \n com3 \n com4 \n com5 \n com6 \n com7 \n com8 \n com9 \n com10 \n "
pos 70 *6 ,400
button gosub "Save BMP" ,*savegrp
x1=OFFSETX
y1=OFFSETY
ptr=0
colordata=0
repeat
if (flag_comm==0 ){
wait 1
}else {
repeat
comgetc btn
if (stat != 0 ){
if (ptr==0 ):colordata = btn
if (ptr==1 ):colordata = (btn<<8 )+colordata
ptr = (ptr+1 ) \ 2
if (ptr==0 ){
red = (colordata >> (5 +6 )) & $1f
green= (colordata >> 5 ) & $3f
blue = colordata & $1f
x2 = x1+DOTSZ-1
y2 = y1+DOTSZ-1
red = red*255 /$1f
green = green*255 /$3f
blue = blue*255 /$1f
red*=2
green*=2
blue*=2
if red>255 :red=255
if green>255 :green=255
if blue>255 :blue=255
color red,green,blue
boxf x1,y1,x2,y2
x1 += DOTSZ
if (x1 >= ((DOTSZ*LEDWIDTH)+OFFSETX)){
x1=OFFSETX
y1+=DOTSZ
if (y1 >= ((DOTSZ*LEDHEIGHT)+OFFSETY)){
y1 = OFFSETY
}
}
}
}else {
redraw 1
wait 1
redraw 0
}
loop
}
loop
end
*savegrp
gosub *connect_close
dialog "bmp" ,17 ,"BMPファイル"
if stat==0 :return
filename=refstr
screen 1 ,LEDWIDTH*DOTSZ,LEDHEIGHT*DOTSZ
gsel 1 ,1
pos 0 ,0
gcopy 0 ,0 ,0 ,LEDWIDTH*DOTSZ,LEDHEIGHT*DOTSZ
bmpsave filename
gsel 1 ,-1
gsel 0 ,0
return
*connect_open
if (flag_comm = 0 ){
comopen comnum,"baud=" +str(BAUDRATE)+" parity=N data=8 stop=1"
if stat : dialog "COM" +comnum+"は使えません" : end
flag_comm=1
repeat
comgetc btn
if (stat == 0 ):break
loop
ptr=0
x1=OFFSETX
y1=OFFSETY
}
return
*connect_close
if (flag_comm = 1 ){
comclose
flag_comm=0
}
return
*connect
if (flag_comm =0 ){
gosub *connect_open
title "OPEN COMM" +str(comnum)
wait 150
}else {
gosub *connect_close
title "CLOSE COMM"
}
return
M5StickCをパソコンのUSBポートに接続してある状態で上記のプログラムを実行します。
実行結果 画面の「OPEN」ボタンを押してシリアルポートの回線を開きます。M5StickCのAボタン(M5ボタン)を押すと、画像データが転送されます。通信速度は115200bpsです。
未解決の問題ですが、受信したカラーコードはすべて、想定の半分になってしまいます。ここままだと画像が暗くなってしまうので、受信した直後に2倍にして描画しています。各色ずつ1bit足りないので、16bitカラーではなく、13bitカラーになっていると思います。