README.md

This commit is contained in:
Serge NOEL
2026-09-21 13:10:47 +02:00
parent 387838349d
commit bd25aaa055
5 changed files with 112 additions and 189 deletions
+4 -4
View File
@@ -1,4 +1,4 @@
.pio/
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/ipch/
.pio/
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/ipch/
-77
View File
@@ -1,77 +0,0 @@
# Journées maritimes de Brest 2027
Projet de bateaux télécommandés pour le bassin des Journées maritimes. Le matériel repose sur des ESP8266 et deux modes réseau :
- **MQTT** : un point d'accès OpenWRT fournit le Wi-Fi et le broker MQTT ; la supervision Banana Pi suit les périphériques et les batteries.
- **AP autonome** : le bateau crée son propre réseau Wi-Fi et fonctionne sans broker ni supervision.
## Structure PlatformIO
Le dépôt contient un seul projet PlatformIO avec quatre environnements :
| Environnement | Matériel | Réseau |
| --- | --- | --- |
| `boat_mqtt` | bateau + MX1508 + servo | MQTT |
| `remote_mqtt` | télécommande + capteurs Hall | MQTT |
| `boat_ap` | bateau + MX1508 + servo | point d'accès ESP8266 |
| `remote_ap` | télécommande + capteurs Hall | point d'accès ESP8266 |
Commandes de départ :
```text
pio run -e boat_mqtt
pio run -e remote_mqtt
pio run -e boat_ap
pio run -e remote_ap
pio device monitor -b 115200
```
Le firmware initial est volontairement passif : il initialise les entrées/sorties et affiche son rôle sur le port série, mais n'active pas les moteurs. Les broches sont centralisées dans `include/pins.h`.
## Conseils de réalisation et de câblage
### Alimentation
- Ne jamais alimenter les moteurs depuis le régulateur 3,3 V de l'ESP8266.
- Relier toutes les masses : batterie, MX1508, régulateur et ESP8266.
- Ajouter un condensateur de découplage près de l'ESP8266 et du MX1508 ; les moteurs peuvent provoquer des resets Wi-Fi.
- Vérifier au multimètre la tension réellement appliquée à l'ESP8266 avant insertion de la batterie.
- Le pont diviseur de mesure batterie doit ramener la tension maximale sous la limite de l'entrée A0 de la carte utilisée. Cette limite varie selon le module ESP8266 : vérifier sa fiche technique.
- Pour une batterie 2S, dimensionner le diviseur sur 8,4 V (batterie pleine), pas sur sa tension nominale.
### Broches ESP8266
Le choix proposé dans `include/pins.h` est :
| Fonction | Broche NodeMCU | GPIO |
| --- | --- | --- |
| Batterie | A0 | ADC0 |
| I2C SDA | D2 | GPIO4 |
| I2C SCL | D1 | GPIO5 |
| Moteur gauche avant/arrière | D5 / D6 | GPIO14 / GPIO12 |
| Moteur droit avant/arrière | D7 / D8 | GPIO13 / GPIO15 |
| Servo gouvernail | D4 | GPIO2 |
Conseils importants :
- GPIO0, GPIO2 et GPIO15 participent au démarrage de l'ESP8266. Le MX1508 et le servo ne doivent pas imposer un mauvais niveau logique pendant le boot ; tester le démarrage avec le moteur déconnecté, puis vérifier les niveaux avec un oscilloscope ou un analyseur logique.
- D8/GPIO15 est utilisé ici pour disposer de quatre sorties moteur, mais il doit être validé sur le montage final. Prévoir une résistance ou un buffer si le MX1508 perturbe le niveau de boot.
- L'ESP8266 ne possède qu'une seule entrée analogique. Deux capteurs Hall analogiques ne peuvent donc pas être raccordés directement : utiliser un ADC externe I2C (solution recommandée) ou un multiplexeur analogique.
- Si les capteurs Hall sont des capteurs numériques à seuil, les raccorder à des GPIO distincts et adapter `pins.h` et le filtrage logiciel.
- Le servo doit avoir une alimentation adaptée et une masse commune ; ne pas supposer que le 3,3 V de l'ESP8266 suffit à fournir son courant de pointe.
### Sécurité de fonctionnement
- Prévoir un état d'arrêt au démarrage, à la perte Wi-Fi, à la perte MQTT et après expiration d'un watchdog de commande.
- Le dernier ordre reçu ne doit jamais rester actif indéfiniment : chaque commande doit porter une durée de validité courte.
- Ajouter une commande d'arrêt locale sur chaque pupitre et tester le comportement avec le broker indisponible.
- Ne tester les moteurs qu'avec l'hélice retirée, puis dans un bassin sécurisé.
## Prochaines étapes
1. Mesurer et documenter les tensions batterie et les rapports des diviseurs.
2. Valider le démarrage avec le câblage MX1508 et la table de broches.
3. Ajouter la lecture calibrée des capteurs Hall et de la batterie.
4. Définir le payload et les topics MQTT, par exemple `bateau/00001/cmd` et `bateau/00001/status`.
5. Implémenter le failsafe, puis le pilotage moteur/servo.
6. Ajouter la page de configuration Wi-Fi, l'identifiant du bateau et les paramètres de calibration.
+21 -21
View File
@@ -1,21 +1,21 @@
#pragma once
#include <Arduino.h>
namespace Pins {
// Shared pins. GPIO0, GPIO2 and GPIO15 need explicit boot-level validation.
constexpr uint8_t batteryVoltage = A0;
constexpr uint8_t i2cSda = D2;
constexpr uint8_t i2cScl = D1;
// Boat: MX1508 uses two inputs per motor.
constexpr uint8_t motorLeftForward = D5;
constexpr uint8_t motorLeftReverse = D6;
constexpr uint8_t motorRightForward = D7;
constexpr uint8_t motorRightReverse = D8;
constexpr uint8_t rudderServo = D4;
// Remote: use an external ADC for two analog Hall sensors.
constexpr uint8_t hallThrottle = A0;
constexpr uint8_t hallRudderSignal = D5;
}
#pragma once
#include <Arduino.h>
namespace Pins {
// Shared pins. GPIO0, GPIO2 and GPIO15 need explicit boot-level validation.
constexpr uint8_t batteryVoltage = A0;
constexpr uint8_t i2cSda = D2;
constexpr uint8_t i2cScl = D1;
// Boat: MX1508 uses two inputs per motor.
constexpr uint8_t motorLeftForward = D5;
constexpr uint8_t motorLeftReverse = D6;
constexpr uint8_t motorRightForward = D7;
constexpr uint8_t motorRightReverse = D8;
constexpr uint8_t rudderServo = D4;
// Remote: use an external ADC for two analog Hall sensors.
constexpr uint8_t hallThrottle = A0;
constexpr uint8_t hallRudderSignal = D5;
}
+41 -41
View File
@@ -1,41 +1,41 @@
[platformio]
default_envs = boat_mqtt
src_dir = src
include_dir = include
[env]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
monitor_filters = direct
build_flags =
-D CORE_DEBUG_LEVEL=0
[env:boat_mqtt]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_BOAT
-D NETWORK_MODE_MQTT
lib_deps =
knolleary/PubSubClient@^2.8
[env:remote_mqtt]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_REMOTE
-D NETWORK_MODE_MQTT
lib_deps =
knolleary/PubSubClient@^2.8
[env:boat_ap]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_BOAT
-D NETWORK_MODE_AP
[env:remote_ap]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_REMOTE
-D NETWORK_MODE_AP
[platformio]
default_envs = boat_mqtt
src_dir = src
include_dir = include
[env]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
monitor_filters = direct
build_flags =
-D CORE_DEBUG_LEVEL=0
[env:boat_mqtt]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_BOAT
-D NETWORK_MODE_MQTT
lib_deps =
knolleary/PubSubClient@^2.8
[env:remote_mqtt]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_REMOTE
-D NETWORK_MODE_MQTT
lib_deps =
knolleary/PubSubClient@^2.8
[env:boat_ap]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_BOAT
-D NETWORK_MODE_AP
[env:remote_ap]
build_flags =
${env.build_flags}
-D DEVICE_ROLE_REMOTE
-D NETWORK_MODE_AP
+46 -46
View File
@@ -1,46 +1,46 @@
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "pins.h"
#if defined(DEVICE_ROLE_BOAT)
constexpr const char *deviceRole = "boat";
#elif defined(DEVICE_ROLE_REMOTE)
constexpr const char *deviceRole = "remote";
#else
#error "Select DEVICE_ROLE_BOAT or DEVICE_ROLE_REMOTE in platformio.ini"
#endif
#if defined(NETWORK_MODE_MQTT)
constexpr const char *networkMode = "mqtt";
#elif defined(NETWORK_MODE_AP)
constexpr const char *networkMode = "ap";
#else
#error "Select NETWORK_MODE_MQTT or NETWORK_MODE_AP in platformio.ini"
#endif
void setup() {
Serial.begin(115200);
delay(100);
pinMode(Pins::batteryVoltage, INPUT);
#if defined(DEVICE_ROLE_BOAT)
pinMode(Pins::motorLeftForward, OUTPUT);
pinMode(Pins::motorLeftReverse, OUTPUT);
pinMode(Pins::motorRightForward, OUTPUT);
pinMode(Pins::motorRightReverse, OUTPUT);
pinMode(Pins::rudderServo, OUTPUT);
#else
pinMode(Pins::hallRudderSignal, INPUT);
#endif
Serial.printf("Stid maritime: role=%s, mode=%s, chip=%06X\n",
deviceRole, networkMode, ESP.getChipId());
Serial.println("Firmware skeleton ready; motors remain stopped.");
}
void loop() {
// Keep the initial firmware passive until the command and failsafe layers exist.
delay(1000);
}
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "pins.h"
#if defined(DEVICE_ROLE_BOAT)
constexpr const char *deviceRole = "boat";
#elif defined(DEVICE_ROLE_REMOTE)
constexpr const char *deviceRole = "remote";
#else
#error "Select DEVICE_ROLE_BOAT or DEVICE_ROLE_REMOTE in platformio.ini"
#endif
#if defined(NETWORK_MODE_MQTT)
constexpr const char *networkMode = "mqtt";
#elif defined(NETWORK_MODE_AP)
constexpr const char *networkMode = "ap";
#else
#error "Select NETWORK_MODE_MQTT or NETWORK_MODE_AP in platformio.ini"
#endif
void setup() {
Serial.begin(115200);
delay(100);
pinMode(Pins::batteryVoltage, INPUT);
#if defined(DEVICE_ROLE_BOAT)
pinMode(Pins::motorLeftForward, OUTPUT);
pinMode(Pins::motorLeftReverse, OUTPUT);
pinMode(Pins::motorRightForward, OUTPUT);
pinMode(Pins::motorRightReverse, OUTPUT);
pinMode(Pins::rudderServo, OUTPUT);
#else
pinMode(Pins::hallRudderSignal, INPUT);
#endif
Serial.printf("Stid maritime: role=%s, mode=%s, chip=%06X\n",
deviceRole, networkMode, ESP.getChipId());
Serial.println("Firmware skeleton ready; motors remain stopped.");
}
void loop() {
// Keep the initial firmware passive until the command and failsafe layers exist.
delay(1000);
}