Pinus0079のアイコン画像
Pinus0079 2021年01月07日作成 (2021年01月09日更新)
製作品 製作品 閲覧数 6885
Pinus0079 2021年01月07日作成 (2021年01月09日更新) 製作品 製作品 閲覧数 6885

小型TFT液晶を使ったドットサイトの自作

小型TFT液晶を使ったドットサイトの自作

概要

タイトルの通りTFT液晶を使って、ドットサイトを自作しました。
https://twitter.com/pinus0079/status/1346985500452638721?s=20
キャプションを入力できます
マイコンはarduino pro miniを使ってます。またMPU6050ジャイロセンサを搭載しているので、傾きを計測することができます。

構造

キャプションを入力できます

ピンク色:TFT液晶
青色:アクリル板(内側にハーフミラーフィルムを張ってる)
紫色:アクリル板

アクリル板にハーフミラーフィルムを張ってハーフミラーを作ります。自分はこちらのものを使用しました。そこにTFT液晶の映像を反射させ、映像を浮かび上がらせます。

下側の空間にaruduino、ジャイロ、基板等を入れてます。
小型化を優先したため、バッテリー等を入れるスペースはありません。そのため外部からの給電が必要です。

キャプションを入力できます
市販のEOTechと比べるとかなりコンパクトに仕上げられたと思います。

TFT液晶について

キャプションを入力できます
(出典:https://www.amazon.co.jp/スクリーン-ST7789-ボルト電圧-インタフェースフルカラー液晶-ディスプレイ/dp/B07P1NQD11

ST7789ドライバのTFT液晶を使用しています。1.3インチという小ささに加えて、240x240ピクセルと高解像度なため非常に重宝しています。
このTFT液晶はSPI接続ですがCS(チップセレクト)ピンが無いため、プログラムは注意が必要です。

回路

キャプションを入力できます

左上は起動回路です。スイッチを長押しし、Arduino起動後powerピンをHIGHにすることで、スイッチを離しても起動し続けます。powerピンをLOWにすることで電源がOFFになります。また起動中にスイッチを押すと、sw1の入力がHIGHからLOWになるので、起動スイッチ以外にも利用できます。

キャプションを入力できます
arduinoのA4,A5ピンとジャイロセンサを直接はんだ付けしています。
ユニバーサル基板には各配線と、表面実装部品で電源回路を組んでいます。

プログラム

使用したプログラムを以下に記します。
Adafruit_GXFとST7789_Fastライブラリを使用しています。

追記(2021/01/09):
プログラミング強つよの人に指摘されそうなので書きました。
プログラムの中にdata.hというヘッダーがありますが、これは120x120ピクセルの現場猫画像データを保存しています。このような書き方は本来するべきではありません。もしこのプログラムを流用するのであれば、データをソースファイルに移して、宣言のみヘッダーに残すことをお勧めします。

メイン

#include <Wire.h> #include <Adafruit_GFX.h> // Core graphics library #include <Arduino_ST7789_Fast.h> // Hardware-specific library for ST7789 #include <SPI.h> // Arduino SPI library #include "data.h" // PIN #define PIN_POWER 7 //電源用 #define PIN1 A3 //起動スイッチ #define PIN2 8 //+スイッチ #define PIN3 9 //-スイッチ // LCD property #define CENTER_X 122 #define CENTER_Y 127 #define SIZE_X 233 //6 ~ 238 #define SIZE_Y 223 //16 ~ 238 // ST7789 TFT module connections #define TFT_DC A1 // define data/command pin #define TFT_RST 10 // define reset pin, or set to -1 and connect to Arduino RESET pin // Initialize Adafruit ST7789 TFT library Arduino_ST7789 lcd = Arduino_ST7789(TFT_DC, TFT_RST); // ジャイロ用変数 int16_t axRaw, ayRaw, azRaw, gxRaw, gyRaw, gzRaw, temperatureRaw; float ax, ay, az, gx, gy, gz; int8_t roll, pitch, yaw; float drift_gx, drift_gy, drift_gz; float dt = 0.02; //1 / 50 // 割り込み、ジャイロ有効フラグ bool interrupt_flag = false; bool gyro_flag = true; // ドットサイト表示用変数 int8_t sin_data[271]; uint8_t center_x = CENTER_X; uint8_t center_y = CENTER_Y; // 割り込み処理 ISR(TIMER1_OVF_vect){ interrupt_flag = true; } void setup() { //Serial.begin(115200); pinMode(PIN_POWER,OUTPUT); digitalWrite(PIN_POWER,HIGH); pinMode(PIN1,INPUT); pinMode(PIN2,INPUT_PULLUP); pinMode(PIN3,INPUT_PULLUP); lcd.init(240, 240); lcd.fillScreen(BLACK); // 割り込み設定 TCCR1A = 0; TCCR1B = 0; TIMSK1 = 0; TCCR1A |= (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS12); //Fast_PWM Prescaler = 256 TIMSK1 |= (1 << TOIE1); //Overflow interrupt ICR1 = 1250 - 1; //8MHz / 256 / 1250 = 25Hz Init_gyro(); //ジャイロ初期化 // 正弦波データテーブルの初期化 0~271:-90~180度 // sin = 90+θ, cos = 180+θ // 値:-100 ~ 100 for(int i = 0; i < 271; i++){ sin_data[i] = 100*sin((i-90)*PI/180); } // 枠の表示 lcd.drawFastVLine(center_x - SIZE_X/2, center_y - 60, 119, RED); //右 lcd.drawFastVLine(center_x + SIZE_X/2, center_y - 60, 119, RED); //左 lcd.drawFastHLine(center_x - 60, center_y - SIZE_Y/2, 119, RED); //上 lcd.drawFastHLine(center_x - 60, center_y + SIZE_Y/2, 119, RED); //下 // ドットの表示 lcd.fillCircle(center_x, center_y, 3, GREEN); //lcd.drawBitmap(center_x - 112, center_y - 55, genbaneko, 120, 120, GREEN); //現場猫表示 // 起動スイッチが離されるまで待つ while(digitalRead(PIN1) == LOW); } int a[2] = {0,0}; int b[2] = {0,0}; int c[2] = {0,0}; int d[2] = {0,0}; void loop() { if(interrupt_flag == true && gyro_flag == true){ Read_gyro(); Correct_gyro(); Complementary_filter(); // 水平線の表示 a[0] = sin_data[pitch+180] * 0.8; b[0] = sin_data[pitch+90] * 0.8; c[0] = sin_data[pitch+180] * 0.2; d[0] = sin_data[pitch+90] * 0.2; lcd.drawLine(a[1]+center_x, b[1]+center_y, c[1]+center_x, d[1]+center_y, BLACK); lcd.drawLine(a[0]+center_x, b[0]+center_y, c[0]+center_x, d[0]+center_y, GREEN); lcd.drawLine(-a[1]+center_x, -b[1]+center_y, -c[1]+center_x, -d[1]+center_y, BLACK); lcd.drawLine(-a[0]+center_x, -b[0]+center_y, -c[0]+center_x, -d[0]+center_y, GREEN); a[1] = a[0]; b[1] = b[0]; c[1] = c[0]; d[1] = d[0]; interrupt_flag = false; } if(digitalRead(PIN1) == LOW){ // 長押しで電源off uint16_t count = 0; while(digitalRead(PIN1) == LOW){ count ++; if(count > 50000){ TIMSK1 = 0; interrupt_flag = false; lcd.fillScreen(BLACK); digitalWrite(PIN_POWER,LOW); break; } } }else if(digitalRead(PIN2) == LOW){ }else if(digitalRead(PIN3) == LOW){ } } void Init_gyro(){ Wire.begin(); Wire.beginTransmission(0x68); Wire.write(0x6B); Wire.write(0x00); Wire.endTransmission(); //加速度センサー初期設定 Wire.beginTransmission(0x68); Wire.write(0x1C); Wire.write(0x08); Wire.endTransmission(); //Gyro初期設定 Wire.beginTransmission(0x68); Wire.write(0x1B); Wire.write(0x08); Wire.endTransmission(); //LPF設定 Wire.beginTransmission(0x68); Wire.write(0x1A); Wire.write(0x00); Wire.endTransmission(); } void Read_gyro(){ Wire.beginTransmission(0x68); Wire.write(0x3B); Wire.endTransmission(); Wire.requestFrom(0x68, 14); while (Wire.available() < 14); axRaw = Wire.read() << 8 | Wire.read(); ayRaw = Wire.read() << 8 | Wire.read(); azRaw = Wire.read() << 8 | Wire.read(); temperatureRaw = Wire.read() << 8 | Wire.read(); gxRaw = Wire.read() << 8 | Wire.read(); gyRaw = Wire.read() << 8 | Wire.read(); gzRaw = Wire.read() << 8 | Wire.read(); } // ジャイロ補正関数 void Calibrate_gyro(int count){ for(int i = 0; i < count; i++){ Read_gyro(); drift_gx += gxRaw/65.5; drift_gy += gyRaw/65.5; drift_gz += gzRaw/65.5; } drift_gx /= count; drift_gy /= count; drift_gz /= count; } // 加速度センサの値を制限する関数 void Correct_gyro(){ ax = axRaw/8192.0; if(ax > 1.1) ax = 1.1; else if(ax < -1.1) ax = -1.1; ay = ayRaw/8192.0; if(ay > 1.1) ay = 1.1; else if(ay < -1.1) ay = -1.1; az = azRaw/8192.0; if(az > 1.1) az = 1.1; else if(az < -1.1) az = -1.1; gx = gxRaw/65.5 - drift_gx; gy = gyRaw/65.5 - drift_gy; gz = gzRaw/65.5 - drift_gz; } // 加速度と角加速度の相補フィルタ void Complementary_filter(){ float K = 0.5; // 3軸用 //roll = K * (roll + gx * dt * PI) + (1-K) * atan2(ay,sqrt(ax*ax + az*az)) * 180/PI; //pitch = K * (pitch + gy * dt * PI) + (1-K) * -atan2(ax,sqrt(ay*ay + az*az)) * 180/PI; //yaw += gz * dt * PI; // 1軸用 pitch = K * (pitch + gy * dt * PI) + (1-K) * -atan2(ax,abs(az)) * 180/PI; }

data.h

// '現場猫', 120x120px const uint8_t genbaneko [] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb8, 0x1f, 0xff, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xe0, 0x00, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x1c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x30, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xfc, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0xff, 0xff, 0xfe, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x8d, 0xfc, 0x06, 0x08, 0x0c, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3d, 0xf8, 0x01, 0xfc, 0x03, 0x08, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0xf8, 0x01, 0x74, 0x03, 0x09, 0x8c, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x04, 0xcc, 0x03, 0x74, 0x01, 0x09, 0x9c, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x60, 0x04, 0xc8, 0x03, 0x34, 0x01, 0x80, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8f, 0x60, 0x00, 0x58, 0x02, 0x3c, 0x00, 0x80, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x03, 0xef, 0xf0, 0x70, 0x01, 0xf8, 0x00, 0x84, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xe0, 0x3f, 0xc0, 0x00, 0x00, 0x70, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x07, 0x80, 0x00, 0x07, 0xfc, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x01, 0x00, 0x00, 0x3f, 0xcf, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x60, 0x01, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x03, 0xe0, 0x61, 0xff, 0xc1, 0xe0, 0x80, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x03, 0x30, 0x60, 0x00, 0x47, 0x31, 0xb8, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x06, 0x18, 0x60, 0x00, 0x3e, 0x1f, 0x07, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x0c, 0x20, 0x00, 0x18, 0x1e, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x08, 0x0e, 0x30, 0x00, 0x08, 0x30, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x1e, 0x30, 0x00, 0x08, 0x30, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0c, 0x1e, 0x30, 0x00, 0x0c, 0x60, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0c, 0x38, 0x38, 0x00, 0x04, 0xe0, 0x00, 0x06, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x08, 0x30, 0x18, 0x00, 0x07, 0xc0, 0x00, 0x0c, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x18, 0x30, 0x1c, 0x00, 0x03, 0x00, 0x00, 0x39, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x60, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x39, 0xf0, 0x60, 0x07, 0x00, 0x00, 0x00, 0x01, 0xe3, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x60, 0x03, 0xc0, 0x00, 0x00, 0x07, 0x67, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0x00, 0x0f, 0xcc, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0xd8, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x3f, 0x00, 0x00, 0xf1, 0x80, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x07, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0c, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 0x01, 0xff, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x00, 0x00, 0x07, 0xe1, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x7f, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x01, 0xff, 0xf0, 0x07, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1c, 0x01, 0xfe, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x7c, 0x01, 0x80, 0x00, 0x70, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x86, 0x01, 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x06, 0x01, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x02, 0x01, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0c, 0x03, 0x01, 0x80, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x01, 0x01, 0x80, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x01, 0x81, 0x80, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x80, 0xc0, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x07, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x80, 0x60, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

傾き算出はpitch角を使っていますが、これはジャイロセンサーが横向きに付けられているからです。

画像データは以下のソフトを使用して作成しました。
https://sourceforge.net/projects/lcd-image-converter/

キャプションを入力できます
あらかじめ液晶のサイズに合わせて縮小した画像をインポートします。

キャプションを入力できます
OptionsのConversionから設定を変更します。白黒の画像に変換する場合はMonochromeを、フルカラーの画像に変換する場合はR5G6B5を選択します。

おまけ

TFT液晶を使用しているので、以下のようにキャラクターや画像を表示することができます。
キャプションを入力できます
ただAruduinoのメモリでは容量的に白黒の1byteデータ型しか保存できません。フルカラーの画像を表示したければSDカードを利用するか、マイコンを変える必要があります。

ここまで書いておきながらこのドットサイトには1つ致命的な欠陥があります。それは前側にあるハーフミラーが45度で設置してあることです。これの何が問題かと言うと、光が真上から入射したとき、ハーフミラーの内側で液晶と乱反射し前が見えなくなることがあります。そのため真上からの光を遮断する必要があります。

今回は3つあるスイッチの内1つしか使ってないので、今後他のスイッチも利用しゼロインやモード変更などできるようにプログラムを改良していきたいです。
またプログラムを改良する上で文字などを表示したいと考えているのですが、これが厄介なことにハーフミラーに反射して投影しているので、文字が反転してしまいます。そのため上下もしくは左右反転したフォントを用意する必要があります。

参考文献

2
Pinus0079のアイコン画像
Arduino、ESP32でよく工作しています。最近はSTM32に手を出し、HALライブラリを勉強中です。
ログインしてコメントを投稿する