概要
タイトルの通り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つしか使ってないので、今後他のスイッチも利用しゼロインやモード変更などできるようにプログラムを改良していきたいです。
またプログラムを改良する上で文字などを表示したいと考えているのですが、これが厄介なことにハーフミラーに反射して投影しているので、文字が反転してしまいます。そのため上下もしくは左右反転したフォントを用意する必要があります。
参考文献
投稿者の人気記事
-
Pinus0079
さんが
2021/01/07
に
編集
をしました。
(メッセージ: 初版)
-
Pinus0079
さんが
2021/01/07
に
編集
をしました。
-
Pinus0079
さんが
2021/01/07
に
編集
をしました。
-
Pinus0079
さんが
2021/01/07
に
編集
をしました。
-
Pinus0079
さんが
2021/01/07
に
編集
をしました。
-
Pinus0079
さんが
2021/01/07
に
編集
をしました。
-
Pinus0079
さんが
2021/01/08
に
編集
をしました。
-
Pinus0079
さんが
2021/01/09
に
編集
をしました。
ログインしてコメントを投稿する