ソロでたのしむ

キャンプ、電子工作、DIY、乗り物などの趣味を紹介

オーバーヘッドコンソール付けGPSディスプレイ完成(Arduinoでコクピット⑦)

オーバーヘッドコンソール付けGPSディスプレイ完成

Arduinoを使って自作したGPS時計や方位計のディスプレイですが、車のオーバーヘッドコンソールにお試しで装着(シリーズ記事⑥)してから一週間たちました。

前回の記事はこちらです。

www.solocamptouring.com

 問題なく作動しており、おおむね満足していますが、改善したい点がでてきました。

少変更を入れつつ、最終的に完成させます。

 

最終改善ポイント

「S」が「5」に見える対策

GPSモジュールが位置計算に使用している人工衛星の数をLCDの中央下に表示しています。

数字の後ろに衛星(サテライト)を意味する「Sats」を表示していますが、パッと見たときに「S」が数字の「5」に見えてしまいます。

f:id:solocamptouring:20180203095841j:plain

写真は、衛星7機を使って位置計算していることを表示している画面ですが、75っぽく見えてしまいます。

そこで、「S」を小文字に変更して「sats」と表示することで、見やすくします。

 

停止していると方位角度におかしな数値が出ることがある

GPSで得られる進行方向データを方位として代用しています。

しかし進行方向はGPSモジュールの位置(=車)を動かさないと計算できないため、車が停止している状態だと、稀におかしな数値を表示します。

進行方向を計算できていない時は方位角度を表示せず、「ACT. REQUIRED」と表示するようにスケッチ(プログラム)を変更します。

f:id:solocamptouring:20180203125501j:plain

最新のスケッチ全文は、最後に載せておきます。

 

オーバーヘッドコンソールへの取り付け

車に一週間装着してみて、ビビリ音もなく作動も安定しているので、透明パネルのままで手を加えていなかったディスプレイ取り付け面を仕上げます。

LCD表示部でない部位は、個人的に好きな黒カーボン柄のカッティングシートでブラックアウトします。

車のオーバーヘッドコンソールに取付けて、動作確認しました。 

自作オーバーヘッドコンソールの完成(Arduinoで表示する20x4LCDディスプレイ付き)


Arduino project #1「GPSマルチモニター 」Multi-information monitor with GPS module

最新のスケッチ(プログラム)

GPSモジュールは、tinygpsplusライブラリ、

温湿度センサーは、GitHub - adafruit/ DHT11用ライブラリを使っています。

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include<Wire.h>
#include <DHT.h>
#define DHTPIN 13
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd( 12, 11, 8, 7, 6, 5 );
byte upword[8] = {
  B00100,
  B01110,
  B11111,
  B00000,
  B00100,
  B01110,
  B11111,
};
byte downword[8] = {
  B11111,
  B01110,
  B00100,
  B00000,
  B11111,
  B01110,
  B00100,
};
byte righthand[8] = {
  B01000,
  B01100,
  B01110,
  B01111,
  B01110,
  B01100,
  B01000,
};
byte lefthand[8] = {
  B00010,
  B00110,
  B01110,
  B11110,
  B01110,
  B00110,
  B00010,
};
byte centerpoint[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
TinyGPSPlus gps;
SoftwareSerial gpsSerial(9, 10); // RX, TX (TX not used)
const int serialTime = 200; // enough time to read all NMEA sentences once
const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

void setup()
{
   Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
  lcd.createChar(1, upword);
  lcd.createChar(2, downword);
  lcd.createChar(3, righthand);
  lcd.createChar(4, lefthand);
  lcd.createChar(5, centerpoint);
  lcd.begin(20,4);
  lcd.clear();  
  gpsSerial.begin(9600);
  lcd.setCursor(0,0);
  lcd.print("  CAPTURING         ");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("  SATELLITES        ");
  lcd.setCursor(0,2);
  lcd.print("        Powered by  ");
  lcd.setCursor(0,3);
  lcd.print("           Arduino  ");
  delay(3000);
  lcd.clear(); 
  dht.begin();
  
} // end setup


void loop()
{
int start = millis(); // reference for starting timestamp
int now = millis();
do {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
now = millis();
} while ((now - start) < serialTime); // breaks out of read gps serial

  if (gps.altitude.isUpdated())
  {
    int h;
    h = (gps.time.hour()) + 9;
    if( 24 <= h ) {
    h = h - 24;
    }
       if (h < 10) {
       lcd.setCursor(0,0);
       lcd.print(" ");
       lcd.setCursor(1,0);
       lcd.print(h);
       } else  {
       lcd.setCursor(0,0);
       lcd.print(h);
       }

    lcd.setCursor(2,0);
    lcd.print(":");

    int m;
    m = gps.time.minute();
       if (m < 10) {
       lcd.setCursor(3,0);
       lcd.print("0");
       lcd.setCursor(4,0);
       lcd.print(m);
       } else {
       lcd.setCursor(3,0);
       lcd.print(m);
       }
       
   int sec;
    sec = gps.time.second();
       if (sec < 10) {
       lcd.setCursor(0,1);
       lcd.print("     ");
       } else  if (sec < 20){
       lcd.setCursor(0,1);
       lcd.write(5);
       } else  if (sec < 30){
       lcd.setCursor(1,1);
       lcd.write(5);
       } else  if (sec < 40){
       lcd.setCursor(2,1);
       lcd.write(5);      
       } else  if (sec < 50){
       lcd.setCursor(3,1);
       lcd.write(5);
       } else {
       lcd.setCursor(4,1);
       lcd.write(5);         
       }

  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  //starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

    lcd.setCursor(16,2);  
    lcd.write(5);

     if (AcX < -5000) {
       lcd.setCursor(16,1);
       lcd.write(1);
       } else {
       lcd.setCursor(16,1);
       lcd.print(" ");
       }

     if (AcX > 5000) {
       lcd.setCursor(16,3);
       lcd.write(2);
       } else {
       lcd.setCursor(16,3);
       lcd.print(" ");
       }

     if (AcY < -5000) {
       lcd.setCursor(14,2);
       lcd.write(4);
       lcd.write(4);
       } else if (AcY < -2500) {
       lcd.setCursor(14,2);
       lcd.print(" ");
       lcd.write(4);
       } else  {
       lcd.setCursor(14,2);
       lcd.print("  ");
       }

     if (AcY > 5000) {
       lcd.setCursor(17,2);
       lcd.write(3);
       lcd.write(3);
       } else if (AcY > 2500) {
       lcd.setCursor(17,2);
       lcd.write (3);
       lcd.print(" ");
       } else  {
       lcd.setCursor(17,2);
       lcd.print("  ");
       }
  }
  
 if (gps.altitude.isUpdated())
  {
    lcd.setCursor(6,1);  
    lcd.print("Alt");
     int koudo;
     koudo = (int)(gps.altitude.meters()); 
     if (koudo == 0) {
     lcd.setCursor(9,1);
     lcd.print("----"); 
     } else if (koudo < 10) {
     lcd.setCursor(9,1);
     lcd.print("   "); 
     lcd.setCursor(12,1);
     lcd.print(koudo); 
     } else if (koudo < 100) {
     lcd.setCursor(9,1);
     lcd.print("  "); 
     lcd.setCursor(11,1);
     lcd.print(koudo); 
     } else if (koudo < 1000) {
     lcd.setCursor(9,1);
     lcd.print(" "); 
     lcd.setCursor(10,1);
     lcd.print(koudo); 
     } else {
     lcd.setCursor(9,1);
     lcd.print(koudo); 
     }
    lcd.setCursor(13,1);
    lcd.print("m");
  }

  if (gps.speed.isUpdated())
  {
        int satV;
        satV = (int)(gps.satellites.value());
        if (satV < 10){
        lcd.setCursor(8,3);
        lcd.print(" ");
        lcd.setCursor(9,3);
        lcd.print(satV);
         } else {
        lcd.setCursor(8,3);
        lcd.print(satV);
         }
        lcd.setCursor(10,3);
        lcd.print("sats");            
    
    int s;
    s = (int)(gps.speed.kmph());
       if (s == 0) {
       lcd.setCursor(0,3);
       lcd.print("---");
       lcd.print("Km/h");
       } else if (s < 10) {
       lcd.setCursor(0,3);
       lcd.print("  ");
       lcd.setCursor(2,3);
       lcd.print(s);
       lcd.print("Km/h");
       } else if (s < 100) {
       lcd.setCursor(0,3);
       lcd.print(" ");
       lcd.setCursor(1,3);
       lcd.print(s);
       lcd.print("Km/h");
       } else {
       lcd.setCursor(0,3);
       lcd.print(s);
       lcd.print("Km/h");
       }
  }

   if (gps.course.isUpdated())
  {
   int headDir = (gps.course.deg());
   
    if ((gps.course.deg()) <= 0) {
     lcd.setCursor(6,0);
     lcd.print("ACT. REQUIRED ");     
    }
    else if ((gps.course.deg()) > 360) {
     lcd.setCursor(6,0);
     lcd.print("ACT. REQUIRED "); 
    } 
    else if ((gps.course.deg()) < 11.3) {
     lcd.setCursor(13,0);
     lcd.print("W--N--E"); 
      if ((gps.course.deg()) < 10) {
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print("  "); 
      lcd.print(headDir);
      lcd.print(" "); 
      }else {
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(" "); 
      lcd.print(headDir); 
      lcd.print(" "); 
      }    
     }
    else if ((gps.course.deg()) < 33.8) {
     lcd.setCursor(13,0);
     lcd.print("--N");
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);
     lcd.print("--E"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(" "); 
      lcd.print(headDir); 
      lcd.print(" "); 
     }
   else if ((gps.course.deg()) < 56.3) {
     lcd.setCursor(13,0);
     lcd.print("-N-"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);   
     lcd.print("-E-"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(" "); 
      lcd.print(headDir);
      lcd.print(" "); 
     }
   else if ((gps.course.deg()) < 78.8) {
     lcd.setCursor(13,0);
     lcd.print("N--"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);   
     lcd.print("E--"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(" "); 
      lcd.print(headDir);
      lcd.print(" "); 
     }
   else if ((gps.course.deg()) < 101.3) {
     lcd.setCursor(13,0);
     lcd.print("N--E--S"); 
      if ((gps.course.deg()) < 100) {
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(" "); 
      lcd.print(headDir);
      lcd.print(" "); 
      }else {
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir); 
      lcd.print(" "); 
      }    
     }
  else if ((gps.course.deg()) < 123.8) {
     lcd.setCursor(13,0);
     lcd.print("--E"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);   
     lcd.print("--S"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);
      lcd.print(" "); 
     }
 else if ((gps.course.deg()) < 146.3) {
     lcd.setCursor(13,0);
     lcd.print("-E-");  
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);   
     lcd.print("-S-"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
 else if ((gps.course.deg()) < 168.8) {
     lcd.setCursor(13,0);
     lcd.print("E--");  
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);   
     lcd.print("S--"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
 else if ((gps.course.deg()) < 191.3) {
     lcd.setCursor(13,0);
     lcd.print("E--S--W"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
 else if ((gps.course.deg()) < 213.8) {
     lcd.setCursor(13,0);
     lcd.print("--S"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);   
     lcd.print("--W"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
else if ((gps.course.deg()) < 236.3) {
     lcd.setCursor(13,0);
     lcd.print("-S-"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0);   
     lcd.print("-W-"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
else if ((gps.course.deg()) < 258.8) {
     lcd.setCursor(13,0);
     lcd.print("S--"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0); 
     lcd.print("W--"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
else if ((gps.course.deg()) < 281.3) {
     lcd.setCursor(13,0);
     lcd.print("S--W--N"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
      }
else if ((gps.course.deg()) < 303.8) {
     lcd.setCursor(13,0);
     lcd.print("--W"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0); 
     lcd.print("--N"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
else if ((gps.course.deg()) < 326.3) {
     lcd.setCursor(13,0);
     lcd.print("-W-"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0); 
     lcd.print("-N-"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
else if ((gps.course.deg()) < 348.8) {
     lcd.setCursor(13,0);
     lcd.print("W--"); 
     lcd.setCursor(16,0);
     lcd.write(1); 
     lcd.setCursor(17,0); 
     lcd.print("N--"); 
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     }
else {
     lcd.setCursor(13,0);
     lcd.print("W--N--E");
      lcd.setCursor(6,0);
      lcd.print("Dir"); 
      lcd.print(headDir);  
      lcd.print(" "); 
     } 
    
  }

 int hmdt = dht.readHumidity();
 int tmpr = dht.readTemperature();

  if (isnan(hmdt) || isnan(tmpr) ){
     lcd.setCursor(0,3);
     lcd.print("UPDATING           ");
  }else{
   lcd.setCursor(0,2);
   lcd.print("Tmp");
   if (tmpr < 10) {
   lcd.setCursor(3,2);
   lcd.print(" ");
   lcd.setCursor(4,2);
   lcd.print(tmpr);
   } else {
   lcd.setCursor(3,2);
   lcd.print(tmpr);
   }
   lcd.setCursor(5,2);
   lcd.print("c ");
   lcd.setCursor(7,2);
   lcd.print("Hmd");
   lcd.setCursor(10,2);
   lcd.print(hmdt);
   lcd.setCursor(12,2);
   lcd.print("%");
  }

}