・三才ブックスから発売の『電子工作マニア』に本GPS Clockが掲載されました。
サポートコンテンツを逐次追加していきますのでお楽しみに!!(2009/06/22)
・GPS 受信衛星数を表示しました。
〜〜今後の予定〜〜
・LCDバリーエションの追加 (評価完了・コンテンツ準備中)
・LED表示モジュールによる表示 (ソフト完成・コンテンツ準備中)
・VFD表示モジュールによる表示
・クロック表示精度の向上 (表示オフセット処理追加)
・新GPSモジュールの評価 (1PPS出力対応)
秋月電子通商で販売されている、GT-720F 通販コード:M-02711を使用しました。
このモジュール、極めて受信感度が高いと噂があり、調べたところ、室内でもGPS衛星の捕捉に成功し、位置情報など正しく出力してきました。市販のGPS機器でも室内でコールドスタートでもウォームスタートでも出来る機器は稀です。比較的性能の良いと言われているものでも屋外で捕捉した後なら室内でも継続捕捉できる程度です。
また、このモジュールは、RS-232Cのレベルコンバータを内蔵しており、パソコンのシリアルポートに直結できるのが、特徴なのですが、実は、LV-TTLレベルの入出力も持っており、ワンチップマイコンなどにも直結できます。(左図参照)
※ただし、何故か秋月の付属の取説では、5pin, 6pinがN.C.表記になっています。
モジュールとの接続には6pinのコネクタ付の接続ケーブルがついていますので、ケーブルの中央で切断して使うと良いでしょう。
GPSとLCDを使った様々な実験を行うための基本プラットフォームとして、ATMELのATtiny2313を採用しました。理由は、非常に安価(@100)、C言語による開発環境が整っている、PICマイコンに飽きた(^^;などです。UARTとLCD接続に必要なGPIO 7pinがあれば、どんなマイコンを採用してもOKですが、クロックも内蔵しているため、実質的な外付部品は、1pinリセット端子の抵抗のみで構成できます。コンフィグレーションによってはこれも省略できますが、ISPやICEをつなぐことを考慮するとこの方が良いので付けてます。
尚、ISPや外部発振器等をあまり考えずに接続できるように該当ピンは空きピンとしています。
LCDは、秋月に売られているもののうち一番安価なものにしましたが、実用には、バックライト付のものや、VFDなどが良いと思います。後述しますが、他のLCDでも問題なく動作します。接続モードは4ビットとし、RW信号も省略せずに接続し、ソフトウェアでBUSYビットを見るようにしています。
GPSモジュールからは、正確な時刻情報が出力されますが、これをバッファリングし、デコードするには、それなりの時間が必要なため、必ずオフセットが生じます。その分を考慮して表示すべきですが、今回は省略しています。ですので、表示データは、リアル時刻に対して遅れて表示されます。
これを防ぐには、1PPS出力があるGPSモジュールを使用するか、ソフトウェアでオフセット分を進めて表示する必要がありますが、どちらの方法を使用してもマイコンのクロック精度ならびにジッタ以下にすることは出来ません。今回は、NTPのような用途ではなく、置時計程度の使用を想定してしますので、実用上問題ないと割り切りました。同様に衛星ロストした場合も内部でカウントすることはしていませんが、前述のとおり、十分感度の高いモジュールのため実用上まったく問題ありませんでした。
1.ソースリストおよびHEXファイル
※GPSモジュールとは、9600bpsで通信していますが、内蔵クロック(8MHz)を使う場合はキャリブレーションが必須です。
良い方法でないのですが、ソースリストの中にキャリブレーションデータを埋め込んでしまってます。
リコンパイルする方は、適宜変更してください。
2.LCD制御
実は今回、一番苦労したのがLCDの表示です。正確にいうとLCDの初期化です。先人の方々が公開されているものを素直に使わしてもらえば良いのですが、勉強を兼ねてスクラッチから書いたらハマりました。(汗) 初期化時のウェイトが不足が主な原因でしたが、描画時はウェイトを最小限にしたいため、RW信号を制御して、BUSYビットを確認するようにしました。
//
// LCD Library for S-10551D
//
// Pin assign
#define LCD_D7 _BV(PB3)
#define LCD_D6 _BV(PB2)
#define LCD_D5 _BV(PB1)
#define LCD_D4 _BV(PB0)
//
#define LCD_RS _BV(PD5)
#define LCD_RW _BV(PD4)
#define LCD_E _BV(PD3)
//
// LCD initialyze
//
static void lcd_init(void){
PORTB = 0x03; // 8bit mode
_delay_ms(50); // wait 50ms
lcd_clock(); // set 8bit mode
_delay_ms(6); // wait 6ms
lcd_clock(); // set 8bit mode
_delay_us(60); // wait 120us
_delay_us(60); //
lcd_clock(); // set 8bit mode
_delay_us(50); // now, true 8bit mode
PORTB = 0x02; // set 4bit mode
lcd_clock(); //
_delay_us(50); // wait 50us
lcd_command_write(0x2c);
lcd_command_write(0x08);
lcd_command_write(0x01);
lcd_command_write(0x06);
lcd_command_write(0x0c);
lcd_command_write(0x14);
lcd_command_write(0x80);
}
void lcd_clock(void){
PORTD |= LCD_E;
PORTD |= LCD_E;
PORTD |= LCD_E;
PORTD &= ~LCD_E;
PORTD &= ~LCD_E;
PORTD &= ~LCD_E;
}
void lcd_ready_check(void){
unsigned char i;
DDRB = 0;
PORTD |= LCD_RW;
while(1){
PORTD |= LCD_E;
PORTD |= LCD_E;
PORTD |= LCD_E;
i = PINB << 4;
PORTD &= ~LCD_E;
PORTD &= ~LCD_E;
PORTD &= ~LCD_E;
PORTD |= LCD_E;
PORTD |= LCD_E;
PORTD |= LCD_E;
i |= PINB & 0x0f;
PORTD &= ~LCD_E;
PORTD &= ~LCD_E;
PORTD &= ~LCD_E;
if((i & 0x80) == 0) break;
}
PORTD &= ~LCD_RW;
DDRB = 0x0f;
}
void lcd_command_write(unsigned char data){
lcd_ready_check();
PORTB = data >> 4;
lcd_clock();
PORTB = data & 0x0f;
lcd_clock();
}
void lcd_data_write(unsigned char data){
lcd_ready_check();
PORTD |= LCD_RS;
PORTB = data >> 4;
lcd_clock();
PORTB = data & 0x0f;
lcd_clock();
PORTD &= ~LCD_RS;
}
秋月電子通商で販売されている、キャラクタタイプのLCDモジュールは、ソフトウェアの変更なしにそのまま使用可能と思われますが、本日(2009/06/07)、いろいろなLCDを購入してきましたので、動作状況を逐次updateしていきます。
Make Tokyo Meeting 03に出展しました。
非常に多くの方にブースにお立寄り頂きありがとうございました。
・会場で配布したチラシ
他のMakerの方には申し訳ないぐらいの作品ですが、このシンプルさ故、興味を持っていただいた方がたくさんいらっしゃいました。
当サイト上に情報を掲載するにあたり、正確な情報を提供するよう注意を払っておりますが、その内容の正確性・妥当性については一切責任を負いません。なお、事前に通知することなく、掲載を中断、あるいは、情報を変更する場合がありますので、あらかじめ御承知おきください。
Copyright (c) 2009 GPS Labo logic☆ (メール logicstar @ news-report.net 空白を削除)