編集履歴一覧に戻る
enponのアイコン画像

enpon が 2025年01月31日21時03分43秒 に編集

コメント無し

本文の変更

# はじめに

-

Spresense

+

ToFセンサとHDRカメラを組み合わせて、自動で撮影するカメラを製作しました。 被写体が設定した距離に近づくと自動的に撮影します。

# 製作物の機能

+

- ToFセンサで距離を測距(4×8ポイント) - 距離を色で表示 - HDR/SDR切替 - ホワイトバランス設定 - 撮影距離範囲設定 - 手動撮影機能 - ISO感度/シャッター速度表示

# 必要な部品 - Spresenseメインボード

-

- Spresense 拡張ボード

-

- HDRカメラ

+

- Spresense HDRカメラ

- ToFセンサーボード(SPRESENSE用)(MM-TOF10-IS) - https://shop.sunhayato.co.jp/products/mm-tof10-is - Mic&LCD KIT for SPRESENSE - LCDのみを使います。 - https://akizukidenshi.com/catalog/g/g116589/

+

- 固定用アクリル板 - レーザーカッターで切断します。 - LCD取付用ヘッダーピン、ピンソケット - LCD90度折り曲げて取付用

-

# 制作プロセス

-

## ハードウェア

+

1. SpresenseメインボードをSpresense拡張ボードに取り付けます。 2. Spresense拡張ボードを固定用アクリル板1に取り付けます。 3. ToFセンサモジュールを、IFモジュールにFFCケーブルを使い接続します。 4. Spresense拡張ボードにToFセンサIFモジュールを取り付けます。ToFセンサのマニュアル通りにIFモジュールをJP1,JP2に取り付けます。 5. HDRカメラをカメラコネクタに取り付けます。 6. LCDをピンヘッダとピンソケットを使い90度折り曲げてSpresense拡張ボードに取り付けます。 7. HDRカメラとToFセンサモジュールを固定用アクリル板2に取り付けます。 8. 固定用アクリル板2を固定用アクリル板1に取り付け金具を使い取り付けます。

## ソフトウェア

+

- ソースコードを以下に示します。 - ビルド時はメインメモリは1280MB確保するようにしてください。 - メインコアのみ使用しています。

+

```arduino:メインコア #include <Camera.h> #include <Adafruit_GFX.h> #include <Adafruit_ILI9341.h> #include <MM-ToF10.h> #include <SDHCI.h> #include <stdio.h> /* for sprintf */ #include <SPI.h> #include "colmap.h" #define TFT_DC 9 #define TFT_CS 10 static float tofdata[8][4]; float* tofptr = (float*)tofdata; unsigned char col[3][1280]; int imageResolution = 32; int imageWidth = 8; int imageHeight = 4;

+

// 画面内位置 #define XP_HDR 170 #define YP_HDR 0 #define XP_JPG 170 #define YP_JPG 20 #define XP_TOF 170 #define YP_TOF 130 #define XP_RNG 170 #define YP_RNG 50 #define XP_PLT 16 #define YP_PLT 130 #define XP_ISO 0 #define YP_ISO 200 #define XP_SHUT 0 #define YP_SHUT 220 #define XP_WB 0 #define YP_WB 240 #define XP_FILE 0 #define YP_FILE 260 #define XP_CAP 0 #define YP_CAP 280 #define XP_ERR 0 #define YP_ERR 300 #define PSZ 16 #define TOFPOSMAX 5 #define QTINIT 80 //JPEG品質初期値 Adafruit_ILI9341 display = Adafruit_ILI9341(TFT_CS, TFT_DC); SDClass theSD; int button4 = HIGH; int button5 = HIGH; int button6 = HIGH; int button7 = HIGH; int take_picture_count = 0; bool hdrmode = false; //HDRモード char* wbname[] = {"Automatic ", "Incandescent", "Fluorescent ", "Daylight ", "Flash ", "Cloudy ", "Shade "}; CAM_WHITE_BALANCE wbmode[] = {CAM_WHITE_BALANCE_AUTO, CAM_WHITE_BALANCE_INCANDESCENT, CAM_WHITE_BALANCE_FLUORESCENT, CAM_WHITE_BALANCE_DAYLIGHT, CAM_WHITE_BALANCE_FLASH, CAM_WHITE_BALANCE_CLOUDY, CAM_WHITE_BALANCE_SHADE }; int wbpos = 0 ; // ホワイトバランスモード int tofpos = 0 ; // int dtime = 500 ; int qt = QTINIT ; float imgsize; int iso ; int exposure ; int tofrange[TOFPOSMAX][2] = { {100, 200}, {200, 300}, {300, 500}, {500, 900}, {900, 2000} }; int dist ; void printError(enum CamErr err) { display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(1); display.setCursor(XP_ERR, YP_ERR ); display.print("Error: "); switch (err) { case CAM_ERR_NO_DEVICE: display.println("No Device"); break; case CAM_ERR_ILLEGAL_DEVERR: display.println("Illegal device error"); break; case CAM_ERR_ALREADY_INITIALIZED: display.println("Already initialized"); break; case CAM_ERR_NOT_INITIALIZED: display.println("Not initialized"); break; case CAM_ERR_NOT_STILL_INITIALIZED: display.println("Still picture not initialized"); break; case CAM_ERR_CANT_CREATE_THREAD: display.println("Failed to create thread"); break; case CAM_ERR_INVALID_PARAM: display.println("Invalid parameter"); break; case CAM_ERR_NO_MEMORY: display.println("No memory"); break; case CAM_ERR_USR_INUSED: display.println("Buffer already in use"); break; case CAM_ERR_NOT_PERMITTED: display.println("Operation not permitted"); break; default: break; } } void CamCB(CamImage img) { if (img.isAvailable()) { img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565); display.drawRGBBitmap(0, 0 /* 開始座標 */ , (uint16_t*)img.getImgBuff() /* 画像データ */ , 160 , 120 ); /* 横幅、縦幅 */ } } void setup() { CamErr err; pinMode(PIN_D04, INPUT_PULLUP); pinMode(PIN_D05, INPUT_PULLUP); pinMode(PIN_D06, INPUT_PULLUP); pinMode(PIN_D07, INPUT_PULLUP); display.begin(40000000); // 液晶ディスプレイの開始 display.setRotation(2); // ディスプレイの向きを設定 err = theCamera.begin(1, CAM_VIDEO_FPS_30, 160, 120, CAM_IMAGE_PIX_FMT_YUV422, 7 ); // カメラの開始 if (err != CAM_ERR_SUCCESS) { printError(err); } err = theCamera.setAutoWhiteBalanceMode(CAM_WHITE_BALANCE_AUTO); //ホワイトバランスをautoに設定 if (err != CAM_ERR_SUCCESS) { printError(err); } err = theCamera.setAutoISOSensitivity(true);//ISO感度をautoに設定 if (err != CAM_ERR_SUCCESS) { printError(err); } err = theCamera.setAutoExposure(true);//露光時間をautoに設定 if (err != CAM_ERR_SUCCESS) { printError(err); } err = theCamera.setHDR(CAM_HDR_MODE_OFF); //HDRモードをOFFに設定 if (err != CAM_ERR_SUCCESS) { printError(err); } err = theCamera.setStillPictureImageFormat(1280, 960, CAM_IMAGE_PIX_FMT_JPG, 4); //JPEG静止画設定 if (err != CAM_ERR_SUCCESS) { printError(err); } theCamera.setJPEGQuality(qt); theCamera.startStreaming(true, CamCB); // カメラのストリーミングを開始 //LCD初期描画 display.fillScreen(ILI9341_BLACK); display.setTextColor(ILI9341_YELLOW, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_HDR, YP_HDR ); display.println("SDR"); display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_JPG, YP_JPG ); display.printf("Q:%d", qt); display.setTextColor(ILI9341_MAGENTA, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_WB, YP_WB ); display.print(wbname[wbpos]); //SDカードマウント確認 while (!theSD.begin()) { display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_ERR, YP_ERR ); display.print("Insert SD card."); } display.setCursor(XP_ERR, YP_ERR ); display.print(" "); filecheck(); //ファイルネーム番号初期値チェック // ToF init MMToF10.begin(); MMToF10.sync(); MMToF10.nomal(ShortDistance, LowSpeed); Serial.begin(115200); Serial.println("setup done"); } void dataplot() { int coln, col0 ; int tcol, tcol0 ; int ofst[4]; ofst[0] = 0; ofst[1] = PSZ / 2; ofst[2] = 0; ofst[3] = PSZ / 2; for (int y = 0 ; y < 4 ; y++) { for (int x = 0 ; x < 8 ; x++) { coln = int (tofdata[7 - x][y]) ; if (coln > 999) { coln = 999; } display.fillRect( XP_PLT + x * PSZ + ofst[y] , YP_PLT + y * PSZ, PSZ, PSZ, display.color565(colmap[coln][0], colmap[coln][1], colmap[coln][2])); } } } void filecheck() { char filename[17] = {0}; sprintf(filename, "PICT%03d.JPG", take_picture_count); while ( theSD.exists(filename ) ) { take_picture_count++; sprintf(filename, "PICT%03d_.JPG", take_picture_count); } display.setTextColor(ILI9341_BLUE, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_FILE, YP_FILE ); display.print("Start No:"); display.print(take_picture_count); } void capture() { display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_ERR, YP_ERR ); display.print(" "); char filename[17] = {0}; sprintf(filename, "PICT%03d.JPG", take_picture_count); display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_JPG, YP_JPG ); display.printf("Q:%d", qt); CamImage img = theCamera.takePicture(); getinfo(); if (!img.isAvailable()) { qt = qt - 5 ; theCamera.setJPEGQuality(qt); display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_JPG, YP_JPG ); display.printf("Q:%d", qt); CamImage img = theCamera.takePicture(); } qt = QTINIT ; if (img.isAvailable()) { display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_ERR, YP_ERR ); imgsize = img.getImgSize(); display.printf("RAM:%.0f/%.0f[KB]", imgsize / 1024.0, img.getImgBuffSize() / 1024.0); sprintf(filename, "PICT%03d.JPG", take_picture_count); display.setTextColor(ILI9341_BLUE, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_FILE, YP_FILE ); display.print(filename); File myFile = theSD.open(filename, FILE_WRITE); myFile.write(img.getImgBuff(), img.getImgSize()); myFile.close(); } else { display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_ERR, YP_ERR ); display.print("Save Failed:"); } sprintf(filename, "PICT%03d_info.txt", take_picture_count); File myFile = theSD.open(filename, FILE_WRITE); myFile.print("HDR mode:"); myFile.println(theCamera.getHDR()); myFile.print("white balance:"); myFile.println(wbname[wbpos]); myFile.print("ISO:"); myFile.println(iso); myFile.print("SHUT:"); myFile.println(exposure); myFile.print("Size " ); myFile.println(imgsize); myFile.print("Dist " ); myFile.println(dist); myFile.println("TOF " ); for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { myFile.print(tofdata[7 - j][i]); myFile.print(" "); } myFile.println(); } myFile.println(); myFile.close(); take_picture_count++; // delay(500); } void getinfo() { iso = theCamera.getISOSensitivity();// ISO値取得 exposure = theCamera.getAbsoluteExposure(); //露光時間取得 display.setTextColor(ILI9341_WHITE, ILI9341_BLACK); display.setTextSize(2); display.setTextWrap(false) ; display.setCursor(XP_ISO, YP_ISO ); display.print("ISO:"); display.setCursor(XP_ISO + 60, YP_ISO ); display.print(iso ); display.print(" "); display.setCursor(XP_SHUT, YP_SHUT ); display.print("SHUT:"); display.setCursor(XP_SHUT + 60, YP_SHUT ); display.print(exposure); display.print(" "); display.setTextSize(2); display.setCursor(XP_HDR + 40, YP_HDR ); display.print(theCamera.getHDR()); display.setTextColor(ILI9341_GREEN, ILI9341_BLACK); display.setCursor(XP_TOF, YP_TOF ); display.print("Dist:"); display.setCursor(XP_TOF, YP_TOF + 20 ); display.print(dist); display.print(" "); display.setCursor(XP_RNG, YP_RNG ); display.print("RNG:"); display.setCursor(XP_RNG, YP_RNG + 20 ); display.print(tofrange[tofpos][0]); display.print(" "); display.setCursor(XP_RNG, YP_RNG + 40 ); display.print(tofrange[tofpos][1]); display.print(" "); } void tofprint() { //this function is for debug Serial.println("ToF data"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { Serial.print(tofdata[j][i]); Serial.print(" "); } Serial.println(); } Serial.println(); } void rangecheck() { dist = tofdata[3][2]; if ( dist > tofrange[tofpos][0] && dist < tofrange[tofpos][1]) { display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_CAP, YP_CAP); display.print("Capture"); capture(); display.setCursor(XP_CAP, YP_CAP); display.print(" "); } } void loop() { CamErr err; int button4_input = digitalRead(PIN_D04); int button5_input = digitalRead(PIN_D05); int button6_input = digitalRead(PIN_D06); int button7_input = digitalRead(PIN_D07); MMToF10.get3d(tofptr); //tofprint(); // for debug dataplot(); rangecheck(); // Still Capture if (button4_input != button4) { if (button4_input == LOW) { // push on display.setTextColor(ILI9341_RED, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_CAP, YP_CAP); display.print("Capture"); capture(); display.setCursor(XP_CAP, YP_CAP); display.print(" "); } else { /// push off } button4 = button4_input; } //White Balance mode if (button5_input != button5) { if (button5_input == LOW) { // push on wbpos++; if (wbpos > 6 ) { wbpos = 0; } display.setTextColor(ILI9341_MAGENTA, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_WB, YP_WB ); display.print(wbname[wbpos]); theCamera.setAutoWhiteBalanceMode(wbmode[wbpos]); delay(200); } else { /// push off } button5 = button5_input; } //TOF range check if (button6_input != button6) { if (button6_input == LOW) { // push on tofpos++; if (tofpos > TOFPOSMAX ) { tofpos = 0; } } else { /// push off } button6 = button6_input; } // HDR mode set if (button7_input != button7) { if (button7_input == LOW) { // push on hdrmode = !hdrmode ; if (hdrmode == true) { err = theCamera.setHDR(CAM_HDR_MODE_ON); if (err != CAM_ERR_SUCCESS) { printError(err); } display.setTextColor(ILI9341_YELLOW, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_HDR, YP_HDR); display.print("HDR"); delay(dtime); } else if ( hdrmode == false) { err = theCamera.setHDR(CAM_HDR_MODE_OFF); if (err != CAM_ERR_SUCCESS) { printError(err); } display.setTextColor(ILI9341_YELLOW, ILI9341_BLACK); display.setTextSize(2); display.setCursor(XP_HDR, YP_HDR ); display.print("SDR"); delay(dtime); } } else { /// push off } button7 = button7_input; } getinfo(); } ``` ```arduino:colormap.h int colmap[1000][3]={ {0,0,128},{0,0,128},{0,0,128},{0,0,128},{0,0,132},{0,0,132},{0,0,132},{0,0,132}, {0,0,136},{0,0,136},{0,0,136},{0,0,136},{0,0,140},{0,0,140},{0,0,140},{0,0,140}, {0,0,144},{0,0,144},{0,0,144},{0,0,144},{0,0,148},{0,0,148},{0,0,148},{0,0,148}, {0,0,152},{0,0,152},{0,0,152},{0,0,152},{0,0,156},{0,0,156},{0,0,156},{0,0,156}, {0,0,160},{0,0,160},{0,0,160},{0,0,160},{0,0,164},{0,0,164},{0,0,164},{0,0,164}, {0,0,168},{0,0,168},{0,0,168},{0,0,168},{0,0,172},{0,0,172},{0,0,172},{0,0,172}, {0,0,176},{0,0,176},{0,0,176},{0,0,180},0,0,180},{0,0,180},{0,0,180},{0,0,184}, {0,0,184},{0,0,184},{0,0,184},{0,0,188},{0,0,188},{0,0,188},{0,0,188},{0,0,192}, {0,0,192},{0,0,192},{0,0,192},{0,0,196},{0,0,196},{0,0,196},{0,0,196},{0,0,200}, {0,0,200},{0,0,200},{0,0,200},{0,0,204},{0,0,204},{0,0,204},{0,0,204},{0,0,208}, {0,0,208},{0,0,208},{0,0,208},{0,0,212},{0,0,212},{0,0,212},{0,0,212},{0,0,216}, {0,0,216},{0,0,216},{0,0,216},{0,0,220},{0,0,220},{0,0,220},{0,0,220},{0,0,224}, {0,0,224},{0,0,224},{0,0,228},{0,0,228},{0,0,228},{0,0,228},{0,0,232},{0,0,232}, {0,0,232},{0,0,232},{0,0,236},{0,0,236},{0,0,236},{0,0,236},{0,0,240},{0,0,240}, {0,0,240},{0,0,240},{0,0,244},{0,0,244},{0,0,244},{0,0,244},{0,0,248},{0,0,248}, {0,0,248},{0,0,248},{0,0,252},{0,0,252},{0,0,252},{0,0,252},{0,0,255},{0,0,255}, {0,0,255},{0,0,255},{0,4,255},{0,4,255},{0,4,255},{0,4,255},{0,8,255},{0,8,255}, {0,8,255},{0,8,255},{0,12,255},{0,12,255},{0,12,255},{0,12,255},{0,16,255},{0,16,255}, {0,16,255},{0,20,255},{0,20,255},{0,20,255},{0,20,255},{0,24,255},{0,24,255},{0,24,255}, {0,24,255},{0,28,255},{0,28,255},{0,28,255},{0,28,255},{0,32,255},{0,32,255},{0,32,255}, {0,32,255},{0,36,255},{0,36,255},{0,36,255},{0,36,255},{0,40,255},{0,40,255},{0,40,255}, {0,40,255},{0,44,255},{0,44,255},{0,44,255},{0,44,255},{0,48,255},{0,48,255},{0,48,255}, {0,48,255},{0,52,255},{0,52,255},{0,52,255},{0,52,255},{0,56,255},{0,56,255},{0,56,255}, {0,56,255},{0,60,255},{0,60,255},{0,60,255},{0,60,255},{0,64,255},{0,64,255},{0,64,255}, {0,68,255},{0,68,255},{0,68,255},{0,68,255},{0,72,255},{0,72,255},{0,72,255},{0,72,255}, {0,76,255},{0,76,255},{0,76,255},{0,76,255},{0,80,255},{0,80,255},{0,80,255},{0,80,255}, {0,84,255},{0,84,255},{0,84,255},{0,84,255},{0,88,255},{0,88,255},{0,88,255},{0,88,255}, {0,92,255},{0,92,255},{0,92,255},{0,92,255},{0,96,255},{0,96,255},{0,96,255},{0,96,255}, {0,100,255},{0,100,255},{0,100,255},{0,100,255},{0,104,255},{0,104,255},{0,104,255},{0,104,255}, {0,108,255},{0,108,255},{0,108,255},{0,108,255},{0,112,255},{0,112,255},{0,112,255},{0,116,255}, {0,116,255},{0,116,255},{0,116,255},{0,120,255},{0,120,255},{0,120,255},{0,120,255},{0,124,255}, {0,124,255},{0,124,255},{0,124,255},{0,128,255},{0,128,255},{0,128,255},{0,128,255},{0,132,255}, {0,132,255},{0,132,255},{0,132,255},{0,136,255},{0,136,255},{0,136,255},{0,136,255},{0,140,255}, {0,140,255},{0,140,255},{0,140,255},{0,144,255},{0,144,255},{0,144,255},{0,144,255},{0,148,255}, {0,148,255},{0,148,255},{0,148,255},{0,152,255},{0,152,255},{0,152,255},{0,152,255},{0,156,255}, {0,156,255},{0,156,255},{0,156,255},{0,160,255},{0,160,255},{0,160,255},{0,164,255},{0,164,255}, {0,164,255},{0,164,255},{0,168,255},{0,168,255},{0,168,255},{0,168,255},{0,172,255},{0,172,255}, {0,172,255},{0,172,255},{0,176,255},{0,176,255},{0,176,255},{0,176,255},{0,180,255},{0,180,255}, {0,180,255},{0,180,255},{0,184,255},{0,184,255},{0,184,255},{0,184,255},{0,188,255},{0,188,255}, {0,188,255},{0,188,255},{0,192,255},{0,192,255},{0,192,255},{0,192,255},{0,196,255},{0,196,255}, {0,196,255},{0,196,255},{0,200,255},{0,200,255},{0,200,255},{0,200,255},{0,204,255},{0,204,255}, {0,204,255},{0,204,255},{0,208,255},{0,208,255},{0,208,255},{0,212,255},{0,212,255},{0,212,255}, {0,212,255},{0,216,255},{0,216,255},{0,216,255},{0,216,255},{0,220,255},{0,220,255},{0,220,255}, {0,220,255},{0,224,255},{0,224,255},{0,224,255},{0,224,255},{0,228,255},{0,228,255},{0,228,255}, {0,228,255},{0,232,255},{0,232,255},{0,232,255},{0,232,255},{0,236,255},{0,236,255},{0,236,255}, {0,236,255},{0,240,255},{0,240,255},{0,240,255},{0,240,255},{0,244,255},{0,244,255},{0,244,255}, {0,244,255},{0,248,255},{0,248,255},{0,248,255},{0,248,255},{0,252,255},{0,252,255},{0,252,255}, {0,252,255},{2,255,254},{2,255,254},{2,255,254},{2,255,254},{6,255,250},{6,255,250},{6,255,250}, {10,255,246},{10,255,246},{10,255,246},{10,255,246},{14,255,242},{14,255,242},{14,255,242}, {14,255,242},{18,255,238},{18,255,238},{18,255,238},{18,255,238},{22,255,234},{22,255,234}, {22,255,234},{22,255,234},{26,255,230},26,255,230},{26,255,230},{26,255,230},{30,255,226}, {30,255,226},{30,255,226},{30,255,226},{34,255,222},{34,255,222},{34,255,222},{34,255,222},{38,255,218}, {38,255,218},{38,255,218},{38,255,218},{42,255,214},{42,255,214},{42,255,214},{42,255,214},{46,255,210}, {46,255,210},{46,255,210},{46,255,210},{50,255,206},{50,255,206},{50,255,206},{50,255,206},{54,255,202}, {54,255,202},{54,255,202},{58,255,198},{58,255,198},{58,255,198},{58,255,198},{62,255,194},{62,255,194}, {62,255,194},{62,255,194},{66,255,190},{66,255,190},{66,255,190},{66,255,190},{70,255,186},{70,255,186}, {70,255,186},{70,255,186},{74,255,182},{74,255,182},{74,255,182},{74,255,182},{78,255,178},{78,255,178}, {78,255,178},{78,255,178},{82,255,174},{82,255,174},{82,255,174},{82,255,174},{86,255,170},{86,255,170}, {86,255,170},{86,255,170},{90,255,166},{90,255,166},{90,255,166},{90,255,166},{94,255,162},{94,255,162}, {94,255,162},{94,255,162},{98,255,158},{98,255,158},{98,255,158},{98,255,158},{102,255,154},{102,255,154}, {102,255,154},{106,255,150},{106,255,150},{106,255,150},{106,255,150},{110,255,146},{110,255,146},{110,255,146}, {110,255,146},{114,255,142},{114,255,142},{114,255,142},{114,255,142},{118,255,138},{118,255,138},{118,255,138}, {118,255,138},{122,255,134},{122,255,134},{122,255,134},{122,255,134},{126,255,130},{126,255,130},{126,255,130}, {126,255,130},{130,255,126},{130,255,126},{130,255,126},{130,255,126},{134,255,122},{134,255,122},{134,255,122}, {134,255,122},{138,255,118},{138,255,118},{138,255,118},{138,255,118},{142,255,114},{142,255,114},{142,255,114}, {142,255,114},{146,255,110},{146,255,110},{146,255,110},{146,255,110},{150,255,106},{150,255,106},{150,255,106}, {154,255,102},{154,255,102},{154,255,102},{154,255,102},{158,255,98},{158,255,98},{158,255,98},{158,255,98}, {162,255,94},{162,255,94},{162,255,94},{162,255,94},{166,255,90},{166,255,90},{166,255,90},{166,255,90}, {170,255,86},{170,255,86},{170,255,86},{170,255,86},{174,255,82},{174,255,82},{174,255,82},{174,255,82}, {178,255,78},{178,255,78},{178,255,78},{178,255,78},{182,255,74},{182,255,74},{182,255,74},{182,255,74}, {186,255,70},{186,255,70},{186,255,70},{186,255,70},{190,255,66},{190,255,66},{190,255,66}, {190,255,66},{194,255,62},{194,255,62},{194,255,62},{194,255,62},{198,255,58},{198,255,58}, {198,255,58},{202,255,54},{202,255,54},{202,255,54},{202,255,54},{206,255,50},{206,255,50},{206,255,50}, {206,255,50},{210,255,46},{210,255,46},{210,255,46},{210,255,46},{214,255,42},{214,255,42},{214,255,42}, {214,255,42},{218,255,38},{218,255,38},{218,255,38},{218,255,38},{222,255,34},{222,255,34},{222,255,34}, {222,255,34},{226,255,30},{226,255,30},{226,255,30},{226,255,30},{230,255,26},{230,255,26},{230,255,26}, {230,255,26},{234,255,22},{234,255,22},{234,255,22},{234,255,22},{238,255,18},{238,255,18},{238,255,18}, {238,255,18},{242,255,14},{242,255,14},{242,255,14},{242,255,14},{246,255,10},{246,255,10},{246,255,10}, {250,255,6},{250,255,6},{250,255,6},{250,255,6},{254,255,1},{254,255,1},{254,255,1},{254,255,1}, {255,252,0},{255,252,0},{255,252,0},{255,252,0},{255,248,0},{255,248,0},{255,248,0},{255,248,0}, {255,244,0},{255,244,0},{255,244,0},{255,244,0},{255,240,0},{255,240,0},{255,240,0},{255,240,0}, {255,236,0},{255,236,0},{255,236,0},{255,236,0},{255,232,0},{255,232,0},{255,232,0},{255,232,0}, {255,228,0},{255,228,0},{255,228,0},{255,228,0},{255,224,0},{255,224,0},{255,224,0},{255,224,0}, {255,220,0},{255,220,0},{255,220,0},{255,220,0},{255,216,0},{255,216,0},{255,216,0},{255,212,0}, {255,212,0},{255,212,0},{255,212,0},{255,208,0},{255,208,0},{255,208,0},{255,208,0},{255,204,0}, {255,204,0},{255,204,0},{255,204,0},{255,200,0},{255,200,0},{255,200,0},{255,200,0},{255,196,0}, {255,196,0},{255,196,0},{255,196,0},{255,192,0},{255,192,0},{255,192,0},{255,192,0},{255,188,0}, {255,188,0},{255,188,0},{255,188,0},{255,184,0},{255,184,0},{255,184,0},{255,184,0},{255,180,0}, {255,180,0},{255,180,0},{255,180,0},{255,176,0},{255,176,0},{255,176,0},{255,176,0},{255,172,0}, {255,172,0},{255,172,0},{255,172,0},{255,168,0},{255,168,0},{255,168,0},{255,168,0},{255,164,0}, {255,164,0},{255,164,0},{255,160,0},{255,160,0},{255,160,0},{255,160,0},{255,156,0},{255,156,0}, {255,156,0},{255,156,0},{255,152,0},{255,152,0},{255,152,0},{255,152,0},{255,148,0},{255,148,0}, {255,148,0},{255,148,0},{255,144,0},{255,144,0},{255,144,0},{255,144,0},{255,140,0},{255,140,0}, {255,140,0},{255,140,0},{255,136,0},{255,136,0},{255,136,0},{255,136,0},{255,132,0},{255,132,0}, {255,132,0},{255,132,0},{255,128,0},{255,128,0},{255,128,0},{255,128,0},{255,124,0},{255,124,0}, {255,124,0},{255,124,0},{255,120,0},{255,120,0},{255,120,0},{255,120,0},{255,116,0},{255,116,0}, {255,116,0},{255,112,0},{255,112,0},{255,112,0},{255,112,0},{255,108,0},{255,108,0},{255,108,0}, {255,108,0},{255,104,0},{255,104,0},{255,104,0},{255,104,0},{255,100,0},{255,100,0},{255,100,0}, {255,100,0},{255,96,0},{255,96,0},{255,96,0},{255,96,0},{255,92,0},{255,92,0},{255,92,0}, {255,92,0},{255,88,0},{255,88,0},{255,88,0},{255,88,0},{255,84,0},{255,84,0},{255,84,0}, {255,84,0},{255,80,0},{255,80,0},{255,80,0},{255,80,0},{255,76,0},{255,76,0},{255,76,0}, {255,76,0},{255,72,0},{255,72,0},{255,72,0},{255,72,0},{255,68,0},{255,68,0},{255,68,0}, {255,64,0},{255,64,0},{255,64,0},{255,64,0},{255,60,0},{255,60,0},{255,60,0},{255,60,0}, {255,56,0},{255,56,0},{255,56,0},{255,56,0},{255,52,0},{255,52,0},{255,52,0},{255,52,0}, {255,48,0},{255,48,0},{255,48,0},{255,48,0},{255,44,0},{255,44,0},{255,44,0},{255,44,0}, {255,40,0},{255,40,0},{255,40,0},{255,40,0},{255,36,0},{255,36,0},{255,36,0},{255,36,0}, {255,32,0},{255,32,0},{255,32,0},{255,32,0},{255,28,0},{255,28,0},{255,28,0},{255,28,0}, {255,24,0},{255,24,0},{255,24,0},{255,24,0},{255,20,0},{255,20,0},{255,20,0},{255,16,0}, {255,16,0},{255,16,0},{255,16,0},{255,12,0},{255,12,0},{255,12,0},{255,12,0},{255,8,0}, {255,8,0},{255,8,0},{255,8,0},{255,4,0},{255,4,0},{255,4,0},{255,4,0},{255,0,0}, {255,0,0},{255,0,0},{255,0,0},{252,0,0},{252,0,0},{252,0,0},{252,0,0},{248,0,0}, {248,0,0},{248,0,0},{248,0,0},{244,0,0},{244,0,0},{244,0,0},{244,0,0},{240,0,0}, {240,0,0},{240,0,0},{240,0,0},{236,0,0},{236,0,0},{236,0,0},{236,0,0},{232,0,0}, {232,0,0},{232,0,0},{232,0,0},{228,0,0},{228,0,0},{228,0,0},{224,0,0},{224,0,0}, {224,0,0},{224,0,0},{220,0,0},{220,0,0},{220,0,0},{220,0,0},{216,0,0},{216,0,0}, {216,0,0},{216,0,0},{212,0,0},{212,0,0},{212,0,0},{212,0,0},{208,0,0},{208,0,0}, {208,0,0},{208,0,0},{204,0,0},{204,0,0},{204,0,0},{204,0,0},{200,0,0},{200,0,0}, {200,0,0},{200,0,0},{196,0,0},{196,0,0},{196,0,0},{196,0,0},{192,0,0},{192,0,0}, {192,0,0},{192,0,0},{188,0,0},{188,0,0},{188,0,0},{188,0,0},{184,0,0},{184,0,0}, {184,0,0},{184,0,0},{180,0,0},{180,0,0},{180,0,0},{176,0,0},{176,0,0},{176,0,0}, {176,0,0},{172,0,0},{172,0,0},{172,0,0},{172,0,0},{168,0,0},{168,0,0},{168,0,0}, {168,0,0},{164,0,0},{164,0,0},{164,0,0},{164,0,0},{160,0,0},{160,0,0},{160,0,0}, {160,0,0},{156,0,0},{156,0,0},{156,0,0},{156,0,0},{152,0,0},{152,0,0},{152,0,0}, {152,0,0},{148,0,0},{148,0,0},{148,0,0},{148,0,0},{144,0,0},{144,0,0},{144,0,0}, {144,0,0},{140,0,0},{140,0,0},{140,0,0},{140,0,0},{136,0,0},{136,0,0},{136,0,0}, {136,0,0},{132,0,0},{132,0,0},{132,0,0},{128,0,0}}; ```

# 動作説明

+