3Dプリンタをアクセスポイントにして出先でもklipperに接続したい！

## はじめに
最近は手乗りサイズの3Dプリンタが徐々に流行りつつあり，「イベントにプリンタを連れて行って出先で印刷したい」という需要も増えてきました．
しかし，イベント会場にWi-Fiアクセスポイントが設置されているとは限らず，これがない場合はklipperへの接続ができません．

そこで，3Dプリンタに搭載されているRaspberry Pi自身にアクセスポイントになってもらい，スマホやノートPCから直接接続する事を考えます．
**この設定は普段使いしているルータ経由の接続とは共存が~~めんどくさい~~難しいため，別途Micro SDを用意して新しく環境を作り直すことを強く推奨します．**

それでは！めざせ居酒屋ボートレース！！

## 環境
本稿で動作確認済みの環境は以下の通りです．
- Mainsail OS
- Raspberry Pi 3A+
- HDMI入力できるモニタ
- USBキーボード

## 手順
### Mainsail OSのインストール

Mainsail公式ページの手順に従ってインストールします．僕は64bit版を選択しました．
Raspberry Pi Imagerのオプションで，家のWi-Fi設定を一緒に焼き込んでおくと便利です．
https://docs-os.mainsail.xyz/getting-started/raspberry-pi-os-based

OSインストールが終わったらモニタとキーボードを繋いで起動します．デフォルトのユーザは`pi`，パスワードは`raspberry`です．必要に応じて変更してお使いください．

ちなみに，**自宅のWi-Fiへ接続していた設定を無効化**の節の手順を行うまでは，自宅のWi-FiにつないであればSSH接続しての操作も可能なはずです．お好みで適宜ご利用ください．


### 必要なパッケージのインストール

OSインストール直後で何も更新を行っていない場合は，とりあえず最初から入っているパッケージたちを先に更新しましょう．再起動も忘れずに．

```
sudo apt update
sudo apt upgrade
sudo reboot
```

再起動から帰ってきたらアクセスポイント化に必要なパッケージたちをインストールします．
```
sudo apt install hostapd
sudo apt install dnsmasq
```

`hostapd`は無線LANデバイスをアクセスポイントとして動作させるためのソフトウェア，`dnsmasq`はDNSサーバとDHCPサーバの機能を含んだソフトウェアです．

このあと設定ファイルを編集します．お好みのエディタがあればこのタイミングでインストールしておきましょう．

良く分からないという方はデフォルトで入っている`nano`を使うのがおすすめです．本稿でもnanoを想定してコマンドを挙げておくので，他のエディタをお使いの方は適宜読み替えてください．

### DHCPサーバの設定
`/etc/dnsmasq.conf`を編集します．
```
sudo nano /etc/dnsmasq.conf
```

ファイル末尾まで下キーでスクロールしたら，以下の内容を追記します．
```
interface=wlan0
dhcp-range=192.168.200.10,192.168.200.100,255.255.255.0,12h
```
この設定では，`wlan0`（＝無線のインターフェース）に対して接続してきたデバイスへ，`192.168.200.10 ~ 192.168.200.100`の中からIPアドレスを割り当てています．

追記できたら，`ctrl + o`でWrite outを呼び出してEnterキーを押下して保存してから，`ctrl + x`でnanoを終了します．


### Raspberry PiのIPアドレスを固定
ノートPC等からRPiにつなぐ際に，IPアドレスが固定されていた方が何かと便利なので設定しておきます．
例によってnanoで設定ファイルを開きます．

```
sudo nanot /etc/dhcpcd.conf
```

下キーでファイル末尾までスクロールして，以下の内容を追記しましょう．

```
interface wlan0
static ip_address=192.168.200.1/24
```

この設定では，RPiのIPアドレスが`192.168.200.1`に固定されます．

### hostapdの設定
RPiのアクセスポイントとしての設定を行います．

以下のコマンドで設定ファイルを作成しながら開いて，
```
sudo nano /etc/hostapd/hostapd.conf
```

以下の内容を書き込みます．このとき，`ssid=klipper_direct`でSSID（PC等のWi-Fi接続先一覧に出てくる名前）を`klipper_direct`に，`wpa_passphrase=pass_klipper_direct`でWi-Fi接続時のパスワードを`pass_klipper_direct`に設定しています．必要に応じて変更してお使いください．

```
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=wlan0
driver=nl80211
ssid=klipper_direct
hw_mode=g
country_code=JP
channel=11
ieee80211d=1
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=pass_klipper_direct
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
```

設定ファイルを書けたら，アクセスポイントとしての機能が自動起動するようにしておきます．
```
sudo systemctl unmask hostapd.service
sudo systemctl enable hostapd.service
```

### 自宅のWi-Fiへ接続していた設定を無効化
ここまではRaspberry Pi Imagerで一緒に焼き込んだWi-Fi設定が生きていましたが，これが有効になっているとRPi自身をアクセスポイントとする設定と競合するため無効化します．

もう一度以下のコマンドで設定ファイルを開いて，
```
sudo nanot /etc/dhcpcd.conf
```

これを末尾に追記します．
```
nohook wpa_supplicant
```

本稿の手順通りに進んでいれば，ファイル末尾は


```
interface wlan0
static ip_address=192.168.200.1/24
nohook wpa_supplicant
```
となっているはずです．


ここまで設定できたら，一旦再起動です．

```
sudo reboot
```

これ以降はRPiが自宅のネットワークへ自動接続されないため，メンテにはモニタとキーボードが実質必須（シリアル接続もできるらしいですが本稿では扱いません）となります．

### 起動確認
再起動から帰ってきたらRPiがアクセスポイントになっているはずです．
PCやスマホのWi-Fi接続先一覧から`klipper_direct`を探して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/8b915d9f-2b5b-a7c0-1b7a-15cb18d7b5af.png)

Wi-Fiパスワード（本稿デフォルトなら`pass_klipper_direct`）を入力して接続します．（インターネットへは繋がっていないので，アイコンは見慣れた接続済みアイコンと違うかもしれません）

お好みのブラウザからRPiに割り当てた固定IP（本稿デフォルトでは`http://192.168.200.1/`）へ接続すれば...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/199e7277-7301-760a-9857-b52154b86ece.png)
はい！いつもの見慣れたMainsailの画面に辿り着けました！


### klipperの設定ファイルを移植
必要に応じて，普段お使いのklipper環境から`pringer.cfg`を持ってきて配置してください．

1. 事前に普段のお使いのRPiからPCへダウンロード
1. 本稿で作った環境へ繋いだらアップロード

の流れが無難かと思います．

## おわりに
いかがでしたか？この手順でスタンドアロン用MicroSDを作っておくとイベント時にも安心ですね．`printer.cfg`の共有だけちょっと面倒なので良い運用があれば教えてください．

それでは．

## 参考
[Raspberry PiをWiFiアクセスポイント化してスタンドアロン運用](https://www.mikan-tech.net/entry/raspi-wifi-ap)
[RaspberrypiをWifiアクセスポイントにする。（スタンドアローン）](https://qiita.com/T-ubu/items/906a8970da5dbec73cec)