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

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

Raspberry pi Zero で オフィス環境の可視化 その8 ファン交換

f:id:pongsuke:20210514120351j:plain
5v 30mm ファン

f:id:pongsuke:20210514120408j:plain
Raspberry pi 3B+

2019-12 に、Raspberry pi 3B+ をセットアップしました。 pongsuke.hatenablog.com

問題なく動いているのですが、冷却ファンがうるさいです。

どうも、カタカタ音がします。 グリースを塗ったりすれば治りそうですが、面倒なので交換しました。

2個 Raspberry Pi DCブラシレス冷却ファンヒートシンク冷却ラジエータコネクタRaspberry Pi 2 / Pi 3 / 3B +およびPiゼロ/ゼロWまたはその他のロボットプロジェクト用の1対2インターフェース3.3V 5Vを分離 Amazon.co.jp: 2個 Raspberry Pi DCブラシレス冷却ファンヒートシンク冷却ラジエータコネクタRaspberry Pi 2 / Pi 3 / 3B +およびPiゼロ/ゼロWまたはその他のロボットプロジェクト用の1対2インターフェース3.3V 5Vを分離: パソコン・周辺機器

2つで、768 税込 でした。

RPI3B+ が余っていたので、それを使用した流れでした。 セットアップした際には、動作が早くて、セットアップも早くて、満足していたのですが、 こうなると、ファンレス・低電力で動く RPI Zero などにしておけばよかったかな・・・なんて思ったりします。

f:id:pongsuke:20210514121227p:plain
グラフ

Sipeed Tang primer を試す

f:id:pongsuke:20200728094039j:plainf:id:pongsuke:20200728094042j:plain
Tang Primer

TANG PRIMER という、FPGAの入門ボードみたいなの?を試します。

tang.sipeed.com

スイッチサイエンスから購入したのですが、商品名が Tang premier となっています。

www.switch-science.com

公式のガイド

Tang Primer Documentation :: Documentation for Tang Primer

Getting started を見ると、

  1. Requirements
  2. Installing Tang Dynasty IDE
  3. Installing USB Driver
  4. Getting to Blinky

となている。

ハードウェア構成

f:id:pongsuke:20200728094203j:plain

f:id:pongsuke:20200728144806p:plain

f:id:pongsuke:20200728144810p:plain

下の方にPINに関する詳細PDFがあります。

https://github.com/kprasadvnsi/tang-doc/releases/download/1.0.0/sipeed-tang-primer-pins.pdf

データシート

https://media.digikey.com/pdf/Data%20Sheets/Seeed%20Technology/102110202_Web.pdf

先に目を通しておきます。

IDE のダウンロードとインストール

ダウンロードの際に、キャプチャが有るのですが、なかなか難易度が高かったです・・・。

https://dl.sipeed.com/TANG/Primer/IDE

f:id:pongsuke:20200728094714p:plain

Installing USB Driver

そもそもわかっていないのですが、どうやら microUSB でつなぐようです。

USBで Windows10 パソコンと繋いで、デバイスマネージャーを確認しました。

f:id:pongsuke:20200728095758p:plain

右クリック から、ドライバーの更新、手動更新で、IDEインストール先のドライバーを指定します。

私の環境では C:\Anlogic\TD4.4.433\driver\win8_10_64 でした。

再起動して、再確認。 f:id:pongsuke:20200728102227p:plain

警告が出ています・・・

このデバイスに必要なドライバーのデジタル署名を検証できません。ハードウェアまたはソフトウェアに最近加えられた変更により、正しく署名されていないファイルや破損したファイルがインストールされた可能性があります。また、出所の不明な悪意のあるソフトウェアであることも考えられます。 (コード 52)

テストモードを試す

PS C:\WINDOWS\system32> bcdedit /set TESTSIGNING ON
要素データを設定中にエラーが発生しました。
この値はセキュア ブート ポリシーによって保護されているため、変更または削除できません。

仕方ないので、セキュアブートを無効しました。

認識の確認

IDE を立ち上げて、Download デバイスが出てくることを確認。

f:id:pongsuke:20200728103808p:plain

Getting to Blinky

サンプルコードを実行します。

github.com

git を Download して、Project > Open Project から Tang_FPGA_Examples-master\0.LED\prj\led.al を選択。

一旦 Run する。

led.bit が生成されるので、いよいよ読み込ませる。

Download から、 Add して、 Run

すると、RGB Led が、光りだします。

f:id:pongsuke:20200728105115j:plain

チュートリアルには、既知の不具合により Speed は 400kbps じゃないと動かない、、、と書かれていますが、1Mbps でも、動きました。

コードを見る

io.adc

set_pin_assignment {CLK_IN} { LOCATION = K14; }      ##24MHZ
set_pin_assignment {RST_N} { LOCATION = K16; }      ##USER_KEY

## RGB LEDs, 3 pins
set_pin_assignment {RGB_LED[0]} { LOCATION = R3;  } ##LED_R, R3
set_pin_assignment {RGB_LED[1]} { LOCATION = J14;  }    ##LED_G, J14
set_pin_assignment {RGB_LED[2]} { LOCATION = P13;  }    ##LED_B, P13

led.v

module led
    (
        input wire CLK_IN,
        input wire RST_N,
        output wire [2:0]RGB_LED
    );

    parameter time1 = 25'd24_000_000;//¾§ÕñΪ24Mhz

    reg [2:0]rledout;
    reg [24:0] count;
    reg [1:0]shift_cnt;
    
    initial
    begin
        count=25'b0;
        rledout=3'b1;
        shift_cnt=2'b0;
    end

    always @(posedge CLK_IN)begin
        if(RST_N==0)begin
            count <= 25'b0;
            rledout <= 3'b1;
            shift_cnt <=2'b0;
        end
    
        if(count == time1)
        begin 
            count<= 25'd0;
            
            if(shift_cnt==2'b10)begin
                rledout <= 3'b1;
                shift_cnt <=2'b0;
            end
            else begin
                rledout <= {rledout[1:0],1'b0};
                shift_cnt <= shift_cnt + 1'b1;
            end
        end
        else
            count <= count + 1'b1;
    end
    
    assign RGB_LED = rledout;
endmodule

そもそも、オンボードのフルカラーLEDの制御はどうするのか? という話ですが、上記のPDFを見ると 書いてあります。

R3 red
J14 green
P13 blue

f:id:pongsuke:20200728145143p:plain

Volumio セットアップ 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が引き出せる小型タッチスクリーンが届いたので電子工作に使ってみた

Raspberry pi Zero で オフィス環境の可視化 その7 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+ を使用するのは、発熱のデメリットも有るようです。

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

追記

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

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

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