カテゴリー
Raspberry Pi 電子工作

備忘録 1.3inch OLED HAT

 これは自分のためのメモです。
 この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
 また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。


Waveshafe 1.3inch OLED HAT wiki

wikiに倣い、config.txtを修正する。

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on ← コメントアウトを外す
#dtparam=i2s=on
dtparam=spi=on ← コメントアウトを外す

check whether SPI is occupied. If the terminal outputs /dev/spidev0.1 and /dev/spidev0.1, SPI is not occupied.

$ls /dev/spi*


ライブラリーのインストール
BMC2835関係のみ必要。(wikiにあるWiringPiは不要)
ここで最新を確認する。

2023年9月22日時点で バージョン1.73

#Open the Raspberry Pi terminal and run the following command
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.73.tar.gz
tar zxvf bcm2835-1.73.tar.gz
cd bcm2835-1.73/
sudo ./configure && sudo make && sudo make check && sudo make install
# For more information, please refer to the official website: http://www.airspayce.com/mikem/bcm2835/

Pythonのライブラリーをpipインストールする
#python3
sudo apt-get update
sudo apt-get install python3-pip 
sudo pip3 install RPi.GPIO
sudo apt-get install python3-smbus
sudo pip3 install spidev

waveshare提供のサンプルプログラムをダウンロード


sudo apt-get install p7zip-full
wget https://files.waveshare.com/upload/5/53/1.3inch-OLED-HAT-Code.7z
7zr x 1.3inch-OLED-HAT-Code.7z -r -o.
sudo chmod 777 -R  RaspberryPi

サンプルプログラムの実行
cd RaspberryPi/python3/
sudo python3 main.py
sudo python3 key_demo.py

IPアドレスとCPU温度を表示させる。

sudo pip3 install ipget

test.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-

import SH1106
import time
import config
import traceback
import ipget

from PIL import Image,ImageDraw,ImageFont

tempfile='/sys/class/thermal/thermal_zone0/temp'

def getTemp():
    with open(tempfile, 'r') as f:
        rdata = f.readline()
        t = float(rdata)/ 1000.0
    return  t

target_ip = ipget.ipget()
print(target_ip.ipaddr("wlan0"))
wlan_ip = target_ip.ipaddr("wlan0")

t = getTemp()
cputemp = 'cputemp=%.2f C' % (t)


try:
    disp = SH1106.SH1106()

    print("\r\r1.3inch OLED")
    # Initialize library.
    disp.Init()
    # Clear display.
    disp.clear()

    # Create blank image for drawing.
    image1 = Image.new('1', (disp.width, disp.height), "WHITE")
    draw = ImageDraw.Draw(image1)
    font = ImageFont.truetype('Font.ttf', 20)
    font10 = ImageFont.truetype('Font.ttf',13)
#    print ("***draw line")
#    draw.line([(0,0),(127,0)], fill = 0)
#    draw.line([(0,0),(0,63)], fill = 0)
#    draw.line([(0,63),(127,63)], fill = 0)
#    draw.line([(127,0),(127,63)], fill = 0)
#    print ("***draw rectangle")

    print ("***draw text")
#    draw.text((30,0), 'Waveshare ', font = font10, fill = 0)
    draw.text((0,0), wlan_ip, font = font10, fill = 0)
    draw.text((0,20), cputemp, font = font10, fill = 0)
#    draw.text((28,20), u'あいうえ ', font = font, fill = 0)

    # image1=image1.rotate(180)
    disp.ShowImage(disp.getbuffer(image1))
    time.sleep(2)

    print ("***draw image")
#    Himage2 = Image.new('1', (disp.width, disp.height), 255)  # 255: clear the frame
#    bmp = Image.open('pic.bmp')
#    Himage2.paste(bmp, (0,5))
#    # Himage2=Himage2.rotate(180)
#    disp.ShowImage(disp.getbuffer(Himage2))

except IOError as e:
    print(e)

except KeyboardInterrupt:
    print("ctrl + c:")
    epdconfig.module_exit()
    exit()

1分毎にに自動更新で表示するようにcrontab -eで編集する

@reboot sleep 20 ; sudo /usr/bin/touch /tmp/amedas ; sudo /usr/bin/chmod 660 /tmp/amedas ;
 cd /home/pi ; /usr/bin/sudo /usr/bin/python3 amedas.py
@reboot sleep 30 ; cd /home/pi/RaspberryPi/python3 ; /usr/bin/sudo /usr/bin/python3 test.py
*/10 * * * * cd /home/pi ; /usr/bin/sudo /usr/bin/python3 amedas.py
*/1 * * * * cd /home/pi/RaspberryPi/python3 ; /usr/bin/sudo /usr/bin/python3 test.py

load averageも表示されてみる

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import SH1106
import time
import config
import traceback
import ipget

from PIL import Image,ImageDraw,ImageFont

tempfile='/sys/class/thermal/thermal_zone0/temp'
loadfile='/proc/loadavg'

def getTemp():
    with open(tempfile, 'r') as f:
        rdata = f.readline()
        t = float(rdata)/ 1000.0
    return  t

def getCpuload():
    with open(loadfile, 'r') as la:
        rdata = la.readline()
        la = rdata
    return  la

target_ip = ipget.ipget()
wlan_ip = target_ip.ipaddr("wlan0")

t = getTemp()
cputemp = 'cputemp=%.2f C' % (t)

la = getCpuload()
la_list = la.split()
cpuload = 'loadave=' + la_list[0] + ' ' + la_list[1] + ' ' + la_list[2]

try:
    disp = SH1106.SH1106()

    print("\r\r1.3inch OLED")
    # Initialize library.
    disp.Init()
    # Clear display.
    disp.clear()

    # Create blank image for drawing.
    image1 = Image.new('1', (disp.width, disp.height), "WHITE")
    draw = ImageDraw.Draw(image1)
    font = ImageFont.truetype('Font.ttf', 20)
    font10 = ImageFont.truetype('Font.ttf',10)

    print ("***draw text")
    draw.text((0,0), wlan_ip, font = font10, fill = 0)
    draw.text((0,15), cputemp, font = font10, fill = 0)
    draw.text((0,30), cpuload, font = font10, fill = 0)

    disp.ShowImage(disp.getbuffer(image1))
    time.sleep(2)


except IOError as e:
    print(e)

except KeyboardInterrupt:
    print("ctrl + c:")
    epdconfig.module_exit()
    exit()

何故かハマり、先人のお知恵で解決

sudo apt-get install libatlas3-base

アメダスの津地域情報を採取する。
名張では気温情報が無くてハマった。

$sudo touch /var/log/amedas
$sudo chmod 666 /var/log/amedas
 

$ cat amedas.py
#!/usr/bin/env python3
import sys
import requests

from datetime import datetime, timedelta


def get_code(name, name_type='enName'):
    area = requests.get("https://www.jma.go.jp/bosai/amedas/const/amedastable.json").json()
    for code in area:
        if area[code][name_type] == name:
            return code
    else:
        return None


def get_json(datetime_str, code):
    return requests.get(f"https://www.jma.go.jp/bosai/amedas/data/map/{datetime_str}.json").json()[code]


def get_data(code, datetime_str=None):
    if not datetime_str:
        datetime_str = datetime.now().strftime('%Y%m%d%H0000')
        try:
            data = get_json(datetime_str, code)
        except Exception:
            # try to get previous data
            datetime_str = (datetime.now() - timedelta(hours=1)).strftime('%Y%m%d%H0000')
            data = get_json(datetime_str, code)
    else:
        data = get_json(datetime_str, code)
    return data


if __name__ == '__main__':
    try:
        conf = {'area': 'Tsu', 'log': '/tmp/amedas'}
        if len(sys.argv) > 1:
            with open(sys.argv[1]) as f:
                for line in f.readlines():
                    key_value = line.rstrip().split('#')[0].split('=')
                    if len(key_value) != 2:
                        continue
                    conf[key_value[0]] = key_value[1]
        code = conf.get('code', get_code(conf['area']))
        print (code)
#        code = 53151
#        print (code)
        data = get_data(code)
        print (data)
        with open(conf['log'], 'w') as f:
            f.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {data['temp'][0]} {data['humidity'][0]}")
    except KeyboardInterrupt:
        pass

 $ cat RaspberryPi/python3/test.py
#!/usr/bin/python3
# -*- coding:utf-8 -*-

import SH1106
import time
import config
import traceback
import ipget

from PIL import Image,ImageDraw,ImageFont

tempfile='/sys/class/thermal/thermal_zone0/temp'
loadfile='/proc/loadavg'
amedasfile='/tmp/amedas'

def getTemp():
    with open(tempfile, 'r') as f:
        rdata = f.readline()
        t = float(rdata)/ 1000.0
    return  t

def getCpuload():
    with open(loadfile, 'r') as la:
        rdata = la.readline()
        la = rdata
    return  la

def getAmedas():
    with open(amedasfile, 'r') as la:
        rdata = la.readline()
        la = rdata
    return  la

target_ip = ipget.ipget()
wlan_ip = target_ip.ipaddr("wlan0")

t = getTemp()
cputemp = 'cputemp  %.2f C' % (t)

la = getCpuload()
la_list = la.split()
cpuload = 'loadave  ' + la_list[0] + '  ' + la_list[1] + '  ' + la_list[2]

la = getAmedas()
ame_list = la.split()
amedas = 'Mie Tsu  ' + ame_list[2] + 'C  ' + ame_list[3] + '%'

try:
    disp = SH1106.SH1106()

    print("\r\r1.3inch OLED")
    # Initialize library.
    disp.Init()
    # Clear display.
    disp.clear()

    # Create blank image for drawing.
    image1 = Image.new('1', (disp.width, disp.height), "WHITE")
    draw = ImageDraw.Draw(image1)
    font = ImageFont.truetype('Font.ttf', 20)
    font10 = ImageFont.truetype('Font.ttf',10)

    print ("***draw text")
    draw.text((0,0), wlan_ip, font = font10, fill = 0)
    draw.text((0,15), cputemp, font = font10, fill = 0)
    draw.text((0,30), cpuload, font = font10, fill = 0)
    draw.text((0,45), amedas, font = font10, fill = 0)

    disp.ShowImage(disp.getbuffer(image1))
    time.sleep(2)


except IOError as e:
    print(e)

except KeyboardInterrupt:
    print("ctrl + c:")
    epdconfig.module_exit()
    exit()
カテゴリー
Raspberry Pi 測定器 電子工作

保護中: 備忘録 Raspberry PI UNI-Tコントロール手始め

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

カテゴリー
Raspberry Pi 電子工作

備忘録 pythonプログラム 対数の等間隔(logspace)

 これは自分のためのメモです。
 この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
 また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。


合ってるかな?

pi@raspberrypi:~$ cat logspace_test.py
#!/usr/bin/python3

import numpy as np

print(np.logspace(1,5,num=20,endpoint=True,base=10))

pi@raspberrypi:~$ ./logspace_test.py
[1.00000000e+01 1.62377674e+01 2.63665090e+01 4.28133240e+01
 6.95192796e+01 1.12883789e+02 1.83298071e+02 2.97635144e+02
 4.83293024e+02 7.84759970e+02 1.27427499e+03 2.06913808e+03
 3.35981829e+03 5.45559478e+03 8.85866790e+03 1.43844989e+04
 2.33572147e+04 3.79269019e+04 6.15848211e+04 1.00000000e+05]
カテゴリー
Raspberry Pi 電子工作

備忘録 Raspberry PI シリアルコンソール

 これは自分のためのメモです。
 この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
 また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。


[Raspberry PI zero]

/boot/config.txt
修正不要

/boot/cmdline.txt
修正不要

[Raspberry PI zero W]

/boot/config.txt 最終行へ
enable_uart=1

/boot/cmdline.txt rootwaitの後ろへ
modules-load=dwc2,g_serial

[Raspberry PI 4B]

/boot/config.txt
enable_uart=1

/boot/cmdline.txt
console=serial0,115200
カテゴリー
Raspberry Pi 測定器 電子工作

備忘録 Raspberry PI VISA&SCPI

 これは自分のためのメモです。
 この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
 また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。


[pip pip3 インストール]
 

$sudo apt install pip -y


[pyvisa インストール]

※いろいろと先人のご苦労を拝見しては真似てやりましたが、バージョンによって少し違うみたいで、なかなか上手くできません。

一応、以下の方法は自分自身で3回構築しなおして再現性あるので大丈夫のはずです。

pip3 install pyvisa
pip3 install pyvisa-py

[USB関連インストール]

pip3 install pyusb

[usbデバイスのルール設定]

① usb アドレス確認
pi@raspberrypi:~$ lsusb
Bus 001 Device 005: ID 0bda:8152 Realtek Semiconductor Corp. RTL8152 Fast Ethernet Adapter
Bus 001 Device 004: ID 1ab1:044d Rigol Technologies DHO802
Bus 001 Device 003: ID 6656:0834 uni-trend UTG900E
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~$

※ Device 003: ID 6656:0834 uni-trend UTG900E と判明する
※ Device 004: ID 1ab1:044d Rigol Technologies DHO802 と判明する

② sudo vi /etc/udev/rules.d/99-com.rules の1行目に追加する
 先の6656:0834と1ab1:0443が重要


#UNI-T Funcrion Arvitrary Waveform Generator UTG900
SUBSYSTEMS=="usb",ACTION=="add",ATTRS{idVendor}=="6656",ATTRS{idProduct}=="0834",GROUP="usbtmc",MODE="0660"
#Rigol Technologies DHO802 Oscilloscope
SUBSYSTEMS=="usb",ACTION=="add",ATTRS{idVendor}=="1ab1",ATTRS{idProduct}=="044d",GROUP="usbtmc",MODE="0660"


③ tcbtmcの権限設定する

sudo groupadd usbtmc
sudo usermod -aG usbtmc pi

④ 必ずrebootする

sudo reboot


[]
・visaアドレス確認

pi@raspberrypi:~$ python
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyvisa as visa
>>> r = visa.ResourceManager()
>>> print(r.list_resources())
('USB0::6833::1101::DHOxxxxxxxx::0::INSTR','USB0::26198::2100::89xxxxxx::0::INSTR')



・scpiコマンド *IDN? 実行

① test.pyを作る
pi@raspberrypi:~$ vi test.py
#! /usr/bin/python3

import pyvisa as visa

awgAddr = 'USB0::26198::2100::89xxxxxxx::0::INSTR'
dsoAddr = 'USB0::6833::1101::DHOxxxxxxx::0::INSTR'

rm = visa.ResourceManager()

instr = rm.open_resource(awgAddr)
st_q = instr.query("*IDN?")
print("AWG *IDN? = " + st_q)

instr = rm.open_resource(dsoAddr)
st_q = instr.query("*IDN?")
print("dso *IDN? = " + st_q)

②実行権限を与える
pi@raspberrypi:~$ chmod +x test.py

③実行する
pi@raspberrypi:~$./test.py
awg *IDN? = UNI-T Technologies,UTG900E,89xxxxxxx,1.09
dso *IDN? = RIGOL TECHNOLOGIES,DHO802,DHOxxxxxxx,00.01.00
カテゴリー
Raspberry Pi 電子工作

備忘録 Raspberry PI OTG

 これは自分のためのメモです。
 この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
 また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。


 Raspberry PI zeroはWi-FiとLANが無いため、updateできない。
 パソコンのUSB経由でパソコンのネットワークを共有するUSB OnTheGoを利用する。

 拙のUSB-HUTの構成がこのようになっており、USB-microケーブルではORG接続できないことが判明する。
 よって、何か別の手立てを考える。


/boot 配下のconfig.txt cmdline.txt 編集する

config.txt 最下行に、以下の一文を追加する。

dtoverlay=dwc2

/boot 配下のcmdline.txtのrootwait直後に以下の一文を割り込ませる。

modules-load=dwc2,g_ether
カテゴリー
Raspberry Pi 電子工作

備忘録 Raspberry PI shutdonボタン

 これは自分のためのメモです。
 この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
 また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。


当方のRaspberry PI zeroには1.3インチ OLED ディスプレイHUTがあり、pushスイッチが3つありますので、その1つをshutdonボタンに設定します。

/boot/config.txtの最後の行に追加。

dtoverlay=gpio-shutdown,gpio_pin=16,debounce=1000
カテゴリー
Raspberry Pi 電子工作

備忘録 Raspberry PI OSインストール

 これは自分のためのメモです。
 この備忘録を見られて真似されても結構ですが、動作の保証は出来かねます。
 また、真似られたことで不測の不具合が発生しましても、私は一切の責任を負いません。


[Raspberry PI OSインストール]

2023年9月時点、ここにRaspberry PI zeroと、PI zero Wがあります。これを使っての前提です。

Raspberry PI OS Lite (32-bit)のバージョンは、
Linux raspberrypi 6.1.21+ #1642 Mon Apr 3 17:19:14 BST 2023 armv6l


[Raspberry PI console tty 設定]
 
 

むむむ、、、
昔と違って、自動的にいろいろやってくれるのか?
それともLiteを選んだから?

これは必要っぽい
/boot/config.txt
enable_uart=1

/boot/cmdline.txt
modules-load=dwc2,g_serial

raspberrypi login: pi
Password:
Linux raspberrypi 6.1.21+ #1642 Mon Apr  3 17:19:14 BST 2023 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~$ uname -a
Linux raspberrypi 6.1.21+ #1642 Mon Apr  3 17:19:14 BST 2023 armv6l GNU/Linux
pi@raspberrypi:~$
pi@raspberrypi:~$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
pi@raspberrypi:~$

[OSを最新の状態にする]
※必ずしも必要では無い

※1行づつ作業した方が良い
sudo apt update
sudo apt -y full-upgrade
sudo apt dist-upgrade -y
sudo rpi-update -y
sudo apt autoremove -y
sudo apt autoclean
sudo reboot


再起動後 6.1.21+から6.1.52+へバージョンアップしている

Raspbian GNU/Linux 11 raspberrypi ttyAMA0

raspberrypi login: pi
Password:
Linux raspberrypi 6.1.52+ #1679 Fri Sep  8 14:38:54 BST 2023 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Sep 14 12:32:44 JST 2023 on ttyAMA0

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~$ uname -a
Linux raspberrypi 6.1.52+ #1679 Fri Sep  8 14:38:54 BST 2023 armv6l GNU/Linux
pi@raspberrypi:~$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
pi@raspberrypi:~$