Hobby Lab 趣味のモノ作り実験のサイトです。
Software OS RaspberryPi IO試験
1.準備
 (1)動作したいディバイス
 (2)I/Oの設定概要
2.I/Oを使う
 (1)動作確認用の回路
 (2)GPIOの準備
 (3)ターミナルから出力制御
 (4)ターミナルから入力制御
 (5)PHPで動作確認するには
 (6)PHPで動作確認
3.1-wireを使う
 (1)1-wireの設定
 (2)モジュール追加確認
 (3)1-wireの接続
 (4)接続Pin変更方法
 (5)動作確認
4.I2Cを使う>
 (1)I2cツール導入
 (2)RaspberryPiの設定
 (3)RaspberryPiに接続
 (4)コマンドで動作確認
5.UARTを使う
 (1)シリアルポートの接続
 (2)RaspberryPiの設定
 (3)パソコン側にソフトのインストール
 (4)TeraTermの設定
 (5)接続方法
  a.コンソールを使用する
  b.コンソールを使用しない

Sf:OS関係
SfO:Mint 関係
 PCへMint導入
 アプリ導入
 その他1
 アイコンを作る
SfO:Ubuntu 関係
 PCへUbuntu導入
 アプリ導入
SfO:RaspberryPi 関係
はじめに
 RaspberryPiへOS導入
 アプリ導入
 Programming
シェル・コマンド関係
 LXTerminal
 sed
 i2ctools
I/O・アプリ関係
 RealVNCとViewer
 IO動作確認
 MySQL
 Python
 raspberrypiハード
Sf:Server 関係
SfS:レンタルサーバー
 CORE-X
SfS:Windowsサーバー
 XAMPPの概要と導入
 Note XAMPP
 Note XAMPP Err
 Note Apache
 Note PHP
 Note MyQSL
Sf:Programming関係
C 関係
 C言語でプログラムミング
Python 関係
はじめに
 RaspberryPi開始
 Windows開始
共通事項
 プログラミングNote
 パッケージ導入 pip
 標準ライブラリ
 Serialライブラリ
 SMBusライブラリ
HTML関係
 開始とNote
Sf:IDE 開発環境
SfI:STM32
 STM32CubeIDEでプログラム
 HALと直接レジスター操作の速度
SfI:CH32
 MounRiver Studioでプログラム
SfI:Arduino
各ボード毎の設定
 Uno 設定
 Mega2560 設定
 DUE_CH340 設定
 ESP_WROOM02 設定
 ESP12F_D1mini 設定
 ESP32 設定
 CH32V 設定
ライブラリー
 OneWire使い方
その他
 日本語リファレンス(外部リンク)
 WiFi Macアドレスを調査
Sf:AP アプリ関係
SfA:エディタ
SfA:回路図CAD
SfA:回路シミュレータ
 シミュレーションの設定
 色の設定
 電源設定設定
SfA:リモートソフト
Sf:Pt プロトコル関係
SfPt:MODBUS
Sf:Otgers その他

1.準備

(1)動作させたいデバイス

①I2C
 ADS1115(A/D)
 INA228(電流・電圧)
 BME280(温度・気圧・湿度)
 DS3231(時計)
 GY302(光度)
 GM009696(ディスプレイ)
②1-Wire
 DS18B20
③シリアル
 ModBus 電力量計
④I(装置状態)
 負荷の状態(太陽光発電か商用電源)
⑤O(装置制御)
 電源供給制御(太陽光発電か商用電源、インバータの動作)

「RaspberryPiの設定」に以上のインターフェースの設定が有ったがどんな関係か次に記載する。

(2)RaspberryPiのI/O設定概要

a.RaspberryPiの設定画面による設定
 RaspberryPiのメニューから『設定』『RaspberryPiの設定』を選択して『RaspberryPiの設定』を左クリックする。


 『RaspberryPiの設定』が表示されるので、『RaspberryPiの設定』の上メニュー「インターフェース」を選択すると下記画面になる
 右側のスイッチを操作して使用するインターフェースの使用を選択して[OK]を左クリックすると使用できる。


b.各項目の説明とコマンドによる設定
設定項目 説明(コマンドライン入力の場合も記載)
SSH ラズベリーパイに対するSSHを使用したリモートアクセスを有効/無効にします。
SSHで別のコンピュータからラズベリーパイにコマンドラインでリモートアクセスすることができます。 無効にしておくと起動時にSSHサービスが開始せず、リソースを解放できることになります。 SSHの使用についてはこちらを読んでください。 SSHはデフォルトでは有効になっていることに気を付けてください。 公共のネットワークからラズベリーパイに直接接続する場合には、全てのユーザーに安全なパスワードを設定しない限りSSHは無効にした方が良いでしょう。
コマンドラインの場合
$ sudo raspi-config nonint do_composite <0/1>
 0: 有効にする   1: 無効にする
VNC WayVNC または RealVNC 仮想ネットワーク コンピューティング サーバーを有効または無効にします。
コマンドラインの場合
$ sudo raspi-config nonint do_vnc <0/1> <0/1>
 0: 有効にする   1: 無効にする
SPI SPIインターフェースとSPIカーネルモジュールの自動読み込みを有効/無効にします。PiFaceのような製品が必要になります。
コマンドラインの場合
$ sudo raspi-config nonint do_spi <0/1>
 0: 有効にする   1: 無効にする
I2C I2CインターフェースとI2Cカーネルモジュールの自動読み込みを有効/無効にします。
コマンドラインの場合
$ sudo raspi-config nonint do_i2c <0/1>
 0: 有効にする   1: 無効にする
シリアル
ポート
シリアル接続ハードウェアを有効または無効にします。
コマンドラインの場合
$ sudo raspi-config nonint do_serial_hw <0/1/2>
 0: 有効にする   1: 無効にする
シリアル
コンソール
シリアル接続でシェルおよびカーネル メッセージを有効または無効にします。
コマンドラインの場合
$ sudo raspi-config nonint do_serial_cons <0/1/2>
 0: 有効にする   1: 無効にする
1-Wire DS18B20 温度センサーでよく使用される Dallas 1 線式インターフェースを有効または無効にします。
コマンドラインの場合
$ sudo raspi-config nonint do_onewire <0/1>
 0: 有効にする   1: 無効にする
リモート
GPIO
GPIO ピンへのリモート アクセスを有効または無効にします。
コマンドラインの場合
$ sudo raspi-config nonint do_rgpio <0/1>
 0: 有効にする   1: 無効にする




2.I/O (装置状態/装置制御) を使う

(1)動作確認用の回路

RaspberryPiの定格
 1.端子最大 16mA
 2.全端子合計電流 50mA
今回の回路
 今回はGPIO17でLEDを点灯させます。
 LEDは「L-513LET」(赤)を使用します。
 ここでR1の値を決めます.


 以上から  R1 = ('3.3-2.1) / 0.005 = 240 (Ω)

(2)GPIOを使用するための準備

「リモートGPIO」をONに設定する


(3)LXTerminalから出力制御

GPIOに関係するディレクトリ「/sys/class/gpio」をファイルマネジャーで開いてみます。


①.今回LEDを点灯するインターフェースgpio17を使用できるようにRaspberryPiの端末エミュレータから下記の様に入力します。
tryday@tryday~ $ echo 17 > /sys/class/gpio/export
上記はechoコマンドのリダイレクト機能を使用し、ファイル名「export」に「17」を書き込んでいます。
書き込まれたことにより、書き込んだNoの「gpio17」のディレクトリーおよびその中には下記ファイルマネジャーに示すディレクトリおよびファイルが作成されます。
なお今回どうやって作成しているかは調査しません。
GPIO17のディレクトリーが作成されましたがその中にこれから関係するファイルについて「direction」、「value」を開いてみる。
「direction」は in 「value」は 0 になっていることが判る。


②.以下により「direction」ファイルの内容を OUT にします。
tryday@tryday~ $ echo 17 > /sys/class/gpio/gpio17/direction

③-1.出力をHiにするため valueファイルに1を書込む
tryday@tryday~ $ echo 1 > /sys/class/gpio/gpio17/value

valueに1が書込まれると点灯

③-2.出力をLoにするためvalueファイルに0を書込む
tryday@tryday~ $ echo 1 > /sys/class/gpio/gpio17/value

valueに0が書込まれると消灯

④.最後にGPIO17ピンの制御を終了する
tryday@tryday~ $ echo 17 > /sys/class/gpio/unexport
ディレクトリー 「gpio17」 が無くなりました。

                ↓


(4)LXTerminalから入力制御

入力ピンは先ほどの出力ピンと同じGPIO17を使用して印加する電圧はPinNo1の3.3(V)を使用します。
出力制御と同じRaspberryPiの端末エミュレータから下記の様に入力します。
そして入力 GPIO17の状態はvalueファイルの内容を読取ることにより0又は1が書込まれます。
このため出力制御で使用したeche では無く cat コマンドを使用してファイルの中身を見ます。

①.GPIO17を使用できるようにします。
tryday@tryday~ $ echo 17 > /sys/class/gpio/export
 ディレクトリー 「gpio17」が作成され、必要なファイルも作成されました。

②.I/Oを入力に設定します。
tryday@tryday~ $ echo in > /sys/class/gpio/gpio17/direction
 ディレクトリー 「direction」のファイルにinが書かれました。
 ディレクトリーとファイルは以下の通り

GPIO17に電圧を印加するのは写真の白線でRaspberryPi側のPinNo1番(3.3V)から取っている。

③-1.電圧を印加してない状態で入力内容を確認します
tryday@tryday~ $ cat /sys/class/gpio/gpio17/value
0


電圧印加していない状態

③-2.電圧を印加した状態で入力内容を確認する。
tryday@tryday~ $ cat /sys/class/gpio/gpio17/value
1


電圧を印加した状態
④.最後にGPIO17ピンの制御を終了する
tryday@tryday~ $ echo 17 > /sys/class/gpio/unexport
 ディレクトリー 「gpio17」が無くなりました。

(5)PHPで動作させるには

PHPには、Linuxのコマンドをラップした関数群がたくさんあります。例えば、cdや、pwdなどもそうです。
Linuxのcdコマンドは、PHPではchdir()になり、
Linuxのpwdコマンドは、PHPではgetcwd()になります。
しかし入出力で使用した「echo」「cat」は下記の方法で使用します。

PHPからシェルコマンドを実行させる方法
コマンド ステータス※ 実行結果の取得 備    考
exec() オールマイティ
shell_exec() × 一番スタンダード
passthru() × 画像などの出力に使用
実行演算子 × shell_exec()と同じ
※ステータス:コマンドがどんな状態で終了したか示す値で一般的には正常動作で「0」以外は異常終了です。
ものによるが、-255~+255の整数が設定されているようです。

コマンドとその内容
コマンド 内  容
exec() コマンドの実行結果が全部必要で、かつ、exitステータスも必要な場合
shell_exec() コマンドの実行結果が全部必要だが、exitステータスは不要な場合
passthru() コマンドの実行結果を取得する必要がない(実行結果を直接ブラウザに出力する)

join(separator,array) この関数は 変数特に配列変数 array の文字列の最後に separator の内容を連結します。
配列の場合は、複数の各文字列最後に separator の内容を連結します。
PHPからHTMLに改行を付加した文字列を渡す場合にはjoin("<br />",$result);と書きます。

(6)PHPで動作確認

gpio17 を出力として gpio16を入力とする。
tryday@tryday~/www/html/cgi-bin $ echo out > /sys/class/gpio/gpio17/direction
tryday@tryday~/www/html/cgi-bin $ echo 16 > /sys/class/gpio/export
tryday@tryday~/www/html/cgi-bin $ echo in > /sys/class/gpio/gpio16/direction
gpio17とgpio16を電線で接続する。
プログラムはgpio17に出力させ、gpio16でその出力状態を表示する。

ファイル名 gpio.php
<?php
exec('echo 0 > /sys/class/gpio/gpio17/value', $result, $status);
if( $status ){
throw new Exception("Error!! ($status)");
}

exec('cat /sys/class/gpio/gpio16/value', $result, $status);
if( $status ){
throw new Exception("Error!! ($status)");
}
echo join("<br/>", $result);
gpio.phpを実行させる。
tryday@tryday~/www/html/cgi-bin $ php gpio.php
0

tryday@tryday~/www/html/cgi-bin $




3.1ワイヤー 温度センサー DS18B20 を使う


(1)の1-Wire(DS18B20)の設定



設定を変更する。


設定で[OK]をクリックするとRaspberryPiの再起動を聞いてくるので、再起動を行ってください。

(2)起動後のモジュールリスト確認

tryday@tryday~ $ lsmodBR> tryday@tryday~ $
追加されたモジュール
ModuleSizeUsed by
w1_gpio163840
wire409601 w1_gpio
cn163841 wire

  (3)RaspberryPiにDC18B20を接続




  (4)RaspberryPiのPinNoの変更方法

温度検出の信号線を接続するデフォルトピンはGPIO=4 PinNo=7だが変更する場合は /boot/config.txt は下記の様になっていると思う。
[all]
dtoverlay=w1-gpio
GPIO4をGPIO17へ変更する場合は下記の様に変更する。
[all]
dtoverlay=w1-gpio,gpiopin=17
に変更したら登録する。

  (5)RaspberryPiの動作確認

測定結果のファイルの有無確認 
tryday@tryday:~ $ ls -l /sys/bus/w1/devices/
合計 0
lrwxrwxrwx 1 root root 0 11月 4 19:56
28-01211257a758 -> ../../../devices/w1_bus_master1/28-01211257a758
lrwxrwxrwx 1 root root 0 11月 4 19:44
w1_bus_master1 -> ../../../devices/w1_bus_master1
tryday@tryday:~ $
今回は1個接続したので 1個[28-01211257a758]が作成されている。

ファイルの概要
 t=は1000倍の値になっている。
 2回目の温度測定値:1回目測定後に温度素子を手で触り温度を上昇させた。




4.I2Cを使う


出来るだけ簡単にするため新たにインストールはしない方向で進める
今回はインストールされているi2c-toolsコマンドを使用する。

(1)I2Cのツールをインストールする。

 最初からインストールされていた。
tryday@tryday~ $sudo apt-get update
ヒット:1 https://packages.sury.org/php bullseye InRelease
ヒット:2 http://archive.raspberrypi.org/debian bullseye InRelease
ヒット:3 http://raspbian.raspberrypi.org/raspbian bullseye InRelease
パッケージリストを読み込んでいます... 完了

tryday@tryday~ $sudo apt-get install i2c-tools
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
i2c-tools はすでに最新バージョン (4.2-1+b1) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 122 個。
i2cの制御用コマンドi2c-toolsの概要
No コマンド 内    容 manページ
eeprog ※ I2C シリアル バスに接続された 24Cxx EEPROM の読み取りと書き込みを行います。
i2cdetect I2Cに接続されている機器を検出しID番号を表示する i2cdetect(8)
i2cdump I2Cに接続されているレジスタを調べます i2cdump(8)
i2cget I2C/SMBus チップ レジスタから読み取ります。 i2cget(8)
i2cset I2Cレジスタを設定します。 i2cset(8)
i2ctransfer 1 回の転送でユーザー定義の I2C メッセージを送信します。 i2ctransfer(8)
※①についてはコマンドを実行しても「コマンドが見つかりません」とメッセージされます。
tryday@tryday~ $ eeprom
bash: eeprom: コマンドが見つかりません


(2)RaspberryPiの設定画面でI2CをONにする。




(3)接続 ADS1115の例

  SDA,SCLは抵抗 3.3kΩ を 3.3V 回路に接続(プルアップ) すること。
接続端子
接続回路

(4)コマンドで動作確認

a.i2cdetectを使用したI2Cに接続されている機器を検出しID番号を表示させる

ADS1115をI2Cに接続状況
注意
 ADS1115のSCL,SDAプルアップ抵抗を外すこと。
tryday@tryday~ $ i2cdetect -y 1
  0 1 2 3 4 5 6 7 8 9 a  b c  d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

tryday@tryday~ $
検索するIDアドレス範囲を指定(例 0x40~0x52)する場合は
tryday@tryday~ $ i2cdetect -y 1 0x40 0x52
  0 1 2 3 4 5 6 7 8 9 a  b c  d e f
00:
10:
20:
30:
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- --
60:
70:

tryday@tryday~ $
以上のコマンドから「i2cget」と「i2cset」を使用してI2Cの部品動作を確認します。

b.「i2cget」と「i2cset」を使い動作確認する
1V又は4Vを入力電圧として印加し動作確認を行った。
① A0の入力電圧確認
tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3c3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x2c1f

tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3c3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x057d
1(V) 0x2c1f ->0x1f2c ->DEC変換7980ー>×125μ= 0.9975(V)
4(V) 0x057d= 4.000625(V)

②A1の入力電圧確認
tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3d3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x271f

tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3d3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x087d
1(V) 0x271f = 0.996875(V)
4(V) 0x087d = 4.001(V)

③A2の入力電圧確認
tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3e3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x2d1f

tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3e3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x037d
1(V) 0x271f = 0.997375(V)
4(V) 0x037d = 4.000375(V)

④A3の入力電圧確認
tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3f3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x301f

tryday@tryday~ $ i2cset -y 1 0x48 0x01 0xe3f3 w
tryday@tryday~ $ i2cget -y 1 0x48 0x00 w
0x027d
1(V) 0x301f = 0.998(V)
4(V) 0x027d = 4.00025(V)

動作確認状況





 5.UARTを使う

今回はRaspberryPiのシリアル信号をパソコンのUSBに接続して確認する。
RaspberryPiはシリアル(UART)信号なので変換IC CP2102を使用してパソコンのUSBに接続する。
パソコン側にこのCP2102ドライバーがインストールされていない場合は ここをクリックしてインストールする
シリアル信号の送受信には各々ターミナルソフトを使用します。
パソコン側は TeraTerm と言うソフトを使用する。
●最初にパソコンからシリアルコンソールでRaspberryPiのシェルにアクセスします。
 (コンソールとは入出力装置を意味する)
 次にシリアルコンソールによる接続をやめ、
●RaspberryPi側はGtk Termと言うソフトを使用しタームソフト相互による通信を確認する。

 (1)シリアルポートの接続



RaspberryPi 線色 USB-シリアル変換器
6  GND GND
8   GPIO14 TxD RXD
10 GPIO15 RxD TxD

(2)RaspberryPiの設定

 
 シリアルポートとシリアルコンソールがONになっていることを確認する。

(3)パソコン側にソフトのインストール

パソコン側にはTeraTerm をインストールする。
窓の杜でTeraTerm v5.3をダウンロードした。

(4)TeraTermの設定

インストールしたTeraTermを起動して[設定]、[シリアルポート]でスピードを115200と設定
スピード以下のデータを確認して設定を終わると次の画面になる

(5)接続方法

 RaspberryPiに接続する方法は2つある
 下記を選んでください。
  ①f-1 RaspberryPiのコンソールを使用する
  ②f-2 RaspberryPiのコンソールを使用しない

a.RaspberryPiのコンソールを使用する
 設定したユーザー名とパスワードを入力し、シェル画面になり
 tryday@tryday:~$  まで表示された後
 exit            と入力すると
ログアウトとなり、再度ログインのメッセージが表示する。
この事により、シリアル機能が動作していることが確認出来た。

上記のログインが出来れば UART で送受信が出来たことになる。

これで確認完了!

b.RaspberryPiのコンソールに接続しない場合
(a)RaspberryPiの設定

シリアルコンソールを OFF にする。
モジュールの変化は無い。

(b)RaspberryPiに通信ソフトのインストール
パソコンとRaspberryPiともにターミナルソフトで通信出来る事を確認するため、RaspberryPiにターミナルソフト Gtkterm をインストールする。
tryday@tryday~ $sudo apt install gtkterm

tryday@tryday~ $
メニューのアクセサリーにSerial port teminal が追加されている。


Serial port teminal を起動した場合には
接続するPortが無いというメッセージが表示されたので下記port設定画面で /dev/ttyAMA0 と記載し[OK]をリックした。


①パソコン(送信) ⇒ RaspberryPi(受信)
パソコンのTeraTermを起動してパソコンのTeraTermからキーボード入力するとRaspberryPiのSerial port teminal に入力した文字が表示される。
下は try-day.com とパソコン側から入力した場合を示す。
------ パソコン側 TeraTerm ------
--- RaspberryPi側 teminal ---
try-day.com と入力するが
パソコン側は表示しない。
パソコンのキーボード入力と同時にその文字が Serial port teminal に表示した。

②RaspberryPi(送信) ⇒ パソコン(受信)
先ほどパソコンから入力した文字がTeraTermに表示されなかたが、「ローカルエコー」を使用すると文字が画面上に表示する。
今回はパソコン と RaspberryPi 側共に「ローカルエコー」を使用する。
今度は RaspberryPi側のキーボードから Serial port teminalを使用して通信する。
------ パソコン側 TeraTerm ------
--- RaspberryPi側 teminal ---
キーボードで Local echo ON と入力した文字が表示される。
文字入力後[改行]を押した場合はカーソルが最初の文字へ移動した。
RaspberryPiのSerial port teminal も同様に文字が表示され、[改行]を押した場合はカーソルが始めの文字へ移動する。

以上でシリアルの動作確認はOKで完了とする。

これで確認完了!

更新日 2025/11/25 19:37  管理者 平林 剛Hirabayashi Takeshi