Quadro strumenti digitale per Fiat Panda 141 basato su Raspberry Pi 4B.
Sistema completo di quadro strumenti digitale che sostituisce la strumentazione analogica originale della Fiat Panda 141. Il sistema si interfaccia con la centralina tramite protocollo OBD-II (ELM327) e legge le spie luminose tramite optoaccoppiatori collegati ai pin GPIO del Raspberry Pi.
- β Lettura dati OBD-II: VelocitΓ , giri motore, temperatura, pressione olio, etc.
- β Rilevamento spie veicolo: Abbaglianti, anabbaglianti, frecce, livello olio, etc.
- β
Sensori esterni:
- Temperatura esterna (DS18B20)
- Livello carburante (ADS1115)
- β Gestione quadro accensione: Sistema di power-saving automatico
- β Interfaccia moderna: Dashboard 3D con modello Panda interattivo
- β ModalitΓ demo: Per sviluppo senza hardware
Il cluster digitale sostituisce completamente il quadro strumenti analogico originale con un'interfaccia moderna e personalizzabile.
Scopri cosa stiamo pianificando: Roadmap & Wishlist
Alcune idee in lista:
- πΉ Retrocamera e sensori parcheggio
- πͺ Animazioni 3D avanzate (portiere, luci)
- π¨ Dashboard e temi personalizzabili
- π Internazionalizzazione
- π± App mobile companion
- E molto altro!
Vuoi contribuire? Ogni aiuto Γ¨ benvenuto! Vedi la guida per contribuire.
- Quick Start - Guida rapida per iniziare subito
- Hardware - Lista completa componenti e schema di montaggio
- Architettura - Architettura dettagliata del sistema
- Documentazione Generale - Overview completa del progetto
- Configurazione Client - Setup e configurazione frontend
- Configurazione Server - Setup e configurazione backend
- Configurazione Environment - Variabili d'ambiente e parametri
- Come Contribuire - Guida completa per contribuire al progetto
- Roadmap - Piano di sviluppo e wishlist
- Autori - Chi ha contribuito al progetto
- Licenza - GNU General Public License v3.0
PandaOS Γ¨ un progetto hobbistico e sperimentale, nato per curiositΓ tecnica e spirito di avventura digitale. Non Γ¨ un prodotto certificato, non Γ¨ pensato per la produzione e non ha alcuna pretesa di rispettare standard industriali, automotive o galattici.
Tutto il materiale presente in questo repository, inclusi codice, guide, schemi e idee piΓΉ o meno sensate, Γ¨ fornito "AS IS", senza garanzie di funzionamento, affidabilitΓ o compatibilitΓ con l'impianto elettrico della vostra eroica utilitaria.
Gli autori e i contributori non si assumono alcuna responsabilitΓ in caso di:
- guasti elettrici o elettronici
- comportamenti anomali del veicolo
- cortocircuiti imprevisti
- danni a persone, cose, animali e simili
- qualsiasi effetto collaterale derivante dall'uso del software o dal seguire le istruzioni presenti in questa documentazione
L'utilizzo di PandaOS su veicoli in circolazione o in qualsiasi contesto in cui potrebbero essere richiesti requisiti di conformitΓ , omologazione o buon senso Γ¨ fortemente sconsigliato. Qualsiasi installazione o sperimentazione avviene a rischio esclusivo dell'utente, che si assume ogni responsabilitΓ in merito alle conseguenze tecniche e pratiche delle proprie scelte.
Il progetto Γ¨ composto da tre moduli principali:
cluster/
βββ client/ β Interfaccia grafica (React + Vite + Electron)
βββ server/ β Backend comunicazione OBD-II e GPIO (Node.js)
βββ main.js β Wrapper Electron per desktop app
- Frontend: React 18, TypeScript, Three.js, Socket.IO Client
- Backend: Node.js, Socket.IO Server, SerialPort, GPIO (onoff)
- Desktop: Electron 36
- Hardware: Raspberry Pi 4B, ELM327, DS18B20, ADS1115
Sì, lo sappiamo. Qualsiasi ingegnere embedded che vede questo progetto probabilmente sta avendo un attacco di panico.
Come andrebbero fatte le cose per bene:
- C/C++ - PerchΓ© JavaScript su un'auto Γ¨ come mettere le ruote quadrate
- Qt/QML - Lo standard dell'industria (Tesla, Audi, BMW lo usano)
- Yocto/Buildroot - Linux embedded serio, non Raspberry Pi OS con tutto il ciarpame
- Direct framebuffer - Non Electron che gira un intero browser per mostrare 4 numeri
E allora perchΓ© React/Electron/Node.js?
PerchΓ© Γ¨ un progetto hobbistico e vogliamo divertirci, non impazzire.
Pro del nostro approccio discutibile:
- β‘ Veloce da sviluppare - Hai visto Three.js? Fai un modello 3D in 5 minuti. Prova con OpenGL nativo.
- π¨ Librerie ovunque - npm ha tutto. C++ ha... ehm... boost?
- π§βπ» Accessibile - Sai React? Benvenuto. Sai CMake? Condoglianze.
- π Debug - F12 e vedi tutto. GDB invece Γ¨... un'esperienza.
- π Divertimento - PiΓΉ tempo a smanettare, meno a bestemmiare con toolchain
- π‘ Prova il concetto - Funziona? Bene! Poi si vedrΓ .
Contro (che accettiamo consapevolmente):
- πΎ Mangia RAM come fosse pasta (~500MB vs ~50MB)
- π Boot lento (~30s vs ~3s) - ma con modalitΓ standby sempre acceso diventa istantaneo
- π Consuma piΓΉ di quanto dovrebbe (ma standby consuma solo 0.4W, trascurabile)
- π JavaScript - SΓ¬, JavaScript. Su un'auto. Deal with it.
Il punto Γ¨: Stiamo parlando di una Panda del 1990. Non Γ¨ un F-35. Non deve andare sulla Luna.
Deve mostrarti i giri motore in modo figo mentre ascolti i Pink Floyd. E questo lo fa benissimo. ππ¨
π‘ Vuoi rifarlo in C++/Qt "come si deve"? Fantastico! Apri pure un fork e ti aiutiamo. Ma non lamentarti quando dopo 3 settimane stai ancora debuggando un segfault nel thread del rendering. Noi intanto ci godiamo l'hot reload. π
| Software | Versione Minima | Consigliata |
|---|---|---|
| Node.js | 18.0.0 | 20.x LTS |
| npm | 9.0.0 | 10.x |
| Git | 2.0+ | Latest |
# Verifica rapida
node --version # >= v18.0.0
npm --version # >= 9.0.0
git --version # >= 2.0.0apt install nodejs (versione obsoleta). Vedi CONFIGURAZIONE_SERVER.md per NodeSource/nvm.
- Hardware:
- Raspberry Pi 4B (4GB o superiore consigliato) o Raspberry Pi 5
- Adattatore ELM327 USB (porta seriale
/dev/ttyUSB0) - Optoaccoppiatori per rilevamento spie (PC817 o simili)
- Display LCD ultra-wide (1920Γ480 consigliato)
- Sensore temperatura DS18B20 (opzionale)
- Convertitore ADC ADS1115 (opzionale, per sensore carburante)
π Lista completa hardware: Vedi HARDWARE.md per dettagli su tutti i componenti necessari
-
Sistema Operativo:
- Raspberry Pi OS Lite (64-bit) - Debian-based consigliato
- Boot time: ~30s (ottimizzabile a ~20s, o istantaneo con modalitΓ standby)
- Architettura ARM/ARM64
π Scelta OS e Boot Time: Vedi CONFIGURAZIONE_SERVER.md per dettagli su come scegliere la distro giusta, ottimizzare il boot time e configurare la modalitΓ standby sempre acceso (consumo trascurabile, avvio istantaneo)
-
Software: Vedi CONFIGURAZIONE_SERVER.md per istruzioni installazione su Raspberry Pi
- Node.js 18+ (20 LTS consigliato)
- npm 9+ (10.x consigliato)
- Git 2.0+
π‘ Setup Veloce: Vedi istruzioni installazione nella sezione Prerequisiti Software sopra
git clone https://github.com/cyberpandino/cluster
cd clusterIl progetto fornisce uno script di installazione che configura tutte le dipendenze:
npm run install:allQuesto comando installa le dipendenze per:
- Root (Electron + concurrently)
- Client (React + dipendenze frontend)
- Server (Node.js + dipendenze hardware)
Modifica il file di configurazione client:
File: client/src/config/environment.ts
export const environment: EnvironmentConfig = {
websocket: {
url: 'http://127.0.0.1:3001', // URL del server WebSocket
mock: true, // true = modalitΓ demo | false = connessione reale
reconnectionAttempts: 3,
reconnectionDelay: 1000,
timeout: 5000,
},
debug: {
enabled: true, // Abilita debug mode
showConsoleViewer: true, // Mostra console viewer (tasto 'd')
},
app: {
name: "PandaOS Cluster",
version: "0.9.0",
locale: "it",
timezone: "Europe/Rome",
timeFormat: "24h",
},
};Parametri Chiave:
websocket.url: Indirizzo del server WebSocket (default:http://127.0.0.1:3001)websocket.mock:true= ModalitΓ demo con animazioni simulate (per sviluppo locale)false= Connessione reale al server (per produzione su Raspberry Pi)
debug.enabled: Abilita funzionalitΓ di debugdebug.showConsoleViewer: Mostra console viewer (attivabile con tastod)
Modifica il file di configurazione GPIO e sensori:
File: server/config/gpio-mapping.js
Vedi la sezione Configurazione GPIO per i dettagli completi.
Avvia client, server ed Electron contemporaneamente:
npm startQuesto comando esegue:
- Server OBD-II sulla porta 3001
- Client React/Vite sulla porta 5173
- Electron desktop app
- Assicurati che
websocket.mock = trueinclient/src/config/environment.ts - Avvia solo il client:
npm run clientL'applicazione sarΓ disponibile su http://localhost:5173 con dati simulati.
npm run client # In un terminale
npm run electron # In un altro terminale# Solo server (richiede Raspberry Pi)
npm run server
# Solo client
npm run client
# Solo Electron (attende client su porta 5173)
npm run electronIl file server/config/gpio-mapping.js contiene la mappatura completa dei pin GPIO.
π Schema Elettrico Veicolo: Per identificare i cavi corretti delle spie sul quadro originale della Panda, consulta lo Schema Elettrico Ufficiale Fiat Panda 141 con tutti i codici colore e le connessioni.
| Spia/Funzione | Pin GPIO (BCM) | Descrizione |
|---|---|---|
| Frecce | 17 | Indicatori di direzione |
| Alternatore | 27 | Carica batteria |
| Pressione olio | 22 | Pressione olio motore |
| Sistema frenante | 23 | Freni |
| Iniettori | 24 | Sistema iniezione |
| Quadro acceso (KEY) | 25 | Chiave inserita |
| Abbaglianti | 5 | Fari abbaglianti |
| Anabbaglianti | 6 | Fari anabbaglianti |
| Quattro frecce | 12 | Luci emergenza |
| Fendinebbia | 13 | Fendinebbia posteriore |
| Temperatura raffreddamento | 16 | Liquido refrigerante |
| Termoresistenza lunotto | 19 | Sbrinatore lunotto |
| Riserva carburante | 20 | Livello carburante basso |
| Ignition (quadro) | 21 | Rilevamento quadro acceso/spento |
config: {
mode: 'BCM', // Numerazione Broadcom GPIO
pullMode: 'PUD_DOWN', // Resistenza pull-down interna
debounceTime: 50, // Filtro anti-rimbalzo (ms)
pollingInterval: 100, // Frequenza lettura GPIO (ms)
}Logica di Funzionamento:
HIGH (1)= Spia accesaLOW (0)= Spia spenta
ignition: {
enabled: true,
pin: 21, // Pin GPIO dedicato
activeOn: 0, // 0 = active low | 1 = active high
scripts: {
lowPower: './scripts/low-power.sh', // Eseguito quando quadro si spegne
wake: './scripts/wake.sh', // Eseguito quando quadro si accende
},
}Gli script di power-saving possono essere personalizzati per:
- Spegnere display
- Ridurre luminositΓ
- Disabilitare servizi non essenziali
- Avviare shutdown controllato
temperature: {
enabled: true,
sensorId: null, // null = auto-detect primo sensore
basePath: '/sys/bus/w1/devices',
readInterval: 5000, // Intervallo lettura (ms)
pin: 4, // GPIO 4 (default per 1-Wire)
}Setup Hardware:
- Collegare DS18B20 al GPIO 4
- Abilitare 1-Wire:
sudo raspi-configβ Interface Options β 1-Wire - Verificare presenza sensore:
ls /sys/bus/w1/devices/
fuel: {
enabled: true,
chip: 0, // 0 = ADS1115 | 1 = ADS1015
channel: 0, // Canale A0 (0-3 disponibili)
gain: 4096, // Β±4.096V full-scale
sampleRate: 250, // Sample rate (SPS)
readInterval: 500, // Intervallo lettura (ms)
// Configurazione partitore resistivo
voltageDivider: {
r1: 100000, // 100kΞ©
r2: 33000, // 33kΞ©
},
// Calibrazione tensione β percentuale
calibration: {
voltageEmpty: 0.5, // Tensione serbatoio vuoto (V)
voltageFull: 4.0, // Tensione serbatoio pieno (V)
},
pins: {
sda: 2, // GPIO 2 (SDA I2C)
scl: 3, // GPIO 3 (SCL I2C)
},
}Setup Hardware:
- Collegare ADS1115:
- VDD β 3.3V
- GND β GND
- SDA β GPIO 2
- SCL β GPIO 3
- A0 β Sensore carburante (tramite partitore resistivo)
- Abilitare I2C:
sudo raspi-configβ Interface Options β I2C - Verificare presenza:
sudo i2cdetect -y 1
File: server/services/OBDCommunicationService.js
constructor() {
this.portPath = '/dev/ttyUSB0'; // Porta ELM327
this.port = null;
this.baudRate = 38400; // VelocitΓ comunicazione
}Setup Hardware:
- Collegare adattatore ELM327 via USB
- Verificare porta:
ls -l /dev/ttyUSB* - Dare permessi:
sudo usermod -a -G dialout $USER - Riavviare o ri-login per applicare permessi
Configurazione Porta Seriale Alternativa:
Se l'adattatore OBD Γ¨ su una porta diversa (es. /dev/ttyUSB1, /dev/ttyACM0), modificare:
// In server/services/OBDCommunicationService.js (riga 7)
this.portPath = '/dev/ttyUSB1'; // Modifica quiPer eseguire il server come servizio di sistema su Raspberry Pi:
sudo npm install -g pm2Modifica server/ecosystem.config.js:
module.exports = {
apps: [{
name: 'obd-server',
script: './server.js',
cwd: '/home/pi/cockpit/server', // β οΈ MODIFICA QUESTO PATH
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '200M',
restart_delay: 2000,
max_restarts: 15,
min_uptime: '10s',
exp_backoff_restart_delay: 100,
env: {
NODE_ENV: 'production',
PORT: 3001
},
log_file: './logs/obd-combined.log',
out_file: './logs/obd-out.log',
error_file: './logs/obd-error.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
merge_logs: true
}]
};cd server
mkdir -p logs
pm2 start ecosystem.config.js
pm2 save
pm2 startuppm2 status # Stato servizi
pm2 logs obd-server # Visualizza log
pm2 restart obd-server # Riavvia servizio
pm2 stop obd-server # Ferma servizio
pm2 monit # Monitor in tempo realeErrore:
β ERRORE: Dipendenze Raspberry Pi essenziali non disponibili
Piattaforma non supportata: darwin arm64 - richiesto Linux ARM
Soluzione:
- Usa la modalitΓ mock nel client (
websocket.mock = true) - Oppure esegui il server solo su Raspberry Pi
Errore:
Porta /dev/ttyUSB0 non trovata
Soluzione:
- Verifica porta:
ls -l /dev/ttyUSB* - Controlla permessi:
sudo usermod -a -G dialout $USER - Modifica porta in
OBDCommunicationService.jsse diversa
Avviso:
β οΈ Sensore temperatura DS18B20 non disponibile (1-Wire non trovato)
Soluzione:
- Abilita 1-Wire:
sudo raspi-configβ Interface Options β 1-Wire - Riavvia:
sudo reboot - Verifica:
ls /sys/bus/w1/devices/ - Se non necessario, disabilita in
gpio-mapping.js:temperature.enabled = false
Avviso:
β οΈ Sensore carburante ADS1115 non disponibile
Soluzione:
- Abilita I2C:
sudo raspi-configβ Interface Options β I2C - Verifica connessione:
sudo i2cdetect -y 1 - Controlla cablaggio ADS1115
- Se non necessario, disabilita in
gpio-mapping.js:fuel.enabled = false
Errore:
Error: connect ECONNREFUSED 127.0.0.1:5173
Soluzione:
Il client Vite deve essere avviato prima. Usa npm start che gestisce l'ordine automaticamente.
Problema: Le spie non vengono rilevate
Soluzione:
- Verifica cablaggio optoaccoppiatori
- Testa pin:
gpio readall(installa wiringpi se necessario) - Controlla mappatura pin in
gpio-mapping.js - Verifica logica active high/low degli optoaccoppiatori
d: Apri console di debugESC: Chiudi console di debugr: Ricarica applicazione
Premi d per aprire la console interattiva che mostra:
- Log WebSocket
- Errori di connessione
- Dati OBD-II in tempo reale
- Stato GPIO e sensori
cd client
npm run buildOutput in client/dist/
Per creare un'app distributable:
- Installa electron-builder:
npm install --save-dev electron-builder - Aggiungi script in
package.json:
"scripts": {
"build:electron": "electron-builder"
}- Esegui:
npm run build:electron
cockpit/
βββ client/
β βββ src/
β β βββ config/
β β β βββ environment.ts β Configurazione client
β β βββ components/ β Componenti React
β β βββ routes/
β β β βββ Cockpit/ β Dashboard principale
β β βββ services/
β β β βββ WebSocketService.ts β Gestione WebSocket client
β β βββ store/ β State management (Valtio)
β βββ package.json
β
βββ server/
β βββ config/
β β βββ gpio-mapping.js β βοΈ Configurazione GPIO e sensori
β βββ services/
β β βββ OBDServer.js β Server principale
β β βββ OBDCommunicationService.js β Comunicazione ELM327
β β βββ GPIOService.js β Gestione GPIO per spie
β β βββ IgnitionService.js β Gestione quadro accensione
β β βββ TemperatureSensorService.jsβ Sensore temperatura DS18B20
β β βββ FuelSensorService.js β Sensore carburante ADS1115
β βββ scripts/
β β βββ low-power.sh β Script power-saving
β β βββ wake.sh β Script risveglio
β βββ ecosystem.config.js β Configurazione PM2
β βββ package.json
β
βββ main.js β Wrapper Electron
βββ package.json β Scripts principali
β οΈ Non eseguire come root: Usa permessi utente normali con gruppodialoutegpio- π Power-saving: Gli script ignition possono proteggere il sistema da scaricamenti batteria
- π§ͺ Testing: Usa sempre modalitΓ mock per test senza hardware
- π Monitoring: Usa PM2 per monitorare il server in produzione
Questo progetto Γ¨ rilasciato sotto licenza GNU General Public License v3.0 or later.
PandaOS
Copyright (C) 2025 Cyberpandino
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License version 3.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Il testo completo della licenza Γ¨ disponibile nel file LICENSE e su https://www.gnu.org/licenses/gpl-3.0.html
Ogni contributo Γ¨ benvenuto! Che si tratti di codice, documentazione, bug report o suggerimenti.
- Leggi la guida per contribuire
- Scegli come contribuire:
- π Segnala un bug
- β¨ Proponi una feature
- β Fai una domanda
- π» Contribuisci con codice
- π‘ Cerca ispirazione nella Roadmap & Wishlist
- Fork del repository
- Crea un branch:
git checkout -b feature/nome-feature - Fai le tue modifiche seguendo lo stile del codice
- Aggiungi l'header GPL-3.0 ai nuovi file sorgente
- Commit:
git commit -m 'feat: aggiunta nuova feature'(Conventional Commits) - Push:
git push origin feature/nome-feature - Apri una Pull Request compilando il template
- π Bug Report - Segnala problemi
- β¨ Feature Request - Proponi miglioramenti
- β Domanda - Chiedi aiuto
- π Pull Request - Contribuisci con codice
Non sai da dove iniziare? Abbiamo una Roadmap & Wishlist di feature che vorremmo implementare:
- Retrocamera e sensori parcheggio
- Animazioni 3D avanzate (portiere, luci sul modello)
- Dashboard personalizzabili e temi
- Tutorial fotografici e video
- Internazionalizzazione
- E molto altro!
Consulta la guida completa per contribuire per tutti i dettagli.
Per problemi o domande, apri una issue su GitHub.
PandaOS Γ¨ sviluppato e mantenuto da:
Vedi AUTHORS per la lista completa e dettagli sui contributori.