| lib | ||
| drone.lua | ||
| README.md | ||
Quadricoptere Create Aeronautics : controleur centralise
Nouvelle architecture: un SEUL ordinateur (PC central) pilote tout via le reseau filaire. Les anciens scripts multi-PC (helice.lua, central.lua, input.lua, console.lua, propulsion.lua) sont obsoletes.
Materiel
Directement sur le PC central:
- altitude_sensor, Create_DisplayLink (affichage de conduite)
- ender modem (uniquement pour le GPS)
- sortie redstone BOTTOM vers le moteur (15 = arret, 14 = vitesse minimale, 0 = vitesse maximale)
Via le reseau filaire (wired modems):
- 6 Create_RotationSpeedController: 4 helices + 2 propulseurs
(roles affectes par
calib rsc, persistes dans drone.etat) - 3 velocity_sensor, un par composante (axes affectes par
calib capteurs) - 1 gimbal_sensor, 1 optical_sensor (vers le sol, 15.5 = rien), 1 stressometer, 1 redstone_relay (joystick), 1 advanced monitor (tactile), 1 linked typewriter (EN ATTENTE: relever ses signatures avec test_signatures, voir lib/ihm.lua)
Installation
- Copier drone.lua sur le PC, puis:
drone maj <url_base>pour telecharger les modules depuis votre depot (Forgejo: URL "raw" du dossier). Autoriser le domaine dans la config http de CC:Tweaked. Ou copier a la main drone.lua + lib/*.lua. - Premier lancement:
dronecreedrone.conf. RELIRE chaque parametre (Y_VOL, Y_MINI, ANGLE_MAX, DIST_SOL, offsets, joystick, moteur...) puis passerverifie = true. Un warning s'affiche tant que ce n'est pas fait. - Calibrations depuis l'onglet CALIB, en mode CALIBRAGE pour
celles au sol, DANS CET ORDRE (les modes non calibres sont
verrouilles en rouge). Toutes sont RE-EXECUTABLES (recablage:
relancer la calibration remet ses affectations a zero et prend
effet sans relancer le programme). La calib rsc verifie la
coherence (retour de l'assiette a l'etat initial entre chaque
impulsion, detection des conflits deux RSC -> une meme helice)
et s'annule proprement en cas d'incoherence. Les calibrations
assistees affichent leurs consignes sur l'ecran de conduite et se
valident en touchant le moniteur:
gimbal(assistee, en premier): incliner le nez vers le bas puis pencher a gauche; associe les 2 angles bruts au tangage et au roulis (l'association CHANGE d'un vaisseau a l'autre).joystick(assistee): pousser a fond dans chaque direction pour identifier les faces du redstone relay.typew(assistee, OPTIONNELLE): le typewriter emet des codes ASCII (qwerty), le mappage est integre par defaut (0..9, Entree = valider, Backspace = effacer, + / - = consigne +-1). Ne calibrer que si le clavier a un mappage exotique.rsc(drone pose): impulsion sur chaque RSC; l'effet d'assiette designe le coin; sans effet = propulseur. prop_l / prop_r arbitraires: si un virage gauche part a droite, les echanger dans drone.etat. Pour un DRONE TROP LOURD (impulsions sans effet), utiliserrscman.rscman(drone pose, manuelle): chaque RSC tourne a CALIB.RPM_MANUEL (10 rpm); regarder quelle helice tourne et toucher sa position sur l'art (4 coins + prop_l / prop_r); unicite garantie, ANNULER restaure l'etat precedent. Fiabilise aussi prop_l / prop_r (plus d'affectation arbitraire).capteurs(en vol): montee, avancee puis translation gauche identifient l'axe ET la direction de chaque velocity sensor (repere du drone: avant / lateral / vertical, positif = avant / gauche / haut).pid(en vol stationnaire, marge d'altitude): recherche iterative, critere ZERO depassement + temps de reponse minimal + assiette <= ANGLE_MAX. EXPERIMENTAL. Toute modification des parametres de conf dont dependent ces gains (VITESSE_RSC_MAX, VITESSE_RAMPE, ANGLE_MAX) INVALIDE la calibration au prochain demarrage (retour aux gains de la conf + alerte).
Interface (moniteur tactile)
Echelle de texte automatique (la plus grande qui loge le contenu). Navigation par onglets:
- PARAM : edition tactile des parametres (depassement tolere, angles max, POIDS et POUSSEE de l'helice en pixelNewton, vitesses verticales max, rampe, Y_VOL, Y_MINI). Les valeurs modifiees sont persistees dans drone.etat et PRIMENT sur drone.conf sans l'ecraser; modifier un parametre dont depend la calibration PID affiche un rappel de recalibration.
- MODE : boutons de modes + contenu adapte au mode courant (voir ci-dessous), art du quadricoptere (cercles des helices: blanc rpm=0, rouge rpm max, jaune en changement, vert stable; rpm des propulseurs sur les cotes)
- CALIB : boutons des calibrations (gris = a faire, jaune = en cours, vert = faite), consignes et barre de progression, art avec le RSC en cours en VIOLET
- JOURNAL : dernieres lignes du journal de vol
Modes (verrouilles en rouge si une calibration manque, la raison
s'affiche au toucher)
off: moteur coupe (bottom a 15), tous les RSC a 0inactif: moteur ALLUME, tous les RSC a 0, commandes desactivees. Dans tous les modes sauf off, une erreur s'affiche si le moteur ne tourne pas (stressometer a capacite nulle) alors qu'il le devraitcalibrage: identique a inactif mais AUTORISE les calibrations au sol (gimbal, joystick, typew, rsc); capteurs et pid se lancent en mode volstationnement: helices a pleine puissance inversee (plaquage), propulseurs a 0, commandes desactivees. Conditions d'entree: au sol (optical <= DIST_SOL) ET horizontal (<= ANGLE_MAX). Sortie automatique versvolsi les conditions sont perdues.vol: assiette maintenue horizontale (PID tangage/roulis a 0), altitude au PID double regime, deplacement horizontal au joystick via les PROPULSEURS (avance/virage differentiels)drone: le joystick commande l'INCLINAISON (jusqu'a ANGLE_DRONE_MAX), deplacement par les helices, propulseurs a 0atterrissage: descente douce (VITESSE_ATTERRISSAGE) jusqu'au sol, puis stationnement. Sous Y_MINI, la descente exige un sol POSABLE (optical: bloc detecte, ni eau ni lave): garde-fou oceanauto: cible a 2 coordonnees (auto <x> <z>au clavier, pave tactile, ou bouton d'un point enregistre): decollage a Y_VOL, ralliement en avancant (cap estime par GPS), atterrissage sur place. Cible a 3 coordonnees (auto <x> <y> <z>): rallie le point et s'y MAINTIENT a l'altitude y (bornee par le sol et Y_MINI). Bouton ANNULER: retour en vol stabilise a la position courante
La consigne d'altitude se regle aux boutons +-1/+-10 du moniteur ou au TYPEWRITER: taper les chiffres (la saisie s'affiche sur l'ecran de conduite) puis Entree; Backspace corrige; + et - ajustent la consigne de 1 quand aucune saisie n'est en cours.
Points nommes (clavier du PC, 10 max):
pt save <nom> | pt go <nom> | pt del <nom> | pt list | rtb
(retour au point de decollage de la derniere mission auto).
Regulation
- ASSERVISSEMENT EN CASCADE + FEEDFORWARD, ADAPTATIF (transport a
charge et centrage variables a chaque vol):
- feedforward de sustentation: rpm d'equilibre calcule depuis POIDS (A VIDE) et POUSSEE_HELICE_MAX (poussee ~ rpm^EXPOSANT), CORRIGE EN CONTINU PAR LA PRESSION mesuree (la poussee diminue avec l'altitude): pousseeEffective = POUSSEE * pression / PRESSION_REF. Mesurer poids a vide et poussee d'une helice et les saisir (conf ou page PARAM). 1b. ADAPTATION DE POIDS: en quasi-stationnaire, le residu du PID de vitesse est transfere lentement vers le feedforward: le drone SE PESE tout seul (poids estime affiche en vol). Remise a zero a chaque decollage (nouvelle cargaison). Plafond: poids total max = RATIO_CHARGE_MAX (60%%) * 4 * poussee de reference, alerte SURCHARGE au dela. 1c. TRIM D'ASSIETTE ADAPTATIF: en stationnaire, la composante statique des corrections d'assiette (centre de gravite decale par la cargaison) est absorbee par un trim par axe; alerte "chargement desequilibre" si |trim| depasse ADAPTATION.SEUIL_DESEQUILIBRE. 1d. GAIN SCHEDULING: la boucle de vitesse est mise a l'echelle du ratio poids estime / poids memorise a la calibration (borne 0.5..2): calibrer avec n'importe quelle charge, les gains suivent la cargaison. Procedure par vol: charger -> mode vol -> 5-10 s de stationnaire (pesee + trim + alertes) -> partir. Aucune recalibration.
- boucle externe: erreur d'altitude -> consigne de vitesse verticale (P, bornee V_MONTEE_MAX / V_DESCENTE_MAX)
- boucle interne: PID sur la vitesse verticale mesuree (velocity sensor vertical calibre; a defaut, derivee filtree de l'altitude), deux jeux de gains montee / descente Consigne rampee (VITESSE_RAMPE), derivee sur la mesure et integrale conditionnelle (zero-depassement).
- Deux calibrations PID complementaires (onglet CALIB, mode vol):
pid(auto-tune): recherche iterative en boucle fermee, garde le meilleur essai valide (zero depassement, assiette bornee)pidmath(methodes mathematiques): identification du modele en boucle ouverte autour du feedforward (echelon -> K, tau, L), gains candidats par COHEN-COON et ZIEGLER-NICHOLS, validation en boucle fermee des deux, conservation du meilleur valide (version adoucie appliquee si aucun ne passe) Conseil: regler POIDS/POUSSEE d'abord, puis pidmath (rapide), puis pid si besoin d'affiner.
- PID assiette: tangage et roulis vers leurs cibles; mixage par coin: base + corrections signees.
- Moteur asservi au stressometer: augmente si l'utilisation depasse STRESS_HAUT, diminue sous STRESS_BAS (economie). Le moteur est dimensionne pour suffire; en cas de SURCHARGE malgre le maximum, les PROPULSEURS sont reduits en priorite (facteur 0.3) + alerte, puis retablis quand le stress redescend.
- Carburant: deux valeurs sur le 2e display link: POURCENTAGE de reserve (ligne 1) et AUTONOMIE en minutes (ligne 2), estimee par apprentissage glissant (EMA, CARBURANT.LISSAGE) de la consommation; les ravitaillements et le mode off sont exclus de l'apprentissage. Alerte sous SEUIL_ALERTE.
- Moteur: pre-boost a pleine puissance (MOTEUR.BOOST secondes) a chaque passage vers un regime exigeant (ex: inactif -> stationnement) pour eviter l'overstress transitoire.
- Reactivite: le GPS (appel bloquant jusqu'a 2 s) est isole dans une tache dediee alimentant un cache; l'interface et la navigation ne bloquent jamais dessus. Messages longs de l'ecran de conduite: defilement par segments de mots entiers (indicateur i/n).
Fichiers
drone.conf: parametres utilisateur (cree si absent)drone.etat: mode, consigne, roles RSC, axes capteurs, gains calibres, point de decollage (restaures au reboot; en vol, la consigne repart de l'altitude reelle)drone.log: journal de vol (rotation a 64 Ko)
Points d'attention
- tanks(): si la capacite n'est pas fournie par le jeu, la conf CARBURANT.CAPACITE_TANK sert de repli.