Raspberry Pi 備忘録 / Mbedもあるよ!

Raspberry Pi であれこれやった事の記録

Volumi セットアップ 2020-02

むかーしセットアップした Raspberry + ハイレゾ対応?DAC マシンの Volumio update を行ったら、ファイルシステムをマウントできなくなった。

稼働時間から考えて、MicroSCの破損だと思われる。

オフィス環境の可視化どうよう、USBにしてみたり、Readonly にしても良いのだが、32GB の microSD が余っているので、とりあえず microSD で再セットアップする。

ISO ダウンロード

Download |Get Started | Volumio

焼き付ける

Once download has finished, you’ll have a zip file
Extract the downloaded zip file and you’ll have a .img image file
Download and install Etcher, which will write Volumio to your SD Card
Open etcher, and click on “Select Image”. Now select the Volumio .img file
Insert the MicroSD Card on your computer, you could use an external card reader or the SD slot if your computer has one.
Click on Select drive, and select the SD Card \ SD Card reader.
To be safe, unplug every External USB Drive you may have connected to your PC and make sure that the device name correspond to the microSD card
Click “Continue” and when ready, hit “Flash”
When the operation has finished (it may take up to 10 minutes)close Etcher and eject the SD card
Done! Volumio is now on your SD Card!

raspbian 同様、こちらでも Etcher を使えと言っている。

ドキュメント

volumio.github.io

SSH

volumio.local/dev から有効化する。

volumio / volumio

IPの設定

GUIから行う。

ただ、設定したところ「ネットワークの設定に成功!」と表示されるものの、どうも失敗している模様。

sudo reboot したところ、正常に反映されました。

作業時間 30分ほど

QC35C を試す

いつ買ったのが思い出せませんが、QC35C が、手元にあったので、試します。

f:id:pongsuke:20200124114053j:plain

3.5 inchi です。

hdmi 接続

GPIO に挿して、hdmi をつなぎます。

普通に、hdmi モニターとして動作します。

タッチパネル

ドライバーを入れましょう。

GitHub - goodtft/LCD-show: 2.4" 2.8"3.2" 3.5" 5.0" 7.0" TFT LCD driver for the Raspberry PI 3B+/A/A+/B/B+/PI2/ PI3/ZERO/ZERO W

How to install the LCD driver of Raspberry Pi を見て、従います。

1.)Step1, Install Raspbian official mirror

raspbian os を入れなさいということですから、入れましょう。

2.) Step2, Clone my repo onto your pi

clone せよ! ということなのでしましょう。

$ sudo rm -rf LCD-show
$ git clone https://github.com/goodtft/LCD-show.git
$ chmod -R 755 LCD-show
$ cd LCD-show/

3.)Step3, According to your LCD's type, excute the corresponding driver:

LCDの種類に応じて、適切なファイルを実行せよとのこと。

どれだろうと、調べていると、どうやら MPI3508_480_320-show が該当するらしい。

$ sudo ./MPI3508_480_320-show

中身を見たたら、

sudo cp -rf ./boot/config-35-480X320.txt /boot/config.txt

とかしているけど、そんなファイルは、無い。

rasipban buster には、対応していないのではないかと思いながらも、config-35-480X320.txt 拾ってきて使ってみる。

$ cd ./boot/
$ wget https://raw.githubusercontent.com/lcdwiki/LCD-show-ubuntu/master/boot/config-35-480X320.txt

$ sudo ./MPI3508_480_320-show

勝手に再起動した後、タッチは有効になったが、ずれている状態。

キャリブレーションファイル

アレコレして、結果的に動いたのがこれ。

$ cat /etc/X11/xorg.conf.d/99-calibration.conf
Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "ADS7846 Touchscreen"
        #Option  "Calibration"   "233 3945 183 3939"
        Option  "Calibration"   "3936 227 268 3880"
        Option  "SwapAxes"      "1"
        Option  "InvertY"      "1"
EndSection

コチラ を使用させていただきました。

neuralassemblyのメモ: Raspberry PiのGPIOが引き出せる小型タッチスクリーンが届いたので電子工作に使ってみた

K-30破損? mh-z19 へ切り替え

f:id:pongsuke:20200123140113j:plain

K-30 破損?

K-30 が、ずっと 0 を出すようになってしまいました。

LEDも点灯していないし、なにかおかしくなったようです。

代替センサー

手元には、mh-z19 が有るので、切り替えることにしました。

以前、pwmで動作確認を済ませていますが、なんとなく UART にしました。

制御スクリプト

pip から、 mh-z19 ライブラリをインストールできます。

$ sudo pip3 install mh-z19

動作

$ sudo python3 -m mh_z19
{"co2": 952}

なお、ライブラリをインストールする際には mh-z19 で、インポートするライブラリ名称は mh_z19 となっています。

かたやハイフン、かたやアンダーバーです。

Python 内部で使用する

import mh_z19

result = mh_z19.read()
co2     = result['co2']

これに、データベース接続などして、保存します。

起動には、やはり sudo 必要です。

Raspberry pi リードオンリー化のテスト

Raspberry pi Busbet OS での、microsd read only 化に挑戦します。

Andreas さんのやり方をそのまんま真似してみます。

Make your Raspberry Pi file system read-only (Raspbian Buster)

私は、Raspberry pi zero w を使用します。
はたして、うまくいくかな?

コマンドメモ

コピペで繰り返す用

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get remove --purge triggerhappy logrotate dphys-swapfile
$ sudo apt-get autoremove --purge

/boot/cmdline.txt の行末に追加

fastboot noswap ro

ロガーの変更

$ sudo apt-get install busybox-syslogd
$ sudo apt-get remove --purge rsyslog

今後は sudo logread を使用してね! とのこと。

/etc/fstab 改変。

roが追加されている。
tmpfsが、3行追加されている。

proc                  /proc     proc    defaults             0     0
PARTUUID=fb0d460e-01  /boot     vfat    defaults,ro          0     2
PARTUUID=fb0d460e-02  /         ext4    defaults,noatime,ro  0     1
#Also add the entries for the temporary file system at the end of the file:
tmpfs        /tmp            tmpfs   nosuid,nodev         0       0
tmpfs        /var/log        tmpfs   nosuid,nodev         0       0
tmpfs        /var/tmp        tmpfs   nosuid,nodev         0       0

いろいろ移動する

$ sudo rm -rf /var/lib/dhcp /var/lib/dhcpcd5 /var/spool /etc/resolv.conf
$ sudo ln -s /tmp /var/lib/dhcp
$ sudo ln -s /tmp /var/lib/dhcpcd5
$ sudo ln -s /tmp /var/spool
$ sudo touch /tmp/dhcpcd.resolv.conf
$ sudo ln -s /tmp/dhcpcd.resolv.conf /etc/resolv.conf

$ sudo rm /var/lib/systemd/random-seed
$ sudo ln -s /tmp/random-seed /var/lib/systemd/random-seed

/lib/systemd/system/systemd-random-seed.service 改変

ExecStartPre=/bin/echo "" >/tmp/random-seed を、Serviceセクションに追加する。
こんな感じになるはず。

3行目?に追加している。

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/echo "" >/tmp/random-seed
ExecStart=/lib/systemd/systemd-random-seed load
ExecStop=/lib/systemd/systemd-random-seed save
TimeoutSec=30s

おまけ機能

optional としてあるところですが、実に便利なので、ぜひ導入しましょう。

設定すると、$ ro で、 Read Only mode となり、 $ rw で、 Read and Write mode になります。

また、ログインシェルに (ro):~$のように、現状の mode を表記してくれます。

/etc/bash.bashrc を編集する。

set_bash_prompt() {
    fs_mode=$(mount | sed -n -e "s/^\/dev\/.* on \/ .*(\(r[w|o]\).*/\1/p")
    PS1='\[\033[01;32m\]\u@\h${fs_mode:+($fs_mode)}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
}
alias ro='sudo mount -o remount,ro / ; sudo mount -o remount,ro /boot'
alias rw='sudo mount -o remount,rw / ; sudo mount -o remount,rw /boot'
PROMPT_COMMAND=set_bash_prompt

やってみたら、何がおきた?

crontab が消えた

/etc/crontab に書き込む

時刻が狂った

etc/crontab に、@reboot root ntpdate -v ntp.nict.jp を入れた。

ファイルを保存できなくなった

これはちょっと意外でした。

/home/user/ に、ファイルを書き出そうとしたら、書き出せなかった。

「書き出せるけれども、再起動したら消える」のかと、なんとなく勘違いしておりました。

タイムラプス専用のマシンを作りたくて挑戦したのですが、ファイルを保存できなくなってしまった。

なので、撮影&転送コマンドを書き換える必要が出ました。

ビフォー
#!/bin/bash
today=`date "+%Y%m%d"`
t_stamp=`date "+%Y%m%d%H%M%S"`
ssh iot_ssh@_IP_ADDR_ "mkdir -p ./zero_w/`echo $today`"
raspistill -o ./out.png
scp ./out.png iot_ssh@_IP_ADDR_:./zero_w/`echo $today`/`echo $t_stamp`.png

ファイルを作成し、spc で転送していた。

アフター
#!/bin/bash
today=`date "+%Y%m%d"`
t_stamp=`date "+%Y%m%d%H%M%S"`
ssh iot_ssh@_IP_ADDR_ "mkdir -p ./zero_w/`echo $today`"
raspistill -o - | ssh iot_ssh@_IP_ADDR_ "cat > ./zero_w/`echo $today`/`echo $t_stamp`.png"

ファイルを作成する代わりに、標準出力に出して、SSHで標準入力から読み込むようにしました。

ポイントは、raspistill の -o で - を指定すると、標準出力に出せる点と、
scpではなく、ssh を使用している点でしょうか。

f:id:pongsuke:20200113154842j:plain フリスクネオの缶に収まった zero w
ピンヘッダー給電にしたので、縦長に収まりました。

カメラマウントがブサイクに大きいけれど、別に構わない。

Raspberry pi Zero で オフィス環境の可視化 その6 マイクロSDカード破損?色々変える

2016-12-05 から稼働していたオフィス環境のログングマシン Raspberry pi zero ですが、2019年7月から動いてないことがわかりました。

Root ファイルシステムの Super block が見つからないとか、破損しているだとかのメッセージですが、fsck などでも対処できず、マイクロSDカードが破損したのではないかと考えています。

約2年半で破損したようです。

これを気に色々変えます

代替マシンは 3B+

代替マシンは 3B+ でいいかな・・・と思っています。

当初は、Zero の低電力、低価格、小型さに惹かれて Zero で各種センサーを動かしていましたが、いくつかの理由で Raspberry pi 3B+ にしようとおもっています。

1.セットアップに無駄に時間がかかる。

apt update など。
単純に遅い。

2.あまり小型化できていない

確かに本体は小さいが、センサーとケーブルを綺麗にまとめきれていないので、本体の小ささは活きていない。

USBハブも邪魔です。

3.電力はコンセントから取れている

zeroなら、モバイルバッテリーでもしっかり動く、、、のですが、オフィスに置くので、別に、そこまで低電力ではなくていいです・・・。

普通にコンセントに刺します。

4.RPI3B+ 余ってる

これがでかい。

埃をかぶり続けそうなので、使用することにしました。

5.USB BOOT したい

これが1番でかい。

そもそもマイクロSDは、常時使用には向いていません。

3B+は、デフォルトでUSB Boot 対応なので、 BalenaEtcher で、USBメモリなどに OS を焼き付ければそれで終わりです。

なお、2B Version 1.2 ``a22042``` なら、usb boot 対応らしい。

cpu info と Version 対応表

Checking Your Raspberry Pi Revision Number & Board Version - Raspberry Pi Spy

K30 co2センサー

Rpi3B+ での設定メモ

GPIO で UART を使えるようにする

raspi-config > interface options > Serial

シェルで使用する? NO

シリアルポートハードウェア? YES

$ ls /dev/ttyS0 
/dev/ttyS0

サンプルを取得する

https://www.co2meter.com/pages/indoor-air-quality-links

AN137 - Interfacing Raspberry Pi to SenseAir K30 Sensor via UART. Sample Code (ZIP)

K-30.py

サンプルを一部改変しています。

python3 向けに、print を () 付きにして、 ser.write を byte 指定の b"" に変更。

resp も、int が帰ってくるようなので、そのまま受け取っています。

#rpi serial connections
#Python app to run a K-30 Sensor
import serial
import time

ser = serial.Serial("/dev/ttyS0",baudrate =9600,timeout = .5)
print("  AN-137: Raspberry Pi3 to K-30 Via UART\n")
ser.flushInput()
time.sleep(1)

for i in range(1,21):
        ser.flushInput()
        ser.write(b"\xFE\x44\x00\x08\x02\x9F\x25")
        time.sleep(.5)
        resp = ser.read(7)
        #high = ord(resp[3])
        #low = ord(resp[4])
        high = resp[3]
        low = resp[4]
        co2 = (high*256) + low
        print("i = ",i, " CO2 = " +str(co2))
        time.sleep(.1)

BME280 湿度、温度、気圧センサー

f:id:pongsuke:20191216110749j:plain

BME280 が、設定が楽そうなので、新規に購入しました。

www.switch-science.com

I2C と SPI の両方に対応している。

仕様

電源電圧 : DC 1.8~3.3V
通信方式 : I2C(最大3.4MHz) SPI(最大10MHz)
測定レンジ 
温度 : -40~+85℃
湿度 : 0~100%
気圧 : 300~1100 hPa
分解能
温度 : 0.01℃
湿度 : 0.008%
気圧 : 0.18Pa
測定精度
温度 : ±1℃
湿度 : ±3%
気圧 : ±1hPa
I2Cアドレス
SDO LOW : 0x76
SDO HIGH: 0x77

i2C でやる

なんとなく、i2c にします。

配線

BME280 – スイッチサイエンス

ラズパイの場合、本体のプルアップ抵抗が有るので、抵抗は不要とのこと。

I2C用のプルアップ抵抗は未実装です。
Raspberry Piで使う場合はこの基板にプルアップ抵抗は不要です。 (Raspberry Pi基板上にI2Cのプルアップ抵抗が実装済みのため)

I2Cアドレスの設定方法
I2Cアドレスは、
 
SDO端子をGNDにつなぐと0x76
SDO端子をVioにつなぐと0x77
になります。必ずどちらかにつないでください。

うーん、、、なんとなく、SDOを、GND にしました。
(あとから気が付きましたが、サンプルスクリプトは、0x76 なので、GNDおすすめ)

BME280 RPI3B+
SDO, GND GND
SCK I2C_SCL1
SDI I2C_SDA1
CSB,Vio 3.3V
Vcare なし
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 --

スクリプト

スイッチサイエンスのスクリプトを、一部改変して使う。

BME280/bme280_sample.py at master · SWITCHSCIENCE/BME280 · GitHub

ライブラリ 追加
$ pip3 install smbus2
スクリプト修正

print を () で囲む。

起動
$ python3 bme280_sample.py 
temp : 22.06  ℃
pressure : 1027.39 hPa
hum :  32.81

失敗

どうにも気温が高くなりすぎています。

f:id:pongsuke:20191217150600p:plain

ケースの中に RPI3B+ を入れておいたのですが、触ってみると、ケース全体が温かい・・・

どうやら、RPI3B+ の発熱で、ケース自体が温まり、センサーにも影響したようです。

PiZero では起こらなかったことなので、RPI3B+ を使用するのは、発熱のデメリットも有るようです。

暫くは、ケースを開けて様子を見ようと思います。

追記

ケースを開けましたが、ケース自体が温まってしまうので、どうにも狂います。

仕方ないので、センサーをケースから外し、横に置く形式にしました。

どうも湿度が低く出ます。
壊れているのか、サンプルスクリプトとは別に、キャリブレーションが必要なのか・・・

Raspberry pi 4 で ハードウェアPWMを試す

f:id:pongsuke:20191203104147j:plain

ソフトウェアPWMの場合、処理が重かったり、他のUSB機器の影響?で、動作が不安定になりがちです。
具体的には、ガタガタしたりします。

まぁ、そりゃそうだろうという感じです。

そこで、PWM に特化した PIN を使用します。
hardware pwm と呼ばれています。

データシートより

f:id:pongsuke:20191203102402p:plain
Datasheet

みると、確かにGPIO12,13 は、PWM0, PWM1 となっており、特別なようだ。

$ gpio readall
Oops - unable to determine board type... model: 17

$ gpio -v
gpio version: 2.50
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Unknown17, Revision: 01, Memory: 0MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 4 Model B Rev 1.1
  * This Raspberry Pi supports user-level GPIO access.

wiringPi updated to 2.52 for the Raspberry Pi 4B | Wiring Pi

$ cd /tmp
$ wget https://project-downloads.drogon.net/wiringpi-latest.deb
$ sudo dpkg -i wiringpi-latest.deb

$ gpio -v
gpio version: 2.52
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 4B, Revision: 01, Memory: 4096MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 4 Model B Rev 1.1
  * This Raspberry Pi supports user-level GPIO access.

$ gpio readall
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+

動作テスト

SG92, SG90 を2つ制御してみる。
制御電圧 5.0V に足りませんが、動きます。

サービスを立ち上げて、、、

$ sudo pigpiod

コマンド実行

import pigpio
import time

gpio_pin0 = 12
gpio_pin1 = 13

pi = pigpio.pi()
pi.set_mode(gpio_pin0, pigpio.OUTPUT)
pi.set_mode(gpio_pin1, pigpio.OUTPUT)

# SP92 min 25000, mid 72500 max 120000

# GPIO12: Hz、duty比
pi.hardware_PWM(gpio_pin0, 50, 72500)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin0, 50, 100000)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin0, 50, 72500)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin0, 50, 50000)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin0, 50, 72500)
time.sleep(0.5)

# GPIO13: Hz、duty比
pi.hardware_PWM(gpio_pin1, 50, 48750)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin1, 50, 25000)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin1, 50, 48750)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin1, 50, 60000)
time.sleep(0.5)
pi.hardware_PWM(gpio_pin1, 50, 48750)
time.sleep(0.5)

time.sleep(1)

pi.set_mode(gpio_pin0, pigpio.INPUT)
pi.set_mode(gpio_pin1, pigpio.INPUT)
pi.stop()

確かに、hardware pwm を使用すると、処置が重くても、がたがたしない!

Line Things として動かしてみる - ESP32 DevKit C-32D を試す その2

ファームウェアの書き込み

line-things-starter/README.ja.md at master · line/line-things-starter · GitHub

こいつをブチ込むのかな? https://raw.githubusercontent.com/line/line-things-starter/master/esp32/arduino/sample/sample.ino

サンプルのプログラム

ESP32のBOOTボタン 押すと、Button state が変化し、カウントアップする

Lineアプリの Switch LED ON 押すと、LEDついたり消えたり。

いともかんたんに動いてしまった!