Retour au menu principal


L'ETRANGE SYSTEME DE PROPULSION DU MODULE LUNAIRE





Cette partie décrit le système de propulsion du module lunaire.
Lien vers le manuel officiel de la NASA du module lunaire contenant la description du système de propulsion
Le réacteur du module lunaire fonctionnait en mélangeant du carburant avec un oxydant.
Il y avait donc deux réservoirs différents pour alimenter le réacteur.







En fait, différemment du moteur de remontée, le moteur de descente peut être tourné, ce qui permet d'aligner la poussée du réacteur principal avec le centre de gravité du module lunaire à la fin de la descente, quand les réservoirs de carburant se sont vidés, et qu'il commence d'y avoir undésalignement du centre de masse avec la poussée, mais cela signifie aussi que les réacteurs horizontaux du RCS ne sont plus horizontaux, et que leur mise à feu fait soit monter, soit descendre le module lunaire, ce qui doit être compensé par un ajustement de la poussée du réacteur principal.
[/size][/hl]










Il y a une confirmation du désalignement du centre de gravité d'avec la poussée du réacteur principal du module de remontée au cours de la montée dans un document "Apollo progress report" écrit dans les années 60 par un ingénieur de la NASA, David Hoagland.
Davig hoagland dit ceci:
"Le vol motorisé de la partie ascendante du module lunaire inclut le contrôle de couple uniquement par les réacteurs latéraux. Le réacteur principal est fixe, il ne peut être pivoté. Ce contrôle se fait de la même manière par les autopilotes en chute libre décrits au dessus, mais avec l'addition que le système estime le couple dérivant du décalage de la poussée du reacteur principal avec le centre de gravité."

Parce que le centre de gravité est décalé par rapport à l'axe du module de remontée alors que les réservoirs de carburant se vident, les forces combinées de la poussée et de la gravité lunaire créent un couple qui fait tourner le module de remontée dans le sens des aiguilles d'une montre.
De manière que le module de remontée garde une direction constante, ce couple doit être corrigé en appliquant un couple inverse.







La seule manière d'appliquer un contre couple est en mettant à feu les réacteurs verticaux latéraux de manière à ce qu'ils produisent des couples faisant tourner le module de remontée en sens opposé.
Si le couple créé par les réacteurs latéraux pouvait être exactement équivalent au couple de désalignement, le module lunaire continuerait d'aller droit.
Mais la poussée des réacteurs latéraux ne pouvait être ajustée, ils fonctionnaient en "tout ou rien", et conséquemment il n'était pas possible d'ajuster leur poussée pour créer un contre couple exactement équivalent au couple de désalignement.
La conséquence est qu'ils ne pouvaient être mis à feu de manière permanente, mais périodiquement au lieu de cela, et comme ils ne pouvaient être commandés à une fréquence suffisante (la période de guidage était de 2 secondes), le résultat est qu'il n'était pas possible d'éviter un mouvement de balancement conséquent.







Cette animation explique ce qui se passait: Le couple de désalignement faisait tourner le LEM dans le sens des aiguilles d'une montre et le poussait sur la droite; puis les réacteurs latéraux étaient mis à feu et faisaient tourner le LEM dans le sens inverse et le poussaient sur la gauche; puis les réacteurs latéraux étaient coupés (sinon ils auraient continué de faire tourner le LEM dans le sens inverse et de le pousser sur la gauche), et le couple de désalignement refaisait tourner le LEM dans le sens des aiguilles d'une montre et le repoussait sur la droite, et ainsi de suite...
Plus le couple de désalignement devenait important, et plus l'amplitude du mouvement sinisoïdal augmentait, car la fréquence de commande des réacteurs latéraux ne pouvait être augmentée pour contrer le couple de désalignement plus rapidement.








Ce n'est absolument pas une supposition que je fais, c'est confirmé dans la documentation par les ingénieurs de la NASA.
Même Clavius en parle sur son site, et dit ceci:
"Alors que la poussée hors-axe faisait tourner le module de remontée, les réacteurs latéraux étaient mis à feu pour contrer la rotation et le remettre dans l'attitude correcte. C'est pourquoi les films de la remontée du module montrent cette oscillation périodique: Les réacteurs latéraux s'opposaient à la poussée hors-axe du moteur de remontée."








Le fait que le réservoir de l'oxydant était placé plus près du moteur de remontée s'explique par le fait que l'oxydant avait une densité plus grande que celle du carburant (1,5 fois plus grande).
Si les réservoirs avaient été placès à la même distance du moteur, la différence de densité des propergols aurait fait tourner le LEM du côté de l'oxydant.
Au début de la remontée, lorsque les réservoirs sont pleins, leur contenu est plus lourd que les contenants, et donc le couple de désalignement est encore limité.
Mais, au fur et à mesure que les réservoirs se vident, la différence entre les contenus et les contenants s'amenuise, et conséquemment le centre de masse du LEM se décale vers le réservoir de carburant, avec la conséquence que le couple de désalignement s'accroît; comme les réacteurs latéraux du RCS ne peuvent augmenter leur fréquence de correction du couple de désalignement, la conséquence est que l'amplitude de l'oscillation du LEM s'accroît progressivement.
(Le but de cette animation est de faire comprendre ce qui se passe, et non de représenter la réalité exacte).







Ce n'était pourtant absolument pas l'intérêt du module lunaire de gaspiller son carburant, car il en a besoin dans la phase cruciale finale, lorsqu'il fait sa manoeuvre de retournement pour accoster le module de commande.







Y avait-il un moyen d'éviter d'utiliser les réacteurs latéraux pour corriger l'attitude du module lunaire?







Absolument, et il y en avait même plusieurs.
Une première manière évidente serait de déplacer un poids dans le module lunaire afin de déplacer le centre de masse; l'intérêt est que le moteur resterait dans l'axe du module luanire.







Une autre manière était de permettre de pivoter le racteur, ce qui permettrait de déplacer le centre de gravité sur la ligne de poussée du réacteur; l'inconvénient est que le moteur ne serait plus dans l'axe du module lunaire.







Ces deux manières permettraient d'éviter d'utiliser les réacteurs latéraux pour contrôler l'attitude du module, ce qui n'est nécessaire qu'à cause du désalignement du centre de gravité.
Non seulement cela donnerait une trajectoire plus régulière au module lunaire, mais cela simplifierait son guidage, et, surtout, cela permettrait d'économiser le carburant des réacteurs latéraux si vital pour l'approche finale.
Les ingénieurs de lla NASA ont fait exprès de le faire de manière illogique.











Les réacteurs latéraux (RCS) sont placés aux quatre coins du module lunaire.








Chaque module du RCS comportait quatre réacteurs, deux horizontaux, et deux verticaux, ce qui permettait de tourner le module lunaire dans toutes les directions (en combinant les réacteurs du RCS).








Chaque réacteur était activé par une commande individuelle.
Une logique permettaint d'activer indépendamment les réacteurs du RCS.









Maintenant, les réacteurs du RCS qui doivent être mis à feu pour appliquer le couple désiré s'opposant au contre de désalignement sont ceux que j'ai cerclés sur ce schéma et sont désignés comme A3U, B4U, A2D, et B1D, selon la terminologie du RCS.
Ils doivent tous être mis à feu en même temps pour éviter un déséquilibre.









Ce schéma montre l'inter-connexion des valves du RCS.
Lorsque le RCS doit être alimenté en carburant, les deux valves de carburant doivent être ouvertes.
Lorsque le RCS doit être alimenté en oxydant, les deux valves de l'oxydant doivent être ouvertes.
Mais, si l'une des valves refuse de s'ouvrir, le RCS ne peut être alimenté soit en carburant soit en oxydant, et ne peut alors fonctionner, car il a besoin à la fois du carburant et de l'oxydant pour fonctionner.









Alors, pourquoi ne pas avoir utilisé ce schéma plus simple?
Le RCS ne fonctionnera pas seulement si l'une des deux valves ne fonctionne pas, et il y a moins de chance qu'une valve sur deux ne fonctionne pas, qu'une valve sur quatre.
Maintenant, avec ce schéma, le le RCS ne fonctionnera pas correctement si une valve refuse soit de s'ouvrir, soit de se fermer; dans le schéma précédent, c'était seulement si une valve refusait de s'ouvrir qu'il ne pouvait fonctionner; si elle refuse de se fermer, l'autre valve qui se ferme permet de bloquer le carburant ou l'oxydant.









Donc, si le système doit vraiment être prémuni contre la panne d'une valve, c'est plutôt ce système qui devrait être utilisé, avec une duplication des valves: Si une valve refuse de s'ouvrir, l'autre valve qui s'ouvre permet encore le passage du carburant ou de l'oxydant, et, si une valve refuse de se fermer, les valves de l'autre paire, qui sont toutes deux fermées, permettent de bloquer le passage du carburant ou de l'oxydant.
Il y a une sécurité totale contre la panne d'une seule valve, refusant soit de s'ouvrir, soit de se fermer.








Ceci est le schéma du système mesurant le propergol.
Il utilise des calculateurs analogiques pour fonctionner, c'est à dire des interfaces électroniques utilisant des amplificateurs opérationnels.









Ceci est le schéma d'un calculateur analogique du système de mesure du propergol.








Je vois des fautes importantes dans ce schéma.
Les connexions que j'ai barrées avec des croix rouges ne devraient pas exister.
Et les résistances ajustables que j'ai cerclées ne devraient pas exister non plus.
Seul l'ajustement du gain devrait exister.








Ceci est à quoi le calculateur analogique aurait du ressembler pour être normal, sans les connexions anormales, et les resistances ajustables inutiles.









Ceci est le schéma de l'assemblage de la chambre de poussée, avec les commandes individuelles pour chaque réacteur du RCS.









Maintenant, les réacteurs du RCS qui doivent être mis à feu pour appliquer le couple désiré s'opposant au contre de désalignement sont ceux que j'ai cerclés sur ce schéma et sont désignés comme A3U, B4U, A2D, et B1D, selon la terminologie du RCS.
Ils doivent tous être mis à feu en même temps pour éviter un déséquilibre.









Les commandes du RCS sont élaborées à partir des angles d'attitude du module lunaire, et du vecteur de translation.









Ceci le schéma de la sélection de la poussée horizontale qui élabore les commandes des réacteurs horizontaux du RCS.









Les dispositifs que j'ai encadrés sont des relais électromécaniques; un relai électromécanique est composé d'une bobine, que j'ai cerclée de vert, et d'un interrupteur dont l'état est changé en excitant la bobine, et que j'ai cerclée d'orange.









Voici comment fonctionne le relais électromécanique:
- Lorsque la bobine n'est pas excitée, le point central de l'interrupteur est connecté au contact du haut.
- Lorsque la bobine est excitée, elle attire l'interrupteur vers le bas, et le point central de l'interrupteur devient connecté au contact du bas à la place.









Si le contact du bas du relais électromécanique est connecté à la masse, l'effet est que la sortie du relais électromécanique est connectée à la masse lorsque la bobine est excitée.









Le circuit que j'ai cerclé de rouge est un ampli OP avec deux sorties; ces deux sorties sont complémentaires: Lorsque l'une est à 1, l'autre est à 0, et inversement.
Le circuit que j'ai cerclé d'orange est une porte OU avec des entrées inversées.









Dans la symbologie d'Apollo, les portes ET et OU sont représentées par le même symbole, mais avec un point noir à l'intérieur de la porte OU pour la différencier de la porte ET.









Une porte OU est un circuit qui a plusieurs entrées (au moins deux), et dont les sorties sont à 1 si au moins l'une des entrées est à 1, et 0 seulement si toutes les entrées sont à 0.









Lorsqu'il y a un petit cercle devant les entrées, ce petit cercle signifie que les entrées sont inversées avant d'être appliquées à la porte OU (i.e. un 0 devient un 1, et vice versa).
La porte OU sort alors un 0 quand toutes les entrées sont à 1, et un 1 sinon (i.e. si au moins une entrée est à 0).
Lorsqu'il n'y a qu'une entrée dans ce circuit, la sortie du circuit est l'entrée inversée.









Sachant tout ceci, nous pouvons analyser cette circuiterie.
Les circuits que j'ai cerclés produisent deux sorties à partir des commandes d'entrée (que j'indique avec des flèches doubles) qui sont complémentaires, ce qui signifie que, lorsque l'une est positive, l'autre est négative, et vice versa.
Ces sorties sont inversées avant d'en faire un OU; comme les sorties sont complémentaires, c'est aussi le cas des inversions de ces sorties, ce qui signifie que, lorsque l'une est à 1, l'autre est à 0, et vice versa; faire un OU des entrées veut dire que la sortie résultante est à 1 si au moins une des entrées et à 1; ici, les petits cercles signifient que les entrées sont inversées avant d'en faire un OU; et les entrées inversées sont aussi complémentaires, ce qui signifie que l'une des entrées inversées est à 1, et conséquemment la sortie du circuit OU est toujours à 1; cette sortie est inversée par le circuit suivant, ce qui signifie que la sortie du circuit 2 est toujours à 0; cette sortie est inversée avant de rentrer dans un circuit OU, ce qui signifie que la sortie du circuit 3 est toujours à 1; et la sortie du circuit 3 rentre dans un ampli op qui activera toujours le relais électromécanique auquel il est relié.








Comme le relais électromécanique est toujours activé, l'interrupteur auquel il est connecté sera toujours sur la position basse, c'est à dire connecté à la masse.
Ceci signifie qu'ils auraient aussi bien pu connecter les deux entrées qui sont reliées à cet interrupteur à la masse, le résultat aurait été le même.
Maintenant, les entrées de A4R/B1L et A3R/B2L sont toutes deux Y-TRANSL et la masse, ce qui signifie que A4R/B1L et A3R/B2L auraient pu être directement connectés à la même commande.
De même, les entrées de B4F/B3A et A1F/A2A sont toutes deux l'angle de roulis et Z-TRANSL, ce qui signifie que B4F/B3A et A1F/A2A auraient aussi pu être directement connectés à la même commande.
Et, comme le relais K3 est toujours alimenté, et donc connecté à la masse, cela signifie que la commande de lacet ne rentre pas dans 4 réacteurs lhorizontaux; pourtant le lacet devrait pouvoir rentrer dans tous les réacteurs horizontaux, car il permet de faire tourner le module lunaire autour de l'axe vertical (lacet) dans les deux directions.
Maintenant, le point principal est que cela n'a pas de sens de comparer des commandes de rotation avec des commandes de translation pour activer les réacteurs latéraux; en effet le module lunaire peut être soit tourné, soit translaté, mais pas les deux en même temps; de plus il n'y a pas de notion de signe des commandes; en effet, suivant la direction dans laquelle le module lunaire est tourné ou translaté, ce ne sont pas les même réacteurs qui sont utilisés.
En fait, il aurait du y avoir deux entrées par commande de rotation ou translation, une pour chaque direction (par exemple, Yaw+ pour faire tourner le module lunaire dans le sens inverse des aiguilles d'une montre - sens trigonométrique positif - et Yaw- pour faire tourner le module lunaire dans le sens des aiguilles d'une montre - sens trigonométrique négatif).
Et seulement une commande horizontale aurait été à 1 à la fois, et toutes les autres à 0.
Les commandes des réacteurs latéraux auraient alors été une combinaison logique des couples de commandes horizontales.








Par exemple:
- Le réacteur latéral A1F aurait été activé si soit Yaw+ soit Z- est à 1, et non activé dans tous les autres cas.
- Le réacteur latéral B1L aurait été activé si soit Yaw- soit Y+ est à 1, et non activé dans tous les autres cas.
- Le réacteur latéral B4F aurait été activé si soit Yaw- soit Z- est à 1, et non activé dans tous les autres cas.
- Le réacteur latéral A2A aurait été activé si soit Yaw- soit Z+ est à 1, et non activé dans tous les autres cas.
Chaque réacteur latéral est activé soit par une commande de rotation, soit par une commande de translation.








Ceci est le schéma de sélection de la poussée verticale qui élabore les commandes pour les réacteurs verticaux du RCS.








Les circuits que j'ai cerclés produisent deux sorties à partir des entrées de commande (que j'indique avec des flèches doubles) qui sont complémentaires, ce qui signifie que, lorsque l'une est positive, l'autre est négative, et vice versa.
Pour la même raison que précédemment expliqué, les sorties des circuits 1, 2 et 3 sont toujours à 1.
Le circuit 4 reçoit deux entrées toujours à 1, mais sont inversées avant d'en faire un OU, ce qui signifie que l'on fait un OU de deux 0, ce qui donne un 0; la sortie du circuit 4 est donc toujours à 0.
Pour la même raison, la sortie du circuit 5 est aussi toujours à 0.
La sortie du circuit 4 est inversée avant d'en faire un OU avec deux autres entrées; le 0 inversé devient un 1 à nouveau, et la sortie du circuit 6 est donc toujours à 1; elle alimente un ampli op qui activera toujours le relais électromécanique auquel elle est reliée.
Pour la même raison, le fait que la sortie du circuit 5 est toujours à 0 a pour conséquence que la sortie du circuit 7 auquel elle est connectée est toujours à 1; elle alimente un ampli OP qui activera toujours le relais électromécanique auquel elle est reliée.







Comme les relais électromécaniques sont toujours activés, les interrupteurs auxquels ils sont reliés sont toujours à la position basse, c'est à dire reliés à la masse, ce qui signifie que les entrées qui sont reliées à ces interrupteurs auraient tout aussi bien être directement reliées à la masse, ce qui signifie que ces entrées sont inutiles, et que deux entrées auraient suffi pour les amplis Op.
Maintenant le premier ampli op, celui qui est cerclé, a toutes ses entrées à 0 (à cause des relais toujours forcés à la masse); cela signifie que les réacteurs verticaux B4U et A4D qu'il commande ne seront jamais activés.
Le point principal est le même que pour la commande des réacteurs horizontaux: Au lieu de comparer de manière incohérente les commandes verticales, il aurait du y avoir deux entrées par commande verticale, une pour chaque direction, et seulement une entrée à 1 à la fois, et les commandes des réacteurs verticaux auraient été une combinaison logique des couples de commandes verticales (comme je l'ai montré sur les commandes horizontales).
Une fois de plus, nous voyons ici une fantaisie complète.










A présent nous pouvons constater que la commande de roulis (qui est normalement la commande qui permet d'appliquer le contre couple) est connectée à l'entrée + de la commande de la paire de réacteurs A3U et B3D, et à l'entrée - de la commande de la paire de réacteurs B2U et A2D; cela signifie que le roulis activera ou bien les réacteurs A3U et B3D lorsque positif, et les réacteurs B2U et A2D lorsque négatif, mais jamais les quatre en même temps.









Maintenant, c'est là que cela devient vraiment savoureux: Les réacteurs A3U et B3D, qui sont activés en cas de roulis positif, sont deux réacteurs verticaux qui sont directement opposés l'un à l'autre; cela signifie qu'ils vont mutuellement annuler leurs effets respectifs, et la conséquence est que le roulis positif...NE FAIT RIEN!









Et les réacteurs B2U et A2D, qui sont activés en cas de roulis négatif, sont deux réacteurs verticaux qui sont aussi directement opposés l'un à l'autre; cela signifie qu'ils vont mutuellement annuler leurs effets respectifs, et la conséquence est que le roulis négatif...NE FAIT RIEN!









Et nous pouvons constater que la commande de tangage rentre sur l'entrée + de la commande de la paire de réacteurs B2U et A2D, et sur l'entrée - de la commande de la paire de réacteurs A1U et B1D; cela signifie que le tangage activera ou bien les réacteurs B2U et A2D lorsque positif, et les réacteurs A1U et B1D lorsque négatif.









Et nous retrouvons le même gag que pour le roulis; les réacteurs B2U et A2D, qui sont activés en cas de tangage positif, sont deux réacteurs verticaux directement opposés l'un à l'autre; cela signifie qu'ils vont mutuellement annuler leurs effets respectifs, et la conséquence est que le tangage positif...NE FAIT RIEN!









Et les réacteurs A1U et B1D, qui sont activés en cas de tangage négatif, sont deux réacteurs verticaux directement opposés l'un à l'autre; cela signifie qu'ils vont mutuellement annuler leurs effets respectifs, et la conséquence est que le tangage négatif...NE FAIT RIEN!









Comment le RCS peut-il marcher alors que chaque commande des réacteurs latéraux verticaux activait deux réacteurs verticaux directement opposés l'un à l'autre sur la même grappe, annulant ainsi leurs effets respectifs.
Le module lunaire était tout simplement incapable de contrôler son attitude, ce qui rendait à la fois la descente motorisée et la remontée motorisée impossibles (et aussi impossible de compenser le couple de désalignement avec les réacteurs latéraux).










Là, les ingénieurs de la NASA ont vraiment poussé la blague très loin.
Mais ils ont même poussé la plaisanterie plus loin comme nous allons le voir.









Maintenant un adepte d'Apollo a pensé sauver la situation en me montrant cette table logique, dans laquelle les commandes activent des réacteurs latéraux sur des grappes opposées.
Cette table contredit le schéma que nous avons vu, et, même si elle semble plus cohérente que le schéma, elle a quand même un gros problème:
Chaque commande agit à la fois sur le tangage et le roulis!
Avec cette table, il est impossible de faire du tangage sans faire de roulis, et vice versa.
En fait, faire du tangage sans faire de roulis, ou faire du roulis sans faire de tangage, ne peut être fait avec deux réacteurs seulement.
Quatre réacteurs sont nécessaires pour ce faire, et les schémas qui suivent vont montrer comment.









Ce schéma montre comment le module lunaire peut faire un mouvement de tangage vers le haut en activant les réacteurs A4D, B1D, A3U, and B2U.









Ce schéma montre comment le module lunaire peut faire un tangage vers le bas en activant les réacteurs B4U, A1U, A2D, and B3D.









Ce schéma montre comment le module lunaire peut faire un mouvement de roulis vers la gauche en activant les réacteurs A4D, B3D, A1U, and B2U.









Ce schéma montre comment le module lunaire peut faire un mouvement de roulis vers la droite en activant les réacteurs B4U, A3U, B1D, and A2D.









...De toute manière, même si l'interface de logique de sélection des réacteurs latéraux avait été correct, ce clown d'AGC aurait encore été incapable de le contrôler correctement.









La manière normale pour l'AGC de contrôler de RCS est d'acquérir les angles d'attitude, et de mettre à jour les positions mesurées à partir des accéléromètres, de comparer les angles et position mesurés avec ceux qui sont désirés par la navigation, et de calculer des commandes à partir de ces différences qu'il envoie au RCS.









L'AGC met à jour les angles (et accélérations) en incrémentant ou décrémentant des compteurs suivant le sens de variation des angles (avec des instructions "cachées", ce qui est une hérésie, comme je l'ai déjà fait remarquer, car l'incrémentation ou décrémentation de ces compteurs devrait se faire matériellement), la navigation calcule des angles et position en fonction de la trajectoire qui doit être suivie; un angle mesuré est comparé avec l'angle désiré correspondant; la différence est comparée avec un seuil; si la différence est au-dessus du seuil, les réacteurs qui font augmenter cet angle sont activés si la différence est positive (i.e. l'angle désiré est plus grand que l'angle mesuré), et inversement les réacteurs qui font diminuer cet angle sont activés si la différence est négative; si la différence est sous le seuil, aucun réacteur faisant changer cet angle n'est activé.









Maintenant, ce qu'ils font est un peu différent.
Ils calculent la différence entre ces deux valeurs de l'angle dans un compteur, et ils convertissent cet angle en une valeur analogique avec un convertisseur digital vers analogique; la valeur analogique convertie module un signal haute fréquence, et la phase de ce signal est mise suivant le signe de la différence.
Puis ce signal modulé est démodulé, et le signal démodulé est comparé avec une référence; si le signal démodulé est au-dessus de la référence, les réacteurs qui font augmenter cet angle sont activés si le signal modulé est phasé, et inversement les réacteurs qui font diminuer cet angle sont activés si le signal modulé est déphasé; si le signal démodulé est sous la référence, aucun réacteur faisant changer cet angle n'est activé.
C'est inutilement compliqué, il est bien plus simple de procéder comme je l'ai précédemment montré, en comparant simplement la différence des angles avec un seuil binaire, et d'activer des réacteurs si la différence est au-dessus du seuil suivant le signe de la différence.
La conversion de la différence des angles en une valeur analogique aurait seulement eu un sens si la poussée des réacteurs latéraux avait pu être ajustée; dans ce cas, la valeur analogique convertie aurait pu être utilisée pour ajuster la poussée des réacteurs latéraux.
Mais, comme leur poussée ne peut être ajustée, et qu'ils fonctionnent en "tout ou rien", i.e. ils peuvent être soit complétement activés, soit pas du tout, mais pas partiellement, la conversion de la différence d'angle dans une valeur analogique est une complication inutile.
Il ne peut pas être dit que cette manière de faire est complètement impossible, mais est une complication inutile, en des ingénieurs ayant l'intention de faire un projet sérieux ne feraient jamais des complications inutiles.









Mais c'est complétement absurde!
Lorsque des commandes soivent être transmises depuis un boitier de commande vers un drone, comme il n'y a pas de connexion filaire entre le boitier et le drone, la seule manière de transmettre les commandes du boitier de commande vers le drone est de moduler une porteuse haute fréquence avec les commandes, de sorte que ces commandes puissent traverser à travers l'air jusqu'au drone; dans la circuiterie électronique du drone, la porteuse haute fréquence est démodulée, et les commandes du boitier en sont extraites et appliquées au drone.









Mais, dans le cas du contrôle du RCS, les commandes sont envoyées à travers des fils, et pas dans l'air, et c'est donc une complication complètement inutile, qui complique la circuiterie et gaspille inutilement de la puissance.










En d'autres termes, cette complication complètement inutile n'est rien d'autre qu'une nouvelle plaisanterie de la part des ingénieurs de la NASA, pour un interface qui de toute manière ne fonctionne pas, et ne permet pas aux RCS de contrôler l'attitude du module lunaire.









Donc, nous avons un couple de désalignement, provenant du décalage du centre de gravité, qui ne peut pas être corrigé en pivotant le moteur de remontée puisqu'il est fixe; ce couple de désalignement ne peut être contré par les réacteurs latéraux du RCS puisque nous avons vu qu'il ne fonctionne pas.









La conséquence est que le module lunaire va tourner comme une girouette, indéfiniment, sans que cette rotation ne puisse être empêchée.









Le résultat est prévisible: Le module lunaire va s'écraser sur le sol lunaire peu après son décollage.









Car, comme la tâche de guidage n'était pas capable de travailler de manière régulière, très souvent les commandes envoyées aux réacteurs n'étaient pas envoyées à temps, ce qui causait de dangereuses oscillations!








Puisque les réacteurs étaient si importants, et si vitaux pour la sécurité du module lunaire, puisque leur panne signifierait fatalement la mort pour les astronautes, il est évident que la NASA aurait du être totalement sûre qu'ils étaient en parfait ordre de marche avant d'envoyer le module lunaire se poser sur la lune, sans le moindre doute, même le plus petit.
Pourtant, sur Apollo 10, durant plusieurs orbites lunaires, une température critique de pile à combustible commença d'osciller de manière significative, comme montré sur cette figure.









Une investigation menée dans un laboratoire révéla que de petites perturbations isolées dans la température de la pile à combustible étaient souvent présentes, comme montré sur cette figure.









Cette investigation démontré que des petittes perturbation isolées pouvaient provoquer une instabilité si la charge de puissance montait suffisamment haut et la température suffisamment basse.
A partir de cette information, ils établirent des procédures pour éliminer les oscillations, devaient-elles se produire.
Il est absolument évident que, ceci montrant que le réacteur avait un problème potentiel, même s'ils pensaient avoir réglé le problème, ils auraient du envoyer une autre mission afin de s'assurer que le problème était vraiment réglé, et étudier le problème en profondeur pour s'assurer que le problème ne se présenterait plus, puisque les réacteurs étaient si vitaux pour la sécurité de la mission, et que leur panne n'était pas permise.








Pas du tout, ils ont directement envoyé la mission suivante, Apollo 11, sur la lune, avec cette "épée de Damoclès" pendant au dessus de la sécurité du vaisseau spatial; ils comptérent sur la "chance".










Voyons ce qui est fait dans le programme de la descente.
Le premier programme de la descente motorisée avait la responsabilité de mettre le moteur à pleine poussée, car la phase initiale de la descente motorisée, la phase de ralentissement, consistait à faire décroître de manière conséquente l'importante vitesse orbitale, de sorte à arriver près de la surface lunaire avec une vitesse modérée.









Ce programme a été baptisé "Burn Baby Burn" par l'équipe du MIT, en référence à un groupe musical.









Ce programme est inclus dans 21 pages du listing de l'AGC.
A-t-il besoin d'autant de code pour faire son travail?
Lien vers le programme "Burn Baby Burn"









De manière a communiquer avec l'environnement externe (avec le LGC en particulier), l'AGC utilisait des ports d'entrée/sortie.









Le LGC pouvait automatiquement allumer et éteindre le moteur (ce que les astronautes pouvaient faire avec le bouton de démarrage/arrêt) avec des commandes ENGINE ON et ENGINE OFF.









L'AGC avait un accès aux commandes ENGINE ON et ENGINE OFF à travers deux bits du canal 11.
Ecrire un 1 dans le bit 13 du canal 1 permettait d'envoyer une commande ENGINE ON, c'est à dire d'allumer le moteur, et écrire un 1 dans le bit 14 de ce canal permettait d'envoyer une commande ENGINE OFF, c'est à dire d'éteindre le moteur.









De manière à écrire sur un port de sortie l'AGC utilisait l'instruction "WRITE".









Cette instruction n'est utilisée qu'à un seul endroit dans le programme de Burn Baby Burn, avec un canal identifié comme "DSALMOUT".









Ce mnémonique correspond à la valeur 11.
Cela signifie que le programme écrit dans le canal 11, celui qui contient les commandes ENGINE ON et ENGINE OFF.









Maintenant, voyons ce qui est fait dans le programme burn baby burn.









L'instruction "CS PRIO30" met le complément de PRIO30 dans l'accumulateur.









PRIO30 est défini comme ayant les bits 13 et 14 mis à 1, et tous les autres bits mis à 0.









Donc, après avoir été complémenté (i.e. les bits inversés), l'accumulateur a maintenant ses bits 13 et 14 mis à 0, et tous les autres bits mis à 1.









L'instruction "RAND DSALMOUT" lit le canal 30, et fait un ET de l'accumulateur avec le contenu du canal 11.
Comme l'accumulateur avait tous ses bits mis à 1 sauf les bits 13 et 14, l'accumulateur contient à présent tous les bits du canal 11, sauf les bits 13 et 14 qui sont mis à 0.









L'instruction "AD BIT13" ajoute la valeur définie par BIT13 à l'accumulateur; cette valeur a le bit 13 mis à 1, et tous les autres bits mis à 0.
Cela signifie que le bit 13 de l'accumulateur est mis à 1, tandis que le bit 14 reste à 0.









L'instruction "WRITE DSALMOUT" écrit le contenu de l'accumulateur dans le canal 11.
Le résultat est que le bit 13 du canal 11 est mis à 1, tandis que son bit 14 reste à 0.









Le programme burn baby burn allume donc effectivement le moteur.
Mais ce programme ne doit pas seulement allumer le moteur, il doit aussi mettre sa poussée au maximum pour la phase de ralentissement initiale, et il manque de le faire, il n'ajuste pas la poussée du moteur principal.









Les programmes de la descente motorisée appellent une routine "THROTTLE", qui est supposée ajuster la poussée du moteur principal, donc, si l'AGC peut contrôler la poussée du moteur principal, nous devrions y trouver des instructions WRITE pour envoyer des commandes au contrôle de poussée.
Mais nous ne pouvons pas en trouver, et donc ce programme ne contrôle pas la poussée du moteur principal.









Maintenant, comment est-ce que la poussée était ajustée?
La manière dont elle était ajustée est décrite dans le manuel technique du module lunaire.
Les commandes INCREASE THROTTLE et DECREASE THROTTLE étaient des entrées d'un compteur; la commande INCREASE THROTTLE permettait d'incrémenter le compteur, et la commande DECREASE THROTTLE permettait de décrémenter le compteur.
La sortie du compteur permettait de contrôler la poussée du moteur quand c'était le LGC qui avait le contrôle de la poussée (c'est à dire quand le mode de contrôle de la poussée était sur AUTO).









L'envoi d'une impulsion sur la commande INCREASE THROTTLE permettait d'incrémenter le compteur, et ainsi d'accroître la poussée du moteur.
La documentation dit que chaque impulsion sur INCREASE THROTTLE augmentait la poussée de 2,7 livres.









De même, l'envoi d'une impulsion sur la commande DECREASE THROTTLE permettait de décrémenter le compteur, et ainsi de décroître la poussée du moteur.
La documentation dit que chaque impulsion sur DECREASE THROTTLE diminuait la poussée de 2,7 livres.









Donc l'augmentation de la poussée se faisait pas l'envoi de trains d'impulsions sur la commande INCREASE THROTTLE, tandis que la diminution de la poussée se faisait par l'envoi de trains d'impulsions sur la commande DECREASE THROTTLE.
La poussée maximum du moteur de descente était de 9900 livres, et la poussée minimale était de 1280 livres.
Donc, si chaque impulsion sur les commandes INCREASE THROTTLE et DECREASE THROTTLE provoquait une variation de 2,7 livres de la poussée, cela signifie que la poussée pouvait être ajustée par (9900-1280)/2,7=3192 pas.
Ceci pourrait se faire avec une commande de 12 bits (12 bits représentent une valeur de 4096).
Cela signifie qu'il devrait y avoir un canal de sortie de l'AGC sur lequel 12 bits sont réservés pour le contrôle de la poussée.









Cela fonctionnerait alors de cette manière:
Lorsque l'AGC veut ajuster la poussée à un niveau désiré, il écrirait le niveau correspondant sur 12 bits consécutifs d'un canal dédié.
Le LGC utiliserait alors cette poussée désirée pour la comparer avec la poussée courante:
- Si la poussée désirée est plus grande que la poussée courante, le LGC enverrait (Poussée désirée - Poussée courante) impulsions sur la commande INCREASE THROTTLE pour incrémenter le compteur contrôlant la poussée de cette valeur.
- Si la poussée désirée est plus petite que la poussée courante, le LGC enverrait (Poussée courante - Poussée désirée) impulsions sur la commande DECREASE THROTTLE pour décrémenter le compteur contrôlant la poussée de cette valeur.
De cette manière, la poussée courante serait maintenue égale à la poussée désirée de l'AGC.









Mais, après avoir attentivement examiné tous les canaux utilisés par l'AGC, j'ai pu constater qu'il n'y avait pas de canal qui permettait à l'AGC de contrôler la poussée du moteur principal.









Pourtant, les 12 bits précédant les bits de l'ENGINE ON (bit 13) et l'ENGINE OFF (bit 14) pourraient parfaitement avoir été utilisés par l'AGC pour spécifier le niveau désiré de la poussée.
Au lieu de cela, ces bits sont seulement utilisés pour des indicateurs lumineux.
La descente motorisée pourrait parfaitement être faite sans ces indicateurs lumineux, mais elle ne pourrait être faite si l'AGC ne pouvait contrôler la poussée du moteur principal (la poussée est mise au maximum du début de la descente motorisée, et diminuée après la phase de ralentissement; et, lorsque le module lunaire se déplace au-dessus de la surface lunaire pour trouver un endroit où se poser, la poussée est continuellement ajustée pour compenser l'attraction lunaire, alors que le module lunaire perd du poids).
De plus, il y a plein de bits libres dans les autres canaux qui auraient pu être utilisés pour ces indicateurs lumineux.









Il y a des bits dans un canal (canal 12) pour agit sur le système d'articulation du moteur de descente (pour changer son orientation), mais aucun pour agir sur Throttle+ et Throttle-.
De toute façon, s'il y avait eu des bits pour agir sur Throttle+ and Throttle-, il aurait fallu les changer un nombre conséquent de fois pour changer la poussée, comme ils changent la poussée d'une très petite quantité à chaque fois.









La conclusion est que la poussée du moteur principal ne pouvait pas être ajustée par l'AGC, ce qui rendait la descente motorisée impossible.









A part ce problème majeur, il y a d'autres problèmes, avec des instructions illégales comme celles que nous avons vues dans le programme de remontée, c'est à dire deux instructions définies dans la même ligne; ces instructions auraient du être rejetées par le compilateur.









Cette affectation, faisant une équivalence entre deux adresses, est impossible.
Une adresse a une valeur unique qui est déterminée par le compilateur, et elle ne peut être changée.
L'étiquette "ZOOM" est associée à l'adresse 2027, alors que l'étiquette P40ZOOMA est associée à l'adresse 2022; dire que ZOOM est égal à P40ZOOMA équivaudrait à dire que 2027 est égal à 2022, ce qui est bien sûr absurde.









Il est possible de manipuler dynamiquement des adresses en utilisant des pointeurs.
Un pointeur n'est pas une adresse, c'est une donnée, mais la différence avec une donnée ordinaire est que, au lieu de contenir une simple valeur, il peut contenir une adresse.









Les pointeurs sont très pratiques pour accéder à des structures.
Lorsque l'adresse d'une structure est placée dans un pointeur, il est possible d'accèder à tous les membres de cette structure indirectement à travers ce pointeur.
Les pointeurs sont beaucoup utilisés en C, et, dans C++, ils permettent d'utiliser des classes.









Si l'affectation qui est montrée est illégale, elle pourrait être définie en utilisant la déclaration d'adresse "CADR".
CADR définit une donnée qui contient une adresse.
L'adresse de cette donnée serait "ZOOM", et son contenu serait "P40ZOOMA".
Cette déclaration est utilisée pour faire des appels à des routines qui sont dans une autre banque de mémoire que la banque de mémoire courante, en faisant un appel à "BANKCALL".
BANKCALL regarde le contenu de l'adresse qui suit son appel, et y trouve l'adresse de la routine à appeler.









Et maintenant un clou final dans ce programme.
Dans la routine "COMFAIL", le couple d'instructions "TC BANKCALL","CADR STCLOK1" fait un appel à STCLOK1.









Dans STCLOK1, l'instruction "CA ZERO" charge 0 dans l'accumulateur, et l'instruction suivante, "TS DISPDEX", place l'accumulateur dans la variable DISPDEX; cela signifie que DISPDEX contient maintenant zéro.









Plus loin, le couple d'instructions "TC TWIDDLE", "ADRES CLOKTASK" lance une tâche appelée "CLOKTASK".
Le programme continue en séquence, et rentre lui-même dans CLOKTASK.









Et maintenant la surprise gît dans CLOKTASK.









Dans CLOKTASK, l'instruction "CCS DISPDEX" teste DISPDEX, exécute la première instruction suivante si DISPDEX est positif, et la seconde instruction suivante si DISPDEX est nul.
Mais nous avons vu que DISPDEX a été mis à zéro à STCLOK1, et c'est donc la seconde instruction suivante qui est exécutée, l'instruction qui aurait permis de sortir de CLOKTASK est sautée.
Le programme continue en séquence, jusqu'à une instruction "TCF CLOKTASK" qui reboucle au début de CLOKTASK.
Et bingo, toute la séquence se répète.









Nous avons donc ici une belle boucle infinie, et aucun programme n'a jamais réussi à se sortir d'une boucle infinie.









Juste avant l'alunissage, alors que le module lunaire se déplaçait au-dessus de la surface lunaire de manière à trouver un endroit où se poser, l'équipage utilisait le programme semi-automatique P66.
Ce programme contrôlait seulement la poussée du moteur principal, de manière à compenser l'attraction lunaire, alors que l'équipage contrôlait le RCS (les réacteurs latéraux) pour se déplacer au-dessus de la surface lunaire.
Ce programme prenait aussi en compte les ordres de l'équipage pour déplacer le module lunaire vers le bas ou le haut, de sorte que l'équipage pouvait choisir à quelle altitude le module lunaire devait se déplacer au-dessus de la surface lunaire.
Comme nous avons vu que l'AGC ne pouvait pas envoyer de commande au LGC pour contrôler la poussée du moteur principal, nous savons donc déjà qu'il y aura un problème dans le programme P66, puisqu'il ne peut pas physiquement appliquer ce qu'il a calculé.
Mais nous pouvons vérifier qu'il calcule quelque chose qui a du sens, de sorte que, s'il avait pu envoyer la commande calculée au LGC, cela aurait pu fonctionner.
A cette fin, je dois expliquer comment le programme P66 aurait dû fonctionner.









De manière à rester au-dessus de la surface lunaire, à altitude constante, le moteur du module lunaire doit parfaitement compenser l'attraction lunaire.
L'attraction lunaire exerce sur le module lunaire une force vers le bas qui est égale à la constante gravitationnelle lunaire (que j'appellerai "g") multipliée par la masse courante du module lunaire (que j'appellerai "M"), exprimée en kilogrammes, cette force étant exprimée en Newtons.
Le module lunaire doit donc produire une force (que j'appellerai "F") qui est égale à cette force vers le bas, de sorte que le module lunaire ne tombe pas vers la lune.









Si le module lunaire produit une force inférieure à l'attraction lunaire, le module lunaire va tomber vers la surface lunaire avec une accélération égale à g-F/M.









De même, si le module lunaire produit une force supérieure à l'attraction lunaire, le module lunaire va monter avec une accélération égale à F/M-g.









Lorsque l'équipage désire descendre, il utilise une commande "DESCENT-", qui signifie que la force produite par le moteur principal est momentanément moins que la force nécessaire pour compenser l'attraction lunaire; le résultat est que le module lunaire commence à descendre; et lorsque le module lunaire a atteint l'altitude désirée, l'équipage utilise une commande "DESCENT+", qui augmente la force produite par le moteur, et arrête ainsi la descente du module lunaire; ensuite, la poussée du module lunaire est maintenue égale à l'attraction lunaire, de sorte que le module lunaire reste à cette altitude.










De même, lorsque l'équipage désire monter, il utilise la commande "DESCENT+", qui augmente momentanément la force produite par le moteur principal, de sorte que le module lunaire commence à monter; lorsque le module lunaire a atteint l'altitude désirée, l'équipage utilise la commande "DESCENT-", qui diminue la force produite par le moteur principal, et arrête ainsi l'ascension du module lunaire; ensuite, la poussée du module lunaire est maintenue égale à l'attraction lunaire, de sorte que le module lunaire reste à cette altitude.









Alors, de quoi a besoin le programme P66 pour fonctionner?
Il a d'abord besoin de connaître la masse courante du module lunaire.
Il pourrait la calculer comme la somme de la masse à vide plus la masse du propergol restant.









Mais l'AGC n'a pas l'information du propergol restant sur ses canaux, et il ne peut donc mettre à jour la masse de cette manière.









Mais l'AGC peut aussi mettre à jour la masse d'une autre manière, en utilisant l'information de l'accélération (fournie par l'accéléromètre vertical).
En effet, lorsque la poussée courante ne compense pas l'attraction lunaire, cela génère une accélération (que j'appellerai "a") qui est égale à: a=g-F/M, "a" étant positif quand orienté vers le bas.
Conséquemment, la masse peut être calculée avec la formule: M=F/(g-a), ce qui permettre de mettre à jour la masse courante du module lunaire à partir de la poussée courante appliquée par le moteur principal, et l'accélération couramment mesurée.









Et l'AGC avait un moyen de connaître l'accélération courante, car l'IMU lui envoie des impulsions que l'AGC doit compter pour la mettre à jour, avec des instructions spéciales "cachées" ("cachées" signifie qu'elles ne sont pas utilisées par le programmeur, et qu'elles s'exécutent indépendamment du programme en cours), appelées "PINC" and "MINC", les mêmes instructions qui ont provoqué une surcharge de l'ordinateur dans la descente d'Apollo 11, à cause d'impulsions radar rapides, et qui ont généré l'alarme 1202.









Et, concernant les commandes "DESCENT+" and "DESCENT-" utilisées par l'équipage pour monter ou descendre le module lunaire respectivement, elles peuvent être trouvées sur les bits 6 et 7 respectivement du canal 16.









Nous pouvons donc maintenant examiner le travail qui est fait par le programme P66, qui est inclus dans la routine "THROTTLE" de l'AGC, et voir si le traitement qui y est fait correspond à ce que j'ai expliqué.
Lien vers le programme de contrôle de la poussée (contient P66)









D'abord ce programme appelle une routine "MASSMULT" qui est supposée faire un calcul avec la masse du module lunaire.
Cette routine devrait normalement mettre à jour la masse du module lunaire, qui change continuellement alors que le module brûle du propergol.
Il fait référence à une variable "MASS" qui représente la masse du module lunaire, avec une déclaration "ADRES"; mais "ADRES" déclare une adresse dans la mémoire fixe, pas dans la mémoire effaçable, ce qui signifie que la masse qui est utilisée n'est pas une masse variable qui devrait être continuellement mise à jour.
De ceci, nous savons déjà que le traitement qui est fait dans ce programme est incorrect.









Un canal est lu par l'AGC avec l'instruction "READ".









Mais cette instruction n'est jamais utilisée pour lire le canal 16 qui contient les commandes "DESCENT+" and "DESCENT-" utilisées par l'équipage pour changer l'altitude du module lunaire.









Nous avons donc déjà la confirmation que le traitement qui est fait dans ce programme est incorrect, et ne correspond pas à celui qu'il devrait faire.
Mais cela va même plus loin que cela, car il n'est pas seulement incorrect, mais même carrément délirant, comme nous allons le voir.









D'abord le programme écrit un 1 dans le bit 4 du canal 14.









Ce bit est identifié comme "Thrust Drive activity for descent engine", et permet une indication visuelle de la poussée appliquée par le moteur principal.
Mais ce bit a déjà été positionné par le programme d'allumage du moteur (burn baby burn), au début de la descente motorisée, et il n'est donc pas utile de le positionner une seconde fois.









L'instruction "CAF 4SECS" charge la valeur identifiée comme "4SECS" dans l'accumulateur; cette valeur est définie comme étant égale à 400 (décimal), et cette valeur est donc mise dans l'accumulateur.
L'instruction "TCF FWCOMP+1" saute à l'adresse qui suit FWCOMP, ce qui signifie que l'instruction"CAF 2SECS" 'qui aurait du charger 200 dans l'accumulateur n'est jamais exécutée.
L'instruction "TS Q" place l'accumulateur dans le registre Q, ce qui signifie que Q contient maintenant 400.









L'instruction "MP BIT6" fait une double multiplication avec une valeur identifiée comme BIT6, qui est égale à 40 en octal, et 32 en décimal.
Cela signifie que 400 est multiplié par 32, ce qui donne 12800 comme résultat, et 31000 en octal.
Ce résultat peut tenir dans un seul mot, ce qui signifie que le mot de poids fort de la double multiplication, qui est mis dans L, est nul.
Autrement dit, L est nul après cette opération.
L'opération "LXCH BUF+1" échange L avec la variable BUF+1; comme L contenait 0, cela signifie que, après cet échange, BUF+1 contient à présent 0.
Il est important de garder ceci à l'esprit, et vous comprendrez bientôt pourquoi!









Un timer "TIME1" est ajouté à l'accumulateur, lequel change tout le temps, ce qui signifie que l'accumulateur peut maintenant contenir n'importe quelle valeur.
Une valeur "THROTLAG" est aussi ajoutée à l'accumulateur.
Le commentaire dit que cette valeur est utilisée pour envoyer la commande calculée en avance, pour compenser le temps de réponse du moteur.
Mais c'est absurde, car cette valeur n'est pas utilisée pour envoyer la commande en avance, mais directement dans le calcul de la commande.









La commande "MASK LOW8" ne garde que les huit premiers bits de l'accumulateur, et met les autres bits à 0; comme l'accumulateur pouvait prendre n'importe quelle valeur (après qu'un timer lui ait été ajouté), il peut maintenant contenir une valeur entre 0 et 255.
L'accumulateur est ensuite divisé par le contenu de Q avec l'instruction "DIV Q"; mais nous avons précédemment vu que 400 a été mis dans le registre Q; cela signifie donc que l'accumulateur est divisé par 400; comme l'accumulateur contient n'importe quelle valeur entre 0 et 255 (et le registre L est nul), le résultat est 0.









L'accumulateur est ensuite multiplié par PIF, donnant 0, comme l'accumulateur contenait 0.
L'instruction "DXCH" échange ensuite la paire de registres A,L avec une variable appelée "FWEIGHT".









FWEIGHT est mis à 0 au début du programme P66.









Cela signifie donc que A et L contiennent maintenant 0.









L'instruction "CCS PIF" teste le contenu de PIF, exécute la première instruction suivante s'il est positif, la seconde instruction suivante s'il est nul, et la troisième instrution suivante s'il est négatif; cela signifie que l'accumulateur va être incrémenté d'une unité, sauf si PIF est nul (mais un commentaire dit qu'il ne peut pas être nul); donc l'accumulateur contient 1 après cette séquence.
L'instruction "MP PIF" multiplie ensuite l'accumulateur avec PIF, et, comme l'accumulateur contient couramment 1, le résultat est PIF.









La paire de registres A,L est ensuite divisée par le contenu de BUF+1 par l'instruction "DV BUF+1", et c'est là que nous pouvons avoir un grand rire, car nous avons précédemment vu que 0 a été mis dans BUF+1 (et vous comprenez maintenant pourquoi vous deviez garder à l'esprit que 0 a été mis dans BUF+1).









Et aucun ordinateur ou calculateur ne peut faire une division par zéro, ils génèrent tous une erreur disant que l'opération ne peut être traitée.
Généralement cela provoque l'arrêt d'un programme, à moins que le programme n'ait prévu une exception pour traiter ce cas.
Dans tous les cas, le résultat est indéterminé.
La documentation de l'AGC dit que le résultat est aléatoire.









L'instruction "DAS" ajoute l'accumulateur à la variable "FWEIGHT" (le registre L a été razé par l'instruction "ZL"), lequel contient une valeur aléatoire, ce qui signifie que FWEIGHT contient aussi une valeur aléatoire après cette opération.









Le programme fait ensuite un appel à une routine appelée "RTNHOLD".









Mais cette variable n'est pas définie dans la mémoire fixe, mais dans la mémoire effaçable au lieu de cela; la mémoire effaçable n'est utilisée que pour les résultats temporaires, elle ne contient pas de procédure valide.
Cela signifie que l'AGC va exécuter des instructions non déterminées, et il y a même peu de chance qu'il puisse en retourner.









S'il arrive quand même à en retourner (un miracle est toujours possible), il va exécuter la séquence suivante d'instructions.
L'instruction "CS ZERO" place le complément de zéro dans l'accumulateur, c'est à dire une valeur avec tous les bits mis à 1 (ce qui est appelé un 0 négatif, une absurdité du complément à 1).
L'accumulateur est ensuite mis dans PIF.









L'instruction "QXCH" échange le contenu de Q avec RTNHOLD; Q contenait l'adresse retour de l'appel à RTNHOLD, soit 2370 octal selon ce qui est indiqué dans le listing, et donc RTNHOLD contient maintenant cette valeur.
Et le programme retourne à DOIT pour refaire la même comédie.









Et nous avons à nouveau la division par zéro, donnant le même résultat indéterminé.









La routine "RTNHOLD" est à nouveau appelée, mais nous savons cette fois que RTNHOLD contient 2370 en octal.









Le code de cette instruction correspondrait à l'instruction RAND, qui permet de faire un ET de l'accumulateur avec le contenu du canal qui est indiqué dans les 9 premiers bits; mais la valeur indiquée dans les premiers bits est 370 octal, et ce numéro de canal I/O est incorrect, ce qui signifie que l'instruction essaie d'accèder à un canal I/O qui n'existe pas.









Et, même s'il y a un retour depuis RTNHOLD (ce qui est peu probable, mais un miracle est toujours possible), la même comédie se repète.









Donc, le programme ne fait pas que faire un traitement incorrect, il fait carrément un travail absurde, dénué de sens.
Même si l'AGC avait eu la possibilité d'envoyer la commande calculée au LGC, ce programme ne lui aurait pas envoyé quelque chose de correct.
Les ingénieurs doivent avoir pensé que, puisqu'il n'était pas possible d'envoyer la commande calculée au LGC, autant s'amuser avec ce programme!









La routine "ATTITUDE_MANEUVER_ROUTINE" est supposée contrôler l'attitude du module lunaire.
Lien vers le programme de contrôle d'attitude du LEM









Généralement, l'axe vertical est appelé "Z", mais, dans le module lunaire, il était inhabituellement appelé "X".









Les axes horizontaux étaient appelés Y et Z, Y étant l'axe transversal, et Z l'axe perpendiculaire.









L'interface de commande des réacteurs verticaux avait trois commandes, qui pouvaient être soit positives, soit négatives (ce qui faisait donc en fait six commandes):
- Le tangage (rotation autour de l'axe Y).
- Le roulis (rotation autout de l'axe Z).
- et la commande de translation verticale (X-TRANSL).









Une commande de tangage positif faisait faire un mouvement de tangage vers le haut au module lunaire.









Une commande de tangage négatif faisait faire un mouvement de tangage vers le bas au module lunaire.









Une commande de roulis positif faisait faire un mouvement de roulis vers la droite au module lunaire.









Une commande de roulis négatif faisait faire un mouvement de roulis vers la gauche au module lunaire.









Une commande de translation verticale positive faisait monter le module lunaire.









Une commande de translation verticale négative faisait descendre le module lunaire.









L'interface de commande des réacteurs horizontaux avait trois commandes, qui pouvaient être soit positives, soit négatives (ce qui faisait donc en fait 6 commandes différentes):
- Le lacet (rotation autour de l'axe X).
- Une translation sur la droite ou la gauche.
- Une translation vers l'avant ou l'arrière.









Une commande de lacet positif faisait tourner le module lunaire dans le sens inverse des aiguilles d'une montre autour de l'axe vertical.









Une commande de lacet négatif faisait tourner le module lunaire dans le sens des aiguilles d'une montre autour de l'axe vertical.









Une commande de translation positive le long de l'axe Y faisait bouger le module lunaire vers la droite.









Une commande de translation négative le long de l'axe Y faisait bouger le module lunaire vers la gauche.









Une commande de translation positive le long de l'axe Z faisait avancer le module lunaire.









Une commande de translation négative le long de l'axe Z faisait reculer le module lunaire.









De manière à communiquer avec le LGC, l'AGC utilisait des canaux sur lesquels il pouvait envoyer de l'information au LGC, ou depuis lesquels il pouvait obtenir de l'information depuis le LGC.









Normalement, il devrait avoir existé un canal avec 12 bits pour envoyer les commandes pour contrôler le RCS au LGC:
- Un bit pour envoyer une commande de tangage, et un bit pour le signe de cette commande.
- Un bit pour envoyer une commande de roulis, et un bit pour envoyer le signe de cette commande.
- Un bit pour envoyer une commande de translation verticale, et un bit pour envoyer le signe de cette commande.
- Un bit pour envoyer une commande de lacet, et un bit pour envoyer le signe de cette commande.
- Un bit pour envoyer une commande le long de l'axe Y, et un bit pour envoyer le signe de cette commande.
- Un bit pour envoyer une commande le long de l'axe Z, et un bit pour envoyer le signe de cette commande.









Eventuellement, si nous considérons qu'une seule commande verticale peut être envoyée à un moment donné, et une seule commande horizontale à un moment donné, il aurait pu y avoir deux bits pour spécifier le type de commande verticale à faire, et un bit pour spécifier le signe de cette commande verticale, et deux bits pour spécifier le type de commande horizontale à faire, et un bit pour spécifier le signe de cette commande horizontale; cela aurait fait deux fois moins de bits pour envoyer des commandes pour contrôler le RCS au LGC.
Mais il ne semble pas que le LGC ait prévu cette possibilité.









Mais, en fait, au lieu de cela, il y a deux canaux pour contrôler le RCS, avec huit bits sur chacun de ces canaux, ce qui signifie qu'il y avait 16 commandes envoyées au LGC pour contrôler le RCS, au lieu de 12.
Au lieu d'envoyer les commandes normales de rotation et translation (trois commandes de rotation, soit positives, soit négatives, et trois commandes de translation, soit positives, soit négatives), ces canaux permettraient de contrôler les 16 réacteurs latéraux du RCS, ce que le LGC ne permet pas.
Cela n'aurait aucun sens que l'AGC puisse contrôler indépendamment les 16 réacteurs latéraux du RCS, car rien ne l'empêcherait d'activer des réacteurs qui sont incompatibles entre eux.









Par exemple, en mettant les 8 bits des deux canaux 5 et 6 tous à 1, cela activerait tous les seize réacteurs latéraux du RCS, lesquels annuleraient mutuellement leurs effets (car ils ont tous la même poussée): le résultat est que le module lunaire ne réagirait pas à ces réacteurs, tandis que cela gaspillerait inutilement le propergol du RCS.
Cela montre combien il serait absurde que l'AGC puisse contrôler individuellement les réacteurs latéraux du RCS sans contrôle du LGC.









De plus, la routine qui contrôle l'attitude du module lunaire n'écrit même pas dans ces canaux.









Cette routine fait plein de calculs qui sont totalement inutiles, car le résultat de ces calculs n'est pas envoyé au LGC.









Cette routine utilise essentiellement des macro-instructions qui sont pour la plupart incorrectement spécifiées (avec deux macro-instructions sur la même ligne, ce qui n'est pas autorisé).









Beaucoup de ces instructions ne devraient même pas avoit été acceptées par le compilateur, qui aurait dû les rejeter comme invalides.









Dans la dernière partie de cette routine, un appel est fait à des routines appelées "ZATTEROR" et "STOPRATE".









Mais tout ce que ces routines font est de charger des variables depuis la mémoire et de les réécrire dans d'autres variables.
Il n'y a aucun accès à des canaux.
Et la routine ZATTEROR exécute aussi une partie de la routine "STOPRATE", ce qui signifie qu'elle aurait pu être arrêtée avant d'exécuter cette partie.









Et l'AGC communique avec le LGC exclusivement à travers les canaux, il ne peut pas communiquer avec lui à travers la mémoire.









Et, même s'il y avait eu un canal pour envoyer des commandes normales de rotation et translation au LGC, et que la routine de contrôle d'attitude avait écrit dedans des commandes correctes...









...Cela n'aurait quand même pas fonctionné, car, dans l'interface de commande des réacteurs verticaux, chaque commande verticale active deux réacteurs verticaux directement opposés l'un à l'autre sur la même grappe...









...Annulant ainsi mutuellement leurs effets respectifs!









Donc, alors que nous avons déjà vu plus haut que l'AGC ne pouvait pas contrôler la poussée du moteur principal...









...Nous voyons à présent que l'AGC ne pouvait pas non plus contrôler les réacteurs latéraux du RCS.









Avec ni le contrôle du moteur principal, ni celui du RCS, cela rendait la descente motorisée complètement impossible.









Et cela rendait également la remontée motorisée impossible, car, si dans la remontée motorisée il n'y a pas de contrôle de la poussée du moteur principal, le contrôle du RCS est par contre absolument nécessaire...









...Surtout puisque les réacteurs verticaux sont aussi nécessaires pour créer un contre-couple pour s'opposer au couple croissant de désalignement qui est généré par le décalage du centre de masse alors que le niveau baisse dans les réservoirs, lequel, contrairement à la descente, ne pouvait être corrigé en faisant pivoter le moteur de remontée, car celui-ci était fixe, et non articulé comme l'était celui du moteur de descente.









Et, si les astronautes pensaient qu'ils étaient des super héros qui étaient capables de faire la descente manuellement parce qu'ils réalisaient que l'AGC n'en était pas capable (il ne pouvait même pas mettre le moteur à pleine poussée au début de la descente motorisée), cela aurait été voué à l'échec...









...Car le problème dans l'interface de commande des réacteurs latéraux les aurait empêché de contrôler l'attitude du module lunaire...









..Ce qui signifie qu'il n'y a pas moyen qu'ils aient pu guider le module lunaire jusqu'à la surface lunaire, aussi talentueux qu'ils puissent être.









Quelqu'un doit complètement ignorer ce fait pour encore croire que des hommes ont marché sur la lune.









La réalité est que personne n'a jamais traversé les ceintures de Van Allen, et encore moins aluni.