Recently I made a post about how to SSH into a Pi Zero over USB. The Raspberry Pi Zero W lets us create some amazing USB projects. Today I'm going to share a project I made over the summer that uses the Pi Zero W and really takes advantage of it's small form-factor, and cool USB capabilities. It's a smart-USB storage device! This allows you to plug into any usb port (TV, Laptop, etc.) and wirelessly transfer files to a virtual USB Flash drive. This lets you play videos from your phone on your TV, upload your favorite photos and share with others. You can also download uploaded data from the captive portal, delete files to make more space, or even tell others to connect to it so they can download data. I made this using NodeJS, and while the frontend (and possibly the backend too :eyes:) might not look the best, it's a very practical project that was exciting to create!
sudo apt update sudo apt upgrade -y
Modify /boot/config.txt and add
Append this to /etc/modules & reboot to load the module
Make a 2GB bin file. You can change the ammount of MB by changing the count (this may take a while)
sudo dd bs=1M if=/dev/zero of=/piusb.bin count=2048
Format the bin as FAT32
sudo mkdosfs /piusb.bin -F 32 -I
Make the directory we'll be using to mount too
sudo mkdir /mnt/usb_share
Append this to /etc/fstab
/piusb.bin /mnt/usb_share vfat users,umask=00 0 02
This will mount the driver automatically and allow for error-checking on boot.
Download the binaries (Check for latest version here)
Extract the tar file
tar xf node-v10.15.3-linux-armv6l.tar.xz
Install Node and NPM
cd node-v10.15.3-linux-armv6l/ sudo cp -R * /usr/local/
Verify the installation by
npm -v node -v
Go back to your home directory
Make sure git is installed
sudo apt install git -y
Clone this repository
git clone https://github.com/CPunch/PiStick.git
cd PiStick/PiStick-WebServer sudo chmod +x install.sh ./install.sh
Test and make sure WebServer is running
sudo node start.js
Now we need to make sure it starts when booting, edit /etc/rc.local and put this right before
cd /home/pi/PiStick/PiStick-WebServer node start.js &
Make sure to do this step LAST. After running an accesspoint you will NOT be able to access the internet from your pi after reboot unless you stop the HostAPD service yourself.
Install dnsmasq and hostapd
sudo apt-get install dnsmasq hostapd
Setup static address in dhcpcd, append this to /etc/dhcpcd.conf
interface wlan0 static ip_address=192.168.4.1/24 nohook wpa_supplicant
Setup DNSMASQ, move conf file and make a new one.
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo nano /etc/dnsmasq.conf
Type or copy this into the file
interface=wlan0 # Use the require wireless interface - usually wlan0 dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h address=/#/192.168.4.1 # redirect to our captive portal
That configures the addresses to lease and the lease time. It also redirects all traffic to our captive portal!
Now, configure hostapd located at /etc/hostapd/hostapd.conf
interface=wlan0 driver=nl80211 ssid=pistick country_code=US hw_mode=g channel=7 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=Pi_Stick wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
Defaults: SSID: pistick Passphrase: Pi_Stick
Feel free to change this!
Now we need to tell hostapd where to find that file, edit /etc/default/hostapd and add this at the top
Now you need to reload the services.
sudo systemctl enable dnsmasq sudo systemctl enable hostapd
NOTE if you get an error about hostapd.service being masked, run this:
sudo systemctl unmask hostapd sudo systemctl daemon-reload sudo systemctl start hostapd sudo systemctl enable hostapd
Plug your Pi into your computer. Wait for it to boot and a USB mass storage device will show up! You can now go on your phone, go to wifi and try to connect to 'pistick' (or whatever you renamed the SSID to). It'll open the captive portal where you can upload your files!