BluePillボードのいい感じの端子配置図

http://reblag.dk というサイトの http://reblag.dk/stm32 の中にいい感じのBluePillボードの端子図があったので、自分のメモ用に転載しておきます。ライセンスは CC BY-SA となっています。とても綺麗で見やすい。

上記は画像にして貼ってありますが、オリジナルのPDFファイルは下記。

回路図の方はあちこちに同じものが載ってるのだけど、見やすいものは これ(https://freeelectron.ro/bare-metal-stm32-led-blink/blue-pill-schematic/)かなぁ?URLは書いてあるのだけど、そこを探しても同じものは見つからない。
他に、PDFファイルへのリンクがあるページはこれ(https://github.com/ruiqimao/keyboard-pcb-guide/issues/17)かなぁ。

Seeeduino Xiaoを使ってみる

秋月で580円で売っていたSeeeduino Xiaoを動かしてみます。用途は特に決めていませんが、この小ささと価格ならインタフェースとして埋め込んでもいいと思って買ってみました。

まずは、Arduinoで使えるようにします。お決まりの「環境設定」⇒「追加のボードマネージャのURL」で、ボードマネージャに以下を追加します。

https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

追加したら、「ツール」⇒「ボードマネージャ」で「Seeed SAMD Boards」を探して、「インストール」をクリックしてインストール。試しに使ったマシンのスペックがショボかったので、インストールに結構時間がかかりました。インストールが完了したら、ボードとして「Seeeduino XIAO」を選択します。ボードを選択したら、とりあえずサンプルスケッチとしてBlinkを選んでみます。ビルドも問題なく成功したので、シリアルポートにttyACM0を選んで書き込んでみました。

・・・が、書き込みは一瞬で完了。見た目は何も変わりません。もともと書き込まれているのが2秒周期のBlinkなので区別が付かないためです。そこでソースコードのdelay()の値を変えて再度書き込んだら無事に変化があり、ちゃんとコンパイルされたものが書き込まれていることが確認できました。とても小さくて安価ですし、Flashへの書き込みが爆速なのと、書き込み時にスイッチ操作などは要らないのでこれはいいかもしれません。I2CやSPI、UARTもあるので、最近のデバイスをちょっと動かしてみるには便利なんじゃないかと。

参考URL:
https://wiki.seeedstudio.com/Seeeduino-XIAO/

nslookup,digの使い方メモ

いつもnslookupやdigの使い方を調べてる気がするので、メモを作ります。

nslookup

nslookupのよくある使い方

$ nslookup [ドメイン名] -[DNSサーバ]ドメイン名とDNSサーバを指定して検索する
$ nslookup対話モードに入る(以下、対話モード)
> server DNSサーバDNSサーバを指定する
> ホスト名検索を行う

dig

digのよくある使い方

$ dig ドメイン名基本的な使い方
$ dig -x IPアドレスIPアドレスからの逆引き
$ dig ANY ドメイン名すべてのレコードを出力する
$ dig ドメイン名 +short
$ dig -x IPアドレス +short
IPアドレス、ホスト名のみを返す。シェルなどで使う。
例)
$ echo 'dig google.com +short'
172.217.161.78
$ dig @DNSサーバ ドメイン名使用するDNSサーバを指定する。
例) $ dig @8.8.8.8 example.com
$ dig ドメイン名 +norecDNSサーバで保持しているキャッシュのみで問い合わせを行う。
$ dig ドメイン名 +traceルートDNSから順に調べる

LinuxでUARTターミナルプログラムを使う

LinuxのUARTのターミナルプログラムといえば、minicomかscreenだと思います。しかし、どちらもいまいち欠点があります。minicomはエスケープシーケンスがターミナルと一致してないのか、画面が崩れます。screenの方はウインドウのスクロールバーが使えなくなります。

CuteComを使ってみる

で、なにかないか試してみたのがcutecomです。

インストールはsynapticからでもaptからでもいいと思います。インストールが成功すると、メニューのシステムツールの中にCuteComが出てきます。実行すると、通信パラメータの設定もGUIでできます。

・・・が、結論から言うと、ダメでした・・・。1行分の入力をしてから送信なので、補完機能のあるシェルが相手だとかえって効率が落ちるのでした。

gtktermを使ってみる

インストールはaptでgtktermをインストールすればOK。インストールすると、メニューの「アクセサリ」の中に「Serial port terminal」というのが出てくるので、これで起動できる。補完機能のあるシェルでも問題なく利用できそう。これを使っていくことにします。

TinyYOLO2でのオブジェクト検出

MaixPy M1 Dockでのデバッグ環境が一応整ったので、こちらの記事にあるオブジェクト検出にトライしてみます。

リンク先にあるmaixpy_20class.zip をダウンロードしてきて、kflash_guiで20class.kmodelを0x500000を指定してダウンロードします。

ダウンロードを開始すると次のような感じになります。

ダウンロード完了後、MaixPy IDEを起動して、20class.pyを開いて動かすとオブジェクト検出ができました。

MAiX M1 Dockで試してみる

IDE上に画面が表示されなかったM1nですが、M1 Dockでも動くようなのでこちらを試してみます。

ファームウェアのアップデート

手持ちのM1 Dockはファームのバージョンが古いので、更新する必要があります。ファームはhttps://dl.sipeed.com/MAIX/MaixPy/release/master/から最新と思われる「maixpy_v0.5.1_124_ga3f708c」をダウンロードしてきました。

アップデートを行う環境は、python3の仮想環境を作ってその中に構築して、バージョンアップを行います。

~$ mkdir python3
~$ cd python3/
~/python3$ sudo apt install python3-venv
~/python3$ python3 -m venv maixpy
~/python3$ cd maixpy/
~/python3/maixpy$ source bin/activate 
(maixpy) ~/python3/maixpy$ pip3 install --upgrade pip
(maixpy) ~/python3/maixpy$ pip3 install pyserial
(maixpy) ~/python3/maixpy$ sudo apt install git
(maixpy) ~/python3/maixpy$ git clone https://github.com/sipeed/kflash.py.git kflash
(maixpy) ~/python3/maixpy$ cd kflash/
(maixpy) ~/python3/maixpy/kflash$ python3 ./kflash.py -p /dev/ttyUSB0 -b115200 maixpy_v0.5.1_124_ga3f708c.bin 
[INFO] COM Port Selected Manually:  /dev/ttyUSB0 
[INFO] Default baudrate is 115200 , later it may be changed to the value you set. 
[INFO] Trying to Enter the ISP Mode... 
._
[INFO] Automatically detected goE/kd233 

[INFO] Greeting Message Detected, Start Downloading ISP 
Downloading ISP: |===================================================================================================================| 100.0% 10kiB/s
[INFO] Booting From 0x80000000 
[INFO] Wait For 0.1 second for ISP to Boot 
[INFO] Boot to Flashmode Successfully 
[INFO] Selected Flash:  On-Board 
[INFO] Initialization flash Successfully 
Programming BIN: |===================================================================================================================| 100.0% 10kiB/s
[INFO] Rebooting... 
(maixpy) ~/python3/maixpy/kflash$ 

バージョンアップ完了後、MaixPy IDEを起動してサンプルを動かすと、無事に動作しました。

なお、モデルは、

$ wget https://github.com/sipeed/MaixPy/releases/download/v0.3.2/face_model_at_0x300000.kfpkg

でダウンロードしてきましたが、ここでは使いませんでした。

kflash GUI版

kflashはGUI版があるようです。
https://github.com/sipeed/kflash_gui

以下のようにしてきてダウンロードして起動します。

(maixpy) ~/python3/maixpy$ git clone  --recursive https://github.com/sipeed/kflash_gui.git
Cloning into 'kflash_gui'...
Submodule 'kflash_py' (https://github.com/sipeed/kflash.py.git) registered for path 'kflash_py'
(maixpy) ~/python3/maixpy$ cd kflash_gui/
(maixpy) ~/python3/maixpy/kflash_gui$ pip3 install -r requirements.txt
(maixpy) ~/python3/maixpy/kflash_gui$ python3 kflash_gui.py 
icon path:/home/xxxxxxxx/python3/maixpy/kflash_gui/kflash_gui_data/assets/logo.png
config file path: /home/xxxxxxxx/.config/kflash_gui/kflash_gui.conf
data path:/home/xxxxxxxx/python3/maixpy/kflash_gui/kflash_gui_data
2
The latest is v1.6.5, now:V1.6.5

MAiX M1nを試してみる

秋月で買って積みボードになっていたMAiX M1n nanoを試してみます。秋月に新商品として出ているのを見て、こちらの動画を見て買ってみたものの、そのまま積みボードになっていました。

MaixPy IDEのインストール

こちらのページを見てMaixPy IDEをインストールしますが、まず、readme.txtをみると、

1. Firmware MUST >= 0.4.0_44 !!!!!
   Firmware MUST >= 0.4.0_44 !!!!!
   Firmware MUST >= 0.4.0_44 !!!!!

    Download firmware from here:  
        ------------------------------------------------------------------------------------------------------------
            http://dl.sipeed.com/MAIX/MaixPy/release/
            http://dl.sipeed.com/MAIX/MaixPy/release/master ( auto build from master branch (development commits, may not stable) )
        ------------------------------------------------------------------------------------------------------------

ということで、ファームウェアバージョンは0.4.0_44以上じゃないとダメということです。たぶん、MicroPythonのバージョンだと思うのですが、確認するとv0.5.0でした。なので、そのまま進めます。
で、IDEの方をダウンロードしようとしたところ、いきなりダウンロードで引っかかってしまいました。理由はいまいちわかりませんが、wgetで引っ張ってきたらダウンロードできました。

$ wget http://dl.cdn.sipeed.com/maixpy-ide-linux-x86_64-0.2.5.run
--2020-10-11 23:29:08--  http://dl.cdn.sipeed.com/maixpy-ide-linux-x86_64-0.2.5.run
dl.cdn.sipeed.com (dl.cdn.sipeed.com) をDNSに問いあわせています... 47.89.66.145
dl.cdn.sipeed.com (dl.cdn.sipeed.com)|47.89.66.145|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 85063710 (81M) [application/x-executable]
`maixpy-ide-linux-x86_64-0.2.5.run' に保存中

maixpy-ide-linux-x86_64-0.2.5.run     100%[=======================================================================>]  81.12M  8.30MB/s    in 12s     

2020-10-11 23:29:25 (6.58 MB/s) - `maixpy-ide-linux-x86_64-0.2.5.run' へ保存完了 [85063710/85063710]

$ sha256sum maixpy-ide-linux-x86_64-0.2.5.run 
2641082c56105a7c33b2abc319b3b76fc022601e234b4f6379edd90c62a6a5c2  maixpy-ide-linux-x86_64-0.2.5.run
$ chmod +x maixpy-ide-linux-x86_64-0.2.5.run
$ ./maixpy-ide-linux-x86_64-0.2.5.run 

チェックサムもreadme.txtと一致して問題ないようなので、実行属性をつけてインストーラを実行します。実行すると、MaixPy IDE 設定ウィザードが起動します。(日本語で表示されました)

インストール先ディレクトリの指定、使用許諾への合意、インストールの順に進みます。インストールはすぐに終了します。

メニューに追加されたMaixPy IDEを起動すると、サンプルプログラムを読み込んだ状態になります。

左下にある緑色のチェーンのアイコンをクリックすると、MaixPyと接続するためのシリアルポートを聞いてきますので、ttyUSB0などを適切に指定します。しばらくすると、下の方にファームウェアバージョンなどが表示されて、チェーンのアイコンが赤くなります(クリックすると切断できます)。で、その下の再生ボタンをクリックすると、コードを実行するようで、FPS表示が出ます。

一方で、切断した状態で、「ツール」→「ターミナルを開く」→「新ターミナル」でポートとしてシリアルポートを選択すると、シリアルコンソールが開きます。で、ターミナル側の再生ボタンを押すと、RPELでコードを実行するようです。

冒頭の動画では、シリアルコンソールの右上部分にカメラ画像が表示されるのですが、残念ながら表示されませんでした。ぐぐってみると、PC側のUSBコントローラによって出たり出なかったりがあるようです。USB2.0のオンボードホストでは動作はするけど画像は出ない。USB3.0のHUBの先だとそもそも全く認識しませんでした。

おまけ

いろいろ調べている中で興味深いな、と思ったのが、K210のベンダーであるCanaanについての記事がいろいろあるこちらのページです。

PCに外付けHDDを増設

いま使っているメインのPCにHDDを外付け増設しました。

目的は、新規のLinuxMint環境立ち上げです。

今回はディスクの負荷がかかりそうでSSDにしたかったので、USBメモリ起動ではなく、eSATAの外付けHDD起動にしました。(eSATAなのは使っているマザーボードが古いからです。これでも自宅最速で、Core i5-3570K + 16GBという古さなのでw)

で、すでに内蔵でSSDが2台(Windows用とLinux用)が入っていますが、これらには干渉させたくありません。危険なのはgrub関連です。初期のインストールはディスクなしの別のPCで行うとして、その後のアップデート時が危険です。ですので、起動したら、他のディスクが見えなくなるように工夫します。

1.インストール

インストールUSBを作成して、インストール対象とは異なる別のPC(ターゲットのPCは棚に組み込んでいて、中を開けるのが大変なので)にインストール先のSSDだけを接続して、インストールしました。
この辺は特に変わった手順はないので、問題ありません。
インストール完了後、各アップデートをかけておきます。

2.grub設定

インストール対象とは異なる別のPCに接続したまま、grubの設定を行います。/etc/default/grubを開いて、GRUB_CMDLINE_LINUX_DEFAULTの行を編集します。

GRUB_CMDLINE_LINUX_DEFAULT="libata.force=1:disable,2:disable,6:1.5Gbps"

パラメータを上記のようにしましたが、これらは最終的なターゲットPCに合わせて設定します。
それぞれ番号がついていますが、BIOSでついている番号とは一つずれていました(BIOSは’0’オリジン、Linuxカーネルでは’1’オリジン)。1,2はそれぞれWindowsとLinuxの内蔵SSDで、これらは禁止しておきます。6は今回の外付けSSDでリンク速度を1.5Gbpsに落としておきます。

これで、update-grubをかけます。

3.ターゲットPCで起動

update-grubをかけたらシャットダウンして、SSDをターゲットPCに移動して起動して問題ないことを確認します。

あと、いつもの時計が狂うのを治すために、

~$ timedatectl set-local-rtc true
~$ timedatectl status
               Local time: 土 2020-10-10 13:49:11 JST
           Universal time: 土 2020-10-10 04:49:11 UTC
                 RTC time: 土 2020-10-10 13:49:12    
                Time zone: Asia/Tokyo (JST, +0900)   
System clock synchronized: yes                       
              NTP service: n/a                       
          RTC in local TZ: yes                       

Warning: The system is configured to read the RTC time in the local time zone.
         This mode cannot be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
~$ 

として、RTC timeをJSTに設定しておきます。

4.余談

Core i5-3570Kなので、だいぶ古いのですが、特に大きな不満はないんです。4コア4スレッドですが、Linuxがメインなので、シングルスレッドがそこそこ出ていればいいかなぁ、と。新しいCPUのベンチマークを見たりもしていますが、シングルスレッドだとそんなに劇的には変わらない。
あ、でも、なにかビルドするときはマルチスレッド性能が高いとうれしいかも。Ryzenで1台組んだら幸せになれるかな?(RyzenとLinuxの相性?ってどうなんだろう?)

CPUPassMark
Single CPU
PassMark
Single Thread
Ryzen 5 36006C12T178532583
Ryzen 3 31004C8T117652441
Core i5-3570K4C4T@3.4GHz49292046
Core i3-32202C4T@3.3GHz21961749
Core i3-21202C4T@3.3GHz19051522
Athlon 5350 APU4C4T@2.05GHz1828710
Core i3-2120T2C4T@2.6GHz14621116
Core2 Quad Q66004C4T@2.4GHz1757953
Core2 Duo E74002C2T@2.8GHz9631083
Ryzenは「今、組むとしたらこの辺のかなぁ?」というもの。Core i3はどれだか忘れちゃったので、それっぽいものを全部載せた。Athlonは普段のWeb検索用。Core2はWindows10をクリーンインストールし直してあって、インストール手順などの確認用。

WebARENAでUbuntuサーバを立てる(5)

WebARENAで運用しているプライベートなサーバ(といっても、今はMQTTで取得したいろんなセンサーの値をグラフ表示しているだけ)ですが、本日、突然、センサーのESP8266/ESP32の各機器がサーバ(MQTT broker)に接続できなくなりました。OLEDディスプレイを持っているものに表示をさせていたので、その旨わかったのですが、他の各機器も全滅しました。Nginx+Flaskで構成している表示系もその時刻でピタッとデータの表示が止まりました(データが来ないのだから当たり前)。

で、どうしようかなー、と思ってWebARENAにログインしてみると、Ubuntu20.04にアップグレードできるよ、という表示が出ていました。どうしよっかなー、と思ったのですが、どうせアップグレードしなくてはならないのだから、ということで、先にアップデートしてしまいました。

$sudo apt-get update
$sudo apt-get upgrade
$sudo reboot
$sudo do-release-upgrade

としても、「アップグレードを全部適用してからやれ」と却下されます。

$ sudo apt-get upgrade
$ sudo apt upgrade
$ sudo do-release-upgrade

として、apt でアップグレードを実行してからだとOKになります。(実際に適用されるものもあります)
apt-get と apt で何が違うのかわかりませんが、とにかく、なんとか Ubuntu 20.02 にアップグレードできました。

・・・が、もちろん、回復はしていません。systemctl で見てみると、Flask 周りが全滅っぽいです。

$ python3 -V
Python 3.8.2

ということで、Python3 のバージョンは3.8系になっていました。pip3は入っているようなので、

$ sudo pip3 install --upgrade pip
$ sudo pip3 install paho-mqtt Flask uwsgi Flask-HTTPAuth

として必要なものをインストールしてから、

$ sudo systemctl restart uwsgi.service
$ sudo systemctl restart bme280.service
$ sudo systemctl restart css811.service
$ sudo systemctl restart mhz19b.service
$ sudo systemctl restart app.service

として関連サービスを再起動します。これで、ESP32を使っているものは復活しました。(これはこれでいまいちわからないところですが、趣味サーバなのでこれ以上の追求はしないことにします)

しかし、ESP8266で動作しているものが復活しません。Arduinoのログで見ると、どうもMQTTで接続する際のfingerprintのチェックでコケているようです。ホストのfingerprintを

$ openssl s_client -connect example.com:8883 < /dev/null 2>/dev/null | openssl x509 -fingerprint -noout -in /dev/stdin

として採取し直してやると、確かに違う値になっていました。つまり、サーバ側の公開鍵が変わったことを意味する・・・はずです。で、思い当たることといえば、WiFiClientSecureで使うLet’s Encryptの鍵の更新が起こったのではないか、ということです。そこで、 /var/log/letsencrypt/letsencrypt.logを見てみたところ、

2020-10-02 08:xx:xx,xxx:INFO:certbot.main:Renewing an existing certificate

という行を含む大量のログがあり、確かに証明書の更新がかかっていました。

とりあえず、各ESP8266側のArduinoのソースコードの fingerprint を更新してやると、データが送信できるようになりました。しかし、このままだとまた2ヶ月後くらいに同じ現象が発生します。簡単な対策はfingerprintのチェックをやめることなのですが、MQTT brokerのセキュリティをfingerprintのチェック+ユーザー名/パスワードとしているので、DNSをごまかされるとユーザー名とパスワードがバレてしまいます。大したデータを流しているわけではないのですが、抜かれたユーザー名とパスワードでMQTT brokerに接続されると、あまりよろしくありません。

さて、どうしたものでしょう。

一方で、ESP32の方は、証明書の更新がかかったのに大丈夫なのか?という疑問が残りました。

が、ここでESP32に追加している証明書はルート証明書なので、大丈夫だったのでしょう。しかし、いつか有効期限が来るはずなのですが、どうやったらわかるのだろう??

うーむ。