Use Raspberry Pi Imager to install your OS https://www.raspberrypi.com/software/
- Raspberry Pi OS installed.
- Stable:
- System: 32-bit
- Kernel version: 6.6
- Debian version: 12 (bookworm) '2024-10-22-raspios-bookworm-armhf-lite'
- Stable:
- Username and hostname set to
bjorn
. - 2.13-inch e-Paper HAT connected to GPIO pins.
I did not develop Bjorn for the raspberry pi zero w2 64bits, but several feedbacks have attested that the installation worked perfectly.
- Raspberry Pi OS installed.
- Stable:
- System: 64-bit
- Kernel version: 6.6
- Debian version: 12 (bookworm) '2024-10-22-raspios-bookworm-arm64-lite'
- Stable:
- Username and hostname set to
bjorn
. - 2.13-inch e-Paper HAT connected to GPIO pins.
At the moment the paper screen v2 v4 have been tested and implemented. I juste hope the V1 & V3 will work the same.
The fastest way to install Bjorn is using the automatic installation script :
# Download and run the installer
wget https://raw.githubusercontent.com/infinition/Bjorn/refs/heads/main/install_bjorn.sh
sudo chmod +x install_bjorn.sh
sudo ./install_bjorn.sh
# Choose the choice 1 for automatic installation. It may take a while as a lot of packages and modules will be installed. You must reboot at the end.
sudo raspi-config
- Navigate to "Interface Options".
- Enable SPI.
- Enable I2C.
# Update system
sudo apt-get update && sudo apt-get upgrade -y
# Install required packages
sudo apt install -y \
libjpeg-dev \
zlib1g-dev \
libpng-dev \
python3-dev \
libffi-dev \
libssl-dev \
libgpiod-dev \
libi2c-dev \
libatlas-base-dev \
build-essential \
python3-pip \
wget \
lsof \
git \
libopenjp2-7 \
nmap \
libopenblas-dev \
bluez-tools \
bluez \
dhcpcd5 \
bridge-utils \
python3-pil
# Update Nmap scripts database
sudo nmap --script-updatedb
# Clone the Bjorn repository
cd /home/bjorn
git clone https://github.com/infinition/Bjorn.git
cd Bjorn
# Install Python dependencies within the virtual environment
sudo pip install -r requirements.txt --break-system-packages
# As i did not succeed "for now" to get a stable installation with a virtual environment, i installed the dependencies system wide (with --break-system-packages), it did not cause any issue so far. You can try to install them in a virtual environment if you want.
Choose your e-Paper HAT version by modifying the configuration file:
- Open the configuration file:
sudo vi /home/bjorn/Bjorn/config/shared_config.json
Press i to enter insert mode Locate the line containing "epd_type": Change the value according to your screen model:
- For 2.13 V1: "epd_type": "epd2in13",
- For 2.13 V2: "epd_type": "epd2in13_V2",
- For 2.13 V3: "epd_type": "epd2in13_V3",
- For 2.13 V4: "epd_type": "epd2in13_V4",
Press Esc to exit insert mode Type :wq and press Enter to save and quit
To prevent OSError: [Errno 24] Too many open files
, it's essential to increase the file descriptor limits.
Edit /etc/security/limits.conf
:
sudo vi /etc/security/limits.conf
Add the following lines:
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
Edit /etc/systemd/system.conf
:
sudo vi /etc/systemd/system.conf
Uncomment and modify:
DefaultLimitNOFILE=65535
Edit /etc/systemd/user.conf
:
sudo vi /etc/systemd/user.conf
Uncomment and modify:
DefaultLimitNOFILE=65535
sudo vi /etc/security/limits.d/90-nofile.conf
Add:
root soft nofile 65535
root hard nofile 65535
Edit /etc/sysctl.conf
:
sudo vi /etc/sysctl.conf
Add:
fs.file-max = 2097152
Apply the changes:
sudo sysctl -p
Reload systemd to apply the new file descriptor limits:
sudo systemctl daemon-reload
PAM (Pluggable Authentication Modules) manages how limits are enforced for user sessions. To ensure that the new file descriptor limits are respected, update the following configuration files.
sudo vi /etc/pam.d/common-session
sudo vi /etc/pam.d/common-session-noninteractive
Add this line at the end of both files:
session required pam_limits.so
This ensures that the limits set in /etc/security/limits.conf
are enforced for all user sessions.
Create the service file:
sudo vi /etc/systemd/system/bjorn.service
Add the following content:
[Unit]
Description=Bjorn Service
DefaultDependencies=no
Before=basic.target
After=local-fs.target
[Service]
ExecStartPre=/home/bjorn/Bjorn/kill_port_8000.sh
ExecStart=/usr/bin/python3 /home/bjorn/Bjorn/Bjorn.py
WorkingDirectory=/home/bjorn/Bjorn
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root
# Check open files and restart if it reached the limit (ulimit -n buffer of 1000)
ExecStartPost=/bin/bash -c 'FILE_LIMIT=$(ulimit -n); THRESHOLD=$(( FILE_LIMIT - 1000 )); while :; do TOTAL_OPEN_FILES=$(lsof | wc -l); if [ "$TOTAL_OPEN_FILES" -ge "$THRESHOLD" ]; then echo "File descriptor threshold reached: $TOTAL_OPEN_FILES (threshold: $THRESHOLD). Restarting service."; systemctl restart bjorn.service; exit 0; fi; sleep 10; done &'
[Install]
WantedBy=multi-user.target
Create the script to free up port 8000:
vi /home/bjorn/Bjorn/kill_port_8000.sh
Add:
#!/bin/bash
PORT=8000
PIDS=$(lsof -t -i:$PORT)
if [ -n "$PIDS" ]; then
echo "Killing PIDs using port $PORT: $PIDS"
kill -9 $PIDS
fi
Make the script executable:
chmod +x /home/bjorn/Bjorn/kill_port_8000.sh
Modify /boot/firmware/cmdline.txt
:
sudo vi /boot/firmware/cmdline.txt
Add the following right after rootwait
:
modules-load=dwc2,g_ether
Modify /boot/firmware/config.txt
:
sudo vi /boot/firmware/config.txt
Add at the end of the file:
dtoverlay=dwc2
Create the USB gadget script:
sudo vi /usr/local/bin/usb-gadget.sh
Add the following content:
#!/bin/bash
set -e
modprobe libcomposite
cd /sys/kernel/config/usb_gadget/
mkdir -p g1
cd g1
echo 0x1d6b > idVendor
echo 0x0104 > idProduct
echo 0x0100 > bcdDevice
echo 0x0200 > bcdUSB
mkdir -p strings/0x409
echo "fedcba9876543210" > strings/0x409/serialnumber
echo "Raspberry Pi" > strings/0x409/manufacturer
echo "Pi Zero USB" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower
mkdir -p functions/ecm.usb0
# Check for existing symlink and remove if necessary
if [ -L configs/c.1/ecm.usb0 ]; then
rm configs/c.1/ecm.usb0
fi
ln -s functions/ecm.usb0 configs/c.1/
# Ensure the device is not busy before listing available USB device controllers
max_retries=10
retry_count=0
while ! ls /sys/class/udc > UDC 2>/dev/null; do
if [ $retry_count -ge $max_retries ]; then
echo "Error: Device or resource busy after $max_retries attempts."
exit 1
fi
retry_count=$((retry_count + 1))
sleep 1
done
# Check if the usb0 interface is already configured
if ! ip addr show usb0 | grep -q "172.20.2.1"; then
ifconfig usb0 172.20.2.1 netmask 255.255.255.0
else
echo "Interface usb0 already configured."
fi
Make the script executable:
sudo chmod +x /usr/local/bin/usb-gadget.sh
Create the systemd service:
sudo vi /etc/systemd/system/usb-gadget.service
Add:
[Unit]
Description=USB Gadget Service
After=network.target
[Service]
ExecStartPre=/sbin/modprobe libcomposite
ExecStart=/usr/local/bin/usb-gadget.sh
Type=simple
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Configure usb0
:
sudo vi /etc/network/interfaces
Add:
allow-hotplug usb0
iface usb0 inet static
address 172.20.2.1
netmask 255.255.255.0
Reload the services:
sudo systemctl daemon-reload
sudo systemctl enable systemd-networkd
sudo systemctl enable usb-gadget
sudo systemctl start systemd-networkd
sudo systemctl start usb-gadget
You must reboot to be able to use it as a USB gadget (with ip)
Set the static IP address on your Windows PC:
- IP Address:
172.20.2.2
- Subnet Mask:
255.255.255.0
- Default Gateway:
172.20.2.1
- DNS Servers:
8.8.8.8
,8.8.4.4
2024 - Bjorn is distributed under the MIT License. For more details, please refer to the LICENSE file included in this repository.