TTGO T-Cameraを開封レビュー

Twitterで見かけたESP32 WROVERとセンサー色々搭載のTTGO T-Cameraを購入してみました。(⇒Aliexpressのページ

ESP32 WROVERにカメラ、人感センサ、温度・湿度・気圧センサなどのセンサ、0.96インチのOLEDディスプレイ、I2Cでの外部拡張端子がついて、魚眼レンズタイプで17.6ドル(今はさらに下がって16.5ドル)で入手できる上に、githubでArduino環境のソースコードまで手に入ります。

梱包は比較的簡易なものでしたが、このようなポリプロピレン製のケースに入っているので、潰れて送られてくる、ということはなさそうです。

ポリプロピレンケースの中に入っていた製品はこのように帯電防止の袋に入れられて密封されていました。

開封するとこんな感じで、電池を接続するためのケーブルも添付されていました。ここにLiPoをつないで充電ができるといいのですが、そこまではまだ調べていません。

裏面はこんな感じです。

MicroUSBの端子がついているので早速適当なUSBの電源アダプタにつないでみると、こんな画面で崩れて表示されてしまいました。

この状態でも無線APとして動作していて、スマートフォンで接続でき、ブラウザで 2.2.2.1 に接続するとカメラ画像の取得などができました。

電源をPCから取ると、このように正常に表示されました。ACアダプタやモバイルバッテリーは軽負荷時にノイズが大きいので、その影響だったのだと思います。
しかし、温度表示が39.61℃と異常な値が表示されています。カメラ右下についているのがBME280だと思いますが、ESP32の自己発熱でかなり温度が上がってしまうのでしょうか??
温度がおかしいと、気圧や湿度も補正できないはずなので、残念です。

・・・と思ったら、バージョンアップ(?)により役に立たないBME280は削除されているようです。

ま、とりあえずおもちゃ入手レポートでした。(なんかおもちゃばっかりですが・・)

追伸

IPS液晶搭載の後継モデルが出ていました。人感センサとスイッチがなくなっているようですが、カラー液晶、MicroSDカードスロット搭載、BME280復活となっています。スイッチが残っていればUIとかも付けられるかな?と思うのですが、スイッチ無しなので用途がいまいち思いつかないところです。(バッテリー駆動するなら不要なときは液晶をOFFにしたいですし)

MKRVIDOR4000_graphicsの中身を見てみる

Quartus Prime LiteでMKRVIDOR4000_graphicsの中身を見てみます。

projectディレクトリの中にMKRVIDOR4000_graphics_lite.qpfがあるので、これをQuartus Prime Liteで開いてみます。

左の方のProject Navigatorのところでソースツリーっぽいところ(Entity)が見えて、ここに MKRVIDOR4000_graphics_top があるので、これをクリックすると、そのソースコードが開きました。トップレベルモジュールの verilog ソースコードのようです。端子の定義と信号の定義、出力バッファ近傍のセレクタなどがあるようです。

Project NavigatorでIP Componentsを選択し、EntityのところでMKRVIDOR4000_graphics_lite_sysをダブルクリックすると、Platform Designerが開いてIPマクロ間の接続の全体像が少しわかります。nios CPUのメモリマップもここで確認することができて、niosの命令バスはオンチップメモリとQSPIフラッシュメモリからフェッチできるようになっているようです。(SDRAM ARBITERとsdramのところを編集するとSDRAMからのアクセスもできるように修正できるっぽい雰囲気です)

上の方の再生ボタンみたいな Start Compilation をクリックすると論理合成して、配置配線、タイミング解析をしてくれます。Task のパネルに進捗が表示されて、完了すると、Entityのところに各モジュールの構造がツリー状に表示されました。このあたりをもう少し見ていくといろいろわかりそうです。

一方で、VidorBitstream-releaseディレクトリの下にipというディレクトリがあり、ここにIPコアのコードが入っているようです。各モジュールの softcore というディレクトリの下にFPGA側のniosのコードが入っています。graphicsの描画処理は ip/GFX/softcore/src/gfx.c というソースの中の gfxRpc() の中で受け取ったリモートプロシージャコールのパラメータに応じて描画関数を呼び出していました。

また、VidorBitstream-release/project/MKDVIDOR4000_graphics/build/software/launcher_lite_bspの下にsummary.html というファイルがあり、これがnios側の諸情報のようです。この中にLinkerのSectionに関する情報があり、nios側のコードもデータもbssもheapもオンチップメモリ上に配置されているようです。また、mem_init.mk というファイルによるとリセットベクターも 0x00a00000 となっているようで、これはメモリマップによればやはりオンチップメモリのようです。nios上のコードはniosとは関係なくオンチップメモリ上に転送しているのかもしれません。(FPGAのコンフィギュレーション時に書き込まれるんでしょうかね??)

まだまだ弄るといろいろわかりそうですが、時間もかかりそうです。

VidorBitstreamがビルドできるようになりました

MKRVIDOR4000_graphicsのサンプルスケッチが中途半端に表示がされる原因についてもわかりました。

中途半端に表示がされるのは、サンプルスケッチ VidorDrawLogo の冒頭にある

のFPGA側での処理が遅いことと、初期化時にそもそも白で全面クリアされていること、ARM側の処理でFPGA側の処理完了を待っていてもタイムアウトするほど遅いことが原因です。初期化時にそもそも白で全面クリアされているので、その上に処理の遅いfillRect()が同色で描画されても、画面上は何も見えません。fillRect()の処理が終わった後に描画要求が飛んでくる部分だけが見える、というわけです。

その証拠に、

と色を変えてやると、ちょっとずつ青く塗っていく処理と、その後で一部の文字が描画されるのがわかります。

というわけで、fillRect()の部分をコメントアウトすることで無事に表示されるようになりました。

まとめ

Linux Mint 19.1 上の Quartus Prime Lite Edition 18.1で MKR Vidor 4000 のFPGAのコードをビルドする場合は以下の点に注意。

  1. apply_quartus_patches.shでパッチを当てる際には、arduino_generic_quad_spi_controller2_sw.tcl に対するパッチ適用は失敗するので、手動で適用すべし。
  2. スケッチサンプルの冒頭のfillRect()はコメントアウトすべし(もしくは、色を変えた上で、Arduinoライブラリの中の VidorMailbox.cpp の冒頭のMB_TIMEOUTを大きく伸ばすべし)

おまけ

Arduino側(ARM側)のライブラリを見ていてARM側からは以下のようにFPGA側にリクエストが伝わるようです。

Vidor_GFX.cpp ⇒ VidorMailbox.cpp ⇒ VidorJTAG.cpp ⇒ jtag_host.cpp ⇒ JTAG信号線

グラフックスの関数はリモートプロシージャコール(rpc)のパラメータの配列(uint32_tの配列)に変換されて、VidorMailbox.sendCommand() が呼び出されます。パラメータはVidorJTAG.writeBuffer()の引数として渡されますが、最終的には jtag_host.cpp で1ビットずつJTAG信号としてFPGA側へ転送されます。すべてソフトウェアでJTAG信号を生成しているようなので、コマンドの転送自体が遅そうです。Mailboxへのコマンド送信後の応答待ち時間は VidorMailbox.cpp の冒頭の MB_TIMEOUT で定義されていて、5000ms=5秒になっているようです。
FPGA側の処理については調べていないのでこれからです。

VidorBitstreamがビルドできない原因を探ってみました

気を取り直して、MKRVIDOR4000_graphicsがビルドできない原因を考えてみます。

まずは改めてビルドして気になるところを洗い出してみます。

途中で

というところがあって、arduino_generic_quad_spi_controller2が絡んで致命的にだめな感じです。

~/intelFPGA_lite/18.1/ip/altera/pgm/arduino_generic_qpsi_controller2 の下でリジェクトされたパッチが2つあったのですが、そのうちの対象の一つが arduino_generic_quad_spi_controller2_sw.tcl というファイル名なので、何か関連がありそうです。リジェクトされたパッチ arduino_generic_quad_spi_controller2_sw.tcl.rej を見てみます。

この中に、

というようなところがあるので、なんか関連はありそうです。arduino_generic_quad_spi_controller2_sw.tcl の中をみても、なぜリジェクトされたのかイマイチよくわかりません(適用されても良さそうな気がする)が、とにかく手動で適用してみます。(追記: 要は、arduino_generic_quad_spi_controller2_sw.tcl というファイルの中の16行目からの10行くらいと、50行目からの11行くらいのところにある「altera_generic_quad_spi_controller2」を「arduino_generic_quad_spi_controller2」に書き換える、ということです。)

もう一つのarduino_generic_qspi_controller2_hw.tclに対して1箇所失敗している方はかなり雰囲気が違うので、まずはこのまま再トライしてみることにしてみます。

ということで、当該箇所では特にエラーなく完了しました。

・・・ということで試してみると、

4:3サイズで全面白になった後、しばらく経ってからこんな表示に。
まあ、全く動いてないわけではないので、だいぶ進歩しました^^;

VidorBitstreamをビルドしてみる

Arduino MKR VIDOR 4000のFPGA部分については、githubのvidor-librariesにいくつかサンプルがあるようです。この中の、VidorBitstreamが詳しそうな感じなのでVidorBitstreamのReadmeを読みながら作業してみます。

冒頭の部分は要約すると、「対象はFPGA開発プロセスに慣れたユーザーである」「FPGAのネイティブ開発はサポートは難しいので限定的」ということみたいです。

ディレクトリ構成は以下の通りのようです。

  • IP IPブロックのソースコード。
  • projects 各ボード用のサンプルプロジェクト。
  • constraints 各ボード用の制約ファイル。ピン配置とタイミング制約を含む。
  • TOOLS FPGAイメージを生成するためのスクリプトとツール
  • distrib コンパイル中にツールチェーンによって作成されたディレクトリ。プロジェクトをコンパイルすることによって作成されたArduinoライブラリが含まれている。

リポジトリのダウンロードと展開

まずはリポジトリをダウンロードして展開します。まず、VidorBitstreamをZIPでダウンロード。ダウンロードしたVidorBitstream-release.zipを~/intelFPGA_liteディレクトリの下に移動し、ここに展開しました。

NIOS II Command Shellの起動

NIOS II Command Shellを開いてシェルスクリプトを起動する必要がある、ということなのですが、Windows版はStartメニュー内にあるようですが、Linux版はnios2edsディレクトリ内にあるようなので、

として起動します。プロンプトは一切変わらないようなので、要注意かもしれません。
(Windows版はCygwinが起動するようですが)

QuartusのIPにパッチ適用

次に、QuartusのIPにパッチをあてます。

うーん、~/interlFPGA_line/18.1/ip/altera/pgm の下のファイルでいくつかパッチ当てに失敗してしまったようですが、このまま進めてみます。

makeCompositeBinaryのコンパイル

make_composite_binary.goをコンパイルするためにはgoが必要ですのでインストールします。

引き続いて、コンパイルします。

TOOLS/scriptsディレクトリにパスを通す、ということなのですが、どうするか考えた挙句、NIOS II Command Shellの実体であるintelFPGA_lite/18.1/nios2eds/nios2_command_shell.sh を修正して、

を179行目付近(env_var_prepend が unset される前あたり)に1行追加して対応しました。

VidorGraphicsのリポジトリダウンロードと展開

VidorGraphicsのリポジトリをZIPでダウンロードして、ダウンロードしたVidorGraphics-release.zipを~/intelFPGA_liteディレクトリの下に移動し、ここに展開しました。

VidorGraphicsのビルド

展開した VidorGraphics-release をビルドしようとしたのですが、 projects ディレクトリがありません。実際には VidorBitstream-release/project の下に、MKRVIDOR4000_graphics ディレクトリがありました。なので、先のリポジトリダウンロードも意味がなかったことになります。

で、結局、別のシェルを起動して、ビルドにトライします。

ということで、11分くらいで一応正常終了したようです。ちなみに使用したPCのスペックは、

  • Intel(R) Core(TM) i3-3220T CPU @ 2.80GHz
    (CPUファンはCeleron G530のものの方が大型で冷えそうなのでそちらを使用。実際TDPもG530の方が大きい。)
  • マザーボード ASRock H61M-ITX
  • メモリ 8GB
  • SSD Crucial CT120M500SSD1(120GB)
  • OS LinuxMint19.1 MATE 64bit

といったところです。

生成したファイルをArduino IDEに取り込む

ビルドに成功すると、VidorBitstream-release ディレクトリの下に distrib というディレクトリができて、更にその下に MKRVIDOR4000_graphics ディレクトリができていました。このディレクトリをZIPで圧縮して、MKRVIDOR4000_graphics.zip を作成します。

Arduino IDEで「スケッチ」→「ライブラリをインクルード」→「ZIP形式のライブラリをインストール」で ~/intelFPGA_lite/VidorBitstream-release/distrib/MKRVIDOR4000_graphics.zip を指定してインストールします。すると、 ~/Arduino/libraries の下に展開して取り込まれました。スケッチ例にもカスタムライブラリのスケッチ例として取り込まれました。

同様に、MKRVIDOR4000_peripheralsでもビルドしてみました。

distribの下の MKRVIDOR4000_peripherals ディレクトリをそのまま~/Arduino/libraries の下にコピーしてもライブラリとして認識されるようです。

生成したものを動かしてみる

Arduino IDE上でカスタムライブラリのスケッチ例を動かしてみました。

  • そもそも書き込みにめったに成功しない・・・・
    ⇒ HDMIケーブルを刺していると、そもそもリセットがなかなか掛からない。
  • HDMIケーブルを抜いてから書き込んでみる
    ⇒ VidorDrawLogoは全く動いてない・・・。VidorEncoderも動いている気がしない・・・。うーん。パッチ当てに失敗しているあたりが関係しているのだろうか・・??

なんか、ARM側とFPGA側の通信が全くうまく行ってない気がする。とりあえず、また明日・・・orz

Quartus Prime Lite と ModelSim Starter をインストール

昨日ダウンロードした Quartus Prime Lite Edition と ModelSim Start Edition をインストールします。といっても、やり方がわからなかったので、適当です。^^;
OSはもちろんLinuxMint19.1 MATE edition 64bitです。

ホームディレクトリにダウンロードした以下のファイルをおいてあります。

  • ModelSimSetup-18.1.0.625-linux.run
  • Quartus-lite-18.1.0.625-linux.tar
  • QuartusLiteSetup-18.1.0.625-linux.run
  • cyclone10lp-18.1.0.625.qdz

この状態で実行属性をつけて、動かしてみました。

すると、ウィザードが立ち上がり、何も考えずに勧めていくと、途中でダウンロードしたファイルをすべて検出した状態でインストールするソフトウェアをすべて表示してくれました。

さらに進めていくと、

という表示が出て、勝手に起動する模様・・・・に見えましたが、

というエラーを出して止まっていまいました。

として、インストールしたディレクトリを削除して再度トライするも、やっぱりだめ。今度は、

を実行してから、再度インストールしたディレクトリを削除してトライ。今度は

という画面が出て、フル機能版のライセンスを買うか聞いてきます。趣味・勉強の範囲なので、そんな余裕もないので、真ん中を選んで実行してみます。

という感じで、Quartus Prime Lite Edition が無事に起動しました。

しかし、デスクトップにショートカットは生成されませんでしたので、デスクトップを右クリックして「ランチャの生成」で手動でランチャを作っておきます。

  • 名前は「Quartus Prime Lite Edition」
  • コマンドは「/home/(ユーザー名)/intelFPGA_lite/18.1/quartus/bin/quartus」
  • アイコンは「intelFPGA_lite/18.1/quartus/adm/quartusii.png」

として作成しておきます。作成したものをダブルクリックすると起動することを確認しておきます。

さらに、こちらの情報によるとModelSimを動かすには、32bit用のライブラリが要るらしいので以下の手順でインストールしておきます。

MicroHDMI-HDMIケーブルを入手

昨日ポチったHDMIケーブルは無事に届きました。

こちらの記事を参考に、ブートローダの更新、VidorGraphicsライブラリの追加、スケッチ例のVidorLogoDrawの書き込みを行ったところ、接続してあるHDMIディスプレイに無事に表示がされました。

インテルFPGAプログラムに登録して、インテル® Quartus® Prime 開発ソフトウェア・ライト・エディション(ライセンス不要、無償)をダウンロードします。自分は(相変わらず)Linux版をダウンロードしました。tarアーカイブで6.2GBという巨大なものです。4MB/s程度しか出ず、時間がかかります。

ここで待っている間にシミュレータについて調べます。昔からModelSimの規模と性能の限定版があるはずなので・・・と思ったら、「ModelSim* – Intel® FPGA Starter Edition ソフトウェア」というのがあって、無償で10000ラインまでというものがあるのですが、なんとWindows版しかありません。・・・と思ったら、いろいろリンクを辿っていたら、Linux版にたどり着きました。ダウンロードページの「個別ファイル」の中にあるようです。この中から、とりあえず

  • Quartus Prime (includes Nios II EDS)
  • ModelSim-Intel FPGA Edition (includes Starter Edition)
  • Cyclone 10 LP device support

のダウンロードも仕掛けて今日は寝ます。

Arduino MKR VIDOR 4000を入手

FPGAが載っているArduinoがあるのをTwitterで知って、ついポチってしまいました。アメリカからドイツ経由で2週間強、ようやく届きました。

届いたら、箱がやや潰れてました(泣)。中身は帯電防止袋なしで、帯電防止スポンジに刺さった状態のArduino MKR VIDOR 4000がゴロッと入ってました。幸い、外観上の異常はなさそうです。

で、使い方を調べていたら、HDMIケーブルはMini HDMIじゃなくて、Micro HDMIが必要なことが判明。早速アマゾンでポチりました。

搭載しているチップは、

  • CPU Atmel ATSAMD21
  • FPGA Intel Cyclone10 10CL016YU256C8G
  • DRAM Alliance Memory AS4C4M16SA-7BCN
  • FLASH Winbond 25Q16DVN1G

のようです。CycloneがALTERAのロゴでなくなっているのは時代を感じさせられるのと、Allianceのメモリは昔痛い目にあったので大丈夫なのか不安です(笑)。

しかし、もうチップの刻印が見えない見えない(涙)。ルーペで必死に見ました。

このルーペは40年ほど前に父がドイツに出張した際に買ってきてくれたお土産です。残念ながら、自分が小さい頃だったので、こんなものに頼らなくても小さな文字までバッチリ見えたので扱いを雑にしていたため、レンズの中央部分に細かい傷がたくさんできていて、かなり見辛くなってしまっています。

レンズをよく見ると、ESCHENBACH W-GERMANY という刻印が見えます。W-GERMANYは西ドイツ製ということだと思います。(当時はまだ西ドイツと東ドイツに分かれていて、ベルリンの壁もあった時代です)

で、ESCHENBACHって何かと調べたら、メーカーの名前(ブランド)のようで、実は同じ(に見える)モデルが今では国内でも買えるようです。

Arduino IDE 1.8.8を動かしてみた

久しぶりに Arduino IDE を使ってみたくなったのでLinux Mint 18.1 LTS上にインストールしてみました。ターゲットボードはずっと前に秋月で買った ESP32-DevKitC ESP-WROOM-32開発ボード です。

インストールの手順はこちらに記載されているとおりなのですが、なにはともあれ、こちらからArduino IDE 1.8.8 Linux 64bitをダウンロードして、ホームディレクトリに展開します。

展開したディレクトリに移動して、インストールスクリプトを起動します。

これでメニュー上に追加されます。

「ファイル」→「環境設定」で環境設定画面を開きます。設定の下の方にある「追加のボードマネージャのURL」に「https://dl.espressif.com/dl/package_esp32_index.json」を入力(下記)します。

次に、「ツール」→「ボード」→「ボードマネージャ」

で「esp32 by Espressif Systems」のところにある「インストール」ボタンをクリックしてインストールします。完了すると「ツール」→「ボード」でESP32を搭載したボードが大量に出てくるので、「ESP32 Dev Module」を選択します。

次に、サンプルを動かしてみます。今回はNTPサーバーにアクセスして時刻を取得するサンプルを動かしてみました。まず、「スケッチ例」→「ESP32」→「Time」→「SimpleTime」でサンプルを開きます。開いたら、上の方にある ssid と password の部分に手近な無線LANアクセスポイントの設定を記述します。

チェックマークをクリックしてビルドすると、エラーが発生します。いろいろ調べると、python の pyserial モジュールがないために発生するようなので、インストールします。そもそも、pip も入っていなかったので、インストールしました。

ビルドが通るようになったので、書き込んでみます。

「ツール」→「シリアルポート」で /dev/ttyUSB0 を選択した後、「ツール」→「シリアルモニタ」でシリアルモニタを開き、速度を 115200bps に設定します。その後で、右矢印マークをクリックするとビルドして書き込み、実行します。

うまく行けば、NTPサーバから取ってきた時刻(UTC)が表示されるはずです。

意外にあっさりと動いてしまいました。

ESP32でNTP Clientを動かしてみた

一昨日のESP-WROOM-32(ESP32)をArduino IDEで動かしてみた続きです。

Arduino IDEにはWiFi関連のサンプルプログラムがあるので、動かしてみました。

「ファイル」⇒「スケッチ例」⇒「あらゆるボードのスケッチ例」⇒「WiFi」の下にいくつかサンプルが有りますが、こちらはESP32環境ではビルドできませんでした。Espressif社提供のライブラリとArduino IDEに初めから付いているWiFiライブラリでは完全に互換ではないようです。(確か、バージョン情報を取得するようなライブラリでコケてたような気がします)

「ファイル」⇒「スケッチ例」⇒「ESP32 Dev Module用のスケッチ例」⇒「WiFi」の下の「WiFiIPv6」というのを開いてみると、NTPクライアントプログラムのように見えますので、これを動かしてみることにします。
スケッチ例を開いて、冒頭にある

の部分にSSIDとパスワードをセットして名前を付けて保存、シリアルポートを /dev/ttyUSB* に設定した後、シリアルモニタを起動して、次に基板上のタクトスイッチを押しながら、「マイコンボードに書き込む」としてやると、ビルドと書き込みが行われます。タクトスイッチは「Writing at 0x00010000… (5 %) 」という表示が出たところで離してもOK。

書き込みが終わると、ESP-WROOM-32モジュールは勝手にリブートして起動します。

 

シリアルモニタ側には IPv6 でのステーションとしての動作、アクセスポイントとしての動作状況の表示、IPv4のステーションとしての動作状況が表示され、IPv4のIPアドレス取得ができると、その後NTPクライアントが動作している状況が表示されました。

また、同時にアクセスポイントとしても動作しているので、スマートフォンのWiFiアナライザなどのツールでみると「esp32-v6」というSSIDでのアクセスポイント動作が確認できました。