Scanner laser à ingénierie inverse Leuze RS4


Plus tôt, j'ai parlé de l'ingénierie inverse d'un capteur de distance laser . Cette fois, nous parlerons d'un appareil plus complexe - un scanner laser Leuze RS4. Comme le capteur, ce scanner m'est venu dans un état cassé, j'ai donc dû commencer à le restaurer et, dans le processus, à améliorer certaines de ses caractéristiques et, en fait, à le refaire dans un autre appareil.

Qu'est-ce que ce scanner laser?


Leuze RS4 est un scanner de sécurité laser, c'est-à-dire qu'il est conçu pour empêcher les personnes d'entrer dans les zones dangereuses de l'usine, pour éviter les collisions des véhicules de production, etc. Il a des caractéristiques assez décentes - portée maximale: 15 / 50m (selon le mode de fonctionnement ), la précision de la mesure de la distance dans toute la plage de mesure est de 5 mm, la résolution angulaire est de 0,36 degrés, la vitesse de balayage est de 25 tr / min (25000 mesures / s).

Il convient de noter que ce scanner est positionné précisément comme un dispositif de sécurité - c'est-à-dire qu'il stocke l'emplacement des zones d'alarme et d'avertissement en mémoire, et lorsqu'un objet entre dans ces zones, l'une des clés s'ouvre dans le scanner. Pour configurer l'emplacement des zones, le scanner peut être connecté à un ordinateur et observer l'emplacement des obstacles sur l'écran. Il existe même un package ROS qui vous permet de recevoir des données de ce scanner.
J'ai obtenu un scanner sans étui, démonté dans ses composants. Le scanner s'est écrasé en raison d'un fort coup porté au corps; dans quoi exactement il a cessé de fonctionner, je ne comprenais toujours pas - peut-être que l'optique était mal alignée, le contact dans l'un des connecteurs s'est éteint, ou le capteur de l'encodeur s'est déplacé, ou autre chose. J'ai essayé d'assembler toutes les pièces ensemble, le scanner a été vu dans le logiciel natif, mais l'analyse n'a pas commencé. Je n'ai donc qu'une seule façon de le démarrer: restaurer le circuit du scanner aussi complètement que possible et écrire mon propre micrologiciel de microcontrôleur de scanner.

Voici à quoi ressemblaient les pièces: ici, elles devraient être situées dans le boîtier (photo de la documentation, on peut voir que le design et l'électronique sont légèrement différents):

image



image

Une autre partie importante du scanner est le miroir de balayage (surligné en bleu sur la photo ci-dessus) installé en son centre:

image

Diagramme schématique du scanner:

image

Comme le montre le diagramme, l'ensemble de l'électronique du scanner se compose de modules séparés (cartes) connectés par des connecteurs et des boucles.

Il existe de nombreux modules - module d'alimentation (DC-DC), module d'interface, module processeur, module photodétecteur (APD), module laser. De plus, il y a aussi un module d'encodeur et deux cartes en forme de fer à cheval, ce qui semblait à première vue étrange.

Tout d'abord, il convient de leur prêter attention:

image

De toute évidence, l'une des cartes contient des LED et la seconde contient des photodiodes. Au début, je pensais que c'était une sorte d'encodeur, ou une sorte de mécanisme pour vérifier le rayonnement laser. Cependant, plus tard, après avoir lu la documentation du scanner et avoir examiné les photographies en détail, j'ai réalisé qu'il s'agissait d'un système de surveillance de l'état de la surface de la vitre de protection du scanner.

Des trous pour les LED sont visibles sur la photo:



En mesurant le niveau du signal provenant des photodiodes, vous pouvez estimer le niveau de transmission du verre de protection. De toute évidence, ce système n'est pas critique pour le scanner, donc je n'ai pas utilisé ces cartes à l'avenir.

Le module processeur est la partie la plus difficile du scanner. Voici à quoi ressemble l'électronique du module de deux côtés:

image

Pour la première fois que j'ai regardé la carte, j'ai immédiatement réalisé que le scanner utilise la méthode du temps de vol pour mesurer la distance (TOF) - la puce avec le plus grand marquage s'est avérée être " ACAM TDC-GPX ", dont j'avais déjà entendu parler. TDC - "Time-to-Digital Converter", c'est-à-dire une puce spécialisée conçue pour mesurer des intervalles de temps avec une très grande précision, c'est elle qui est utilisée pour mesurer le temps de "vol" d'une impulsion laser.
Un microcontrôleur Infineon C167 avec une puce de mémoire FLASH externe (qui a plu) et ASIC (qui a énormément bouleversé) était également à bord. Plus en détail sur ce module, je le dirai ci-dessous.

Module de puissancecontient un convertisseur DC-DC à isolation galvanique personnalisé avec plusieurs tensions de sortie et plusieurs condensateurs:

image

La tension d'alimentation du convertisseur est de 24V. Sa principale caractéristique est qu'il fournit une haute tension (~ 230 V), qui est nécessaire pour le fonctionnement du laser et du photodétecteur, à un petit connecteur séparé.

Il fournit également les tensions suivantes au connecteur principal: + 5V, -5V, ~ 15V, isolées galvaniquement du reste + 5V pour l'interface RS232.

Partie optique du scanner

image

À première vue, il n’est pas très clair où se trouvent les optiques du scanner. Dans ce cas, une petite fenêtre avec un miroir au centre de la photo sert à émettre le faisceau laser, et une grande surface brillante autour de celle-ci est la surface du filtre de lumière d'interférence installé devant la lentille du photodétecteur. Ce filtre ne transmet que le rayonnement dont la longueur d'onde est proche de la longueur d'onde laser.

Voici comment cela apparaît dans la documentation du scanner:



l'objectif lui-même est monté à l'intérieur d'un boîtier en plastique noir, il est donc problématique de le voir. A l'extrémité de ce boîtier, contrairement à ce qui est vu sur la photo ci-dessus, le module laser et le photodétecteur sont fixes : Module laser

image


Vue du module laser (certains des détails sont marqués par moi lors du dessin du circuit): Comme vous pouvez le voir, le circuit de ce module est assez simple, donc j'ai pu restaurer complètement son circuit: Une grande partie ronde sur la carte est un émetteur laser spécialisé. Malheureusement, il n'y avait aucune marque dessus, donc aucune documentation n'a pu être trouvée dessus. À partir de la description sur le scanner, vous pouvez trouver - «Longueur d'onde de la lumière laser - 905 nm», «Classe laser - 1», «Durée d'impulsion - 0,003 µs», «Fréquence de répétition - 25 kHz». Ce qu'il était possible de comprendre en restaurant le circuit du module et en analysant son fonctionnement:

image



image






  • L'émetteur laser est alimenté en permanence avec une tension d'alimentation de 143 V, limitée par des diodes zener.
  • , «3» . , , .
  • , , . ( ) «» .

Tout le contrôle laser est effectué sur une seule ligne - "LASER_PULSE". La plupart du temps sur la ligne doit être de haut niveau. Lorsqu'une impulsion négative est appliquée, le déclencheur DD1 est remis à 0 sur son bord d'attaque et sur le bord de fuite, le déclencheur commence à «attendre» le signal de la photodiode et le laser démarre. Lorsqu'un signal provenant de la photodiode apparaît, le déclencheur passe à 1.
Vous pouvez remarquer deux fils coaxiaux à l'aide des connecteurs connectés au module. Ils sont utilisés pour transmettre le signal différentiel du déclencheur à la puce TDC.

Ce module contient également cinq LED. Le module processeur les contrôle. Module

photodétecteur
Le module lui-même ressemble à ceci: Photographie du photodétecteur lui-même à proximité:

image



image

Le signe de haute tension dans le coin de la carte montre clairement qu'une photodiode à avalanche (APD) est utilisée ici - ils nécessitent une tension assez élevée pour fonctionner.

Malheureusement, il n'y avait aucun marquage visible sur le corps du photodétecteur. Par l'emblème sur la photodiode elle-même (au centre), il était seulement possible de déterminer qu'elle était fabriquée par Pacific Silicon Sensor (First Sensor)Cependant, il n'y avait plus d'informations sur lui, peut-être qu'il est fait sur mesure. On peut voir sur la photo que ce photodétecteur est un hybride, c'est-à-dire contient un amplificateur intégré - il est clairement visible au-dessus de la photodiode. De toute évidence, l'amplificateur et la photodiode ont besoin de puissance - ils sont alimentés par les bornes inférieures (les condensateurs leur sont soudés). Un grand mystère était le petit détail à gauche de la photodiode, à laquelle se trouvent trois conducteurs. D'autres recherches ont montré qu'il s'agit d'un capteur thermique analogique.

Ce module est beaucoup plus compliqué que le précédent, il utilise une carte de circuit imprimé multicouche - au moins 4 couches, avec la plupart des lignes de signaux situées sur la couche externe de la carte, ce qui facilite grandement son analyse. Dans ce module, j'ai restauré environ 80% du circuit, le reste n'était pas vraiment nécessaire pour moi.

Le circuit résultant du module photodétecteur: Au sommet du circuit se trouve une source linéaire haute tension réglable pour une photodiode à avalanche. Il peut générer une tension stable d'au moins 150 V. Cette source est contrôlée par le DA1 DAC (LTC1451).

image



Comme le scanner est basé sur un télémètre pulsé, la tâche principale du module photodétecteur est de détecter rapidement un signal laser suffisamment faible réfléchi par un obstacle. Étant donné que le niveau du signal lumineux est très faible, il ne peut être détecté qu'à l'aide d'une phototodiode à avalanche, qui a son propre gain. Dans ce cas, le signal de la photodiode est en outre amplifié par un amplificateur intégré intégré au photodétecteur. Du fait que l'amplificateur est intégré dans le corps du photodétecteur, l'influence des interférences sur le signal utile est réduite. Le signal généré par le photodétecteur (OUT_B) est transmis à une certaine puce DA4, qui, apparemment, est un autre amplificateur haute fréquence. Après cela, le signal est transmis à l'entrée directe du comparateur à grande vitesse D1 (MAX9601).Le signal de référence du diviseur de résistance (environ 50 mV) est envoyé à l'entrée inverse de ce comparateur.

Le signal en sortie du comparateur est différentiel, il est transmis via un fil coaxial directement à la carte module processeur.

De plus, le signal de la sortie de l'amplificateur DA4 est transmis à une sorte de détecteur de crête, qui «se souvient» du niveau maximum de l'impulsion reçue. Je n'ai pas commencé à restaurer le circuit de ce noeud, et n'ai puisé sur le circuit que son étage de sortie (puce U1), dont le signal est également transmis au module processeur.

L'une des parties du scanner qui est moins claire pour moi est le transistor Q3 installé à la sortie de l'amplificateur RF. A en juger par les circuits, il est nécessaire de permettre l'atténuation du signal à la sortie de l'amplificateur. Ce transistor peut être contrôlé à l'aide d'un signal provenant de la carte processeur (ligne 10 - «digi»).

Vous pouvez remarquer que la carte a une puce EEPROM. Toutes les sorties de signaux de cette puce sont connectées à la carte processeur. Apparemment, dans ce microcircuit, certains paramètres ont été stockés, uniques pour chaque carte photodétecteur, et enregistrés dans celui-ci lors du test de la carte. En particulier, il peut s'agir d'une courbe de la dépendance du gain APD sur la tension d'alimentation, de la dépendance de la tension en sortie du capteur de température sur sa température, et d'autres caractéristiques similaires.

Vous pouvez voir que la puissance du photodétecteur peut être contrôlée en réglant certains niveaux sur les lignes CLK, CS, CS2 connectées au DAC et à l'EEPROM.

La carte contient plusieurs circuits conçus pour surveiller son état. Vous pouvez contrôler le niveau de tension de l'APD, sa température (ligne 7) et le seuil du comparateur. Ces tensions sont converties par des amplificateurs opérationnels DA3-DA5 et transmises à la carte du module processeur.

Revenons au module processeur Ce module est le plus complexe de tous, il contient un grand nombre de microcircuits multi-sorties, la carte de circuit imprimé est à nouveau à quatre couches, et la plupart des lignes de signal sont séparées dans les couches internes, ce qui complique considérablement la restauration du circuit. Très souvent, il s'est avéré que les pistes passaient d'un autre côté de la planche. Afin de rechercher rapidement où une certaine piste est connectée, j'ai dû utiliser un tel pinceau, connecté à un multimètre (en mode numérotation):

image





image

J'ai restauré environ 70% du régime - le reste dont je n'avais pas vraiment besoin. Schéma fonctionnel du module processeur:

image

Le schéma résultant du module processeur: Malgré le fait que j'appelle ce module «module processeur» partout, il est en réalité basé sur le microcontrôleur Infineon SAK-C167CR-L33M . Il a 144 broches et est construit sur l'architecture C166 assez ancienne. Ce microcontrôleur ne possède pas sa propre mémoire non volatile - il est nécessaire de lui connecter une mémoire externe via un bus parallèle. À ces fins, le scanner dispose d'une puce de mémoire Flash M29F400B (512K x 8 / 256K x 16). De plus, deux puces RAM sont connectées au microcontrôleur - IS61C6416AL-12 (64K x 16) et K6R4016C1D (256K x 16).

image



Vous pouvez voir que le bus d'adresse est connecté à tous les microcircuits de mémoire avec un décalage d'un bit - les lignes de mémoire A0 sont connectées à la ligne A1 du microcontrôleur. Cela est dû au fait que les adresses sont définies sur le bus d'adresses en octets, mais le contrôleur et la mémoire sont en 16 bits. Pour que le contrôleur écrive des octets uniques dans la RAM sans affecter les octets voisins dans un mot de 16 bits, les puces de mémoire ont des lignes spéciales UBn, LBn. Cette solution est très courante dans les appareils avec des bus parallèles et est décrite en détail dans la documentation du contrôleur.

Mais une autre solution dans le module processeur n'est pas devenue complètement claire pour moi. Si vous regardez la puce de mémoire flash U1, vous remarquerez que la ligne A14 de la puce est connectée à la terre. La ligne de bus d'adresse du contrôleur A15 correspondante n'est pas du tout connectée à la puce. Le résultat est que le contrôleur n'a accès qu'à la moitié de la mémoire Flash. Une situation complètement similaire avec la puce RAM2 (DD3).

Avec la puce RAM1 (DD2), la situation est quelque peu différente - la ligne de contrôleur A15 n'y est pas non plus connectée, mais en même temps toutes les entrées d'adresse de cette puce sont connectées au bus d'adresse, de sorte que le contrôleur a accès à toute la mémoire de la puce.

Et maintenant, vous devez faire attention au nœud sur les éléments logiques DX1, DX2, DD4. Ce sont ces microcircuits qui déterminent lequel des microcircuits de mémoire est sélectionné par le microcontrôleur. On peut voir qu'ils sont contrôlés par les signaux suivants:

  • WRn - signal d'enregistrement, niveau actif - faible. Sur cette ligne, le microcontrôleur définit un niveau bas lorsque vous devez écrire des données dans la mémoire RAM externe
  • A15 est la même ligne de bus de données qui n'est connectée directement à aucune des puces de mémoire.
  • CSn0 est un signal de sélection de puce spécialisé, le niveau actif est faible. Cette ligne est connectée au décodeur d'adresse intégré au contrôleur. Après une réinitialisation, le contrôleur est bas.
  • RAM2_CE - connecté au GPIO du contrôleur avec un ascenseur au sol.

La logique de fonctionnement de ce nœud est bien décrite par le tableau:

image

Comme vous pouvez le voir, selon l'état de la ligne RAM2_CE, le microcontrôleur fonctionnera soit avec la mémoire Flash soit avec le microcircuit RAM2 (DD3), et les espaces d'adressage pour eux coïncident. Il est à noter que la capacité mémoire de ces microcircuits est la même. Peut-être que cela est fait pour simplifier la mise à jour du firmware de l'appareil. Il existe une autre option - la RAM installée est 3 fois plus rapide que la mémoire Flash, donc après le démarrage, le contrôleur peut copier le contenu de FLASH vers RAM2, après quoi le programme est exécuté à partir de celui-ci.

Mais le niveau élevé de la ligne A15 détermine clairement que le contrôleur fonctionnera avec la puce RAM (DD2).

En conséquence, il s'avère que la mémoire FLASH et RAM1 alternent dans l'espace d'adressage du contrôleur:

image

La zone de RAM déjà rencontrée est surlignée en rouge - en y accédant, le contrôleur aura en réalité accès aux données situées aux adresses (0x8000-0xFFFF).
La configuration du compilateur n'est pas anodine et, comme je l'ai mentionné ci-dessus, la moitié de Flash / RAM2 est perdue. La raison pour laquelle les développeurs du scanner n'ont pas basculé entre les puces FLASH et RAM en utilisant la ligne spécialisée CSnX du contrôleur n'est pas claire.

Comme je l'ai déjà mentionné, le contrôleur utilisé n'a pas de mémoire flash, et donc de bits de fusible. Afin de configurer certains paramètres du contrôleur: largeur et adresse du bus de données, les paramètres PLL sont des résistances déroulantes connectées au bus de données. Le contrôleur lui-même possède des résistances Pull-Up intégrées de haute résistance (> 100 KOhm) connectées à l'ensemble du bus. Ainsi, en raison de résistances externes, une certaine combinaison de signaux est établie sur le bus, que le contrôleur lit lorsqu'il est allumé. Il détermine les paramètres de contrôleur nécessaires.

Dans ce cas, nous parlons des résistances R3-R6. La configuration sélectionnée des résistances est cohérente avec les connexions de signal de bus résultantes et fournit une vitesse d'horloge du contrôleur de 33 MHz.

Le signal impulsionnel du codeur miroir est envoyé à l'entrée du temporisateur "T2IN" du microcontrôleur via l'élément logique OR D6. La deuxième entrée de cette puce est connectée au GPIO du contrôleur, ce qui vous permet de désactiver la fourniture d'impulsions à l'entrée de la minuterie. Pourquoi une telle solution est nécessaire, et pourquoi il est impossible de désactiver la minuterie par programme, je ne comprends toujours pas.

Vous devez maintenant faire attention à la puce TDC (DD1).

Le scanner possède une puce TDC-GPX - la plus «avancée» de toutes les gammes ACAM. Précision revendiquée de la mesure des intervalles de temps jusqu'à 10 ps RMS. Le microcircuit possède 8 canaux d'entrée de lignes LVTTL et 2 canaux de LVECL (différentiel).
Dans ce scanner, pour obtenir la précision maximale de la mesure du temps, ce sont les entrées LVECL qui sont utilisées pour recevoir les signaux du module laser et du module photodétecteur à l'aide de quatre câbles coaxiaux. Les signaux du module laser sont envoyés aux entrées du DStart / DStartN et démarrent le décompte du temps. Les signaux du module photodétecteur sont envoyés aux entrées DStop1 / DStop1N, DStop2 / DStop2N et arrêtent le décompte du temps. Comme le montre le diagramme, les signaux d'arrêt sont appliqués immédiatement à deux canaux TDC, avec une polarité inverse. De ce fait, il est possible de mesurer non seulement la durée du "vol" de l'impulsion lumineuse, mais également la largeur de l'impulsion reçue.

Le TDC-GPX possède un bus de données 28 bits, mais il peut être commuté en mode 16 bits, ce qui est utilisé dans le scanner. Le bus d'adresse est à 4 bits, il est également décalé de 1 bit, comme pour les puces mémoire. Les puces DD8, DD9, U2 sont utilisées pour générer des signaux de contrôle de la puce et faire correspondre les niveaux - le microcontrôleur fonctionne à partir de 5 V et le TDC - à partir de 3,3 V. En général, le système d'alimentation TDC est assez complexe, il y a même un ajustement automatique de la tension d'alimentation. En raison de sa complexité, je n'ai pas commencé à dessiner son diagramme - je soupçonne qu'il n'est pas très différent d'une fiche technique.

La programmation du microcontrôleur et du TDC sera discutée plus loin.

Comme je l'ai mentionné plus tôt, une puce ASIC personnalisée avec les inscriptions «LEUZE98» et «WATCHDOG» est installée sur la carte. Ce que c'est est inconnu. On peut voir qu'un oscillateur à cristal de 20 MHz est connecté à ce microcircuit. Après avoir pu programmer le microcontrôleur, je me suis assuré que l'ASIC n'interfère pas avec son fonctionnement et je n'ai pas restauré le schéma de connexion de l'ASIC. Autant que je sache, cette puce communique avec le contrôleur via un bus parallèle. Il est possible que ce soit l'ASIC qui génère le signal de réinitialisation RESETn, qui réinitialise le contrôleur et le TDC.

Néanmoins, il était nécessaire de traiter certaines chaînes plus en détail.

Il s'est avéré que le signal de commande laser "LASER_PULSE" peut être généré à la fois par le microcontrôleur et l'ASIC en utilisant un nœud sur les transistors T1, T2. Dans ce cas, lorsqu'il est activé, l'ASIC ouvre le transistor T1, de sorte que le contrôleur ne peut pas contrôler le laser. Pour cette raison, j'ai dû retirer la résistance R24 - et le laser a commencé à être normalement contrôlé par le contrôleur.

Le signal de commande du moteur du miroir line_motor1 provenait également de l'ASIC (via la diode D2). Pour cette raison, j'ai dû couper la piste sur la carte et connecter ce signal directement à la sortie libre du contrôleur GPIO - P3.15.

Le plus étrange est que la ligne CS2 connectée au DAC installé sur le circuit imprimé du module photodétecteur s'est également avérée être connectée à l'ASIC. Pour cette raison, le contrôleur n'a pas pu régler indépendamment la tension d'alimentation APD et allumer l'amplificateur APD. Cela a peut-être été fait pour augmenter la fiabilité du scanner - un paramètre DAC incorrect peut entraîner une défaillance de l'APD. J'ai également dû connecter cette ligne à la broche GPIO libre du contrôleur P3.4.

Il est bien connu que c'est l'ASIC qui contrôle les trois LED montées sur le module laser. Deux autres LED affichant l'état du scanner (la présence d'un obstacle dans la zone de travail) sont contrôlées à partir du contrôleur - lignes LN1, LN2. Ces lignes vont également à la carte du module d'interface.

Étant donné que le scanner peut fonctionner dans les systèmes de sécurité, la carte processeur dispose d'un grand nombre de nœuds pour diagnostiquer son état. Le processeur (et éventuellement ASIC) peut détecter l'inclusion d'un laser (à l'aide de la puce U3), contrôler le niveau de plusieurs tensions d'alimentation, la tension d'alimentation APD, la température APD et le seuil du comparateur sur la carte photodétecteur.

En raison du fait que la tension de référence de l'ADC du contrôleur est de 4,1 V, une partie des tensions mesurées est réduite à l'aide de diviseurs de résistance - ils peuvent être vus dans le diagramme à droite.

Et maintenant, il vaut la peine de regarder de plus près la méthode de génération du signal "digi" inhabituel , que j'ai mentionné plus tôt dans la description du module photodétecteur.

Le diagramme ci-dessous montre les nœuds du module processeur (en bas) et du module photodétecteur (en haut):

image

Les flèches indiquent la connexion des modules à l'aide de fils. Ci-dessous, je décrirai le fonctionnement de ces nœuds, si je comprends bien. Dans le module photodétecteur, le signal de la sortie APD est amplifié par la puce DA4, après quoi il est transféré au comparateur D1. Si le niveau du signal à l'entrée du comparateur est supérieur à 50 mV, alors un niveau haut est réglé à la sortie du comparateur. Le signal de la sortie du comparateur est transmis au module processeur. Tout d'abord, il entre dans l'entrée TDC, qui compte le temps depuis le début de l'impulsion laser. Mais en plus, ce signal est envoyé à l'entrée d'horloge du DD-trigger DD1. Une unité logique est toujours fournie à l'entrée du signal de déclenchement, et le déclencheur lui-même peut être remis à zéro à l'aide de la ligne GPIO du contrôleur BASE5. Ainsi, le fonctionnement du comparateur conduit à un déclencheur instantané "1". Ce déclencheur a une sortie différentielle,dont le signal est envoyé à l'entrée de la puce D3, qui la convertit au format LVTTL. Ce signal est envoyé à l'entrée «digi» du module photodétecteur. Comme je l'ai mentionné précédemment, à mon avis, l'apparition de ce signal conduit à un affaiblissement du niveau du signal à l'entrée du comparateur.

La question principale est pourquoi est-ce nécessaire et pourquoi est-il si difficile à mettre en œuvre? Pourquoi était-il impossible de faire les deux nœuds sur la carte du module photodétecteur?

Je ne peux qu'exprimer mes hypothèses. Peut-être que le signal doit être atténué afin d'éviter la transition du comparateur ou du détecteur d'amplitude à la saturation. Peut-être - pour réduire la durée de l'impulsion reçue. Pour les deux nœuds, il ne pouvait tout simplement pas y avoir de place sur la carte photodétecteur. Une autre option est également possible - le signal ne doit être affaibli qu'après avoir eu le temps d'atteindre le PMH via des fils coaxiaux, ce qui justifie une conception aussi complexe.
L'étude a montré qu'avant de démarrer une nouvelle impulsion laser, il est nécessaire de réinitialiser le déclencheur, sinon les impulsions ne sont pas acceptées.

Module d'interface
Malheureusement, je n'ai pas trouvé une bonne photo de ce module. Il n'y a que celui-ci:

image

c'est sur ce module que sont installés les deux seuls connecteurs, auxquels vous pouvez vous connecter en dehors du scanner. L'un d'eux est RS-232 / RS-422, selon le second, l'alimentation est fournie au scanner, les signaux de commande sont fournis et un circuit de sécurité est connecté ici.

Ce module contient des convertisseurs UART-RS232 / RS485 et des optocoupleurs d'isolement galvanique (ils sont installés sur une petite carte séparée illustrée à droite), les touches d'alimentation du circuit de sécurité, les circuits d'entrée des lignes de commande du télémètre, un circuit de commande du moteur, un convertisseur de signal codeur.

Le module de puissance et le module processeur, ainsi que le module codeur et le moteur miroir sont connectés à ce module (à l'aide des connecteurs en bas du module, ils ne sont pas visibles sur la photo).

Schéma partiel du module d'interface: je n'ai restauré qu'une partie du circuit de ce module (environ 20%), car je n'étais pas intéressé par les clés et les lignes d'entrée nécessaires pour assurer la sécurité. Et il y en a pas mal, la documentation mentionne la limite de courant sur le circuit de sécurité, la surveillance des courts-circuits et d'autres fonctionnalités.

image



Un peu bizarrement fait contrôler la vitesse de rotation du moteur du miroir. Le contrôle de la vitesse est mis en œuvre en modifiant la tension du moteur - avec cela, tout est clair. Mais l'ajustement de cette tension elle-même s'effectue à l'aide d'une certaine chaîne d'intégration sur un amplificateur opérationnel. Afin d'augmenter la tension, le contrôleur met 0 sur la ligne line_mot1 pour la baisser - 1. Évidemment, sans rétroaction constante de l'encodeur, le moteur s'arrête ou accélère à la vitesse maximale à travers le contrôleur.

Il s'est avéré que la puce du convertisseur UART-RS232 LTC1387 est assez lente - à une vitesse de 500 kbit / s, les données ont été déformées. Pour cette raison, j'ai dû retirer une petite carte avec cette puce et connecter le convertisseur USB-UART directement à la carte du module d'interface.

Maintenant que j'ai parlé de la conception de tous les modules, il vaut la peine d'élaborer sur le processus de rétro-ingénierie lui-même.

Lorsque j'ai commencé à m'occuper de l'électronique du scanner, j'avais le plus peur qu'un laser ou un photodétecteur puisse être endommagé à la suite d'un impact. Dans le même temps, je n'étais pas sûr de pouvoir lancer le module processeur - le microcontrôleur inconnu et l'ASIC étaient gênés. J'ai donc tout d'abord restauré le circuit du module laser, puis le module photodétecteur. Après avoir pu comprendre le circuit de ces modules et déterminer le but de tous les contacts sur leurs connecteurs, il a été possible de passer au module processeur. En dernier recours, si je ne pouvais pas le démarrer, j'ai eu l'idée de faire un analogue de ce module sur des microcircuits STM32 + TDC-GP2.

Évidemment, pour vérifier le module, vous devez exécuter votre propre programme sur le microcontrôleur Infineon SAK-C167CR qui y est installé. Encore une fois, il convient de se rappeler que ce contrôleur n'a pas de mémoire Flash intégrée. De plus, comme il s'est avéré, le contrôleur n'a pas d'interfaces de débogage spécialisées (y compris JTAG). Avec un degré de probabilité élevé, le firmware est écrit sur un flash externe dans le programmateur en usine. Cependant, comme il s'est avéré, tout n'est pas si mal - le contrôleur a un chargeur de démarrage («Bootstrap Loader»), fonctionnant sur UART. Ce chargeur de démarrage est stocké dans la ROM de démarrage intégrée du contrôleur, il doit donc se trouver dans mon contrôleur. Et cela fonctionne de manière assez particulière - pour l'activer au démarrage, vous devez définir la ligne de bus de données P0L.4 sur faible,après quoi le contrôleur commence à attendre que l'octet 0x00 de l'hôte apparaisse. Après avoir accepté cet octet, le chargeur de démarrage détermine automatiquement le taux de transfert et commence à attendre 32 octets de données qu'il copie dans la RAM interne du contrôleur. Une fois les données reçues, le contrôleur démarre l'exécution du programme reçu (16 mots du contrôleur).

En fait, dans ces 32 octets, vous devez pousser un autre chargeur («préchargeur»), qui recevra le chargeur principal «Chargeur externe» de l'hôte, et commencera son exécution.

Ici, j'ai eu de la chance - pour ce processeur, il existe déjà un programme FLASHit prêt à l'emploi qui peut effectuer toutes les opérations mentionnées automatiquement. Le chargeur intégré a beaucoup de fonctionnalités - avec lui, vous pouvez déterminer automatiquement le modèle de mémoire Flash installée, modifier et afficher le contenu des registres du contrôleur, vous pouvez voir l'état des canaux ADC.

Je n'ai pas trouvé de tampons de test sur la carte connectée à la ligne P0L.4 du contrôleur, donc pour démarrer le chargeur de démarrage, j'ai dû souder une broche spéciale sur cette ligne. J'ai collé la broche au boîtier de l'une des puces RAM. Pour démarrer le chargeur de démarrage, vous devez connecter cette broche à la terre via une résistance de 8 kΩ.

Après avoir connecté la carte à l'ordinateur et mis le module processeur sous tension, le microcontrôleur est vraiment apparu dans FLASHit. Après cela, j'ai écrit un petit programme en Keil qui a commuté l'une des broches du contrôleur et l'ai écrit en Flash. Le programme a bien fonctionné, l'ASIC n'a pas interféré (j'avais peur d'une sorte de mécanisme de surveillance intégré ou de conflits dans les bus), pour que je puisse continuer.
Après cela, j'ai restauré le circuit du module processeur, ce qui m'a permis de vérifier le fonctionnement de tous les modules de l'assemblage.

La première fois que j'ai vérifié le fonctionnement du module laser - comme je l'ai écrit plus tôt, pour démarrer l'impulsion laser, il était nécessaire d'appliquer un seul signal à ce module. Le laser a fonctionné - ses flashs étaient visibles à l'aide de l'appareil photo d'un téléphone portable. De plus, à l'aide d'un oscilloscope, j'ai vérifié que le module forme normalement des impulsions de démarrage (référence).

Vint ensuite la vérification du module photodétecteur. Ici, je devais vérifier le fonctionnement du DAC, de l'unité de génération de tension de photodiode à avalanche et de l'unité de contrôle de puissance de l'amplificateur à photodétecteur. Tous ont gagné, ce qui a permis de vérifier le fonctionnement du télémètre lui-même. Pour ce faire, j'ai assemblé ses modules sous la forme voulue par les développeurs:

image

Sur la photo, les cinq modules principaux sont assemblés autour du système optique. Ici, au lieu de mon propre miroir rotatif, j'ai installé un miroir ordinaire.

Après cela, j'ai déposé écrit un programme de contrôle laser pour UART, mis en place la photodiode. Du coup, quand j'ai démarré le laser à l'entrée du comparateur, j'ai vraiment pu détecter des impulsions avec un oscilloscope dont l'amplitude dépendait clairement du type d'obstacle devant le miroir! Le comparateur a également bien fonctionné. La dernière partie importante du test est restée - la vérification des performances TDC.

La puce TDC-GPX installée dans le scanner a une conception assez compliquée et peut fonctionner dans un grand nombre de modes.

La figure ci-dessous montre son diagramme structurel:

image

Comme vous pouvez le voir, la puce contient 8 canaux distincts, c'est-à-dire qu'elle peut recevoir jusqu'à 8 signaux d'arrêt. Si les canaux sont différentiels, seuls deux signaux d'arrêt plus un signal de démarrage peuvent être analysés. Dans ce cas, la puce vous permet de combiner les canaux de mesure, augmentant ainsi la précision de mesure des intervalles de temps:

image

Honnêtement, je n'ai pas aimé la documentation de cette puce. Beaucoup de choses y sont décrites de manière plutôt superficielle, les exemples de code sont incompréhensibles. La partie de la fiche consacrée à l'ajustement de la résolution temporelle est remplie d'une sorte de «nombres migratoires». Il n'y a pas non plus de «note d'application» normale sur la puce. De plus, dans le scanner lui-même, je n'ai pas pu détecter la connexion des lignes EF1 / EF1 au contrôleur. C'est à partir de ces lignes que l'on peut déterminer que le microcircuit a fini de mesurer le temps. À cause de tout cela, le démarrage du TDC m'a pris beaucoup de temps, mais en conséquence, tout a fonctionné comme il se doit - lorsque le laser a démarré, le TDC a fonctionné, et les résultats du TDC dépendaient clairement de la distance à l'obstacle. Ainsi, le télémètre laser pulsé a commencé à fonctionner. Il reste à transformer toute la structure en un scanner laser réalisable.

La première étape dont j'avais besoin pour effectuer le réglage - le télémètre assemblé a cessé de "voir" les obstacles après quelques mètres. Le système optique avait l'air intact, mais j'ai dû retirer les cartes du système optique, de sorte que la lumière réfléchie n'était pas précisément focalisée par l'objectif sur le photodétecteur.

Avant l'alignement, j'ai écrit un programme pour le contrôleur, qui non seulement déterminait les distances, mais mesurait également l'amplitude du signal généré par le détecteur de crête à l'aide de l'ADC.

L'ensemble du processus d'ajustement a été réduit à des mouvements fluides du photodétecteur et des cartes laser, et à la recherche de leur position à laquelle l'amplitude du signal est maximale. À la suite de l'ajustement, l'amplitude du signal reçu a été considérablement améliorée.

Ensuite, vous devez prêter attention à certaines caractéristiques du traitement des données inhérentes aux télémètres à impulsions.

Le signal généré par le photodétecteur a une forme analogique. Pour le convertir sous forme numérique, qui est ensuite traitée par le TDC, un comparateur est utilisé, configuré pour commuter si le signal d'entrée dépasse un certain seuil. En conséquence, en raison de la forme complexe du signal d'entrée, lors du changement de l'amplitude du signal, une erreur se produit lors de la détermination des intervalles de temps:

image

Comme le montre le graphique, un signal avec une amplitude inférieure sera détecté avec retard. Pour résoudre ce problème, il existe plusieurs méthodes, à la fois matérielles et logicielles. J'ai décidé d'utiliser l'option la plus simple - la correction des résultats de mesure en fonction de l'amplitude du signal. Dans le même temps, j'ai dû collecter des statistiques sur les changements dans les résultats de mesure du temps des changements dans l'amplitude du signal. Afin de changer l'amplitude du signal sans changer ses autres paramètres, j'ai utilisé des tampons en papier sur la lentille, ce qui a réduit le flux lumineux incident sur la photodiode.

Le résultat a été cette dépendance:

image

Sur la base de cette dépendance, j'ai formé une table de correction, dont les données sont utilisées par le programme du contrôleur pour déterminer la distance à l'objet.

L'étape suivante consiste à démarrer le moteur miroir et l'encodeur.

Plus tôt, j'ai déjà cité une photo d'un miroir:

image

le moteur du miroir est sans balais, très similaire à ceux utilisés dans les ventilateurs plus froids. Trois fils en sortent - 2 d'entre eux sont de l'alimentation, un autre est un signal de vitesse d'impulsion. Tous ces fils sont connectés au module d'interface, tandis que le signal de vitesse généré par le moteur n'est pas utilisé - le contrôle est basé sur les données du codeur.
Comme vous pouvez le voir sur la photo, un disque transparent avec des étiquettes pour l'encodeur est fixé sur l'axe du moteur. Vous pouvez remarquer qu'il y a une marque zéro sur le disque.

L'encodeur était monté sur une petite carte et complètement recouvert d'un écran métallique, de sorte que son marquage ne pouvait pas être déterminé. Cependant, en fonction de sa taille et de son brochage, j'ai décidé qu'il s'agissait d'un encodeur en quadrature HEDS-9040:

image

quatre fils sont passés de la carte d'encodeur au module d'interface, mais il s'est avéré que seuls trois d'entre eux ont été utilisés - deux alimentations et un signal.

Si je comprends bien, des déclencheurs Schmitt et une logique ont été installés sur la carte, combinant les données des canaux A, B et index (signal de marque zéro).

Voici à quoi ressemblent le signal produit par la carte d'encodeur et le signal d'index pris directement de l'encodeur.

image

Comme on peut le voir, pendant le signal d'index, les impulsions du codeur sont supprimées. Il s'est avéré que la carte de l'encodeur a généré 500 impulsions par tour, mais la minuterie du contrôleur T2, à laquelle la ligne de l'encodeur est connectée, peut fonctionner simultanément sur les deux bords des impulsions, ce qui donne 1000 interruptions par tour du miroir. Cette valeur correspond à la résolution angulaire déclarée du scanner à 0,36 degrés.

J'ai réglé la minuterie T2 sur "Mode capture", ce qui me permet de mesurer le temps entre les interruptions de l'encodeur. Le temps obtenu est utilisé pour détecter la position "zéro" du miroir, et pour stabiliser la vitesse de rotation du moteur. Dans le même temps, le nombre d'interruptions est compté, ce qui vous permet de déterminer la position du miroir.

Une fois que l'encodeur a fonctionné et que j'ai réussi à démarrer le contrôle du régime moteur, il a été possible d'assembler complètement le scanner. En raison de la forme complexe des cartes et de l'optique, la conception s'est avérée plutôt élaborée: il n'a pas été facile d'assembler une telle conception - la précision de l'agencement des pièces individuelles est très importante pour le scanner. Si l'axe du miroir ne coïncidait pas avec l'axe optique de la partie télémètre, cela pourrait conduire au fait que le plan de balayage serait fortement incurvé ou incliné.

image

image



Lors de la mesure de la distance exacte aux objets, il est important d'avoir une sorte d'objet «de référence», dont la distance est connue avec précision. Connaissant le "temps de vol", vous pouvez déterminer avec précision le temps correspondant à la distance zéro. En raison des changements de température des composants du scanner, ce temps peut changer, ce temps doit donc être surveillé en permanence. Pour résoudre ce problème, j'ai installé une plaque noircie spéciale dans le scanner:

image

La plaque est noircie afin que la lumière réfléchie ne "aveugle" pas le photodétecteur. À en juger par les instructions, des éléments réfléchissants sombres et lumineux ont également été installés dans la conception originale du scanner. Ils ont été utilisés pour surveiller le fonctionnement de la partie télémètre du scanner, et très probablement, ils ont également été utilisés pour l'étalonnage.

Sur la photo ci-dessus, l'encodeur monté sur la carte est également clairement visible. Il s'est avéré que l'encodeur devait être positionné très précisément par rapport au disque, et il y avait beaucoup de problèmes avec cela - même un petit décalage de l'encodeur entraînait la perte d'impulsions, en particulier celles d'index. Il est possible que le scanner ait cessé de fonctionner après avoir heurté le corps précisément en raison de problèmes avec l'encodeur.

En conséquence, il a été possible d'obtenir une vitesse de balayage allant jusqu'à 20 tours par seconde. Avec une tension APD de 135 V, des distances allant jusqu'à 10 à 15 m sont normalement détectées. À une tension de 145 V et avec un filtrage de signal supplémentaire, il est possible de mesurer des distances jusqu'à 30 m (même si je ne suis pas sûr que ce soit sûr pour un photodétecteur).

Il convient de noter que la vitesse de transmission maximale dans le scanner d'origine est de 115200 bit / s, ce qui vous permet de transférer toutes les données uniquement à une vitesse d'environ 11 tours par seconde.

Comme je l'ai mentionné, dans mon firmware, je transfère des données à une vitesse de 500 kbit / s, ce qui peut augmenter considérablement le nombre de scans transmis par seconde. C'est à cause de la limite de vitesse UART que je n'ai pas augmenté la vitesse de balayage aux 25 tours par seconde d'origine. Je note que dans la conception originale du scanner, les données sont traitées dans le scanner lui-même, de sorte que la faible vitesse de transfert de données n'affecte pas particulièrement quoi que ce soit.

Étant donné que le scanner fonctionne désormais sans boîtier, il a été possible d'augmenter la zone de numérisation à 208 degrés contre 190 dans la conception d'origine.

Visualisation des données reçues du scanner:

image

De toute évidence, le scanner devrait remplir certaines fonctions utiles, j'ai donc décidé de vérifier son fonctionnement dans ROS dans SLAM, et de comparer les résultats avec les résultats d'un scanner laser maison . Pour ce faire, je l'ai installé sur Roomba, sur lequel un scanner fait maison était précédemment installé.

Vue du scanner Leuze installé sur Roomba (le miroir tourne pour qu'il apparaisse flou): À la suite de l'opération hector_slam, nous avons réussi à obtenir une telle carte d'appartement (les murs sont affichés en jaune): Puisque l'aspirateur se déplace au niveau du sol, il `` voit '' principalement les meubles. Mais une telle carte est obtenue si l'aspirateur est simplement porté en main au niveau de la ceinture: dans ce cas, les murs de l'appartement sont «visibles» plus souvent.

image



image





image



Si l'on compare la qualité des cartes, il est clair que les lignes du scanner maison sont plus «bruyantes». Cela est dû au fait qu'avec un scanner maison qui utilise le principe de triangulation de fonctionnement, la précision augmente considérablement avec l'augmentation de la distance.

Malheureusement, malgré la très bonne qualité de numérisation, ce scanner n'est pas adapté à un robot autonome - il a des dimensions et une consommation électrique trop importantes (environ 7,2 W).
Où puis-je utiliser un tel scanner? Plus tôt, lorsque je discutais d'un scanner fait maison, on me posait souvent des questions sur la possibilité de faire un scanner 3D, et il est temps de le faire! Une vitesse de numérisation assez élevée est utile ici. Bien sûr, par résolution, un tel scanner ne peut pas être comparé à des scanners qui utilisent le principe de triangulation de la mesure de distance (avec une ligne laser ou un projecteur (SLS)), mais ils peuvent scanner de grands espaces - locaux, sections de rue.

Afin de refaire un scanner 2D en 3D, vous devez lui fournir la possibilité de tourner le long d'un autre axe. J'ai décidé de faire mon scanner en utilisant le même principe de balayage de faisceau que dans le scanner de cearticles. Pour ce faire, j'ai placé le scanner Leuze «couché» de sorte que son plan de balayage soit perpendiculaire au sol. Ensuite, il était nécessaire de réaliser une rotation lente et en douceur de l'ensemble du scanner autour de l'axe. La principale difficulté - le scanner doit tourner sans battements ni distorsions, ce qui entraînera une distorsion des scans. Comme il s'est avéré, à la maison, il est difficile de fabriquer un ensemble de roulements qui peut fournir une rotation aussi précise. Par conséquent, j'ai décidé d'utiliser la tête VHS du magnétophone comme unité de roulement - elle contient deux roulements, est fabriquée avec une très grande précision et est capable de supporter le poids du scanner. La conception résultante est entraînée par un moteur pas à pas.

Le scanner 3D assemblé ressemble à ceci: Vue du scanner monté sur un trépied:

image



image

Sur la gauche se trouve une batterie 12 V, qui est également un contrepoids. Comme le scanner Leuze nécessite 24 V pour fonctionner, j'ai dû installer un convertisseur DC / DC élévateur assemblé sur la base de la puce XL6009 du scanner. Le moteur pas à pas du scanner est contrôlé par un module sur l'A4988 et l'Arduino, qui permet une rotation à une vitesse donnée. Le scanner Leuze (via l'adaptateur USB-UART) et l'Arduino sont connectés via un concentrateur USB avec un fil à un ordinateur qui capture les données. Dans la forme actuelle, la rotation du miroir du scanner et la rotation de l'ensemble du scanner ne sont pas synchronisées - la vitesse de rotation du scanner est choisie de sorte que lorsqu'il est tourné de 0,36 degrés, le miroir ait le temps de faire au moins trois tours. Comme il n'y a pas de synchronisation de vitesse, j'ai dû transmettre des informations de position de synchronisation de l'Arduino au scanner Leuze.Ceci est mis en œuvre tout simplement - lorsque Arduino fait pivoter le scanner tous les 0,36 degrés, il modifie le niveau du signal sur l'un des terminaux. Ce signal est transmis au module processeur du scanner (au connecteur inutilisé du capteur d'état de la vitre de protection). Des informations sur l'état de ce signal sont transmises au début de chaque envoi de scanner - ainsi le programme auto-écrit pour le PC qui contrôle le scanner reçoit des informations sur le mouvement du scanner et détermine l'angle de rotation.reçoit des informations sur le mouvement du scanner et détermine l'angle de rotation.reçoit des informations sur le mouvement du scanner et détermine l'angle de rotation.

Une seule numérisation 3D générée par le scanner contient environ 350'000 points. Bien sûr, c'est nettement moins que celui des scanners professionnels, mais tout de même assez bon, surtout si vous collez plusieurs scans ensemble.

Un exemple est un scan unique d'une pièce: Un exemple est un scan d'une pièce collée à partir de plusieurs: La partie scannée de l'entrée: Une vidéo montrant les résultats du scanner résultant:

image



image



image





Le code source du programme contrôleur sur Github

Source: https://habr.com/ru/post/fr396357/


All Articles