lvglのALIGN設定を確認した

TTGO T-Watch-2020で画面にいろいろ要素を足してみる時に設定するLV_ALIGN_IN_~とかLV_ALIGN_OUT_~の違いがよくわからないのでドキュメントサイトを検索してみたけど、資料が無かった…

2020/09/08 公式に追加された「Base object (lv_obj) Alignment

仕方が無いので実際に表示をして確認してみた。

縦方向: y もしくは height
横方向: x もしくは width

文字列が長くなるので「LV_ALIGN_IN_BOTTOM_RIGHT」だったら「IN_BOTTOM_RIGHT」というように「LV_ALIGN_」の部分を省略している。

LILYGO TTGO T-Watch-2020が届いたので開発環境を作って動かしてみた

LILYGO TTGOからT-Watch-2020が登場。

販売ページ「LILYGO® TTGO T-Watch-2020 ESP32 Main Chip 1.54 Inch Touch Display Programmable Wearable Environmental Interaction
資料「https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library

発売直後に注文入れたのですが、発送される前に値下がりしてたり、中継地点のシンガポールにつくまで1ヶ月以上音沙汰がなかったりと、約2ヶ月かかるとは思いませんでした。

画像
画像

中身は本体とmicroUSBケーブルだけでした。

初代T-WatchはType-Cコネクタでしたが、microUSBだとは・・・

画像

横についているボタンを押しても電源が入らなかったので、microUSBで電源供給してみたところテストプログラムが実行されました。

画像

とりあえずは問題ないようです。

では、開発環境を作って書き換えましょう。

ドキュメントとして「https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library」と「T-Watch Document」が書かれていますが、後者の記述は微妙なので無視ですね。

初期設定

(1) Arduino IDEをインストール

Arduino IDEをダウンロードしてインストール。うちの環境はWindows10なので Microsoft Storeからインストールしました。

(2) TTGO_TWatch_Library ライブラリをインストール

https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library の「Clone or download」から「Download Zip」を選択してzipファイルをダウンロード。

Arduino IDEの[スケッチ]-[ライブラリをインクルード]-[ZIP形式のライブラリをインストール]にてダウンロードしたzipファイルを指定してインストール。

追加が成功すると画面下部に以下が表示されます。

また「ドキュメント\Arduino\libraries」に「TTGO_TWatch_Library-master」が作成されます。

(3) Arduino IDE Boards Managerにespressif社のURLを登録

Arduino IDEの[ファイル]-[環境設定]の「追加ボードマネージャのURL」に「https://dl.espressif.com/dl/package_esp32_index.json」を追加する。

(3) T-Watchを選択する

Arduino IDEの[ツール]-[ボード]-[ESP32 Arduino]-[TTGO T-Watch]を選択する。(下の方に登録されている)

(4) スケッチ例からSimple Watchを呼び出す

Arduino IDEの[ファイル]-[スケッチ例]-[TTGO T-Watch]-[lvgl]-[Simple Watch]を選択する。

(5-1) Simple WatchをT-Watch-2020用に書き換える(2020/06/28以降のTWatch_Libraryの場合)

2020/06/28以降のlvgl 7.0.0対応のTWatch_Libraryの場合、SimpleWatchを選択した場合にタブで表示される「config.h」にて使用するT-Watchのバージョンを選択するようになった。
T-Watch-2020を使用する場合は、下記の様に「//define LILYGO_WATCH_2020_V1」のコメントを削除する。

// => Hardware select
// #define LILYGO_WATCH_2019_WITH_TOUCH     // To use T-Watch2019 with touchscreen, please uncomment this line
// #define LILYGO_WATCH_2019_NO_TOUCH          // To use T-Watch2019 Not touchscreen , please uncomment this line
#define LILYGO_WATCH_2020_V1             //To use T-Watch2020, please uncomment this line


// => Function select
#define LILYGO_WATCH_LVGL                   //To use LVGL, you need to enable the macro LVGL

#include <LilyGoWatch.h>

(5-2) Simple WatchをT-Watch-2020用に書き換える(2020/06/28より前のTWatch_Libraryの場合)

2020/06/28より前のTWatch_Libraryの場合、「SimpleWatch」のファイル冒頭に「// #define LILYGO_TWATCH_2020_V1 // If you are using T-Watch-2020 version, please open this macro definition」とあるように、T-Watch-2020を使う場合はここのコメントを外す必要がある。

/*
Copyright (c) 2019 lewis he
This is just a demonstration. Most of the functions are not implemented.
The main implementation is low-power standby. 
The off-screen standby (not deep sleep) current is about 4mA.
Select standard motherboard and standard backplane for testing.
Created by Lewis he on October 10, 2019.
*/

#define LILYGO_TWATCH_2020_V1        // If you are using T-Watch-2020 version, please open this macro definition

#include <TTGO.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"
<以下略>

こんな感じに書き換える。

(6) Simple Watchを日本時間対応にする

SimpleWatchの「gui.cpp」というタブ内で、時刻表示が「CST-8」と設定されているので、それを「JST-9」に書き換えます。

<略>
#include "FS.h"
#include "SD.h"

#define RTC_TIME_ZONE   "JST-9"


LV_FONT_DECLARE(Geometr);
<略>

こんな感じです。

また、「gui.cpp」ではNTPサーバの接続先も設定されています。標準は「pool.ntp.org」ですが、日本国内の「ntp.jst.mfeed.ad.jp」(INTERNET MULTIFEED運営)や「ntp.nict.jp」(NICT運営)に書き換えてください。

(7) T-Watch-2020をパソコンにつなげます

microUSBケーブルを使ってT-Watch-2020をつなげます。

USBシリアルCP2104用のドライバがインストールされていない場合は https://t-watch-document-en.readthedocs.io/en/latest/download/index.htmlCP2104の公式ページなどからSilicon Labs Virtual COM Port (VCP) Universal Driverを入手してインストールします。

(8) T-Watch-2020が接続されたCOMポートを指定します。

Arduino IDEの[ツール]-[シリアルポート]にてCOMポートを指定します。

Arduino IDEの[ツール]-[Upload Speed]は「1152000」と指定しています。この速度はT-Watchのサンプルコードのシリアル入出力で見かける速度指定なので使っています。

それ以外の項目は特に変えていません。

ちなみに「PortPop」というアプリをインストールしておくと、デバイスをつなぎWindows上でCOMポートとして認識した時点で、何番として認識されたのかを教えてくれるので便利です。

(9) コンパイルと書き込み

Arduino IDEの[スケッチ]-[マイコンボードに書き込み]を選択して、コンパイルと書き込みを実行します。

(10) 完成

WiFiをスキャンしてSSID一覧を作り、そこから接続先を選択し、キーを入力することで、ネットワークに接続し、NTPサーバから時刻同期を行う、ということが可能となりました。

画像
画像
画像

Simple Watchの操作は「画面タッチ」です。横の丸ボタンは画面ON/OFFのみのようです。

また、WiFi以外に「Settings」「SDcard」「Camera」などのメニューがありますが、現状未実装です。押しても何も発生しません。

次に作るものは、と製品紹介ページに載っている下記画像を実現できるソースコードを探してみたところ・・・

画像

LilyGoGui」でした。

画像

が・・・時間が変わらないのでおかしいな、とソースを見てみると、画面表示のサンプルなだけで、全てが固定表示だったという・・・

そっか・・・時計実装は自前でやらなきゃならないのか・・・

TTGO T-Watch用開発環境の作り方2020年3月版

最初に入手したときと作成手法が変わっていたのでメモ書き

(1) Arduino IDEをインストール

Windowsの場合、Microsoft StoreからArduino IDEをインストールする。

(2)githubのTTGO_TWatch_LibraryをArduino IDEに組み込む

githubの https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library にて「Download ZIP」を行い、T-Wach用ライブラリzipをダウンロード。

次にArduino IDEを起動して、「スケッチ」-「ライブラリをインクルード」-[.ZIP形式のライブラリをインストール」を選択し、ダウンロードしたT-Watch用ライブラリzipを読み込む。

この結果、「スケッチ」-「ライブラリをインクルード」を開くと下の方にある「提供されたライブラリ」の下に「TTGO T-Watch」が追加される。

(3)Ardbuino IDEのボードマネージャにESP32を追加

Installation instructions using Arduino IDE Boards Manager」に書いてあるとおりだけど、「ファイル」-「環境設定」を開き、「追加のボードマネージャのURL」に「 https://dl.espressif.com/dl/package_esp32_index.json 」を追加します。

なお、既にURLが書かれている場合は「,」で区切ることで複数のURLを記述できます。

追加した後は「ツール」-「ボード」-「ボードマネージャ」を選択し、検索欄に「esp32」と入力すると、「esp32 by Espressif SYstems」というのが登場しますので、それをインストールします。

(4) ボードでTTGO T-Watchを選択する

「ツール」-「ボード」から「TTGO T-Watch」を選択する。

時々話題に上がるOSのメモ(AliOS,Harmony,webOS,Tizen,KaiOS) 2021/11/25

HuaweiのHarmonyOS関連をおっていたら、中国におけるIoT向け開発する場合のサイト一覧みたいなものを発見したので、その情報を追加しつつ、全体的に情報更新を実施。

中国のIoT向けサイト一覧 https://gitee.com/zhengnianli/EmbedSummary

ただ、Huawei系の人なようで、AliOSに関する記載がなかったりしている。

AliOS系統

AliOS

元々はalibabaがAndroid(AOSP)をベースにカスタマイズしたOS。「Yun OS」「Aliyun OS」といった呼び方をされていた時期もある。

公式ページ: AliOS

基本的にはGapps(Google Play Storeなど)が入っておらず、代わりにalibaba系でやってるサービスやストアが導入されている中国向けのAndroidといった感じのものになっている。

AliOS Things

AliOSのIoT向けとして作成されているOS。AliOSといってもAndroidベースではない。

公式ページ: AliOS Things
github: https://github.com/alibaba/AliOS-Things

IoT向けということで、ESP32とか、RISC-Vを使ったC-Sky SoCとかもサポートしている。

Huawei系統

LiteOS

Narrow Band IoT(NB-IoT)など向けにHuaweiが開発していたOS。これが、OpenHarmonyに発展した。

てっきり、全面OpenHarmonyに移行なのかと思ったら、2021年11月現在も更新は続いている。

公式: Huawei LiteOS(英語) / 轻量级操作系统 LiteOS(中国語)
github: https://github.com/LiteOS/LiteOS

以前は動作対象ボード一覧があったのだが発見出来ず。

HarmonyOS

「鴻蒙 OS( HongMeng OS)」とも呼ばれることがある。LiteOSはIoT向けのみだったが、その適用範囲を大幅に広げ、スマートフォンも対象に含むようだ。

最初はgithubで公開されていたがhuawei排除の波におされgiteeというサイトに移動した。

HarmonyOS 公式
HarmonyOS開発者向けサイト

ただ、Androidアプリも動くスマホなど向けのものと、IoT向けのものの区別がよく分からない。

GoogleのAndroidとAOSPみたな関係で、HarmonyOSとOpenHarmony があるようで、giteeでソースが公開されている。

gitee: https://openharmony.gitee.com/openharmony or https://gitee.com/openharmony

OpenHarmonyリリースノートからSIG_DevBoardという開発者向け基板に関する情報を見てみると、Android向けのメーカ名だけではなく、espressifなどのIoT向けのメーカ名も入っている。

いまいちここらへんの区切りがどうなっているのかよくわからない

HuaweiではARKという、AndroidでいうとART(Android Run Time)みたいなものを作成しているようで、「方舟编译器(Open Ark compiler)」というページで関連資料が公開されている。

昔からのやつら

Tizen

Samsungが開発している自社向けOS。2020/10/27にTizen 6.0がリリースされていたりしている。

Android代替のTizen Mobileということで始まっているので、スマホやタブレットでTizen OS搭載のものがリリースされたりしているが、あまり売れていないようだ。
TV向けのTizen TVやWearデバイス向けTizen Wearなどは出ている。

Tizen Wearについては2021年6月にGoogleのWear OSとの統合が発表された。(グーグルとサムスン、「Wear OS」「Tizen」を統合)

いままでAndroidベースだったWear OS by Googleを、省電力なTizenベースで構築し、その上にGoogle基盤を載せるという方向転換が行われている。

公式ページ: Tizen
ソースコード: Tizen Source

Tizen RT」というCortex-M/R SoC向けのバリエーションもあるようだが、こちらは2017/5のTizen RT 1.0以降更新がないようだ。

webOS

現在はLGが主体となって開発しているpalm webOS。
LG社のTV向けOSとして現在も開発は続けられている。(最新のwebOS TV SDK v6.0.1のリリースが2021/8で、webOS OSE v2.13.2は2021/10)

公式ページ: webOS TV Developer
オープンソースサイト: webOS Open Source Edition

ラズパイ4がwebOS OpenSource Editionの公式デバイスとして掲載されている。

kaiOS

Firefox OSのB2G部分をベースに開発が続けられているモバイル向けOS。
インドのJio社やNOKIAのフィーチャーフォンで使われており、昨日も新しいデバイスが発表されたりしている。

公式ページ: KaiOS tech
開発者向け: KaiOS Developer
github: https://github.com/kaiostech

元々はFirefox version 59をベースに開発を進めていたが、2020年のMozillaと提携して、更新を行っているようだが、それを反映したKaiOSは2021年11月時点でも製品に搭載されていない模様。

mozilla wikiにも「KaiOS」というページが出来て、構築手法の紹介がされている。

Arduino/ESP32/TTGO T-WatchのシステムクロックとRTC周りのメモ 2019/07/02

TTGO T-watchの腕時計の時刻表示がおかしいので調べていったことのメモ

・T-Watchでは画面オフ時にシステムクロックが止まる

T-watchでは左側の端っこボタンを押すと画面がオフになる。

この処理は、power_handle関数内の「LVGL_POWER_IRQ」イベントの「axp.isPEKShortPressIRQ()」( 左側の端っこボタン =PEKキー)で行われている。

オフ時に「rtc_clk_cpu_freq_set(RTC_CPU_FREQ_2M)」を実行して、CPU周波数を落としている(240M→2M)

これによりOS内のシステムクロックの進みも劇的に遅くなって、ほぼ止まっているように見える。

このことがあるので、T-Watchのソフトウェアでは、システムクロックからではなく、RTC上の時計から時刻を取得しているようだった。

・システムクロックの設定方法はsettimeofday(UNIX)

Arduino/ESP32環境でシステムクロックを簡単に設定する手法はNTPからの時刻を取得して、システムクロックを適用する、というもの。

    struct tm timeinfo;
    bool ret = false;
    int retry = 0;
    configTzTime("JST-9", "pool.ntp.org");
    do {
        ret = getLocalTime(&timeinfo);
        if (!ret) {
            Serial.printf("get ntp fail,retry : %d \n", retry++);
        }
    } while (!ret && retry < 3);

また、システムクロックをRTCに反映するのも簡単。(以下は、RTCモジュールがPCF8563の場合に使うPCF8563_Libraryの場合)

        rtc.setDateTime(timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);

しかし、逆にRTCからシステムクロックに対して時刻を反映させる手法がよく分からない。

RTCモジュールがDS1307RTCの場合の事例があるので Michael MargolisさんによるTimeモジュールを使ってみたが、時刻設定はできなかった。

void syncSystemTimeByRtc()
{
    Serial.print("Read RTC :");
    Serial.println(rtc.formatDateTime(PCF_TIMEFORMAT_YYYY_MM_DD_H_M_S));
    struct tm dt;
    getLocalTime(&dt);
    Serial.printf("getLocalTime is %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
    RTC_Date d = rtc.getDateTime();
    Serial.printf("  %d,%d,%d,%d,%d,%d\n",d.hour,d.minute,d.second,d.day,d.month,d.year);
    setTime(d.hour,d.minute,d.second,d.day,d.month,d.year);
    Serial.println(timeStatus());
    getLocalTime(&dt);
    Serial.printf("getLocalTime override RTC clock, %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
   
}

上記のデバグコードをいれて、画面オフ→オンイベントを起こしてみると、

10:16:18.034 -> LVGL_POWER_IRQ event
10:16:18.034 -> 
10:16:18.034 -> PEKShortPressIRQ to off
10:31:15.803 -> PEKShortPressIRQ to on
10:31:15.803 -> bma423_disable:0
10:31:15.803 -> Read RTC :2019-7-2/10:31:15
10:31:15.835 -> getLocalTime is 10:16:9
10:31:15.835 ->   10,31,15,2,7,2019
10:31:15.835 -> 2
10:31:15.835 -> getLocalTime override RTC clock, 10:16:9
10:31:24.715 -> RTC time is 2019-7-2/10:31:24
10:31:24.715 -> getLocalTime is 10:16:17

時刻が設定されていない・・・

UNIXだとどうやってシステムクロック設定できたかな?と調べて見たらsettimeofdayでunixtimeを指定する、ということが判明

#include <time.h>    // requried for settimeofday 
#include <sys/time.h>// requried for timeval

上記を冒頭に追加した上で、以下を書いた。

void syncSystemTimeByRtc()
{
    Serial.print("Read RTC :");
    Serial.println(rtc.formatDateTime(PCF_TIMEFORMAT_YYYY_MM_DD_H_M_S));
    struct tm dt;
    getLocalTime(&dt);
    Serial.printf("getLocalTime is %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
    RTC_Date d = rtc.getDateTime();
    Serial.printf("  %d,%d,%d,%d,%d,%d\n",d.hour,d.minute,d.second,d.day,d.month,d.year);
    dt.tm_hour = d.hour;
    dt.tm_min  = d.minute;
    dt.tm_sec  = d.second;
    dt.tm_mday  = d.day;
    dt.tm_mon = d.month-1;
    dt.tm_year = d.year-1900; 
    time_t timertc = mktime(&dt);
    Serial.print("RTC unixtime is ");
    Serial.print(timertc);
    Serial.print(" ,system unixtime is ");
    time_t timesys = time(NULL);
    Serial.println(timesys);
    struct timeval tv ={
      .tv_sec = timertc
    };
    settimeofday(&tv,NULL);
    
    getLocalTime(&dt);
    Serial.printf("getLocalTime override RTC clock, %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
   
}

これで期待通りにRTCの時刻をシステムクロックに反映することができるようになった。

13:23:48.103 -> PEKShortPressIRQ to on
13:23:48.103 -> bma423_disable:0
13:23:48.103 -> Read RTC :2019-7-2/13:23:47
13:23:48.103 -> getLocalTime is 13:17:30
13:23:48.103 ->   13,23,47,2,7,2019
13:23:48.103 -> RTC unixtime is 1562041427 ,system unixtime is 1562041050
13:23:48.103 -> getLocalTime override RTC clock, 13:23:47
13:23:57.121 -> RTC time is 2019-7-2/13:23:56
13:23:57.121 -> getLocalTime is 13:23:56

・rtc_cpu_freq_setは非推奨

コンパイル中に以下の警告が・・・

C:\Users\osakanataro\Documents\Arduino\TTGO-T-Watch-mod\TTGO-T-Watch-mod.ino:328:17: warning: 'void rtc_clk_cpu_freq_set(rtc_cpu_freq_t)' is deprecated [-Wdeprecated-declarations]

                 rtc_clk_cpu_freq_set(RTC_CPU_FREQ_240M);

https://github.com/espressif/arduino-esp32/blob/master/tools/sdk/include/soc/soc/rtc.h 」を確認したところ、「 rtc_clk_cpu_freq_config_set 」に置き換わった、とある。

・・・あるんだけど、 rtc_clk_cpu_freq_config_set に関する資料がでてこないってどういうこと???

grepしても定義無いし、試しに置き換えてみても定義されてない、というエラーになった。