6.2 KiB
6.2 KiB
CAN Monitor for Flipper Zero
Dynamic multi-page monitor application for Raspberry Pi 5 via UART.
Features
- Dynamic Page System - Pages are fully controlled by RPi5
- Multiple Page Types:
- Info - Read-only status display
- Menu - Selectable action items
- Confirm - Yes/No confirmation dialogs
- Real-time Updates - Content refreshes every second
- Bidirectional Communication - Send commands back to RPi5
- Result Notifications - Action results displayed as overlay
Default Pages
When connected to the CAN Sniffer system:
| Page | Type | Description |
|---|---|---|
| CAN Statistics | Info | Frame counts, queue status, per-interface stats |
| UPS Status | Info | Battery level, voltage, charging state (X120x) |
| System Info | Info | CPU temperature, power consumption, fan RPM |
| Actions | Menu | Shutdown, Reboot, Cancel shutdown |
Screen Layout
128x64 pixels (Flipper Zero display)
+----------------------------------+
| [1/4] Page Title (*) | <- Header: page indicator, title, connection dot
+----------------------------------+
| |
| Content Line 1 | <- Content area: 4-5 lines
| Content Line 2 |
| Content Line 3 |
| Content Line 4 |
| |
+----------------------------------+
| < Hint Text > | <- Footer: nav arrows, action hint
+----------------------------------+
Controls
| Key | Info Page | Menu Page | Confirm Page |
|---|---|---|---|
| Left/Right | Navigate pages | Navigate pages | Navigate pages |
| Up/Down | - | Select item | Switch Yes/No |
| OK | - | Execute action | Confirm selection |
| Back | Disconnect (pg 0) / Prev page | Same | Cancel dialog |
Protocol
RPi5 -> Flipper
PAGE:<idx>/<total>|<type>|<title>|<lines>|<actions>|<selected>
ACK:<device>,ip=<ip>
RESULT:<OK|ERROR>|<message>
Examples:
PAGE:0/4|info|CAN Statistics|Total: 12.3K;Processed: 12.1K;Queue: 142||0
PAGE:1/4|info|UPS Status|Bat: 85.2% [====];Voltage: 4.12V;Status: Charging||0
PAGE:2/4|info|System Info|CPU Temp: 52.1C;Power: 4.2W;Fan: 3200 RPM||0
PAGE:3/4|menu|Actions|Shutdown;Reboot;Cancel Shutdown||0
PAGE:3/4|confirm|Confirm Shutdown?|Are you sure?|Yes;No|1
ACK:rpi5,ip=192.168.1.100
RESULT:OK|Shutdown in 1 min
Flipper -> RPi5
INIT:flipper - Start handshake
STOP:flipper - Disconnect
CMD:NAV:next - Next page
CMD:NAV:prev - Previous page
CMD:SELECT:<index> - Select menu item
CMD:CONFIRM - Confirm action
CMD:CANCEL - Cancel action
CMD:REFRESH - Request page update
Hardware Connection
Wiring Diagram
Flipper Zero Raspberry Pi 5
----------- ---------------
Pin 13 (TX) ----> GPIO 15 (RX) - Pin 10
Pin 14 (RX) <---- GPIO 14 (TX) - Pin 8
Pin 8/11/18 (GND) ---- GND - Pin 6
Note: Cross TX/RX connections (Flipper TX -> RPi RX)
Flipper Zero GPIO Pinout
Pin 13 = TX (USART)
Pin 14 = RX (USART)
Pin 8/11/18 = GND
RPI5 GPIO (using /dev/ttyAMA0)
GPIO 14 = TX (Pin 8)
GPIO 15 = RX (Pin 10)
GND = Pin 6, 9, 14, 20, 25, 30, 34, 39
Building the Application
Prerequisites
- Clone Flipper Zero firmware:
git clone --recursive https://github.com/DarkFlippers/unleashed-firmware.git
cd unleashed-firmware
- Copy the
flip_monitorfolder toapplications_user/:
cp -r /path/to/carpibord/flip_monitor applications_user/can_monitor
Build
# Build the FAP
./fbt fap_can_monitor
# Or build all external apps
./fbt fap_dist
The compiled .fap file will be in build/f7-firmware-D/.extapps/can_monitor.fap
Install
Copy the .fap file to your Flipper Zero SD card:
SD Card/apps/GPIO/can_monitor.fap
RPI5 Configuration
1. Enable UART
Add to /boot/firmware/config.txt:
enable_uart=1
dtoverlay=uart0
Disable serial console:
sudo raspi-config
# Interface Options -> Serial Port -> No (login shell) -> Yes (hardware)
Reboot after changes.
2. Install Dependencies
pip install pyserial smbus2 gpiozero
3. Configure CAN Sniffer
Add to can_sniffer/src/config.json:
{
"flipper": {
"enabled": true,
"device": "/dev/ttyAMA0",
"baudrate": 115200,
"send_interval": 1.0
}
}
Or use environment variables:
export CAN_SNIFFER_FLIPPER__ENABLED=true
export CAN_SNIFFER_FLIPPER__DEVICE=/dev/ttyAMA0
4. Run CAN Sniffer
cd can_sniffer/src
python main.py
Adding Custom Pages
On RPi5 side, create a new page class:
from flipper.pages.base import InfoPage
class MyCustomPage(InfoPage):
def __init__(self):
super().__init__(
name="my_page",
title="My Page",
icon="custom"
)
def get_lines(self) -> list[str]:
return [
"Custom line 1",
"Custom line 2",
f"Value: {self.get_value()}"
]
Register in FlipperHandler:
# In flipper_handler.py
from flipper.pages.my_custom import MyCustomPage
# In _setup_pages():
self._page_manager.register_page(MyCustomPage())
Troubleshooting
No connection
- Check wiring (TX/RX crossed correctly)
- Verify UART is enabled on RPI5:
ls -la /dev/ttyAMA0 - Check config:
flipper.enabled = true - Test UART manually:
# On RPI5
echo "ACK:rpi5,ip=test" > /dev/ttyAMA0
Permission denied on /dev/ttyAMA0
Add user to dialout group:
sudo usermod -a -G dialout $USER
# Then logout and login again
Flipper shows "Waiting for data..."
- Data is sent every 1 second (configurable)
- Connection timeout is 5 seconds
- Check if CAN sniffer is running
- Check UART logs:
CAN_SNIFFER_LOGGING__LEVEL=DEBUG python main.py
UPS page shows "not available"
- X120x UPS must be connected via I2C
- Install smbus2:
pip install smbus2 - Check I2C:
i2cdetect -y 1(should show device at 0x36)
Version History
- v2.0 - Dynamic page system, bidirectional commands, UPS/System pages
- v1.0 - Basic CAN statistics display
License
MIT License