2014/06/08

GPS redio clock Act.3

PA6H GPSモジュール
AE-FT231X USBモジュール
ACM1602NI-FLW-FBW-M01 I2C_LCD
AVRマイコンATMEGA328P-PU(3.3V 8MHz (内蔵CR))
74HC14AP
2SC1815GR

の組み合わせで、
1PPS
GPS radio clock
を組んでみました。

$GPGGAの行からデータを抽出しています。

参考にさせていただいたスケッチは
↓ 弦木考忘さんのサイト
http://baticadila.dip.jp/arduino_105.html

AE-FT231X USBモジュールは、PA6HからのNMEAデータをPCに
取り込むためのものです。

スケッチは、ICSP経由で書き込んでいます。

ボーレートは、デフォルトの9600bpsにしましたので
データ更新は、0.5秒です。

GPSからのデ-タ更新には、関係なく
1PPSからの割り込みで1秒ごとに「秒」
を更新しています。

6/20 追記
GPSからのデ-タ更新を、2秒に設定した場合。
1PPSからの割り込みは、2秒ごとにかかるしい。
よってこのスケッチは間違った動きをします。

秒針の遅れは、ほんのわずかです。
ソースを簡略にするため、59~00間の1秒は「マヤカシ」です。

TR5822 1Hzの周期は、1.0000003 s (10^2)と表示しています。
表示は、動きません。なお室温は、25℃です

/*
GPS radio clock 1.56
2014/06/08 daikunomokichi
*/
#include <Wire.h>                       //I2C
#include <wI2cLcdACM1602.h>             //LCD
wI2cLcdACM1602 lcd;
/*
 MTK3339 コマンドのメモ
 $PMTK251,19200*22 CR+LF                 19200bps
 $PMTK251,57600*2C CR+LF                 57600bps
 $PMTK220,500*2B CR+LF                   データ更新レート 2Hz 9600bps以上
 $PMTK220,200*2C CR+LF                   データ更新レート 5Hz 38400bps以上
*/
int dHour = 0;                          //JST時
int dHour0 = 0;
int dHour1 = 0;
int dHour2 = 0;
int dMin = 0;                           //内部分
int dMin0 = 0;
int dMin1 = 0;
int dSec = 0;                           //内部秒
int dSec0 = 0;
int dSec1 = 0;
int dSec2 = 0;
int dIntpin = 2;                        //割込D2
char buf[256];
char c;
int count = 0;
char *gpsTime, *gpsCnt;                 //個別データ用の文字列用ポインタ
char dRun = 0;                          //補足完了
void setup()
{
    Serial.begin(9600);
    Serial.println("$PMTK220,500*2B");    //データ更新レート 2Hz
    Wire.begin();                         //I2C初期化
    lcd.begin();                          //LCD初期化
    lcd.clear();                          //全クリア
    lcd.noBlink();                        //カーソル点滅なし
    lcd.noCursor();                       //カーソル表示なし
    lcd.setCursor(0, 0);
    lcd.print("Preliminary GPS");         //最初のメッセージ表示
    lcd.setCursor(0, 1);
    lcd.print("1.56 by mokichi");         //最初のメッセージ表示
    pinMode(dIntpin, INPUT);
    attachInterrupt(0, yCnt, RISING);
    //attachInterrupt(0,yCnt, FALLING);   //HIGHからLOW
    delay(1000);
    lcd.clear();
}
void loop()
{
    count = 0;
    do {
        if (Serial.available()) {
            buf[count] = Serial.read();
            count++;
        }
        if (count > 250) {
            break;
        }
    } while (buf[count - 1] != 0x0A);
    buf[count] = '\0';
    if (0 == strncmp("$GPGGA", buf, 6)) {
        strtok(buf, ",");
        gpsTime = strtok(NULL, ",");        //m1>UTC時刻の抽出
        strtok(NULL, ",");                  //m2
        strtok(NULL, ",");                  //c1
        strtok(NULL, ",");                  //m3
        strtok(NULL, ",");                  //c2
        strtok(NULL, ",");                  //d1
        gpsCnt = strtok(NULL, ",");         //d2>測位に使用した人工衛星の個数
        lcd.setCursor(14, 1);
        lcd.print(gpsCnt);
        lcd.print("  ");
        dMin0 = gpsTime[2];
        dMin1 = gpsTime[3];
        dMin = ((dMin0 - 48) * 10) + dMin1 - 48;
        dSec0 = gpsTime[4];
        dSec1 = gpsTime[5];
        dSec2 = ((dSec0 - 48) * 10) + dSec1 - 48;
        dHour0 = gpsTime[0];
        dHour1 = gpsTime[1];
        dHour2 = ((dHour0 - 48) * 10) + dHour1 - 39;
        switch (dHour2) {
            case 24:
            case 25:
            case 26:
            case 27:
            case 28:
            case 29:
            case 30:
            case 31:
            case 32:
                dHour = dHour2 - 24;
                break;
            default:
                dHour = dHour2;
                break;
        }
    }
    if (dRun != 0) {
        lcd.setCursor(0, 0);
        lcd.print("GPS radio clock");
    }
    lcd.setCursor(6, 1);
    lcd.print(dSec / 10);
    lcd.print(dSec % 10);

    lcd.setCursor(0, 1);
    lcd.print(dHour / 10);
    lcd.print(dHour % 10);
    lcd.print(":");
    lcd.print(dMin / 10);
    lcd.print(dMin % 10);
    lcd.print(":");
    lcd.setCursor(8, 1);
    lcd.print("(JST)");
    lcd.print(char(222));
}
void yCnt()
{
    dSec++;
    if (dSec > 59) {
        dSec = 0;
    }
    if (59 == dSec2) {
        dRun = -1;
        dSec = 0;
    }
}

2014/06/06

SyntaxHighlighter

Bloggerにソースコードを見やすくするツール?スクリプト?
「SyntaxHighlighter」
を導入しました。
ソースコードに、<, >, & ,", 'が含まれている場合は,うまく表示されない場合があります。
SyntaxHighlighter <pre> 特殊文字
検索すると解説がヒットするはずです。
bloggerの「作成」と「HTML」をうまく使い分けると良い。

そして
ソース整形は、「Artistic Style」バッチファイルから起動。

asbat.bat
astyle --style=1tbs -s4 -S -N -Y -M80 -p -j -k1 -U -H sample.c

上記オプションの提案と簡単解説は、
しゅにるさん「おともだちティータイム」のウエブログ
ゴミのようなコードを見たときに利用するべき astyle のススメ
http://shunirr.hatenablog.jp/entry/20120628/1340884145
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup()
{
    // initialize the digital pin as an output.
    pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop()
{
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);               // wait for a second
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);               // wait for a second
}

まとめ「Arduinoを学習する。」Act.3

まとめ「Arduinoを学習する。」Act.3

ソルダーレスブレッドボード上のAVRマイコンATMEGA328P-PU
で遊ぶ場合のため限定です。
① ヒューズビットの書き込みを行う
② ソルダーレスブレッドボード上に[ICSP]端接続子を設ける。
③ 書込装置で「Arduino as ISP」を選択し、ファイル→書込装置を使って書き込む、
でスケッチのデバックを行う。


ボードの説明(左から)

[1]-------------
Uncompatino 3.3V版 (8MHz水晶発振子)
(Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 コンパチにしました。)
妙楽堂電子パーツショップで購入。Elecrow社 AVR ISPシールド 801-ECP-SISP
   >>> ArduinoをAVRライタとして使うことができるようにするシールド。
             ソルダーレスブレッドボード上のAVRマイコンATMEGA328P-PU
     へICSP経由でスケッチの書き込みを行う。

[2]-------------
Uncompatino 5.0V版 (16MHz水晶発振子)
   >>> 「すz」及び「ゆき」さんに感謝し
      <FT245R/FT232R で avrdude>+<avrdude-GUI>の書き込みソフトで、
      <通常版のUncompatino>+<ゼロプレッシャーICソケット (28P)>で、
      ヒューズビットの書き込みを行う。

この2台で完璧です。

なお、「作って遊べるArduino互換機」  鈴木 哲哉 (著)
を読むことをお勧めします。

是非購入してください。

追伸
AVRマイコンATMEGA328P-PUは
3.3V 8MHz (内蔵CR)
でかなりのことができるはずです。

2014/06/05

GPS redio clock Act.2

未使用の

「ATMEGA328P-PU」

ヒューズビットを書き換え後、
書込装置「Arduino as ISP」で
ICSP経由でスケッチを書き込みました。

ブートローダーは、書き込んでいません。
電源は、シールドからは送らずに
ソルダーレスブレッドボードからの自前です。

今回の改造は、秒を1PPSから「割込み」処理で
自前カウントしています。
GPS NMEA の秒「00」時に同期させます。

なんとなく秒ステップがいい感じになりました。

今までは、0.7秒くらい遅かったのですが、

秒「00」時の設定ができるようになりましたので

0.3秒進めてあります、

2014/06/03

RTC-4543 & Arduino Act.5

RESET
① 秒を0にする。
② 分を増加。
③ 時を増加。

の3つのボタンを追加しました。

時刻合わせが、簡単にできるようになり、
実用まであと一歩のところまで来ました。

スケッチライターは、
Uncompatino 3.3V版 (8MHz水晶発振子)

Elecrow社 AVR ISPシールド 801-ECP-SISP
(シールドからの電源は、NC)

ボードには[ICSP]6Pinを増設してあります。

2014/06/02

OCN モバイル ONE

OCN モバイル ONE を使用開始しました。
 もっぱらWiFi接続で使用しなかった DoCoMo GALAXY tab SC-01C
にSIMを挿入。 サイトの案内のとおり設定したら「サク」と接続完了。
SMSも使えるようになりました。 
docomoの端末は、ほとんどOKらしいです。

写真はありませんが、
EMOBILE GP02 も「サク」と接続完了 となりました。

GP02は、元々SIMフリーであるらしいとネット情報がありました。 ホントかな?

EMOBILEからの移行で月額2500円の節約になりそうです。

2014/06/01

RTC-4543 & Arduino Act.4

Act.3のボードに

秋月電子通商のATmega168/328マイコンボードキット
「AE-ATmega」(Arduino Duemilanove互換)。

Elecrow社 AVR ISPシールド 801-ECP-SISP
ArduinoをAVRライタとして使うことができるようにするシールド。

の組み合わせでスケッチを組み込みました。

AVR ISPシールドにVCCの電圧切り替え(3.3Vと5.0V)が
便利です。
電源容量がどのくらいあるのか不明です。

Arduino IDEでの使い方を簡単説明
①Arduino Duemilanove互換(「AE-ATmegaa」)にArduinoISPのスケッチを書き込む。
②作成した「RTC-4543表示」のスケッチを選択
③ツール→マイコンボードメニューで
  「Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328」を選択し直す。
④ツール→書込装置で「Arduino as ISP」を選択する。
⑤ファイル→書込装置を使って書き込むで書き込む。
⑥動作を確認。

VCC 3.3V で書き込みは、電源用量が足らず、不安定です。
VCC 5.0V で書き込みを薦めます。

いつもの様に「マイコンボードに書き込む」で書き込むと、
当たり前ですが「AE-ATmegaa」に上書きしてしまうの要注意。