ソロでたのしむ

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

いつでも正確な時計を自作。GPSからの情報を秒単位で表示します

スポンサーリンク

こんにちは。在宅時間が増えてきていると思いますが、お元気でおすごしですか?

私は(も)、アウトドアで過ごす予定がたてられない生活をしています。

しかし、そんな時こそキャンプでも使えるガジェットを自作すべき!ということで、在宅勤務でもアウトドアでも使える、いつでも正確な時間を教えてくれる時計を作ってみます。

 

いつでも時間が正確な時計を作ってみる

マイコン「Arduino」は難しくない!

最初に、「デジタル時計なんて自作できるのか?」問題について、少しだけ私の所感を紹介させていただきます。

マイコンを使う工作なんて無理〜と思っていた私が、Arduinoに出会ったのは、数年前です。

その頃すでに、日本語でArduinoの使い方を紹介されているサイトなどがありましたが、専門用語が多くて少し難解だったり、応用しづらかったりして、やはり基礎知識がないと無理なのかな?と最初は思いました。

海外のサイトからも情報を得たりしながら、いろいろ作ることに成功した現在、結論を言うと、「基本的なエクセルの関数計算を使うことができるなら、難しくない!」です。

Arduinoの場合は、プログラムのことを「スケッチ」と呼びますが、スケッチを描くのと同じくらい簡単ですよ!ということのようです。

表計算ソフトのエクセルで「もし〇〇ならば、△△を計算(実行)」の関数を使ったことがあれば、Arduinoスケッチの8割くらいは理解できると思います。

実際に私は、if~else~式を乱用して、スケッチを作っています。残りは数字の種類(整数、桁数)などを少し勉強すれば、だいたい理解できました。

ひとつ作品を成功させると、可能性が無限に広がったような気持ちになって、何かを表示するだけでなく、動かしたり光らせたりする作品など、いろいろ作ってきました。

もし興味がおありでしたら、見てみてください。

www.solocamptouring.com

 

人工衛星の情報で、正確な時間を入手

さて、前置きが長くなりましたが、置き時計を作ります。

最近は、腕時計でも採用されているものがありますが、地球のまわりを飛んでいる人工衛星から、正確な時間情報をいただきます

使う部品はこれだけです。

GPS時計を自作します

  • Arduino
  • NEO-6M GPSモジュール
  • 1602 LCDモジュール
  • 220Ω 抵抗
  • 1kΩ 可変抵抗 

あとは、試作用の汎用基盤などの小物ですね。

GPSモジュールとLCDモジュールは、電力消費がそれほど多くないので、この後で紹介する回路図とは少し違って、USB接続したArduinoからの5Vアウトプットで駆動しています。

GPS時計の回路図

いつもお世話になっているFritzingで回路図を作成しました。

LCDモジュールへの配線数が多いですが、GPSモジュールへの配線はわずか3本です!

これだけで正確な時間情報がいただけるなんて、嬉しいですね。

GPS clock 1604 LCD_回路図

組み立てましょう

はんだ付けって大変!なのですが、便利な道具があると、ずいぶん楽になります。

若かりし頃は、横着なやり方もしていましたが、分別ができる年頃になってから、便利な道具に助けてもらうことを覚えました。

電線どうしのはんだ付けなど、もう一本手が欲しい~と思いながら苦戦していましたが、クリップ付きのはんだこて台があると、本当に楽です。

ハンダ付けを含めた作成の様子は、タイムラプスの動画にしてみました。

youtu.be

完成したことろで、お部屋のテレビ台に置いてみると、こんな感じです。

USBで駆動するGPS置時計

きちんと、秒単位で正確に働いています!

青色の背景に白い文字が浮かび上がっていて、雰囲気も良いですね。

ちなみに、このGPS時計は、電源を入れた後、表示するまで少しだけ時間がかかりますが、一度電波を受信した後は、今のところ表示が止まったりすることはありません。

アウトドアなら問題なく、また置時計として使うにも、電波が受信できる場所であれば、大丈夫でしょう。

GPS時計のスケッチ(プログラム) 

これまで紹介させていただいた作品の中では、おそらく最もシンプルなスケッチです。

バンコク時間に合わせたスケッチになっているので、日本時間を表示する場合は、6行目の

#define time_offset 25200 // define a clock offset of 3600*7 seconds (7 hour) ==> TH = UTC + 7

の部分を、

#define time_offset 32400 // define a clock offset of 3600*9 seconds (9 hour) ==> JP = UTC + 9

にします。 

スケッチは、TinyGPS++と、Arduino Time Librariesのライブラリを、インストールしてから使います。

#include <TinyGPS++.h>    
#include <TimeLib.h>          
#include <SoftwareSerial.h>   
#include <LiquidCrystal.h>    
TinyGPSPlus gps;
#define time_offset   25200  // define a clock offset of 3600*7 seconds (7 hour) ==> TH = UTC + 7
#define S_RX    9
#define S_TX    8
SoftwareSerial SoftSerial(S_RX, S_TX);   
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // LCD connections (RS, E, D4, D5, D6, D7)
 
// variable definitions
char Time[]  = "00:00:00";
char Date[]  = "2000/00/00";
byte last_second, Second, Minute, Hour, Day, Month;
int Year;
 
void setup(void)
{
  SoftSerial.begin(9600); 
 
  lcd.begin(16, 2); 

// welcome display
  lcd.setCursor(0, 0); 
  lcd.print("   GPS  CLOCK   ");
  lcd.setCursor(0, 1); 
  lcd.print("ARDUINO  POWERED");

  delay(5000);
  lcd.clear()  ;
}
 
void loop()
{
  while (SoftSerial.available() > 0)
  {
    if (gps.encode(SoftSerial.read()))
    {
// get time from GPS
      if (gps.time.isValid())
      {
        Minute = gps.time.minute();
        Second = gps.time.second();
        Hour   = gps.time.hour();
      }
 
// get date from GPS
      if (gps.date.isValid())
      {
        Day   = gps.date.day();
        Month = gps.date.month();
        Year  = gps.date.year();
      }
 
      if(last_second != gps.time.second())  
      {
        last_second = gps.time.second();
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(time_offset);
 
// update time
        Time[6] = second() / 10 + '0';
        Time[7] = second() % 10 + '0';
        Time[3]  = minute() / 10 + '0';
        Time[4] = minute() % 10 + '0';
        Time[0]  = hour()   / 10 + '0';
        Time[1]  = hour()   % 10 + '0';
 
// update date array
        Date[2] = (year()  / 10) % 10 + '0';
        Date[3] =  year()  % 10 + '0';
        Date[5]  =  month() / 10 + '0';
        Date[6] =  month() % 10 + '0';
        Date[8]  =  day()   / 10 + '0';
        Date[9]  =  day()   % 10 + '0';
 
// show time & date
        print_wday(weekday()); 
        lcd.setCursor(4, 0);    
        lcd.print(Time);         
        lcd.setCursor(0, 1);    
        lcd.print(Date);         
      }
    }
  }
}
 
// for displaying day of the week
void print_wday(byte wday)
{
  lcd.setCursor(11, 1);  // move cursor to column 5, row 1
  switch(wday)
  {
    case 1:  lcd.print("(SUN)");   break;
    case 2:  lcd.print("(MON)");   break;
    case 3:  lcd.print("(TUE)");   break;
    case 4:  lcd.print("(WED)");   break;
    case 5:  lcd.print("(THU)");   break;
    case 6:  lcd.print("(FRI)");   break;
    default: lcd.print("(SAT)");
  }
}

本当に短いスケッチですね~

今回は、簡単に自作できるGPS時計の紹介でした。

早くキャンプに持っていきたい!

電波が届かないキャンプでも正確な時間な時計

それでは最後に、皆様がお家時間もアウトドア時間も楽しまれるよう、祈念しております。