MAGAZINE

キャリテク!マガジン

コラム

【おうちSEになろう!】Raspberry Pi で遊ぼう(池澤あやか氏 連載)

前回の連載では、おうちで活躍間違いなしのチャットボットを作成しました。
Googleカレンダー上に、お知らせしたいことを登録しておくカレンダーを用意し、ごみ出しや資料の提出日などの前日に、家族で使っている Discord に通知メッセージを送るようにしました。

プログラムの実行さえしておけば、確かにBotは動き続けてくれるのですが、自分のPCでずっとプログラムを実行させておくのもなんだか微妙ですよね。
自分のPCは電源を切ったり、持ち運んだりして、ずっとネットワークにつながっているわけではないことが多いと思います。

というわけで今回は Raspberry Pi という小型のマイコンを利用して、自分のプログラムを気軽に動かしてみたいと思います。

今回使う Raspberry Pi Zero 2 W はこのサイズ!小さい!

Raspberry Piとは

Raspberry Pi は、小型で手頃な価格のコンピュータやマイクロコントローラのシリーズです。
Linuxが動作するモデル(Raspberry Pi 5など)や、特定のタスクに特化したマイクロコントローラ(Raspberry Pi Picoなど)があり、教育、IoT、DIYプロジェクトに幅広く利用されています。

ちなみに、我が家では Raspberry Pi を積層して、気軽にアプリケーションをデプロイできるKubernetes クラスタとして運用しています。

我が家では勉強も兼ねて Kubernetes クラスタとして運用しているわけですが、我が家で動いているシステムは巨大サービスでもないので、正直あまりに冗長です。
多くのご家庭では、ラズパイ単体をサーバーとして使えれば充分でしょう。

また、昨今は円安やインフレの影響を受けて、Raspberry Pi 5 は1万円越えと気軽に使うにはお高いですし、今回は Raspberry Pi 5 よりは非力だけど、Linux OS が動作する Raspberry Pi Zero 2 W を使用して、ちいさなおうちサーバー環境を作っていきましょう!

Raspberry Pi Zero 2 W なら3000円くらいで手に入りますし、自分で描いたプログラムをお手軽にデプロイできる環境が整えられますよ!

Raspberry Pi Zero 2 W でプログラムを動かす

環境構築をしていきます! とはいえ、Linux OS が動くため、簡単にセットアップできるので安心してください。

環境構築はパッケージ管理ツールである poetry を使って簡単にできるようにしています。

必要なもの
  • Raspberry Pi Zero 2 W 本体
  • microSDカード(16GB以上推奨)
  • microSDカードリーダー
  • USB Type-B 充電ケーブル
  • 電源アダプター(5V/2.5A推奨)
  • Mac(PC)

以下はMacの手順で記載しています。Windowsの方は少しやり方が異なる可能性があります。

Raspberry Pi OS のインストール

Raspberry Pi 公式サイトから Raspberry Pi のOSイメージを書き込むソフト「Raspberry Pi Imager」をダウンロードします。

OS を microSDカードに書き込みます。PCにmicroSDカードリーダーをつなぎ、microSDカードにOSを書き込む準備をしてください。Raspberry Pi Imager を起動して以下の手順に従います。

  • 「Raspberry Pi デバイス」は「Raspberry Pi Zero 2 W」を選択する。
  • 「OSを選択」で Raspberry Pi OS (32-bit) を選ぶ。
  • 「ストレージを選択」で microSDカードを選択。
  • 「書き込み」をクリックする。「設定を編集する」というボタンを押し、詳細を設定をして、OSをインストールする。

詳細設定では、一般タブの各項目とサービスタブの中のsshの設定を行ってください。

Raspberry Pi Zero 2 W のセットアップ

さきほどOSを書き込んだmicroSDカードを」]Raspberry Pi Zero 2 Wに挿入します。

電源につなぎます。

OSインストール時に設定してあると、ssh で繋げるはずなので、接続します。

私はホスト名をzero、ユーザー名はikeay、sshは公開鍵認証のみを許可する状態にしているので、.ssh/config に以下の情報を書き込んでおきます。

このような設定をしておくと、以下のようなsshのコマンドで接続できます。

念の為、ソフトウェアアップデートを実行して、再起動しておきましょう。

Poetryのインストール

再起動が終了したら、もう一度 sshでつなぎ直し、Pythonプロジェクトを実行できるようにします。

以下のコマンドを使ってPoetryをインストールします。最新のインストール方法は Poetry 公式サイトをご参照ください。

確認のため、以下を実行してバージョンが表示されれば成功です。

プロジェクトのセットアップ

前回作成したチャットボットのプログラムを試しに実行してみましょう!
プロジェクトを GitHub から clone して、初期化をします。

プロジェクトのディレクトリに移動し、pyproject.tomlに基づいて依存関係をインストールしますが、その前に、デフォルトでインストールされているPythonのバージョンを確認します。

おうちSEでは Python 3.12 系 をインストールする必要があります。

もし、インストールされているバージョンが異なる場合、Python 3.12 系をインストールするか、Raspberry Pi にインストールされている Python バージョンに合わせて Poetry の環境を設定してください。

以下はRaspberry Pi にインストールされている Python バージョンに合わせて Poetry の環境を設定した例です。

pyproject.tomlの `python = "^3.12"` の記述を `python = "^3.11"` に変更し、以下のコマンドを実行して、ロックファイルを書き換え、Poetryの仮想環境を作成します。

プログラムを実行してみます。まず、仮想環境をアクティブにするには、以下のコマンドを使用します。

プロジェクトのREADMEに従い、環境変数や Google Calendar APIのクレデンシャルを設定したのち、仮想環境内でPythonプログラムを実行します。

プログラムをcronで定期実行できるようにする

前回の連載のプログラムでは schedule というライブラリを使って、自分がスケジュールした時間にプログラムが動くようにしていましたが、ずっとプロセスを立ち上げっぱなしにしておくのもシステムリソースの観点でよろしくないので、cronを使ってプログラムを定期実行できるようにしておきます。

試しに以下のような時刻と一緒に"Hello world"を出力するような簡単なプログラムを hello.py として保存し、cronで実行してみましょう。

保存した場所のパスは、以下のコマンドで確認してメモっておきます。

プログラムを自動で実行できるようにスクリプトに実行権限を付与します。

crontabエディタを開いて、時間を設定します。

以下のようなスケジュールを追加します。

例では、毎日10:30に実行し、pythonのパスは `which python` などで調べたもの、hello.pyのパスはメモっておいたものと`/hello.py` をつなげた文字列を使っています。ログは hello.py と同じ階層(`/home/ikeay/cron_output.log `)においておきます。

登録したジョブを確認します。

時刻を過ぎたら、ログを保存しておいた場所を確認してください。時刻と一緒にHello worldが記録されているはずです。

このしくみを利用すると、システムリソースを無駄にせずプログラムが動くようになります。前回のプログラムも cron を用いたものに改良すると、リソースの無駄なし!

まとめ

今回は小型のRaspberry Piを使って、クラウドのサーバーを契約しなくても、おうちサーバーとして気軽にデプロイできる環境を整えてみました。

次回は、もうすこしRaspberry Piのおうちでの活用を模索したいと思います!次回もよろしくお願いします。

AltXからのお知らせ

池澤あやか氏のコラムはいかがでしたでしょうか?

当社のIT未経験者向け育成研修「キャリテク!」を趣味でパソコンを活用している方にもぜひ知っていただきたく、池澤あやか氏に「おうちSE」のコラムを執筆いただきました。
当社の「キャリテク!」はITエンジニア未経験の方でも2~3ヶ月間の研修を通してゼロからITエンジニアとしてのキャリアをスタート出来るようにサポートする入社時研修です。

「キャリテク!」については個別説明会を実施しています。

少しでも興味がある方は、まずは以下の個別説明会でざっくばらんにお話しましょう!
https://www.altx.co.jp/careetec/seminar/tokyo/

関連記事

facebook シェアシェア
LINE シェアシェア