Raspberry pi(ラズパイ)の内蔵Wi-Fiでアクセスポイントを立て、開発用PCとラズパイをWi-Fiで直接接続することで、無線ルーターがない状況(屋外など)でもラズパイにアクセスし開発できるようにします。
加えて、ラズパイに搭載したUSB Wi-Fi アダプタを使い、スマートフォンのテザリングでネットに接続できるようにします。
ラズパイへのUSB Wi-Fi アダプタの接続方法は下記の記事を参照してください。
それではラズパイの設定を行っていきます。以下は筆者の環境で実行したことをまとめたものです。抜けている可能性もあるため適宜補完してください。
筆者の環境は、開発用PCとラズパイ(USB Wi-Fi アダプタ)が無線ルータを介してSSH接続をしている状態です。
この無線ルータを介した接続を変え、PCとラズパイを直接接続しSSHできるようにします。
Wi-Fiの接続状況の確認
まず現在の接続状況を確認します。
ip a
-----
1: lo: (略)
2: eth0: (略)
3: wlan0: (略)
4: wlx(略):(略)
無線Wi-Fiである3:wlan0, 4:wlx(略)のinetに記載された値が自宅の無線ルータとの接続に使われているipアドレスです。後ほど数値が変わることがわかります。またSSHが何かで切れてしまったときにここに表示されたipアドレスで接続するなどに使います。
接続している先のSSID名を知るコマンドもありますので参考に記載します。
iw dev
パッケージのインストール
ラズパイでWi-Fiのアクセスポイントを立てるなどに使用するパッケージをインストールします。
sudo apt install hostapd dnsmasq
このパッケージの設定などを次から行っていきます。念のためインストールしたサービスを停止するコマンドを命令しておきます。
sudo systemctl stop hostapd
sudo systemctl stop dnsmasq
netplanの設定
まずアクセスポイントの静的ipアドレスを設定します。Ubuntuのネットワーク設定を管理する標準ツールnetplanのYAMLファイルを編集します。
ファイルの編集をする前に、修正を間違ってしまった際に元の状態に戻れるよう、ファイルのバックアップをするのがベターです。
# ファイルのバックアップ
sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.backup
それではファイルの中身を変更します。
sudo nano /etc/netplan/50-cloud-init.yaml
wlan0(内蔵Wi-Fi)でアクセスポイントを立てます。
筆者の環境ではwlan0は自宅の無線ルータに接続する設定で、wifis:の下に書かれています。wifis:に書かれているwlan0の内容は全てコメントアウトし、ethernets:の下に記載を追加します。
# /etc/netplan/ファイル名.yaml
network:
ethernets:
eth0:
(略)
# ===== ↓ ethernetsにwlan0を追加。wifisに書いておくとエラーが出た。
wlan0: # 内蔵Wi-Fi AP用
dhcp4: no
addresses: [192.168.4.1/24]
# access-points: ここでは設定せず、hostapdで設定する
# ===== ↑
wifis:
wlx(略): # USB Wi-Fi クライアント用
(略)
編集したらファイルを保存して閉じます。(Ctrl + O -> Enter -> Ctrl + X)
dnsmasqの設定
次にIPアドレス割り当て(DHCP)とDNS中継/キャッシュを行うサーバーの設定をします。
sudo nano /etc/dnsmasq.conf
dnsmasq.confは全てコメントアウトされているファイルでした。ファイルの最後に以下を追加しています。
# ==========================
# wlan0でAPを立てるため、ファイルに以下を手動入力する。/etc/dnsmasq.conf に追記する内容
# ==========================
interface=wlan0
dhcp-range=192.168.4.50,192.168.4.150,255.255.255.0,12h
dhcp-option=option:router,192.168.4.1
listen-address=::1,127.0.0.1,192.168.4.1
dhcp-option=option:dns-server,192.168.4.1
server=8.8.8.8
server=8.8.4.4
domain=lan
local=/lan/
domain-needed
bogus-priv
systemd-resolvedの設定
dnsmasqがDNSサーバとして動作するときポート番号53が他のプログラムで使用されていて起動できないエラーが出ないよう、システム全体のDNS名前解決を管理するUbuntu標準サービスのsystemd-resolvedの設定をします。
まず53ポートの使用状況を確認します。
sudo ss -tulnp | grep :53
ここでsystemd-resolvedが動いているのが確認できると思います。
続いてファイルの設定を変更します。
sudo nano /etc/systemd/resolved.conf
次の文字列を探し、noとして保存します。
DNSStubListener=no
変更内容を適用します。
sudo systemctl restart systemd-resolved
以上でsystemd-resolvedが53ポートを使用しなくなっています。
hostapdの設定
次にWi-Fiアクセスポイント(AP)として動作させるhostapdを設定します。
sudo nano /etc/hostapd/hostapd.conf
筆者の環境ではファイルが存在しませんでした。以下を記載し保存します。ここにSSIDとパスワードを記載しますので好きな名前を付けてください。
# /etc/hostapd/hostapd.conf
# 使用するインターフェース
interface=wlan0
# Wi-Fiドライバ (多くのデバイスでnl80211が使用されます)
driver=nl80211
# アクセスポイントのSSID
ssid=(好きな名前を設定)
# ハードウェアモード (g = 2.4GHz, a = 5GHz)
hw_mode=g
# 使用するチャンネル (1, 6, 11 など、干渉の少ないものを選ぶ)
channel=6
# WPA2設定
wpa=2
# 8文字以上のパスワードを設定
wpa_passphrase=(WIFIのパスワードを設定する)
wpa_key_mgmt=WPA-PSK
# WPA2推奨
rsn_pairwise=CCMP
# 国コード (日本の場合はJP)
country_code=JP
# その他オプション (必要に応じて調整)
ieee80211n=1
# 802.11n を有効にする場合
wmm_enabled=1
# QoSを有効にする場合
macaddr_acl=0
# MACアドレスフィルタリング (0:無効, 1:許可リスト, 2:拒否リスト)
auth_algs=1
# Open System認証
ignore_broadcast_ssid=0
# SSIDを隠さない
hostapdの設定ファイルが起動時に読み込まれるように指定します。
sudo nano /etc/default/hostapd
ファイル内でコメントアウトされている以下の部分のコメントアウトを外し、パスを指定します。
DAEMON_CONF="/etc/hostapd/hostapd.conf"
サービスの起動・確認
設定した内容を適用し起動します。
# netplanの適用
sudo netplan apply
# マスクの解除
sudo systemctl unmask hostapd
sudo systemctl unmask dnsmasq
# サービスの有効化
sudo systemctl enable hostapd
sudo systemctl enable dnsmasq
sudo systemctl start hostapd
sudo systemctl start dnsmasq
うまく起動しているかを確認します。Activeがactiveになっていることを確認します。
sudo systemctl status hostapd
sudo systemctl status dnsmasq
以上を実行した後に、wlan0のipアドレスが変わっていることを確認します。
ip a show wlan0
開発用PCからアクセスポイントに接続(ラズパイ内蔵Wi-Fi)
開発用PCでラズパイで設定したSSIDを見つけ、パスワードを入力し接続します。ラズパイのWi-Fiは電波が混雑している箇所など、電波状況が悪いとなかなかリストに現れません。数分待つなどします。
そして上記で確認したwlan0の新しいipアドレスを使ってsshをしていきます。
ssh user名@192.168.4.1
sshできたら、ip addrなどでWi-Fiの接続状況を確認してみるといいでしょう。内蔵Wi-Fi(wlan0)はAPを立てているipアドレスを確認でき、USB Wi-Fi アダプタは自宅の無線ルータに接続しているipアドレスのままであることを見れると思います。
ip addr
スマホのテザリングでラズパイをネット接続
今の状況だと、ラズパイは無線ルータとUSB Wi-Fi アダプタで接続しているためaptやgitなどのコマンドを実行してもインターネットからデータをダウンロードすることができます。
しかし屋外にいる場合は無線ルータに接続することはもちろんできません。そこでスマートフォンのテザリングに接続することでインターネットに接続できる環境を作ります。
無線ルータの設定を保ったまま、スマートフォンのテザリングの設定を追加することで、自宅では無線ルータに、屋外ではスマートフォンにつながるようにします。
上記とするためにnetplanの設定ファイルに追記をします。
sudo nano /etc/netplan/50-cloud-init.yaml
以下のようにUSB Wi-Fi アダプタの設定の箇所にSSIDとパスワードを新しく追加します。
wifis:
wlx(略): # USB Wi-Fi クライアント用
dhcp4: yes
optional: true # 起動時にこの接続が必須ではない
access-points:
# 1番目の接続候補: 自宅の無線LAN
"無線ルータのSSID":
password:"パスワード"
# 2番目の接続候補: スマホのテザリング
"スマホのテザリングのSSID":
password: "パスワード"
最後にnetplanの設定を適用します。
sudo netplan apply
まとめ
ラズパイに直接アクセスし、sshで開発することができるようになりました。筆者は屋外でラズパイにアクセスをしたい機会が多いため、よく使う機能です。
ラズパイ自体がAPを立てられるようになると、無線ルータなどの設備がなくてもローカルネットワークを作れるため、他のラズパイやESP32などと繋がれます。これで複数のロボットや機器がAPを立てたラズパイを通じてデータをやり取りできます。
群ロボットなどの開発で活用が考えられますが、Wi-Fiが混雑しているなど通信環境があまりよろしくないところだとラズパイ内蔵Wi-Fiを使っての無線をうまく捕まえられない場合があります。
通信が不安定ならば、USB Wi-Fi アダプタを使ってAPを立てると、無線が繋がりやすくなる場合があります。ラズパイへのUSB Wi-Fi アダプタの接続方法は記事にまとめていますので参考にしてください。
それでは楽しいものづくりライフを!