ソロでたのしむ

DIY、電子工作、キャンプ用品などの趣味を紹介します

ArduinoとLCDでコクピット情報を追加表示 その③~ArduinoとGY-521(MPU-6050)を使うスケッチ(プログラム)

 

ArduinoとTinyGPS++で、正確な時間、高度、速度、進行方向、温度、傾斜を、LCDディスプレイに表示

 20x4文字のLCDモニターとArduinoで、戦闘機の計器類と同じような情報を、車内で表示します。実際に車に装着されるまでを、全7回で紹介します。

  1. プロローグ ArduinoとDHT11を使うスケッチ(プログラム)
  2. その① 20x4LCDモニターの表示内容を決める
  3. その② シリアル通信で加速度出力を確認
  4. 今回の記事;その③ ArduinoとGY-521(MPU-6050)を使うスケッチ
  5. その④ 自作オーバーヘッドコンソールを拡大
  6. その⑤ 自作オーバーヘッドコンソールにモニターと回路埋め込み
  7. オーバーヘッドコンソール付けディスプレイ完成

今回は、加速度センサーモジュールGY-521(MPU-6050)を追加して、20x4文字LCD画面に詰め込めるだけ全ての情報を表示します。

前回やったこと

Arduinoとセンサーモジュールでバージュンアップ途中の車内モニター

前回は、これから追加する加速度センサーモジュールが使用できることを確認しました。

今回やること

下表の情報をLCDに表示させます。速度と使用衛星数の配置を、前前回の記事から少し変更しました。

20x4文字LCDに時間、高度、速度、進行方向、温度、傾斜を表示する

回路図

最後に追加したGY-521(MPU-6050)モジュールが、I2C接続のため必然的にArduino nanoのA4,A5,D2ピンを使うことになり、各モジュールとの接続ピン割振りを見直しました。

 

Arduino nanoと加速度ジャイロセンサ、GPSモジュール、温度センサの接続 回路図

回路図はFritzingで作成しました。
左上付近にあるGY521が今回追加するセンサーです。回路図では違う部品が載っていますが接続は同じです。

ブレッドボードで作動確認

スケッチは最後に紹介します。

スケッチをArduinoに書き込んで、ブレッドボード上で配線して表示させてみました。

ウエルカム画面

Arduino で加速度、位置、時計、温度をLCDに表示。ウェルカム画面

 

電源オン後、走り出すまでの画面

Arduino で加速度、位置、時計、温度をLCDに表示。車両停止時画面

 動きがないと進行方向が計算できないので、LCD画面の右上に「ACT. REQUIRED」と表示します。

平坦路で、前後および横Gが発生していない時の画面

Arduino で加速度、位置、時計、温度をLCDに表示。Gがない時の画面

 LCD画面の右下の■(車のイメージ)のまわりには、どの向きにも▲マークがありません。

坂路もしくはGがかかっている状態

Arduino で加速度、位置、時計、温度をLCDに表示。Gがかかっている時の画面

写真手前の加速度センサーを傾けたので、LCD画面の右下の■のまわりに、▲マークが表示されます。

スケッチ

前回の加速度センサーのサンプルスケッチと、前前回のGPS&温湿度センサーのスケッチを足し合わせてから、LCDの表示場所取りを見直したり条件式をいくつか追加したりして書きました。

#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);
const int serialTime = 200; 
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(); 
int now = millis();
do {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
now = millis();
} while ((now - start) < serialTime); 
  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()) < 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("%");
  }
}

 今後やること

Arduinoとセンサーモジュール類、LCDを汎用基盤に実装したら、車のオ-バーヘッドコンソール部に埋め込みます。車に装着する作業では木工作業も紹介します。