Topics

エンジニアじゃないけど、ラズパイでKidsWiFi管理システムを作ってみた

  • column

こんにちは!デザイナー兼運用マネージャーのおがです。
2015年入社のすっかり古参勢ですが、普段はゆるろぐでギャルに擬態して誰の為になるのかわからない記事を書いてたりします。
そんな私ですが、今回は気合を入れて少しマジメな話をしようと思います。

前提として、私はエンジニアとしての実務経験はほぼ皆無です。
業務でターミナルを見ることはあっても、流れてくるログを眺めるのがせいぜいで、自分でコマンドを叩いて何かを作るなんて、「できる人がやるもの」くらいに思ってました。
そんな私が、今回 Raspberry Pi でネットワーク構成からWebアプリの実装までやり切ってしまうという……。人間、必要に迫られると意外と動けるもんです。

きっかけは、子どものiPad問題

わが家の子どもが、とにかくiPadを触りまくる。放っておくと本当にキリがない。
なので、まずはそこをどうにかしたかった。

ちょうどそんなタイミングで、会社から「自社ハッカソン的に、好きなもの作ってみて」という指令が。
弊社は今、空前のClaude Codeブーム。全スタッフがClaudeを相棒にしていて、社内はまさに開発祭り状態です。私は月25ドルのプランですが、もっとお高いプランを使いこなす猛者もいて、とにかく「AIで何でも作っちゃえ」という活気に溢れています。

「ずっと憧れていたラズパイを触ってみたい(理由は、ただなんとなくカッコ良さそう)」
「iPad問題をエンジニア的に解決したい」
「ハッカソンで何かしらの成果物を出したい」

この3つの熱が合体して爆誕したのが、「スマホのボタン一つで、子ども用Wi-Fiを強制ON/OFFできる管理システム」プロジェクトです。

ターミナルを見ることはあるけど、設定組むとかほぼ皆無。
そんな私が、Claudeに助けてもらいながら、あーでもないこーでもないしつつ、この「魔法の箱」を作るところまでやってみました!

Step 1 — ラズパイのセットアップ

Raspberry Pi Imagerでの準備 → SSH接続

まずRaspberry Pi 4にOSを入れるところから。Raspberry Pi Imager(公式の書き込みツール)をMacにインストールして、MicroSDカードに64bit OSを書き込みます。書き込み設定でSSHを有効化しておくのが地味に重要です。

LANケーブルでラズパイをルーターに繋いで電源を入れたら、Macのターミナルからこれだけで繋がります。

terminal (Mac)

ssh [email protected]

ターミナルにpi@raspberrypi:~ $が出てきた瞬間、ちょっと感動しました。まずはシステムをアップデートしておきます。

sudo apt update && sudo apt upgrade -y

Step 2 — WiFiアクセスポイントを立てる

hostapd / dnsmasq / iptables の設定

ラズパイを「WiFiアクセスポイント」として動かすために、2つのソフトウェアを入れます。hostapdがWiFiの電波を出すやつ、dnsmasqが繋いできたデバイスにIPアドレスを配るやつです。

sudo apt install hostapd dnsmasq

設定ファイルにSSID(WiFiの名前)やパスワードを書きます。今回はわかりやすく「KidsWiFi」にしました。

/etc/hostapd/hostapd.conf

interface=wlan0
driver=nl80211
ssid=KidsWiFi
hw_mode=g
channel=7
wpa=2
wpa_passphrase=(パスワード)
wpa_key_mgmt=WPA-PSK

続いて、繋いできたデバイスに配るIPアドレスの範囲を指定します。

/etc/dnsmasq.conf

interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h

最後に、ラズパイがインターネットの中継役になれるようIPフォワーディングとNATを設定します。これをやらないとKidsWiFiに繋いでもネットに出られません。

# IPフォワーディングを永続化
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/routed-ap.conf

# NATの設定(eth0経由でインターネットに出られるようにする)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

再起動するたびにwlan0がDOWNになる問題が発生。systemdのサービスファイルを書いて起動時に自動でネットワーク設定が走るようにしました。「なんでまた繋がらないの!?」とClaudeに泣きつきながら解決した場面です。

スマホのWiFi一覧に「KidsWiFi」が現れてネットに繋がったときは、思わず「先生!繋がりました!」とチャットに打ちました(マジで打ち込んだ)。

Step 3 — Webアプリで管理画面を作る

Python + Flask でスマホから操作できる画面を実装

WiFiアクセスポイントができたので、次はスマホからON/OFFできる管理画面です。PythonのWebフレームワーク「Flask」を使って、ラズパイ上でWebサーバーを動かします。まずMacのローカル環境で開発して、動くことを確認してからラズパイに転送するという流れにしました。

terminal (Mac) — 開発環境の準備

python3 -m venv venv
source venv/bin/activate
pip install flask

WiFiのON/OFFは、実は「インターネットへの接続だけをブロックする」という仕組みです。KidsWiFiの電波は常時出ていて、iptablesというLinuxのファイアウォールでインターネットへのパケットをドロップするかどうかを切り替えます。コードにすると意外とシンプルです。

app.py(抜粋)— WiFi制御の核心部分

import subprocess

def enable_internet():
    # ブロックルールを削除 → インターネット解放
    subprocess.run([
        'sudo', 'iptables', '-D', 'FORWARD',
        '-i', 'wlan0', '-j', 'DROP'
    ], capture_output=True)

def disable_internet():
    # ブロックルールを追加 → インターネット遮断
    subprocess.run([
        'sudo', 'iptables', '-I', 'FORWARD',
        '-i', 'wlan0', '-j', 'DROP'
    ], capture_output=True)

これだけでネットが止まる。コマンド1行で子どものiPadが止まる。なんかすごい力を手に入れた気がしました(まだうまく使えてないけど)。

システムの画面は、子ども用と親用で別々に作りました。
子ども用の画面には、なんと「ルーレット機能」を搭載!
一方的な時間制限は、子どもだって面白くないはず。それなら、自分で回したルーレットの結果なら納得してくれるんじゃないか?という作戦です。
「今日のWi-Fi時間は何分だ!?」とゲーム感覚で一喜一憂してもらう。不毛になりがちな「iPadのやめ時」の交渉を、ちょっとハッピーな遊びに変えるための仕掛けです。

  • 子ども用画面
    →ルーレットで30分・45分・1時間のどれかが当たる。
    →残り時間カウントダウン
    →時間切れのあと1時間クールダウン
    →累計使用時間
    →残りルーレット回数を表示
  • 親用ダッシュボード
    →パスワード保護
    →緊急WiFi OFF
    →宿題モード(完全遮断)
    →ルーレット回数上限
    →強制OFF時間
    →使用履歴ログ

開発中に「Macにはiptablesがないのでテストできない」問題が発生。Mac用にダミー関数(print文を出すだけのもの)を用意して動作確認できるようにしました。
こういう「詰まった!どうする!」もぜんぶClaudeに相談しながら進めました。

ちなみに、一応デザイナーなので「画面のレイアウトは自分で整えないといけないかな」と思いながら出力を待っていたんですが、思いの外きれいなレイアウトで吐き出されてきて少し拍子抜けしました。手直しはほぼせずに済んでいます。
これはちょっと悔しいような、嬉しいような。

Step 4 — ラズパイにデプロイして自動起動

SCPでファイル転送 → systemdサービス登録

Macでできあがったファイルをラズパイに転送します。scpコマンドで一発です。

terminal (Mac) — ラズパイへの転送

scp -r templates app.py [email protected]:~/wifi-manager/

再起動のたびにFlaskを手動で起動するのはしんどいので、systemdのサービスファイルを書いて自動起動にします。電源を入れたら勝手に全部動く状態を目指します。

/etc/systemd/system/wifi-manager.service

[Unit]
Description=WiFi Manager
After=network.target wifi-setup.service

[Service]
ExecStartPre=/bin/bash -c 'echo > /home/pi/wifi-manager/state.json'
ExecStartPre=iptables -F FORWARD
ExecStart=/usr/bin/python3 /home/pi/wifi-manager/app.py
WorkingDirectory=/home/pi/wifi-manager
Restart=always
User=root

[Install]
WantedBy=multi-user.target
# サービスを有効化して起動
sudo systemctl enable wifi-manager
sudo systemctl start wifi-manager

これで電源を入れるだけで全部動く状態になりました。スマホのブラウザから http://192.168.4.1:5000にアクセスするとルーレット画面が開きます。すっげ、ホントにできた。

やってみて思ったこと

エンジニアではない私が、ネットワーク設定からPythonまで完遂できたのは、間違いなくClaudeと「対話」しながら進められたからです。
詰まったらエラーをそのまま投げる。「次は何をすればいい?」と聞けば手順を並べてくれる。「なんでこうなるの?」と聞けば噛み砕いて解説してくれる。

世の中では「エンジニアがAIで爆速開発」なんて話も多いですが、個人の生活にある、ちょっとした、でも切実な悩みを解決するのにだってAIは最強の相棒になります。

「思いついたアイデアが、組織の規模や個人のスキルを飛び越えて形になってしまう」
そんなものづくりの民主化を肌で感じられたのが、何よりの収穫でした。

さて、肝心の子どものiPad問題はというと……実は、まだ解決していません。

システムはバッチリ動いています。あとは親である私の運用次第ですかねー。がんばります!

この記事を書いた人

福島在住、活発すぎる息子と毎日攻防戦を繰り広げる。美大卒の感性を活かしながらデザイナー兼運用マネージャーとして日々奮闘。育児で鍛えた対応力と瞬発力が武器。

おが

デザイナー / 運用マネージャー

このスタッフの記事を見る

安心のチーム体制とスピードのある対応力が自慢

リベロジックでは、ベテランスタッフが積極的にプロジェクトを推進するため、お客様から高く評価されています。
プロジェクトマネージャー、ディレクターをきちんとアサインし、プロジェクト全体をスムーズに進行することを心掛けています。 不必要なフルコミットでのコスト増加を防ぎ、適材適所にリソースを配分するスタイルで、業務内容の把握から見積作成/提出の速さにも定評があります。

当社はSES的な常駐業務等は積極的に行っておりませんので予めご了承ください。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webexなど、ほぼすべての主要なプロジェクト管理ツールやチャットツールをご利用いただけます。

Webのお悩みご相談ください。

ケーススタディ