初めに
presenseの大きな特徴として、マルチコアという点があります。
このマルチコアの各コアごとに、センサーを高速で読み出しかつ信号処理などを独立して実装するとPortability や Modifiability がかなり向上するかと思います。
ただ、その場合、それらのセンサーのデータが同期できないという問題が発生しますが、これは、RTCを使うことで解決できるのでその方法を書いておきます。
ブログ(元ネタ)
この記事は、以下のブログに過去に投稿したもののまとめです。
SpresenseのRTCライブラリ
RTC(Real Time Clock)とはリアルタイムクロックの略称で、SpresenseにはすべてのCoreから読み出せるRTCがあります。
RTCの使い方に関しては、こちらにライブラリの説明があるのでわかりやすいです。
使い方
MainCoreの中で、起動時にRTCを設定します。
#include <RTC.h>
void setup()
{
// Initialize RTC at first
RTC.begin();
// Set the temporary RTC time
RtcTime compiledDateTime(__DATE__, __TIME__);
RTC.setTime(compiledDateTime);
このように設定したRTCは、SubCore側で以下のように読み出すことができます。
#include <RTC.h>
void printClock(RtcTime &rtc)
{
printf("%04d/%02d/%02d %02d:%02d:%02d:%08ld\n",
rtc.year(), rtc.month(), rtc.day(),
rtc.hour(), rtc.minute(), rtc.second(),rtc.nsec());
}
void setup()
{
int ret = 0;
ret = MP.begin();
if (ret < 0) {
errorLoop(2);
}
// Initialize RTC at first
RTC.begin();
}
void loop()
{
RtcTime now = RTC.getTime();
printClock(now);
}
このようにRTCを取得し、この時刻をセンサーデータに付与するとで、
各データを同期させることが可能になります!
サンプルコード
SubCore1でアナログのデータを、SubCore2でI2Cセンサーのデータを非同期に取得し、それぞれにRTCのタイムスタンプをつけて、MainCoreに渡すサンプルです。
分、秒、ミリ秒までの時間を付与しています。