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

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

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