From ac16d211de89d897ebc8ff5eaa55f73d56b2ae90 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 9 Jun 2026 00:56:58 -0400 Subject: [PATCH] feat: WiFi access point setup script + README hotspot instructions --- README.md | 19 ++++ scripts/setup-wifi-ap.sh | 221 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 240 insertions(+) create mode 100755 scripts/setup-wifi-ap.sh diff --git a/README.md b/README.md index d8c3120..054d453 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,25 @@ From any device on the same network: - **Browser:** http://pedal.local:8080 - Or use the IP: http://192.168.x.x:8080 +### WiFi Hotspot (No Network? No Problem) + +If there's no WiFi network to join — stage, rehearsal space, park bench — the Pi can create its own: + +```bash +# Run once to set up +sudo bash scripts/setup-wifi-ap.sh + +# Or with custom SSID/password: +sudo bash scripts/setup-wifi-ap.sh --ssid "Pi-Pedal" --psk "yourpassword" + +# Phone connects to "Pi-Pedal" → open http://pedal.local:8080 + +# To turn it off and go back to client mode: +sudo bash scripts/setup-wifi-ap.sh --disable +``` + +**Pro tip:** Add a USB WiFi dongle for dual-network — Pi creates hotspot on built-in WiFi, dongle handles internet access for git pulls and updates. + ### 8. Wire It Up **Mono mode (standard pedal):** diff --git a/scripts/setup-wifi-ap.sh b/scripts/setup-wifi-ap.sh new file mode 100755 index 0000000..67bcb07 --- /dev/null +++ b/scripts/setup-wifi-ap.sh @@ -0,0 +1,221 @@ +#!/usr/bin/env bash +# ── Pi Multi-FX Pedal — WiFi Access Point Setup ──────────────────── +# Enables the Pi to act as its own WiFi hotspot. +# Phone connects to "Pi-Pedal" → web UI at http://pedal.local:8080 +# No venue WiFi or internet required. +# +# Usage: +# sudo bash scripts/setup-wifi-ap.sh # Interactive mode +# sudo bash scripts/setup-wifi-ap.sh --ssid "Pi-Pedal" --psk "changeme" # Headless +# sudo bash scripts/setup-wifi-ap.sh --disable # Turn off hotspot, back to client mode +# +# After setup: +# Phone WiFi → join "Pi-Pedal" (password: changeme or your custom psk) +# Browser → http://pedal.local:8080 +# +# Dual WiFi option (for internet while hotspot is active): +# Plug a USB WiFi dongle. The built-in WiFi becomes the hotspot, +# the dongle handles internet access. No config changes needed. +# ──────────────────────────────────────────────────────────────────── + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" + +# ── Defaults ────────────────────────────────────────────────────────── +SSID="Pi-Pedal" +PSK="pedal1234" +AP_IP="192.168.4.1" +DISABLE=false + +# ── Parse args ──────────────────────────────────────────────────────── +while [[ $# -gt 0 ]]; do + case "$1" in + --ssid) SSID="$2"; shift 2 ;; + --psk) PSK="$2"; shift 2 ;; + --disable) DISABLE=true; shift ;; + --help|-h) echo "Usage: $0 [--ssid ] [--psk ] [--disable]"; exit 0 ;; + *) echo "Unknown option: $1"; exit 1 ;; + esac +done + +# ── Colors ──────────────────────────────────────────────────────────── +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +info() { echo -e "${CYAN}[INFO]${NC} $1"; } +ok() { echo -e "${GREEN}[OK]${NC} $1"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +fail() { echo -e "${RED}[FAIL]${NC} $1"; } + +# ═══════════════════════════════════════════════════════════════════════ +# DISABLE MODE +# ═══════════════════════════════════════════════════════════════════════ + +if [ "$DISABLE" = true ]; then + echo "" + info "Disabling WiFi access point..." + + sudo systemctl stop hostapd dnsmasq 2>/dev/null || true + sudo systemctl disable hostapd dnsmasq 2>/dev/null || true + + # Remove AP config from dhcpcd + sudo sed -i '/^interface wlan0$/d' /etc/dhcpcd.conf 2>/dev/null || true + sudo sed -i '/^static ip_address=192\.168\.4\.1\/24$/d' /etc/dhcpcd.conf 2>/dev/null || true + sudo sed -i '/^nohook wpa_supplicant$/d' /etc/dhcpcd.conf 2>/dev/null || true + + # Restart dhcpcd to pick up client mode + sudo systemctl restart dhcpcd + ok "Access point disabled. WiFi is back in client mode." + echo "" + echo "To reconnect to your home WiFi, edit /etc/wpa_supplicant/wpa_supplicant.conf" + echo "or use 'sudo raspi-config' → System → Wireless LAN." + exit 0 +fi + +# ═══════════════════════════════════════════════════════════════════════ +# INSTALL MODE +# ═══════════════════════════════════════════════════════════════════════ + +echo "" +echo "╔═══════════════════════════════════════════════╗" +echo "║ Pi Multi-FX Pedal — WiFi Access Point Set ║" +echo "╚═══════════════════════════════════════════════╝" +echo "" +info "SSID: $SSID" +info "Password: $PSK" +echo "" + +# ── 1. Install packages ───────────────────────────────────────────── + +info "Installing hostapd and dnsmasq..." +sudo apt-get update -qq +sudo apt-get install -y -qq hostapd dnsmasq +ok "Packages installed" + +# Stop services while we configure (they start enabled on install) +sudo systemctl stop hostapd dnsmasq +sudo systemctl disable hostapd dnsmasq # We enable explicitly at the end + +# ── 2. Configure static IP for wlan0 ──────────────────────────────── + +info "Configuring static IP for wlan0 ($AP_IP)..." + +# Remove any existing AP config from dhcpcd.conf +sudo sed -i '/^interface wlan0$/d' /etc/dhcpcd.conf +sudo sed -i '/^static ip_address=192\.168\.[0-9]*\.[0-9]*\/24$/d' /etc/dhcpcd.conf +sudo sed -i '/^nohook wpa_supplicant$/d' /etc/dhcpcd.conf + +cat < /dev/null + +# Pi Multi-FX Pedal — WiFi Access Point +interface wlan0 +static ip_address=$AP_IP/24 +nohook wpa_supplicant +EOF + +ok "Static IP configured" + +# ── 3. Configure DNS/DHCP server (dnsmasq) ───────────────────────── + +info "Configuring dnsmasq..." + +sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig 2>/dev/null || true + +cat < /dev/null +# Pi Multi-FX Pedal — dnsmasq config for WiFi AP +interface=wlan0 +dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h +domain=pedal.local +address=/pedal.local/$AP_IP +no-resolv +server=8.8.8.8 +server=8.8.4.4 +EOF + +ok "dnsmasq configured (DHCP range 192.168.4.2-20)" + +# ── 4. Configure access point (hostapd) ───────────────────────────── + +info "Configuring hostapd..." + +cat < /dev/null +# Pi Multi-FX Pedal — hostapd config +interface=wlan0 +ssid=$SSID +hw_mode=g +channel=6 +wmm_enabled=0 +macaddr_acl=0 +auth_algs=1 +ignore_broadcast_ssid=0 +wpa=2 +wpa_passphrase=$PSK +wpa_key_mgmt=WPA-PSK +wpa_pairwise=TKIP +rsn_pairwise=CCMP +EOF + +# Point hostapd at our config +if grep -q "^#DAEMON_CONF" /etc/default/hostapd 2>/dev/null; then + sudo sed -i 's|^#DAEMON_CONF.*|DAEMON_CONF="/etc/hostapd/hostapd.conf"|' /etc/default/hostapd +fi + +ok "hostapd configured (SSID: $SSID)" + +# ── 5. Enable services ────────────────────────────────────────────── + +info "Enabling hostapd and dnsmasq services..." +sudo systemctl unmask hostapd 2>/dev/null || true +sudo systemctl enable hostapd +sudo systemctl enable dnsmasq +ok "Services enabled to start on boot" + +# ── 6. Start now ──────────────────────────────────────────────────── + +info "Starting services..." +sudo systemctl restart dhcpcd +sudo systemctl start dnsmasq +sudo systemctl start hostapd + +sleep 2 + +# Verify +if systemctl is-active --quiet hostapd && systemctl is-active --quiet dnsmasq; then + ok "WiFi access point is running" +else + fail "One or more services failed to start. Check:" + echo " sudo systemctl status hostapd" + echo " sudo systemctl status dnsmasq" + echo " sudo journalctl -u hostapd -n 30 --no-pager" + exit 1 +fi + +# ═══════════════════════════════════════════════════════════════════════ +# DONE +# ═══════════════════════════════════════════════════════════════════════ + +echo "" +echo "╔═══════════════════════════════════════════════╗" +echo "║ WiFi Access Point Setup Complete 🎸 ║" +echo "╚═══════════════════════════════════════════════╝" +echo "" +echo " 📶 SSID: $SSID" +echo " 🔑 Password: $PSK" +echo " 🔗 Web UI: http://pedal.local:8080" +echo " 🌐 IP: http://$AP_IP:8080" +echo "" +echo "Your phone should see '$SSID' in available WiFi networks." +echo "Join it, then open the browser to the URL above." +echo "" +echo "To disable the hotspot later:" +echo " sudo bash $0 --disable" +echo "" +echo "Note: The Pi's WiFi is now in AP mode — it won't connect" +echo "to the internet. If you need internet access, plug in a" +echo "USB WiFi dongle (the pedal auto-detects it)." +echo "" \ No newline at end of file