2020年8月23日日曜日

ESP32-Dev-KitCで不明なUSBデバイス(デバイス記述子要求の失敗)

ESP32の開発環境を新しいWindows10ノートに構築しようとしたら出たエラーです。

結論から申し上げるとUSBケーブルが悪かったようです。
よくある電源専用ケーブルではなくデータ通信も可能なUSBケーブルでしたが、USBケーブルを変更したら問題なく認識してくれました。

こちらのサイトに行き当たりましたが、どうやらUSB供給の電圧が5V未満になると認識に失敗するようです。USBケーブルの品質が問題になるのかな?

2020年8月17日月曜日

Raspberry PiでMariaDBをインストールしたらまず行うこと

ESP32で収集したセンサーデータを保存する為にRaspberry PiにMariaDBをインストールしてそこに保存しようと考えていますが、久々にMariaDB(MySqlでも同じですが)をインストールしたのでインストール直後に行うセキュリティ対策をメモして置きます。

STEP1:インストール

MariaDBはRaspberry PiのGUI画面のメニューで

設定>Add/Remove Software

から

「Mariadb」で検索して、

MariaDB database client(metapackage depending on the latest version)
MariaDB database server(metapackage depending on the latest version)

にチェックしてサーバーとクライアントのバイナリインストールができます。

インストール直後にはサーバも起動されているのが確認することができます。(hostnameはiotserverに変更してあります)

pi@iotserver:~ $  systemctl status mariadb.service
* mariadb.service - MariaDB 10.3.23 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-08-17 13:01:03 JST; 1h 41min ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
 Main PID: 2268 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 30 (limit: 2065)
   CGroup: /system.slice/mariadb.service
           `-2268 /usr/sbin/mysqld
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Phase 6/7: Checking and upgrading tables
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Running 'mysqlcheck' with connection arguments: --socket='/var/run/mysqld/mysqld.sock' --host='localhost' --socket='/var/run/mysqld/mysqld.sock' --host='
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: # Connecting to localhost...
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: # Disconnecting from localhost...
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Processing databases
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: information_schema
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: performance_schema
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: Phase 7/7: Running 'FLUSH PRIVILEGES'
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2306]: OK
 8 17 13:01:06 iotserver /etc/mysql/debian-start[2362]: Triggering myisam-recover for all MyISAM tables and aria-recover for all Aria tables


STEP2:インストール直後に行う事

他のサイトでもよく紹介されいる

pi@iotserver:~ $ sudo /usr/bin/mysql_secure_installation

を行ってrootにパスワードの設定を行います。(ルートの新パスワード以外はEnterで進めて問題ありません)

ただ、この状態では

pi@iotserver:~ $ mariadb
ERROR 1698 (28000): Access denied for user 'pi'@'localhost'
pi@iotserver:~ $ mariadb -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
pi@iotserver:~ $ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 63
Server version: 10.3.23-MariaDB-0+deb10u1 Raspbian 10


Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> 

のようにrootがパスワード無しでログインできてしまいます。これはrootのユーザ認証にunix_socket認証プラグインが使われている為で


MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
MariaDB [mysql]> select host,user,password,plugin from user;
+-----------+------+-------------------------------------------+-------------+
| host      | user | password                                  | plugin      |
+-----------+------+-------------------------------------------+-------------+
| localhost | root | *A764549B3367FB60049727C812C20114B39D834E | unix_socket |
+-----------+------+-------------------------------------------+-------------+
1 row in set (0.001 sec)

次のSQLコマンドでpluginを無効化します。


MariaDB [mysql]> update user set plugin='' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [mysql]> select host,user,password,plugin from user;
+-----------+------+-------------------------------------------+--------+
| host      | user | password                                  | plugin |
+-----------+------+-------------------------------------------+--------+
| localhost | root | *A764549B3367FB60049727C812C20114B39D834E |        |
+-----------+------+-------------------------------------------+--------+
1 row in set (0.001 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

rootでのログインにパスワードが必須となります。


pi@iotserver:~ $ sudo mariadb
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
pi@iotserver:~ $ mariadb -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 69
Server version: 10.3.23-MariaDB-0+deb10u1 Raspbian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>quit
pi@iotserver:~ $ sudo mariadb -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 72
Server version: 10.3.23-MariaDB-0+deb10u1 Raspbian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

2020年8月9日日曜日

node-red-node-pisrfでのピン番号

自作のIoT教育用ボードのテストを行っています。

Raspberry Pi Zero WHでNode-REDを使ってテスト用プログラムを作成していますが、超音波距離センサーHC-SR04のテストでnode-red-node-pisrfを使った時のメモです。

node-red-node-pisrfはSRF04 又はSRF05用なんですがネットで調べるとHC-SR04でも使えることが分かりました。早速インストールして使って見ましたが上手く動きませんでした。

設定としてはtriggerピンとechoピンの番号指定するだけなんですが、この番号がBCMではなくBOARDだったという落ちでした。


2020年7月8日水曜日

LineageOS 16.0 (Android 9) for Raspberry Pi 4をインストールしてみた

前回Raspberry PiにLineageOSをインストールしてから1年以上が経過してRaspberry Piも4に進化しましたが、LineageOSも今年の2月にはRaspberry Pi 4用のLineageOS 16.0(Android 9)がリリースされていました。

前回はScratch JrをRaspberry Piで動かすことが目的でしたが、残念ながらScratch Jrについてはマウスで操作ができなかったので断念した経緯があります。新しいバージョンではどうかも含めて再度トライすることにしました。

Google appsのインストールも前回同様用意されていました。多少スクリプト名が変更になっていたり、TWRPの画面がちょっと変わったりしてしていましたが、作業は前回と全く同じでした。
注意点としてはGoogle appsのインストール後、起動設定変更作業前にパーティションのマウントを行いますが、この時に「boot」にもチェックを入れないとエラーが発生します。/bootに書き込みに行っているのが原因だと思います。


今回改善されていた点

  • インストール時に言語選択で日本語が選択できるようになっていました。頑張って下の方までスクロールして下さい。インストール後すぐに日本語環境になっています。
  • Raspberry Pi 4の威力でしょうか、前回と違って設定などですぐに落ちることはなくなりました。そこそこのレスポンスで作業ができるようになっていました。

やっぱり問題が

  • Scratch Jrはやはり使えません。画面は表示されますが、マウスで操作ができませんでした。
  • Play Storeでのインストールは保留中となって先に進みませんが、そのまま再起動するとインストールされるようです。
  • インストールもそうですが、ネットワーク周りでおかしな動作が見受けられます。

前回同様にadbでもテストしてみましたが、adbでマウスイベントを発生させると動作するのですが、実際のマウスでは動作しないという現象が発生します。adbの場合は直接イベントを発生させているので、実際のマウスの場合はOS側の動作が違うのでしょうか?

Scratch JrはAndroidとiOSで動作するように、基本部分はJavaScriptで作成されていてOSに関わる部分だけをそれぞれのネイティブな言語で作成してあります。
Androidの場合はWebViewでJavaScriptを有効にして、handleTouchStartとhandleTouchEndで処理しているようです。

私が公開しているアプリは問題なくインストールできて動作も確認できました。ただこのアプリはAndroidネイティブなのでWebViewを使ったアプリではありません。
時間があれば簡単なアプリでテストをしたいと思いますが、今回はここまでとしたいと思います。

2020年6月13日土曜日

Raspberry Piのhostnameを起動時に変更したい

半年以上立っていますね。(T . T)
やはり物書きには向いてないようです。^ ^

・・・

最近IoT関連のハンズオンとかやる機会が増えてきています。
参加者はパソコン持参ですが、Raspberry Pi Zero Wを使う場合にちょっと困っています。
ネットワーク用のコネクタが付いていないのでWiFi接続となりますが、ディスプレイやキーボード、マウスを用意するのも大変です。

sshの設定とWiFiのSSID、PSK(Pre-Shared Key)の設定についてはブート時に自動設定する方法がこちらに書いてあります。

/bootフォルダに「ssh」という空ファイルを作成しておくとsshが自動的にONになりますし、「wpa_supplicant.conf」というファイルにWiFiの設定をしておけば自動的にWiFiに接続することができます。

wpa_supplicant.confはこんな感じです。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
 ssid="<Name of your wireless LAN>"
 psk="<Password for your wireless LAN>"
}

ここでWiFiの接続先に注意してください。
Raspberry Pi Zero Wがサポートしているのは「802.11 b/g/n」だけなので2.4GHzしかサポートされていません。NECとかBuffaloのルータを使っている場合、SSIDは大体「A」「G」がついたSSIDが2.4GHzのはずです。

2020/09/08 訂正: Aは5HzでGが2.4GHzでした。正確にはご自分のルータの設定を確認してください。

あと私のハマった点は、Raspberry Pi Zero Wが立ち上がったかを確認するのに「ping raspberrypi.local」でまずは確認するのですが、Zeroconfが割と遅いということでしょうか?
あれ、pingが通らないや!と勘違いしないでちょっと時間を置いてみて再度確認して下さい。これで2回程SDカードの初期化からやり直してしまいました。

と、ここまではあちこちのサイトで紹介されています。

Windowsパソコンで作業している場合でも、SDカードへrasbianのイメージを書き込んだあと/bootがマウントできるのでWindowsだけで作業ができます。

ただ、ここで問題なのはセミナーのハンズオンなどで同時に複数台の設定を行う場合です。
WiFi接続がDHCPでも1台だけのセットアップならRaspberry Pi Zero Wのhostnameが「raspberrypi」固定なので
ssh pi@raspberrypi.local
でssh接続が可能です。

ところが複数の参加者が同じWiFiに接続するとhostnameが被ってしまいます。
それぞれのSDカードで別のhostnameにするか、IPアドレスを固定にするかで回避できますが、
残念ながらどちらも初回ブート時に設定する方法は無いようです。

そこでこちらのサイトで回答のあったサービスを利用する方法を応用して初回ブート時にhostnameを変更するイメージを作成することにしました。

こうすることで、SDカードにイメージを書き込んだ後に、Windowdsパソコンでssh、wpa_supplicant.conf、hostnameの3つのファイルを用意することで、参加者各自が任意のhostnameのRaspberry Piを立ち上げることができます。(実際にはsshは設定済みのイメージになるので、会場のWiFiに併せたSSID/pskとhostnameの設定を行います)


STEP1:rasbianのイメージを書き込んだSDカードの用意


こちらのサイトから必要なrasbianのイメージファイルをダウンロードします。本家は遅い場合がありますので、その場合はこちらのサイトも試してみてください。
私はSDカードへの書き込みはSD Memory Card Formatterでフォーマット後に、balenaEtcherを使用しています。


STEP2:/booにsshとwpa_supplicant.confを作成


上で説明したようにrasbianのイメージを書き込んだ後、SDカードを抜き差しすると/bootがWindowsでもマウントされて見えるようになります。ここでsshとwpa_supplicant.confをbootフォルダに作成します。

この時に、ちょっと工夫をしておくことで後でimgファイルを作成する時間が短縮できます。

それは、最近のrasbianではパーティションの拡張作業が初回boot時に自動で行われるようになっているので、そのまま再起動してしまうとパーティションサイズがSDカードいっぱいになってしまいます。後でイメージファイルを作成する時にSDカード全体をイメージファイルにすることになって時間がかかりますし、SDカードにイメージファイルを焼く時間も長くなります。

/boot/cmdline.txtの
init=/usr/lib/raspi-config/init_resize.sh
init=/sbin/init
に書き換えておきます。init_resize.shがパーティションの拡張を行なっているシェルスクリプトです。


STEP3:Raspberry Pi Zero Wを起動


SDカードをRaspberry Pi Zero Wに挿し、電源を入れて下さい。しばらくしてからパソコンからsshで接続できれば、無事にWiFiに接続できています。
この時はまだhostnameは「raspberrypi」のままです。


STEP4:hostname変更サービスの登録


以下の作業で、起動時にhostnameを変更するサービスを追加します。
$ sudo vi /etc/systemd/system/change-hostname.service
[Unit]
Description=Change hostname from sd
ConditionPathExists=/boot/hostname
Before=dhcpcd.service

[Service]
Type=oneshot
ExecStartPre=/bin/bash -c 'CURRENT_HOSTNAME=$(/bin/cat /etc/hostname | /usr/bin/tr -d "\t\n\r");NEW_HOSTNAME=$(/bin/cat /boot/hostname | /usr/bin/tr -d "\t\n\r");/bin/sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts'
ExecStart=/bin/mv /boot/hostname /etc/hostname
ExecStartPost=/sbin/reboot

[Install]
WantedBy=multi-user.target

$ sudo systemctl enable change-hostname.service

STEP5:imgファイルの作成


以上で、起動時に/boot/hostnameが存在する場合、hostnameを変更してWiFIで接続してssh可能なrasbianが出来ました。

後は
  1. /boot/cmdline.txtのinitを元に戻す。(パーティション拡張の自動処理)
  2. /etc/wpa_supplicant/wpa_supplicant.confからnetworkを削除(SSID、psk消去)
  3. rm ~/.bash_history(コマンド履歴の削除)
を行なってから電源を切って、SDカードのイメージを作成すれば完了です。

私はSDカードのイメージ作成にはWin32 Disk Imagerを使っているので、「Read Only Allocated Partitions」にチェックを入れて作成されるイメージファイルを小さくしています。

Raspberry Pi ZeroでHeadphonesが無くなった

最近こんなの Adeept Robotic Arm Kit for Arduino や こんなの 「Petoi Bittle」(ペトイ・ビトル) を購入して遊んでいました。 両方共にArduino互換ボードでサーボモーターを駆動する物ですが基本的なプログラムは提供されるのでとりあ...