nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

SDカード&RTCを試してみます

ArduinoでSi5351aを制御するデジタル局発を作りました。中華製エアバンドレシーバーキットを改造し、デジタル化エアバンド受信機を試作しています。

 

次に取り掛かろうとしているのは受信モニターログ記録をしてみようかと言うアイデアです。受信信号をモニターし、信号あったら、周波数や時間を記録してみようかとの取り組みです。そのためにArduino環境でSDカード&RTCをどうするか探したら中華製パーツでSDロガーシールドというのがありました。早速Aliexpressで買うと、キリギスタンから航空便でやってきました。当然資料はついてません。

 

ぐぐってみると、Adafruitsのロガーシールドと言うのが本家のようです。ただし、本家製品は廃版なようで、中華製コピー品が改良されていくつかでています。ARDUINO UNOへピギーバックする基板(シールド)にSDカードスロット、3.3V電圧変換、DS1307クロックとバッテリーが付いています。実験表示環境としてLCD&KEYPADをさらに上載せすることにしました。

 

f:id:nobcha23:20210312230523j:plain

回路構成

f:id:nobcha23:20210312230606j:plain

3種基板

f:id:nobcha23:20210312230712j:plain

3段重ねで動かす

本家がAdafruitsなのでライブラリーは豊富。また、SDカード、RTCに関してブログで発表されている事例はたくさんありました。地盤工学的電子工作講座 Season 1「第5回 SDカードに記録する:SDカードシールド」を参考にさせていただきました。

f:id:nobcha23:20210312230755j:plain

KEYPAD押したらA0に抵抗分圧電圧

LCD&KEYPADシールドではプッシュボタンは抵抗分圧されてA0に入ります。このとき、DOWNキーを押しています。

 

SDカードへはdatalog.csvファイルに書き込まれます。PCにSDカードリーダーを繋いで内容を読んでみました。

f:id:nobcha23:20210312231322j:plain

EXCELで書き込みデータを確認したら



 

 

 

‐―――――――――――――――スケッチは次―――――――――――――――
// SD RTCで時間設定、A0ポートの電圧値をADC値,電圧値として7秒ごとにSDカードにCSV形式で
// 記録するテストプログラム。SDカードのdatalog.csvに記録される。
// SDカードはSPI接続、RTCはi2cで0x68:DS1307Zを使用。表示はLCD KEYPAD基板の16字x2行
// LCDと9600bpsのシリアルポートに出力する。
// 電源ON時にRTCがアクティブでないとコンパイル時のPCの時間をRTCに設定する。
// LCD KEYPAD基板のA0にはボタンキーがつながっていて、各キー押すと電圧分圧される。
// 2021 02 15

#include <SPI.h>
#include <SD.h>

#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;

const int chipSelect = 10; // Arduino UNOでは10、Arduino MEGAでは53

#include <LiquidCrystal.h> // ―→16x2

//lcd instance for parallel IO LCD. If change to i2c, you shall replace i2c_lcd.
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7); // for LCD&key pin assign

// the digital pins that connect to the LEDs
#define redLEDpin 3
#define greenLEDpin 4


void setup(void)
{
Wire.begin();
lcd.begin(16,2); // initialize the lcd
lcd.clear();

pinMode(redLEDpin, OUTPUT);
pinMode(greenLEDpin, OUTPUT);

RTC.begin();
if(!RTC.isrunning()){
Serial.println( "RTCがRESETされています!");
lcd.setCursor(0, 0);
lcd.print("RTC had been RESET");
//次の行は、RTCをこのスケッチがコンパイルされた日時に設定します
RTC.adjust(DateTime(__DATE__,__TIME__));
}

/* ----- Setting up serial communication with PC ------ */
/* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
//何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる
}

/* ----- Initialisation of SD card ------ */
Serial.print("Initializing SD card..");
lcd.setCursor(0, 0);
delay(200);
lcd.print("Initializing SD card");
//see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
lcd.setCursor(0, 1);
lcd.print("Card failed, or no ");
// don't do anything more:
digitalWrite(redLEDpin, HIGH);
return;
}
Serial.println("card initialized. ");
lcd.setCursor(0, 2);
lcd.print("card initialized.");
digitalWrite(greenLEDpin, HIGH);
}

char current_t[20] = "";

void loop(void)
{
int ainput; //読み取ったbit数:intは整数
float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

// RTCから現在時の取得と文字列変換、シリアルポートとLCDへ出力

DateTime now = RTC.now();
sprintf(current_t,"%04d/%02d/%02d,%02d:%02d:%02d,", now.year(),now.month(), now.day(), now.hour(), now.minute(), now.second());

lcd.setCursor(0, 2);
lcd.print(current_t);

Serial.println(current_t);

/* データの読み取り */
ainput=analogRead(A0); //A0から電圧をADCデータとして読む
vinput=5000.0*ainput/1023; //上記電圧mVに変換

/* PCのシリアルモニタに表示 */
Serial.print(ainput);
Serial.print(" bit "); // bit単位
Serial.print(vinput);
Serial.println(" mV"); // mVと表示、改行する

lcd.setCursor(0,0);
lcd.print(current_t);

lcd.setCursor(0, 3);
lcd.print(ainput);
lcd.print("bit"); // bitと表示、
lcd.setCursor(7, 3);
lcd.print(vinput);
lcd.print("mV"); // mVと表示、

/* SDカードに書き込み */
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile)
{
dataFile.print(current_t);
dataFile.print(ainput);
dataFile.print(" bit,"); // bit単位
dataFile.print(vinput);
dataFile.println(" mV"); // mV単位
}
dataFile.close();

delay(5000); // 5秒待ち

lcd.setCursor(0, 3);
lcd.clear(); // 表示消す
delay(2000); // 2秒待ち
}

 

www.youtube.com