🇬🇧 English | 🇮🇹 Italiano | 🇩🇪 Deutsch
Quadro strumenti digitale per Fiat Panda 141 basato su Arduino / 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 dell'Arduino / 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 lottare 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! Saremmo curiosi di vedere un port nativo e ti aiuteremmo volentieri.
| 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)
Raspberry Pi 3 Model B+: Funziona in modalità Headless (solo server)
📋 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 (durante npm install nel server):
gyp ERR! stack TypeError: Cannot assign to read only property 'cflags'
gyp info using node-gyp@7.1.2
gyp info using Python version 3.13.5
Causa: La dipendenza epoll (usata da onoff per GPIO) ha una versione vecchia di node-gyp incompatibile con Python 3.13+.
Soluzioni:
Opzione 1: Installazione con --ignore-scripts (Consigliata per dev)
cd server
npm install --ignore-scriptsQuesto salta la compilazione delle dipendenze native (GPIO, SerialPort). Perfetto per:
- ✅ Sviluppo su laptop/desktop
- ✅ CI/CD pipelines
- ✅ Sistemi con Python 3.13+
- ❌ NON funziona su Raspberry Pi (serve compilare)
Opzione 2: Downgrade Python (solo se necessario per Raspberry)
# Installa Python 3.11 (compatibile con node-gyp)
sudo apt install python3.11
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1Opzione 3: DEV_MODE (sviluppo server)
cd server
npm install --ignore-scripts
DEV_MODE=true node server.jsNota: Le dipendenze hardware (onoff, serialport, ads1x15) sono optionalDependencies - falliscono senza bloccare l'installazione delle altre dipendenze.
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 distribuibile:
- Installa electron-builder:
npm install --save-dev electron-builder - Aggiungi script in
package.json:
"scripts": {
"build:electron": "electron-builder"
}- Esegui:
npm run build:electron
cluster/
├── 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.
