Celeron J3160+LinuxMint20の不具合

Web閲覧用の静かなマシンCeleron J3160をLinuxMint20にアップデートしたところ、Xの表示に不具合が出ました。マウスカーソルを左端に持っていったときに引っかかったり固まったりするというものです。マルチモニタ時はさらに顕著に発生します。

マルチモニタをやめれば出ないのかと思ったら、シングルモニタでも出るのでほぼ使うのをやめてしまっていたのですが、回避策が見つかりました。

まず、xrandr で接続されているポートを確認します。自分のところではDP-3でした。確認したら、

$ xrandr --output DP-3 --scale 0.9999x0.9999

とすると、(とりあえず)直ります。このコマンドを ~/.xprofile に記述しておけばグラフィカルログイン時に自動実行されるので、とりあえず問題は収まりました。マルチモニタで直っているかどうかまでは見ていません(ケーブル抜いてしまったので・・)。

Raspberry Piでラジコン用サーボを動かす

Raspberry Pi(初代)でラジコン用サーボを制御してみました。

ラジコン用サーボの信号生成には、秋月の16chキットを使いました。まず、コマンドラインでI2Cのレジスタを見ることができるようにします。

pi@raspio:~ $ sudo apt install i2c-tools python-smbus
pi@raspio:~ $ ls -la /dev/i2c*
crw-rw---- 1 root i2c 89, 0 10月 19 08:57 /dev/i2c-0
pi@raspio:~ $ sudo i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --  

次に、Python3でサーボ制御用の仮想環境を用意します。

pi@raspio:~/python3 $ sudo apt-get install python3-pip python3-venv
pi@raspio:~/python3 $ python3 -m venv servo
pi@raspio:~/python3 $ cd servo/
pi@raspio:~/python3/servo $ source bin/activate
(servo) pi@raspio:~/python3/servo $ pip install --upgrade pip
(servo) pi@raspio:~/python3/servo $ python -V
Python 3.7.3

gitでAdafruitのPCA9685用のライブラリをダウンロードしてきてインストールします。

(servo) pi@raspio:~/python3/servo $ sudo apt-get install git
(servo) pi@raspio:~/python3/servo $ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
Cloning into 'Adafruit_Python_PCA9685'...
(servo) pi@raspio:~/python3/servo $ cd Adafruit_Python_PCA9685 
(servo) pi@raspio:~/python3/servo/Adafruit_Python_PCA9685 $ python setup.py install

exampleディレクトリにあるサンプルを実行します。

(servo) pi@raspio:~/python3/servo/Adafruit_Python_PCA9685 $ cd examples/
(servo) pi@raspio:~/python3/servo/Adafruit_Python_PCA9685/examples $ python simpletest.py 

これでPCA9685の16チャネルのサーボモータ接続端子のうちの0番に接続したラジコン用サーボが動作しました。

MH-Z19B CO2センサーにケースを作りました

記事を公開するのを忘れていましたが、MH-Z19B CO2センサーにケースを作りました。

WeMOS WiFi&Bluetooth Batteryの上部にMH-Z19Bセンサを埋め込みました。

写真でも、実際に見ても見えませんが、右側面にタッチセンサを内部から貼ってあります。これにタッチするとOLEDディスプレイに写真のようにCO2ガスの濃度を15秒間表示します。表示の残り時間が下のバーグラフです。

ソフトウェアも更に変更と機能追加を行いました。これまで、Auto CalibrationはONで動作していましたが、これをOFFで動作(起動)するように変更しました。ただ、補正したいときに困るので、MQTTでコマンドを送ると、Auto CalibrationをONにすることができるようようにしてあります。Auto CalibrationがONになっている場合には、OLEDの右上に小さく「CAL」と表示するようにしてみました。

OLEDの下の穴は基板上のタクトスイッチを押すための穴です。奥がBOOT、手前がENです。

sshで公開鍵認証を設定

同じRasperry Piに繰り返しsshでアクセスするのに面倒なので、後悔カギ認証を設定します。

1.鍵の生成

~/.ssh ディレクトリで、ssh-keygenコマンドをただ実行すれば、対話的に作成できます。コマンドラインでオプションで指定してもいいのですが、覚えるのが面倒なので。

~/.ssh$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/USERNAME/.ssh/id_rsa): id_rsa_(ホスト名)
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_rsa_(ホスト名)
Your public key has been saved in id_rsa_(ホスト名).pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (ユーザー名@ローカルホスト名)
The key's randomart image is:
+---[RSA 3072]----+
|        =oo.. o +|
|       .+=o+ = o+|
|     . o.E* + o.+|
|      B o+O=.+  o|
|   . = =S+.+o.. +|
|    o o. o. .  o.|
|        .        |
|                 |
|                 |
+----[SHA256]-----+
~/.ssh$

2.接続先への転送

以下のようにssh-copy-idコマンドを使うと勝手にやってくれます。

~/.ssh$ ssh-copy-id -i id_rsa_(ホスト名).pub pi@(ホスト名).local

これで、

~/.ssh$ ssh pi@(ホスト名).local

で接続できます。全然簡単なのでした。

BluePilをArduinoで使えるようにする

こちらを参考にやってみました。結局の所、課題はある感じです。何通りかの方法を試してみましたが、 ST-Link V2を使う方法が結局は良さそうです。

1.bootloaderの書き込み

まずは https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/binaries からブートローダプログラムであるgeneric_boot20_pc13.binをダウンロードしてきて、~/Arduino/BluePil/. の下に置きました。

次に、https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zipからArduino開発環境をダウンロードしてきて、展開して~/Arduino/hardwareの下に置きます。

BluePilボードにシリアル接続して、接続チェックします。このときのジャンパの状態はBOOT0=1、BOOT1=0(ISPブートモード)で行いました。端子配置はコチラが参考になります。

~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$ ./stm32flash /dev/ttyUSB0 
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB

接続が確認できたら、ブートローダを書き込んでみます。

~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$ ./stm32flash -w ~/Arduino/BluePil/generic_boot20_pc13.bin -v -g 0x0 /dev/ttyUSB0
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote and verified address 0x08015a48 (100.00%) Done.

Starting execution at address 0x08000000... done.

BOOT0=0、BOOT1=0(Flashブートモード)に変更して、USBケーブルを挿してみましたが・・・

[762473.049541] usb 4-3: new full-speed USB device number 89 using ohci-pci
[762473.209544] usb 4-3: device descriptor read/64, error -62
[762473.477560] usb 4-3: device descriptor read/64, error -62
[762473.741551] usb 4-3: new full-speed USB device number 90 using ohci-pci
[762473.901550] usb 4-3: device descriptor read/64, error -62
[762474.169572] usb 4-3: device descriptor read/64, error -62
[762474.277700] usb usb4-port3: attempt power cycle
[762474.749583] usb 4-3: new full-speed USB device number 91 using ohci-pci
[762475.165585] usb 4-3: device not accepting address 91, error -62
[762475.321474] usb 4-3: new full-speed USB device number 92 using ohci-pci
[762475.737532] usb 4-3: device not accepting address 92, error -62
[762475.737644] usb usb4-port3: unable to enumerate USB device

うーん、enumerateできない・・・。ググると、どうもあるある現象っぽい。あきらめます。

2.hidのブートローダを試してみる

hidのブートローダを焼いてみました。

~/Arduino/hardware/Arduino_STM32/tools/linux64/stm32flash$ ./stm32flash -w ~/Arduino/BluePil/hid_generic_pc13.bin -v -g 0x0 /dev/ttyUSB0
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote and verified address 0x080007b4 (100.00%) Done.

Starting execution at address 0x08000000... done.

ダウンロード方法にusbhidを指定してもダメ・・・。なぜかttyACM0にアクセスできないなどと表示される。

rootじゃなくてもusbhidにアクセスできるように /etc/udev/rules.d/99-stm32_hid_bl.rulesにルールを追加してもダメ・・・。

# STM32_HID_bootloader
ATTRS{idProduct}=="beba", ATTRS{idVendor}=="1209", MODE:="666"

を追加して、

$ sudo udevadm control --reload-rules

としてもダメでした。うーん。これもあきらめます。

3.ST-Link V2で書き込んでみる

ST-Link V2とBluePilを接続するアダプタを作って、ST-Link V2で試してみます。

Arduino環境にもLinuxMintにもstlinkというST-Link V2を動かすプログラムが入っていないようです(実は入ってた)ので、https://github.com/stlink-org/stlink/releases/tag/v1.6.1 からstlink-1.6.1.1_amd64.deb をダウンロードしてきてインストールします。

そのままでは、ユーザー権限でアクセスできないので、/etc/udev/rules.d/99-st-link.rulesとして以下のファイルを作成します。

# ST-LINK/V2
ATTRS{idProduct}=="3748", ATTRS{idVendor}=="0483", MODE:="666"

作成したら、

$ sudo udevadm control --reload-rules

として適用します。これで、

$ st-flash reset
st-flash 1.6.1
2020-10-15T01:18:53 INFO common.c: F1xx Medium-density: 20 KiB SRAM, 64 KiB flash in at least 1 KiB pages.

という感じでリセットができるようになりました。

Arduino IDEで書き込み方法にST-LINKを指定してやると、書き込みの際に /home/xxxx/Arduino/hardware/Arduino_STM32/tools/linux/stlink_upload というスクリプトでエラーが出ていました。実際には64bit環境の場合にはlinuxではなくlinux64ディレクトリを使う構成です。ですので、

$ cd ~/Arduino/hardware/Arduino_STM32/tools
$ rm -fr linux
$ ln -s linux64 linux

としてごまかします。これで、スケッチ例のBlinkが書き込めて動作するようになりました。しかし、UARTとしては使えないので、書き込み後にttyデバイスがないっぽいエラーが出ます。

結局の所、シリアルは別に接続する必要があるようです。USB経由でシリアルを使う方法もありそうなので試してみましたが、上手くいきませんでした。やや面倒と言えば面倒ですが、この状態だとUSBはフリーになっているので、USBを使う工作で使うには便利そうです。

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

http://reblag.dk というサイトの http://reblag.dk/stm32 の中にいい感じのBluePilボードの端子図があったので、自分のメモ用に転載しておきます。ライセンスは 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を開いて動かすとオブジェクト検出ができました。