« 2021年2月 | トップページ | 2021年4月 »

2021年3月

2021年3月21日 (日)

台湾YUASAのバッテリーをオーダー

丁度3年前、2018年の3月にGS YUASAのバッテリーをGETした。

その当時のブログがこれになる。その当時、台湾YUASAのバッテリーが3年しかもたなかったと書いている。これは表現が正しくなかったようだ。台湾YUASAでも3年もつって書くべきなんだと思う。GS YUASAは台湾YUASAとは違って長寿命と思っていたが、3年もたなかった(2年はもった)。

GS YUASAが13000円に対して、台湾YUASAはその半額位。でもって、寿命が同じなら、そりゃ台湾YUASAでしょ。ということで、先ほど台湾YUASAをオーダーしたのだ。

で、届きました。

Img00028_hdr

台湾YUASAからの輸入品だから箱の記載はみんな中国語。

ばててしまったGS YUASAと新品台湾YUASAの新旧交代。

Img00029_hdr

当然のことだけれど新品バッテリーは超快適・強力にセルをぶん回してくれる。バッテリーは徐々に弱くなっていくので、どの程度弱くなったのか認識しずらいけれど、旧・新を比較すると一目瞭然。これであと2年位はバッテリーにドキドキしなくてよくなった。

2021年3月 6日 (土)

デジタルフィルターの実験

Python scipyでデジタルフィルターの実験をしてみた。

インプットとしてフォトレジスターの値をMCP3208で読み取った。Raspberry Pi 4BにSPIでインターフェースしている。回路図左側のラベルはRaspberry Pi 4BのGPIO信号で、カッコ内はヘッダーピン番号。

Mcs3208cds

実際の様子はこんな感じ。
Img04797

0.01秒周期で512サンプル行った。読み取ったサンプルデータに対して先人の知恵に学びながButterフィルターをかけてみた。

写真のセットを机の上(蛍光灯、LED証明、LCDモニター前)に置いた場合。
通過域端周波数 4Hz、阻止域端周波数 6Hz

どうやら蛍光灯の影響で3Hzから4Hzの間の周波数でCdS出力が変化する(蛍光灯を切るとこの周期の波はなくなった)。通過域端周波数を4Hzとするとフィルター出力は正にこの変化を捉えることになった。

Fl2fp4ps6

通過域端周波数 1Hz, 阻止域端周波数 3Hz

通過域端周波数を1Hzとすると、3~4Hzの波の下に隠れている周波数成分を取り出すことが出来たようだ。

Fl6fp1fs3

ちなみに蛍光灯を消した状態ではこんな感じになった。

Fl7

CdSを手で覆って光を遮断した状態
通過域端周波数 4Hz、阻止域端周波数 6Hz

CdSの光を遮断(センサー表面を手で隠す)した場合、相対的にノイズ成分が多くなる。この状態でフィルターしてみた。確かにノイズの下に隠れている波を取り出しているように見える。

Fl5fp4fs6dark

CdSの上およそ20cmのところで手のひらを1秒弱で往復させた場合
通過域端周波数 2Hz、阻止域端周波数 4Hz

1~2Hz程度でインプットがあった場合の周期性を捉える実験もしてみた。これは手のひらを通過させたときの出力変位が多きの出フィルターするまでもない感じだけれども、仮に多量にノイズが乗っていても恐らく同様の結果が得られるものと期待できる。

Fl4fp2fs4

記録のためにここで使ったコードは以下に置く。多くの方々の知恵をまとめて一つにしたもの。

ダウンロード - filtertest2.py

感謝。

 

 

 

 

2021年3月 5日 (金)

ADCのサンプリングレート

アナログ出力に対してADCをかけて波形サンプリングをしたい。サンプリングレートはどの程度になるのか以下の2パターンを実験してみた。

  • PicoのADCを使ってサンプリングして、PicoからUARTでRaspberry Piにデータを取り込む
  • ADC IC MCP3208を使ってSPIでRaspberry Piにデータを取り込む

結果

PicoのADCをUARTでサンプリングした場合の最小周期は1300us(800Hz)程度
MCP3208をSPIでサンプリングした場合の最小周期は50us(20KHz)程度

結論

ナイキスト周波数を100Hzとすればいずれの方法でもサンプリングは可能。

 

PicoのADCをUARTにて

PicoのUART0(1ピン、2ピン)をPiのUART(8ピン、10ピン)に接続した。

以下のMicroPythonをPicoで実行。

import machine
import utime

uart = machine.UART(1,115200)
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / 65535

count = 0
ptime = utime.ticks_ms()
while True:
reading = sensor_temp.read_u16() * conversion_factor

temperature = 27 - (reading - 0.706) / 0.001721
ctime = utime.ticks_us()
count += 1
output = "{}/{}\n".format(count, (ctime - ptime))
if (count % 1000) == 0:
   print(output)
uart.write(output)
ptime = ctime

 

以下のPythonコードをRaspberry Pi 4Bにて実行した。

import time
import serial


s = serial.Serial("/dev/serial0",115200, timeout=3)
s.reset_input_buffer()
count = 0

try:
   while True:

      line =s.readline()
      line = line.decode('utf-8')
      count += 1
      if (count % 1000) == 0:
         print("{}".format(line))


except KeyboardInterrupt:
   pass

結果は以下。1000回に1回、カウント数とループ一回当たりの時間をコンソール出力している。

Adc0

 

MCP3208をSPIにて

MCP3208をRaspberry Pi 4BのSPIに接続している。PythonコードはBlue Backs Raspberry Piで学ぶ電子回路に掲載されているものを使っている。


import RPi.GPIO as GPIO
import time

# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
   if adcnum > 7 or adcnum < 0:
      return -1
   GPIO.output(cspin, GPIO.HIGH)
   GPIO.output(clockpin, GPIO.LOW)
   GPIO.output(cspin, GPIO.LOW)

   commandout = adcnum
   commandout |= 0x18 # スタートビット+シングルエンドビット
   commandout <<= 3 # LSBから8ビット目を送信するようにする   

   for i in range(5):
# LSBから数えて8ビット目から4ビット目までを送信
      if commandout & 0x80:
         GPIO.output(mosipin, GPIO.HIGH)
      else:
         GPIO.output(mosipin, GPIO.LOW)
      commandout <<= 1
      GPIO.output(clockpin, GPIO.HIGH)
      GPIO.output(clockpin, GPIO.LOW)
   adcout = 0
# 13ビット読む(ヌルビット+12ビットデータ)
   for i in range(13):
      GPIO.output(clockpin, GPIO.HIGH)
      GPIO.output(clockpin, GPIO.LOW)
      adcout <<= 1
      if i>0 and GPIO.input(misopin)==GPIO.HIGH:
         adcout |= 0x1
   GPIO.output(cspin, GPIO.HIGH)
   return adcout

GPIO.setmode(GPIO.BCM)
# ピンの名前を変数として定義
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8
# SPI通信用の入出力を定義
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICS, GPIO.OUT)

ptime = time.time()
count = 0
try:
   while True:
      inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)
      ctime=time.time()
      if (count % 1000) == 0:
         print("{}/{}".format(inputVal0, ctime-ptime))
      ptime=ctime
      count += 1

except KeyboardInterrupt:
   pass

GPIO.cleanup()

結果は以下の通り。1000回に1回、ADC値とループ時間をコンソール出力している。5掛ける10のマイナス5乗で50us。

Adc1

以上。

2021年3月 4日 (木)

Raspberry Pi 4でscipyをimport

以下の3つのimportを持つPythonコードについての作業記録。環境はRaspberry Pi 4B, Python 3.7, Python3 IDLE。

import numpy
import scipy
import matplotlib.pyplot

コードをRUNすると以下のエラーになった。

Traceback (most recent call last):
File "/home/pi/raspi/study/filter-test.py", line 3, in <module>
from scipy import signal
ModuleNotFoundError: No module named 'scipy'


pi@raspberrypi:~ $ sudo apt-get install python-scipy
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libexiv2-14 libgfortran3 libgmime-2.6-0 uuid-dev
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
python-decorator
提案パッケージ:
python-scipy-doc
以下のパッケージが新たにインストールされます:
python-decorator python-scipy
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 1 個。
8,955 kB のアーカイブを取得する必要があります。
この操作後に追加で 38.2 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf python-decorator all 4.3.0-1.1 [14.4 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf python-scipy armhf 1.1.0-7 [8,941 kB]
8,955 kB を 8秒 で取得しました (1,144 kB/s)
以前に未選択のパッケージ python-decorator を選択しています。
(データベースを読み込んでいます ... 現在 179465 個のファイルとディレクトリがインストールされています。)
.../python-decorator_4.3.0-1.1_all.deb を展開する準備をしています ...
python-decorator (4.3.0-1.1) を展開しています...
以前に未選択のパッケージ python-scipy を選択しています。
.../python-scipy_1.1.0-7_armhf.deb を展開する準備をしています ...
python-scipy (1.1.0-7) を展開しています...
python-decorator (4.3.0-1.1) を設定しています ...
python-scipy (1.1.0-7) を設定しています ...

なんだかインストールできた感じがする。再びRUNするも、結果は同じ。Scipy Moduleが無いといってくる。そこでpipでのインストールを実行した。

pi@raspberrypi:~ $ sudo pip install scipy
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting scipy
Downloading https://www.piwheels.org/simple/scipy/scipy-1.6.1-cp37-cp37m-linux_armv7l.whl (62.0MB)
100% |████████████████████████████████| 62.0MB 7.3kB/s
Collecting numpy>=1.16.5 (from scipy)
  Downloading https://www.piwheels.org/simple/numpy/numpy-1.20.1-cp37-cp37m-linux_armv7l.whl (11.6MB)
    100% |████████████████████████████████| 11.6MB 39kB/s
Installing collected packages: numpy, scipy
  Found existing installation: numpy 1.16.2
    Not uninstalling numpy at /usr/lib/python3/dist-packages, outside environment /usr
    Can't uninstall 'numpy'. No files were found to uninstall.
Successfully installed numpy-1.20.1 scipy-1.6.1

なんだか既にインストールされているnumpyとして1.16.2があるけれどアンインストールできなかったと言ってる。でも1.20.1は無事インストールできたようだ。結果を見る限りなんだかよい感じだ。そこで再びRUNを実行してみた。結果はエラー。。。。

Traceback (most recent call last):
File "/usr/local/lib/python3.7/dist-packages/numpy/core/__init__.py", line 22, in <module>
from . import multiarray
File "/usr/local/lib/python3.7/dist-packages/numpy/core/multiarray.py", line 12, in <module>
from . import overrides
File "/usr/local/lib/python3.7/dist-packages/numpy/core/overrides.py", line 7, in <module>
from numpy.core._multiarray_umath import (
ImportError: libf77blas.so.3: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/pi/raspi/study/filter-test.py", line 2, in <module>
import numpy as np
File "/usr/local/lib/python3.7/dist-packages/numpy/__init__.py", line 145, in <module>
from . import core
File "/usr/local/lib/python3.7/dist-packages/numpy/core/__init__.py", line 48, in <module>
raise ImportError(msg)
ImportError:

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

* The Python version is: Python3.7 from "/usr/bin/python3.7"
* The NumPy version is: "1.20.1"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: libf77blas.so.3: cannot open shared object file: No such file or directory

>>>

どうもlibf77blas.so.3が無いって言っている。先人の知恵に学ぶとlibatlas-base-devをインストールすれば解決するらしい。

pi@raspberrypi:~ $ sudo apt install libatlas-base-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libexiv2-14 libgfortran3 libgmime-2.6-0 uuid-dev
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
libatlas3-base
提案パッケージ:
libatlas-doc liblapack-doc
以下のパッケージが新たにインストールされます:
libatlas-base-dev libatlas3-base
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 1 個。
5,365 kB のアーカイブを取得する必要があります。
この操作後に追加で 32.1 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf libatlas3-base armhf 3.10.3-8+rpi1 [2,399 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libatlas-base-dev armhf 3.10.3-8+rpi1 [2,966 kB]
5,365 kB を 2秒 で取得しました (2,200 kB/s)
以前に未選択のパッケージ libatlas3-base:armhf を選択しています。
(データベースを読み込んでいます ... 現在 180480 個のファイルとディレクトリがインストールされています。)
.../libatlas3-base_3.10.3-8+rpi1_armhf.deb を展開する準備をしています ...
libatlas3-base:armhf (3.10.3-8+rpi1) を展開しています...
以前に未選択のパッケージ libatlas-base-dev:armhf を選択しています。
.../libatlas-base-dev_3.10.3-8+rpi1_armhf.deb を展開する準備をしています ...
libatlas-base-dev:armhf (3.10.3-8+rpi1) を展開しています...
libatlas3-base:armhf (3.10.3-8+rpi1) を設定しています ...
update-alternatives: /usr/lib/arm-linux-gnueabihf/libblas.so.3 (libblas.so.3-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/libblas.so.3 を使います
update-alternatives: /usr/lib/arm-linux-gnueabihf/liblapack.so.3 (liblapack.so.3-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so.3 を使います
libatlas-base-dev:armhf (3.10.3-8+rpi1) を設定しています ...
update-alternatives: /usr/lib/arm-linux-gnueabihf/libblas.so (libblas.so-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/libblas.so を使います
update-alternatives: /usr/lib/arm-linux-gnueabihf/liblapack.so (liblapack.so-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so を使います
libc-bin (2.28-10+rpi1) のトリガを処理しています ...
pi@raspberrypi:~ $

インストールが無事完了。再度RUNを実行したところimportは無事成功し期待するようにコードが実行された。

めでたし、めでたし。

ところで、apt-getとpipは何が違うのか。aptはシステム環境、pipは個別環境にインストールされるということでインストール先が違うらしい。またインストール元(リポジトリ)が異なる。すくなくともIDLEのRUN環境ではpipのインストール先を見に行っているんだろうとは思う。結果を左右したのはそのくらいなのだろうか。。。。

 

« 2021年2月 | トップページ | 2021年4月 »