初版作成 2023.5.7
最終更新 2024.04.01
Raspberry Pi Imager というアプリを使う。 https://www.raspberrypi.com/software/ からダウンロードし、exe ファイルをダブルクリックすると インストールされる。 起動して「インストールする OS」「インストール先ドライブ」を 選択する。 インストール時に以下のものを設定する。 ・ユーザー名とパスワード(過去との互換性をとるなら pi) ・wifi のパスワード インストールできるラズパイ ・ラズパイ 2 以降でないと Chrome が起動しないので 初期バージョンの無印の B は実用的ではない
GUI で操作できる。 ネットワークを固定 IP に設定する。 サブネットマスクを設定する項目はない。 default router と name server は 192.168.xxx.1 に設定する。 以下のアプリをインストールする emacs telnet telnetd ftp ftpd ibus-mozc (使用前に再起動必要)
# apt install apache2 (1) ユーザーディレクトリを使えるようにする # a2enmod userdir (2) cgi を使えるようにする # cd /etc/apache2/mods-enabled # ln -s ../mods-available/cgi.load . (3) ユーザーディレクトリを html としているとき html ----> public_html のシンボリックリンクを張る $ cd $ ln -s public_html html (4) 設定ファイルの変更点 ------------- /etc/apache2/apache2.conf ------------ ServerRoot "/etc/apache2" #<Directory /home/user-name/public_html/> # AllowOverride Limit Options FileInfo AuthConfig # Options FollowSymLinks # Require all granted #</Directory> #<FilesMatch "~$"> # Require all denied #</FilesMatch> ---------- /etc/apache2/sites-available/000-default.conf -------- ServerName xxx.yyy.nara-edu.ac.jp ServerAdmin zzz@nara.edu.ac.jp を設定(省略可) Include conf-available/serve-cgi-bin.conf を確認 ---------- /etc/apache2/conf-available/serve-cgi-bin.conf -------- <IfDefine ENABLE_USR_LIB_CGI_BIN> ScriptAlias /cgi-bin/ /home/pi/public_html/cgi-bin/ <Directory "/home/pi/public_html/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Require all granted AddHandler cgi-script .py <---- ここに必要! なぜか mime.conf に書いても効かない </Directory> </IfDefine> ---------- /etc/apache2/mods-available/mime.conf ---- AddHandler cgi-script .py なぜか効かない。 (5) /var/www/html/index.html の変更 以下のように書き換える。 <html> <head> <meta http-equiv="Refresh" content="0;URL=/~pi/"> <title>top page</title> </head> <body> </body> </html> (6) apache2 の自動起動の on/off # update-rc.d -f apache2 remove 自動起動停止 /etc/rc2.d/... が削除 # update-rc.d apache2 defaults 自動起動復活 apache2 の起動 # apachectl start # apachectl stop # apachectl restart (7) ファイルのパーミッション ~/public_html/ 755 ~/public_html/index.html 644 ~/public_html/cgi-bin/ 755 ~/public_html/cgi-bin/*.py 755 (8) CGI を実行可能にする # visudo 最後に以下を付加 www-data ALL=(ALL) NOPASSWD: ALL
デフォルトでは、送信は成功するが受信で文字の欠落、 文字化けが発生する。 /boot/config.txt enable_uart=1 # raspi-config でも設定できる。
参考 http://sooch.hatenablog.com/entry/2017/03/26/061032 1. デバイス名の確認 # blkid 2. フォーマット # fdisk /dev/sda Command (m for help): d パーティション削除 Selected partition 1 Command (m for help): p 確認 Command (m for help): n パーティション作成 enter を押すとデフォルト値が入る Command (m for help): p 確認 Command (m for help): w 書き出して終了 # mkfs.ext4 /dev/sda1 enter を押すとデフォルト値が入る 3. マウント # mount /dev/sda1 /mnt /etc/rc.local に書き込む リブートした時に自動的に接続されてしまう /etc/fstab に書くより、 mount コマンドを /etc/rc.local に書く方が 良いと思う。
$ sudo apt install nfs-common <-- client $ sudo apt install nfs-kernel-server <-- server $ sudo apt install rpcbind <-- server ・クライアント ----- /etc/rc.local ----- mount -t nfs machine-name:/home/user-name/dir /home/user-name/dir -------------------------- ・サーバー ----- /etc/exports ---- /home/user-name/html macine-name(rw,sync,no_subtree_check) machine-name2(rw,sync,no_subtree_check) /etc/apache2 machine-name(rw,sync,no_subtree_check) /var/log/apache2 machine-name(rw,sync,no_subtree_check) -------- /etc/rc.local -------------- service rpcbind start service nfs-kernel-server restart # nfs-kernel-server start ではダメ。restart # 下記の設定でも同じ # systemctl start rpcbind.service # systemctl restart nfs-kernel-server.service -------------------------------------- サーバーを動かすのに色々と苦労した。 # service nfs-kernel-server start ではダメ。restart が必要。 export 状況の確認は # exportfs サービスの状況は # service nfs-kernel-server status で確認する。しかし、rpcbind, nfs-kernel-server ともに active であるにもかかわらず、接続できなかった。 restart に気がつくのに時間がかかった。 参考サイト https://hermemo.com/archives/1312 このサイトがなかったら、解決できなかった。
linux2.txt を参照 ユーザー名を指定しての接続は \\192.168.xx.yy\user-name としてわざとエラーを出し、 「その他」をクリックして 「別のアカウントを使用する」を選ぶ。 windows と samba のパスワードが同一の場合は、 いきなりログイン出来てしまう。 smbpasswd でパスワードを変更すると、 linux のログインパスワードと samba のパスワードの 両方が変わる。 passwd でパスワードを変更すると、linux のパスワード だけが変わる。 いろいろといじっているうちに、telnet でログインすると 途中で止まるようになってしまった。止まっても ^C でログイン出来る。 リブートしたらなおった。謎。
pi.txt を参照 ファイル名は ○○.php パーミッションを 666 にすることを忘れないように!!!
○ 接続 DHT11 の詳しい説明はデータシートを参照 http://akizukidenshi.com/download/ds/aosong/DHT11_20180119.pdf DHT11 は 4 個端子がある。使うのは 3 個 1 Vcc 2 Data 3 NC 4 Gnd 電源 DC 3.3V ~ 5.5 V 3.3 V で運用するときはケーブルの長さは可能な限り短くする。 Data ピンは 4.7k でプルアップ Data 端子は入出力兼用という不思議な接続法である。 Data 端子の波形をオシロで見ると、 0 V と Vcc の 2 値をとるパルスである。 Vcc = 5 V に設定すると、パルス波形の立ち上がりがなまる。 ネットを見ると、Vcc = 5 V のサイトと Vcc = 3.3 V の サイトの 2 つの接続法がある。 実験してみると、どちらでも動作するが、ラズパイの 入力端子に 5 V をかけるのは良くないと思われるので、 私は 3.3 V で運用する。 ○ ライブラリのインストール # apt-get install git # git clone https://github.com/szazo/DHT11_Python.git これ以外にもライブラリがあるようだ。 https://se-lina.hatenablog.com/entry/2022/03/07/182723 によると、以下のライブラリがあるらしい。 git clone https://github.com/adafruit/Adafruit_Python_DHT.git ○ サンプルプログラム DHT11_Python のフォルダで実行する。 import dht11 を実行すると dht11/__init__.py を見に行く。 その他のフォルダで実行するときは、__init__.py を当該フォルダ にコピーし、ファイル名を dht11.py にリネームする。 以下のプログラムは Data は GPIO14 (8番端子) に 接続する場合である。 #!/usr/bin/python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time, datetime import dht11 GPIO.setwarnings(True) GPIO.setmode(GPIO.BCM) instance = dht11.DHT11(pin=14) while True: result = instance.read() if result.is_valid(): temp = result.temperature humid = result.humidity print(temp, humid) time.sleep(1)
DHT20 の方が精度が良いらしい。 温度 ±0.5 ℃ 湿度 ±3 % DHT11 は 温度 ±2 ℃ 湿度 ±5 % 接続は I2C なので、ラズパイの設定で I2C を on に しておく。 # raspi-config Pi DHT20 1 (3.3V) --- 1 3 (SDA)----- 2 5 (SCL)----- 3 9 (Gnd)----- 4 穴が空いている面を上に、下向きに端子が伸びるように 配置して左から順番に 1-4 サンプルプログラム 参照:https://s-design-tokyo.com/use-dht20-raspberrypi/ import smbus, time send = [0xac, 0x33, 0x00] i2c = smbus.SMBus(1) address = 0x38 time.sleep(0.2) ret = i2c.read_byte_data(address, 0x71) while True: time.sleep(0.01) i2c.write_i2c_block_data(address, 0x00, send) time.sleep(0.08) data = i2c.read_i2c_block_data(address, 0x00, 0x07) humid = data[1] <<12 | data[2] << 4 | (( data[3] & 0xf0 ) >> 4 ) temp = ((data[3] & 0x0f) << 16 ) | data[4] << 8 | data[5] humid2 = humid / 2**20 * 100 temp2 = temp / 2**20 * 200 - 50 print("湿度 = {:3.0f} % 温度 = {:4.1f} 度".format(humid2, temp2)) time.sleep(1)