ラズベリーパイをいろいろ使ってみる
この画像は、Raspberry Pi Foundation のURLで表示されている画像からコピーしたものです。
ラズベリーパイ 3 B+
忘備録
ラズベリーパイにLinuxをインストール
ラズベリーパイでファイルサーバーを作ってみる。
ftp で使えるファイルサーバーの設定手順
ラズベリーパイでGPIOを操作
ラズベリーパイでGPIOを操作するプログラム
ラズベリーパイは、raspberrypi 2 B が最初に買った機種で、買った当初は、HDMI表示を付けてOSをインストールして、Linuxの環境を確認したのみで、何かに使うということは無く、ジャンク箱に入れたままになっていた。
ところが、10年近く家庭内のファイルサーバーとして使ってきた、インテル製の Atomマザーボード が壊れてしまい(基板が故障した原因が電源の故障と後に判明)、新しいサーバーをどうするか検討した結果、消費電力の少ない、ラズベリーパイにしようということになった。ラズベリーパイをLANのサーバーにする方法は、ずっと前から雑誌などで紹介されていたのだが、最新の雑誌で解説されている、超初心者向けの方法とした。
必要なもの。
1、RaspberryPi 2( 3,4 ) Model B 。 Model B は、イーサネット付き。
2、5V2A(2.5A,3A )を供給できるUSB電源( リチュームイオン電池の充電器など)と、USB Type-A --> microUSB Type-A ケーブル
3、HDMIケーブルと、表示器 ( raspberrypi4 は、miniHDMI --> HDMI 変換コネクタが必要 )
4、USBマウス
5、16GB以上の microSD カードと、PCと接続できるSDカードリーダー。microSDカードのスピードクラスは I 推奨
6、LANケーブルと、イーサネット経由でインターネットに接続できる環境
7、ラズベリーパイのOS。簡単にインストールできる、NOOBSを使う方法。
Linuxのダウンロード先→ https://www.raspberrypi.org/downloads/noobs/
ミラーサイト → http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS/images/
8、NOOBSとは別のインストール方法として、SDカードのイメージファイルを、直接SDカードに書いて、インストールする方法。
イメージのダウンロード→ https://www.raspberrypi.org/downloads/raspbian/
上記のページのRaspbian Buster with desktop で、Download ZIP をクリック。
なお、この方法では、Linuxのファイルシステムを含むインストールイメージを、SDカードに直接書く必要があり、Windows のファイルコピー機能は使えないので、特別なライターツールが必要になる。
特別なツールのダウンロード先→ balena Etchar https://www.balena.io/etcher/
SDカードにインストールデータを書いた後、SDカードを ラズベリーパイのSDカードスロットに入れ、HDMI表示器、USBマウス、LANケーブルを接続しておいて、microUSB ケーブルを挿して、電源を入れると、インストールが始まります。SDカードのスピードランクによってインストール時間がかなり左右されるので、できるだけ書き込み速度の速いのを使うと、20〜30分ほどで、終了します。SDカードのインターフェイスは、4本のデータ線があるが、シングルエンドインターフェイスなので、データ転送スピードに限界があります。最新のSDカードでは、UHS−I,U,V、さらに、SD Express が出ているようですが、ラズベリーパイ側では、どれにも対応していない模様。( UHSなどは、上位規格なので、従来の規格でも操作できるようです)
OSのインストールが終わった後に設定しておくと便利な機能
HDMI表示ができ、操作ができるようになれば、ラズベリーパイ専用の表示器とか、マウス、キーボードを付けたままにするのは、場所も電力も食うので、ノートPCなどから操作できるように、VNCなどを有効にしておきます。
左上のラズベリーアイコン −−> 設定 −−> Raspberry pi の 設定 で、以下の設定ウインドウが開くので、SSH と、VNC を有効にします。SSHを有効にすると、Windowsののteraterm から Raspberrypi を操作できるようになります。
VNCの設定
VNCはデフォルトでは、ラズベリーパイに接続しているHDMI表示器のサイズになってくれますが、HDMI表示器を接続せずに起動すると、パソコン側のVNCビューワーでは、640x480になってしまいます。これでは小さすぎて使い勝手が悪いので、1024x768かそれ以上のサイズにするには、/boot/config.txt の設定を変更します。
$ sudo gedit /boot/config.txt で、ファイルを開き、21〜22行付近にある、以下の2行の数値を以下のように変更します。
framebuffer_width=1024
framebuffer_height=768
1024x768よりもう少し大きいサイズとして、1152x864も設定できます。このサイズは、昔のSUNワークステーションで使われた標準サイズです。
SSHでラズベリーパイを操作
キャラクタベースで操作するにはこれを使います。パソコン側でテラタームを起動し、( テラタームのダウンロードはこちら→Tera Term Home Page http://ttssh2.osdn.jp/ )
テラタームを起動し、ファイル --> 新しい接続 で以下の設定画面がでてくるので、IPアドレスを設定すると接続できます。
設定したIPアドレスに接続すると、以下のようにユーザーとパスワードを入力します。
認証されると以下のようにログイン完了です。
1、$ sudo apt install samba (これで samba をインストール。)
2、$ sudo smbpasswd -a pi (pi というユーザー追加し、パスワードを設定すると、パスワードの設定を促してくるので、パスワードを2回設定する)
3、USBポートに共有したいUSBHDDとか、USBメモリを接続すると、以下のようなウインドウがポップアップするので、OKを押す。
4、OKを押すと、以下のようなパスが表示される。この例では、32GBのSDカードを、USBカードリーダーに装着して、ラズベリーパイに接続している。
また、このSDカードには、ルートパスに、PI_SERVER というフォルダを作成している。
PI_SERVER というフォルダのパスは、/media/pi/410E-BD5E/PI_SERVER となっている。ここで、410E-BD5Eは、SDカードのドライブ名に付けられた名称である。Windows で、SDカードをフォーマットするときにドライブ名を命名しないと、このような名称になるので、WindowsでSDカードのドライブ名を、SD32GB などと変更しておく。
5、上記だけでは、本体のログインのディレクトリだけしか、外部から見えないので、
/etc/samba/smb.conf のファイルの最後に、以下のように4行を追加する。フルパスを記述して、アクセス条件を設定する。
[Share]
path = /media/pi/SD32GB
guest ok = no
read only = no
6、再起動して、Windows のネットワークのアドレス設定BOXで、\\raspberrypi を書くと、raspberrypi という名称のコンピュータが表示される。
7、ネットワークコンピュータ、raspberrypi の中には、pi と、SD32GB の2個のフォルダがあるのが判るが、そのフォルダをクリックすると、以下のように、ユーザーとパスワードを求めてくる。
7、ユーザーを pi、 パスワードを設定すると、フォルダの中にアクセスできるようになる。
LANでは、samba が便利ですが、グローバルネットワークからファイルを操作するには、FTPのほうが便利です。家に置いたWebカメラの映像を、家の外からスマホなどで見て、ペットの状態を確認するというのが、手軽にできるようになってますが、出先からパソコンを使って、家に置いたサーバーのデータを操作できるようにするには、FTPの設定以外に、ブロードバンドルーターの設定も必要になってきます。
ラズベリーパイには、デフォルトではFTPサーバー、ftpd はバンドルされていないので、ダウンロードします。
1、$ sudo apt-get update
2、$ sudo apt-get install vsftpd
以上の操作で、インストールが完了ですが、デフォルトのままで不都合なので( anonymous でログインできてしまう )、/etc/vsftpd.conf のいくつかの記述を編集します。
1、anonymous_enable=NO デフォルトではYES
2、local_enable=YES デフォルトでは、コメントアウトされているので、# を削除
3、write_enable=YES ファイルを変更できるようにする。
4、local_umask=022 デフォルトではコメントアウト
5、ascii_upload_enable=YES デフォルトではコメントアウト
6、ascii_download_enable=YES デフォルトではコメントアウト
7、chroot_local_user=YES デフォルトではコメントアウト。ユーザーのディレクトリがルートディレクトリになる。
8、chroot_list_enable=YES 指定したファイル( /etc/vsftpd.chroot_list ) に記述されたユーザーのみログインできるようにする。
9、chroot_list_file=/etc/vsftpd.chroot_list ここにログインできるユーザーを記述する。
以上で準備ができるので、
$ sudo service vsftpd restart で、vsftpd を再起動すると、外部からログインできるようになります。
FFFTPで操作してみる。
FFFTPを起動し、接続サーバーの設定します。
ログインすると以下のようになります。
左側が、パソコン側、右側が、ラズベリーパイ
外部からログインできるようにする。
ルーターを介して、外部からアクセスできるように、以下のように設定します。ATERMの例ですが、他のメーカーでも同じようなことができるはずです。
ここで、6行の設定内容がありますが、ポート番号 21 が、FTPのポートです。80はHTTP、22はSSHです。SSHは、外部からラズベリーパイにログインして操作するポートなので、安全のため設定をはずすほうがいいと思います。
残りの192.168.10.11は、別のサーバーで、ラズベリーパイがダウンしたときのみ接続されるようになります。
外部からログインした相手を参照する
$ sudo cat /var/log/vsftpd.log
とコマンドを与えると、以下のようなアクセス記録( ログイン失敗も含む ) をみることができます。
ここで、CONNECT のみは、ユーザーを入力しなかったアクセス、
[anonymous] FAIL LOGIN は、ユーザーと、パスワードが合致しなかったアクセス、
[pi] OK LOGIN: Client "ffff:192.168.10.14" は、パソコンのFFFTPからログインできたという記録。
LOGをみると、どこからアクセスがあったかが判り、どこからともなくログインが試みられていることがわかります。この例では、数は少ないですが、以前 ATOM基板でサーバーを運用していたとき、5秒に一回ぐらいで、ある特定のIPからのアクセスが、2日ほど連続していたことがあり、おそらく不正ログインのアタックではなかったかと思います。ユーザー名は数文字でしたが、パスワードを、25文字ほどにしていたので、あきらめたと思われます。
アクセスを試みたIPに、ping を行ってみると、多くは応答があり、数十msから、百数十msです。日本国内だと、たいてい10ms〜30ms程度なので、外国と思われます。 ちなみに、アメリカ大陸では、100ms〜200ms、ヨーロッパでは、200ms〜300msです。
ラズベリーパイでGPIOを操作する簡単な開発環境が整ってきたようなので、いわゆる組み込みマイコンの感覚で使えるか、試してみた。
GPIOを操作するには、当然ドライバーが関連しますが、一連のドライバーを統合したパッケージがあります。いくつかあるようですが、次の WiringPi から使ってみます。
WiringPi
使用したラズパイのOS、NOOBS_v3_3_0 では、raspbian のバージョンは、v4.19.97 で、WiringPi はプリインストールされているのでそのまま使えます。コンソールから直接GPIOを操作できるので、配線のチェックがすぐにでき、プログラミングの検証時、一段手間が省けます。
1、GPIOの現在の設定状態を見る。
$ gpio readall
ここで、wPi の番号は、gpio コマンドで指定するピン番号、BCM の番号は、CPUのピンによる番号で、ラズベリーパイの基板仕様に記されているコネクタのピンの説明に使われている番号。パワーONで何も設定しなければ、すべて入力( IN )になっています。
2、指定したピンを出力に設定する。
$ gpio -g mode 18 out
CPUピン番号で、GPIO18番を出力に設定。 -g オプションが、CPUピン番号の指定。
ラズパイ基板には、40ピンのコネクタがありますが、18番は、このコネクタの12番ピンで、GPIO18という名称。詳しくは、ラズパイの回路図で確認できます。
以下はraspberrypi 3 B+ の回路図から抜粋したもの。
出力に設定した後、$ gpio readall を実行すると、以下のようになります。コネクタのピン番号で12番が、out になっています。
3、指定したピンをHighにする
$ gpio -g write 18 1
GPIO18の出力を1にします。確認するには、コネクタの12番ピンの電圧を測ればいいのですが、いわゆるLチカ用の配線をします。
さて、$ gpio -g write 18 1 を実行すると、上記回路でLEDが点灯しますが、ここで、$ gpio -g mode 18 in とすると、LEDは消えます。そして再度出力に設定すると、( $ gpio -g mode 18 out )、LEDは再び点灯します。つまり、出力した内容は、ピンの入出力の設定の変更にかかわらず、記憶しているということです。ですから、ピンの入出力を切り替えるようなアプリケーションで、入力から出力に切り替えたときに、0(Low )を出力したい場合は、$ gpio -g mode 18 in の後、 $ gpio -g write 18 0 を実行してから、$ gpio -g mode 18 out とする必要があります。
WiringPi を使ってプログラミングしてみます。
定番のLチカです。Web検索で、いくつも出てきますが、以下のサイトを参考にして作ったものです。
WiringPi を使ってC言語でGPIO操作 → とある科学の備忘録
GPIO18を、0.2秒点灯、0.2秒消灯する信号を出します。wiringPiSetupGpio() は、ラズベリーパイ基板のGPIOピン番号で指定する指示です。
コンパイルは、
$ gcc -o testgpio testgpio.c -lwiringPi
となり、実行は、$ ./testgpio で、停止するのは、コントロールCとなります。
このLチカでは、LEDの点滅以外はなにもできませんが、ターミナル画面からのキー入力で点滅の状態を変化させるには、ハードルがかなり上がります。Linuxのプログラミングに慣れていないので、Web検索を行った結果、Windowsの kbhit() 関数と同じように機能する関数を用意する必要があるようです。以下のリンクは、kbhit() と同等の機能を実装した例です。これを参考にして、次のようなプログラムを作り、動作確認しました。
Windows の kbhit() 関数をLinux で実行する例 → 【C言語】Linuxでのkbhit関数(キーイベントの取得) これを参考にして作ったものが以下です。実行後、何かのキーを押すとプログラムが終了します。
上記では、何かキーを押すとLチカの動作が終了しますが、今度は、押すキーの種類によって、Lチカの点滅スピードを変化させたり、点灯と消灯の時間幅を変えてみたりしてみます。これには、上記の kbhit() 関数を若干変更する必要があります。
ターミナルから入力する文字で点滅速度を変化させます。
'l' 点滅速度を遅くします
'h' 点滅速度を早くします
'q' プログラムを終了します
上記以外の文字は、もとの点滅速度にもどします
準備中
ホーム に戻る