2023年オーストラリア・インドネシア    金環皆既日食のたくらみ

Seeeduino XIAOでGo!-③
2021.12.29:Open

※実験に使った環境※

使用したコンポーネントは下記の通り 
  1. マイコン:Seeeduino XIAO
  2. RTC:DS3231を使ったI2C接続のもの・Amazonで購入
  3. GPS:UART通信で利用・GPS受信キット・秋月電商で購入
  4. OLEDディスプレイ:コントローラはSSD1306、表示は128×64ドット・Amazonで購入
  5. TFカードメモリシールドモジュール:SPI接続・Amazonで購入
 本番環境では2.RTCはDS1307を使います。また、SDカードソケットは別途型が違うモノをAliexpressで買って使う事にしましたが、接続は同じです。
 これらをブレッドボードに据えて配線したものは下の様な感じ。フォトジェニックではないですが…
 回路図は先のページにある通りです。GPSはマイクロSDコネクタを介して窓辺にあるのでここには現れません
 

 という事で各種要素の実験をしてみました。
 記事は下の方ほど古く、上の方ほど新しいという形で付け足して行ってます。
  1. Seeeduino XIAOでGPSから時刻情報を得る実験
  2. Seeeduino XIAOでRTCの時刻をTFカードに書き込む実験
  3. Seeeduino XIAOでOLEDディスプレイに表示する実験
  4. GPSで得られた時刻でRTCを修正しOLEDに表示する実験

4.GPSで得られた時間でRTCを修正しOLEDに表示する実験


上へ

3.Seeeduino XIAOでOLEDディスプレイに表示する実験

 先ずOLEDディスプレイで、定番のHellow World!しました。
 ヘッダファイルは多々あるのですが、U8x8が楽に上手く表示を可能にしていたので、インストール後OLEDディスプレイにあう形にして不要部分を削除したリストが下です。

#include <Arduino.h>
#include <U8x8lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
//沢山あるコメント化された行から使うディスプレイにあたものから選ぶ
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

void setup(void)
{  
  u8x8.begin();
  u8x8.setPowerSave(0);
}

void loop(void)
{
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  u8x8.drawString(1,1,"Hello World!");
  u8x8.refreshDisplay();		// only required for SSD1606/7  
  delay(2000);
}
 太文字にした部分は様々なディスプレイの条件から選択します。今回はコントローラーはSSD1306、画面は128×64ドット、I2C接続という事で合いそうなものを探しました。
上へ

2.Seeeduino XIAOでRTCの時刻をTFカードに書き込む実験

 geotechlab-workshop様の「geotechlab-workshop のブログ」にある「第7回 時刻を記録する:RTCモジュール」の記事下方にあるプログラムコードを使ってみました。個人ブログなので、著作権とか考えてコードは記さない事にします。上述のブログにある通りの出力がTFカードに書き込まれました。
上へ

1.Seeeduino XIAOでGPSから時刻情報を得る実験

Qiitaに「コインサイズ Arduino互換機 Seeeduino XIAO を使ってみた」という記事があって、GPSからの情報の読み込みのための簡単なソースが掲載されていました。
void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  if (Serial.available()) {
    char c = (char)Serial.read();
    Serial1.write(c);
  }

  if (Serial1.available()) {
    char c = (char)Serial1.read();
    Serial.write(c);
  }
}

動かすと、

$GPGGA,235948.800,,,,,0,0,,,M,,M,,*41
$GPGLL,,,,,235948.800,V,N*73
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,01,10,,,34*7E
$GPRMC,235948.800,V,,,,,0.00,0.00,050180,,,N*48
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPZDA,235948.800,05,01,1980,,*5B
$GPGGA,235949.800,,,,,0,0,,,M,,M,,*40
$GPGLL,,,,,235949.800,V,N*72

 なんて形でシリアルモニタに表示されます。ここで、
$GPGGA,225948.800,,,,,0,0,,,M,,M,,*41
 の紫文字が、hhmmss.sssの形式で時・分・秒を示しています。
 という事で、「$GPGGA,」の8文字を認識したら、そこから時刻の文字列を取り出して、時・分・秒に切り分ける事にします。秒は小数点下3桁が000になったら
digitalWrite(LED_BUILTIN, LOW); 黄色
digitalWrite(PIN_LED2, LOW); 青
 の表面実装LEDのいずれかを点灯させることにします。そして、時・分・秒でRTCを補正することにします。
上へ
inserted by FC2 system