Ankündigung

Einklappen
Keine Ankündigung bisher.

Entwicklung eines Tastsensors

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Entwicklung eines Tastsensors

    Hallo zusammen,

    Ich habe mich mal damit beschäftigt einen Tastsensor zu entwickeln. Da das TAS-UP1-Touch-BE Projekt von IngDom schon relativ lange kein Update mehr gesehen hat muss/darf ich hier wohl neu anfangen


    Die Hardware für das Projekt habe ich soweit schon mal grundlegend entworfen:

    Der Touch Controller soll ein CAP1188 von Microchip werden. Es werden 4 Touch Flächen (zwei Wippen oder 4 Taster). Wenn die Hardware mitspielt soll es auch eine Näherungsdetektion geben.
    Der CAP1188 hat IO-Ausgänge welche nach Parametrierung des Sensors bei Touch Detektion ein 3.3V Signal ausgeben. Er ist damit eher ein analoges Frontend das zwischen den Touch-Elektroden und dem RP2040 sitzt. Für den RP2040 sieht das im laufenden Betrieb aus wie normale Taster-Buttons
    LED's werden über WS2811 angesteuert. (Die WS2811 im vergleich zu den WS2812B haben den Vorteil, dass LED's nicht integriert sind. Das erlaubt die WS2811 im Prinzip als programmierbare Stromsenken zu benutzen. Das nutze ich um die angeschlossenen LED's dunkler zu fahren, da sonst bei dwenig helligkeit die Farbauflösung massiv abnimmt -> Stichwort Nachtlicht.

    Die ganze Hardware ist wie beim TAS-UP1-Touch-BE auf zwei PCB's aufgeteilt. Ein PCB macht nur den Touch-Part, das Zweite übernimmt die Kommunikation mit dem KNX-Bus und die Spannungsversorgung. Die Pinbelegung habe ich mir von hier https://github.com/OpenKNX/OpenKNX/w...S-UP1-Touch-BE genommen, da sich da ja IngDom anscheinend schon mal Gedanken gemacht hat.

    Eine Herausforderung beim Kapazitiven messen ist in diesem Anwendungsfall, dass man das schwarze KNX-GND Kabel nicht als GND verwenden kann.
    Dieser KNX-GND ist nämlich Verdrosselt und stört damit das kapazitive Sensing. Bei Buskommunikation ändert KNX-GND über die Zeit sein Potential Ich werde hierzu die Gelb/Weiße unverdrosselte Klemme verwenden müssen, da hier über den weißen Draht ein stabiler(er) GND bereitgestellt wird. Die KNX-Kommunikation muss dann optisch entkoppelt sein. Sollte auch die Gelb/Weiße klemme nicht stabil genug sein kann es eventuell sogar nötig sein eine PE-Verbindung herzustellen (aber das hoffe ich definitiv nicht)


    Ich habe mich hierzu schon einige Stunden in die Software eingewühlt, musste allerdings feststellen, dass ich ohne Hilfe wohl nicht weiter komme...

    Folgenden "Schlachtplan" habe ich mir für die Software ausgedacht:

    Schritt 1:
    - Die Firmware für den SEN-UP1-8xTH drauf flashen.
    - Vor jeglicher KNX-Setup (in der Setup()-routine im main.c-file) Routine den CAP1188 per I2C parametrieren, danach den KNX-Stack und alles was kommt "einfach machen lassen"
    - Die Ansteuerung der einzelnen WS2811 LED's in der main.c --> loop() nach openknx.loop() laufen lassen. Kann sein, dass es funktioniert, kann auch nicht funktionieren.
    - Die Firmware muss dann über die ETS natürlich auf die Hardware parametriert werden.

    Schritt 2:
    - den CAP1188 als neuen Sensor in das OFM-THPSensorModule einbinden. Edit: Nope, ein egenes Lokales Hardware modul basteln
    Hier kommt dann auch schon das erste große Hindernis, da ich hier die XML-Dateien für den KNX-Producer ändern muss. Und ich aus dem ganzen XML-Kram einfach nicht schlau werde.
    - den neuen CAP1188 dann als nicht parametrierbaren Sensor an die fest verdahteten I2C Leitungen einprogrammieren, sowie die 4 (bzw. 5 mit Näherungsdetektion) Taster auf "ist fest an diesem pin" verdrahten

    Schritt 3:
    - die WS2811 (Softwaretechnisch werden die genauso angesteuert wie die gängigen WS2812B) irgendwie als Modul einbinden, wobei ich noch keine Ahnung habe wie hier das beste vorgehen ist.

    Schritt 4:
    - Alles über die ETS Parametrierbar machen, also Farbein der LED's, Helligkeiten, eventuell so Sachen wie Sampling-Time oder Sensitivity des CAP1188 parametrierbar machen. Dafür muss ich noch mehr Hardware-Versuche machen um herauszufinden welche Stellschrauben der CAP1188 braucht um in der Praxis zuverlässig zu funktionieren


    Anregungen/Stolpersteine zu den Schritten welche ihr sofort seht?
    Anregungen wie man die Umsetzung der einzelnen Schritte angehen würde?


    Ein paar weitere Fragen:
    Durch welche Doku sollte ich mich noch durchwühlen? Ich habe mir schon das GitHub Wiki zu Gemüte geführt, habe mich schon mit jemanden der noch mehr von C/C++ versteht durch den Code gegraben.

    Welche Toolchain nehmt ihr her für die Änderung der XML-Dateien? Wird das wirklich per Hand editiert? Der OpenKNXproducer ist ja auch "nur" ein Hilfstool welches die XML's checkt und in eine knxprod umwandelt. (Soweit ich das richtig verstanden habe😅)

    Was macht die knxprod.h? Ich verstehe, dass hier die Information liegen muss, welche parameter welche "id" haben, aber wie wird im programmcode drauf zugegriffen? Die defines die ich hier finde, findet man die in den XML-Dateien wieder? Kann ich die defines einfach im programmcode verwenden und die Software im Hintergrund kümmert sich automatisch um das laden und speichern in den flash? Wenn ich einen parameter aus diesem .h File in den XML's suche, dann finde ich diesen Bezeichner nirgends.

    Also generell bin ich noch etwas aufgeschmissen wie der Code die Identifier mit der knxprod "verknüpft"


    Was ist eine BAU/Bus Access Unit und was sind die unterschiedlichen Ausführungen dahinter (zum Beispiel "Bau07B0")? Muss ich mir dazu überhaupt Gedanken machen?


    Ein kleines bisschen Erklärung zu mir noch:
    Ich bin hauptsächlich Hardwareentwickler für alles was irgendwie Analog- und Digitalhardware ist. Mit C/C++ kenne ich mich eigentlich ganz gut aus, allerdings bin ich hier definitiv kein Profi der im "täglichen Gebrauch" programmiert.
    Aufgrund von, sagen wir mal "übermäßigen Enthusiasmus", ist mir in der Arbeit das Aufbauen und Betreuen der kompletten KNX-Haussteuerung zugefallen (~350 KNX Geräte mit allem was ein moderner Neubau halt so hat)
    Dieses Taster-Projekt ist allerdings ein rein privates Projekt für meine Haussteuerung zuhause.

    Anbei noch Bilder von meinem Hardware Konzept (noch nicht fertig)
    image.pngimage.png​​
    Das schematic vom Touch-Board hänge ich ebenfalls mal an, am Interface-Board mit dem RP2040 arbeite ich grade noch.
    So, viel geschrieben ich bin generell immer noch viel verwirrt. Mal sehen was bei rum kommt
    Danke schon mal.
    - cad435
    Angehängte Dateien
    Zuletzt geändert von cad435; 19.03.2025, 21:49.

    #2
    Zitat von cad435 Beitrag anzeigen
    Da das TAS-UP1-Touch-BE Projekt von IngDom schon relativ lange kein Update mehr gesehen hat muss/darf ich hier wohl neu anfangen
    ich hab das mehr der weniger eingestellt, da mir der Aufwand zum Löten des LEDs per Hand und Beschriftung per Aufkleber als wenig zielführend erschienen,, für ein Ergebnis das dann optisch nur mäßig passend ist.

    Zitat von cad435 Beitrag anzeigen
    Eine Herausforderung beim Kapazitiven messen ist in diesem Anwendungsfall, dass man das schwarze KNX-GND Kabel nicht als GND verwenden kann.
    Dieser KNX-GND ist nämlich Verdrosselt und stört damit das kapazitive Sensing. Bei Buskommunikation ändert KNX-GND über die Zeit sein Potential Ich werde hierzu die Gelb/Weiße unverdrosselte Klemme verwenden müssen, da hier über den weißen Draht ein stabiler(er) GND bereitgestellt wird. Die KNX-Kommunikation muss dann optisch entkoppelt sein. Sollte auch die Gelb/Weiße klemme nicht stabil genug sein kann es eventuell sogar nötig sein eine PE-Verbindung herzustellen (aber das hoffe ich definitiv nicht)
    ich glaube, das ist nur ein theoretisches Problem... weder beim TAS-UP1 mit dem china touchcontroller, noch beim Präsenzmelder mit ttp223 hab ich je Probleme gehabt.
    Und Andreas bei seinem FP mit Touchatsten AFAIK ebenfalls nicht.

    Zitat von cad435 Beitrag anzeigen
    - den CAP1188 als neuen Sensor in das OFM-THPSensorModule einbinden.
    ähh besser nicht. Da ist es völlig fehl am Platz.
    Schau dir an wie das mit den Touchtasten beim FP gelöst ist..
    Zitat von cad435 Beitrag anzeigen
    Welche Toolchain nehmt ihr her für die Änderung der XML-Dateien?
    vsc plugin https://github.com/redhat-developer/vscode-xml

    Zitat von cad435 Beitrag anzeigen
    Was macht die knxprod.h?
    stellt dir grob vereinfacht die ganzen Adressen auf der knxprod im Programm zur Verfügung.. die wird automatisch generiert.


    Wie dein fertiges Produkt aussehen soll kann ich mir noch nicht so recht vorstellen, und auch was die vielen LEDs da tun...

    Zitat von cad435 Beitrag anzeigen
    Die WS2811 im vergleich zu den WS2812B haben den Vorteil, dass LED's nicht integriert sind. Das erlaubt die WS2811 im Prinzip als programmierbare Stromsenken zu benutzen.
    verstehe nicht wie du so die Auflösung für die bessere Farbtreue verbessert? Oder meinst du damit nur, dass du die Helligkeit der LED in Summe reduziert?
    Kann man die hier wirklich parallel schalten? Ist dafür die Streung der VF nicht zu groß?
    OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

    Kommentar


      #3
      Zitat von Ing-Dom Beitrag anzeigen
      ich hab das mehr der weniger eingestellt, da mir der Aufwand zum Löten des LEDs per Hand und Beschriftung per Aufkleber als wenig zielführend erschienen,, für ein Ergebnis das dann optisch nur mäßig passend ist
      Absolut verständlich...

      Zitat von Ing-Dom Beitrag anzeigen
      ich glaube, das ist nur ein theoretisches Problem... weder beim TAS-UP1 mit dem china touchcontroller, noch beim Präsenzmelder mit ttp223 hab ich je Probleme gehabt.
      Und Andreas bei seinem FP mit Touchatsten AFAIK ebenfalls nicht.
      Also ich hatte ähnliche Probleme schon sehr real... Auch mit dem TTP223, da sich die relativ komisch verhalten wenn sie kurzzeitig zu viel Kapazität sehen.
      Muss ich ausprobieren, hab ein Dev-Board mit dem CAP1188 rum liegen.

      Zitat von Ing-Dom Beitrag anzeigen
      ähh besser nicht. Da ist es völlig fehl am Platz.
      Schau dir an wie das mit den Touchtasten beim FP gelöst ist.
      Gut, ich schau es mir mal an. Kannst du mir einen link geben was das "FP" ist?

      Edit:
      OK, also das Fingerprint Module hab ich mir angesehen.
      Da ist quasi die Hardware nicht als shared Function-Modul implementiert. Sondern halt als Lokales Modul. Passt.​

      Zitat von Ing-Dom Beitrag anzeigen
      verstehe nicht wie du so die Auflösung für die bessere Farbtreue verbessert? Oder meinst du damit nur, dass du die Helligkeit der LED in Summe reduziert?
      Kann man die hier wirklich parallel schalten? Ist dafür die Streung der VF nicht zu groß?
      Die Streuung der LED's ist in der Praxis egal, da du im Reel eh immer LED's drin hast die aus der selben Batch sind.
      Genau, mit den Parallelwiderständen zwackst du den LED's wen nötig etwas Strom ab, sodass sie insgesamt dunkler werden. Damit kannst du dann wenn du eine Nachtlichtfunktion baust den Wert der WS2811 größer lassen.

      Beispiel: Du möchtest die RGB-Farbe 255/128/16, allerdings sehr dunkel. --> Bei gleichbleibender Farbmischung kannst du jetzt maximal auf 16/8/1 runter dimmen. Ist das jetzt immer noch zu hell und man dimmt weiter runter verschiebt sich die Farbzusammensetzung. Daher habe ich parallelwiderstände vorgesehen, falls es zu hell ist. Muss ich ausprobieren.

      Zitat von Ing-Dom Beitrag anzeigen
      Wie dein fertiges Produkt aussehen soll kann ich mir noch nicht so recht vorstellen, und auch was die vielen LEDs da tun...

      Das ganze soll später erstmal so aussehen, ob es diese Form bleibt weis ich noch nicht. Habe von einem Schalter irgendwo ein Bild gesehen und das mal aus meinem Kopf konstruiert. Weiß aber ehrlich gesagt nicht mehr was und wo das her ist.
      image.png

      Zitat von Ing-Dom Beitrag anzeigen
      stellt dir grob vereinfacht die ganzen Adressen auf der knxprod im Programm zur Verfügung.. die wird automatisch generiert.
      Ja das verstehe ich soweit. Nur alles was danach kommt eben noch nicht


      Gibts irgendwo ne Beschreibung wie die Nodes zusammenhängen? Woher kommen die ganzen %xyz% Parameter innerhalb der xml? Wie werden die aufgelöst?



      Danke, Grüße,
      - cad435
      Zuletzt geändert von cad435; 19.03.2025, 21:47.

      Kommentar


        #4
        Zitat von cad435 Beitrag anzeigen
        Weiß aber ehrlich gesagt nicht mehr was und wo das her ist.
        Basalte fibonacci
        https://www.basalte.be/de/product/fibonacci
        Gruß Bernhard

        Kommentar


          #5
          Waldemar ist dafür bekannt gute, aktuelle und auch sehr ausführliche Doku zu erstellen.
          Du solltest also damit anfangen: https://github.com/OpenKNX/OpenKNXpr...KNXproducer.md

          Mit FP ist der Fingerprint gemeint.

          Die Idee hinter der knxprod ist: du verwendest die Makros (ParamBase_Brightness) und musst im Code keine Zeit verschwenden heraus zu finden wo genau der Parameter liegt, wie groß er ist, ob er verschoben werden muss welche Maske er hat und Konvertierung.
          Du nimmst einfach das Makro und bekommst den Parameter.
          Das Marko wird aus der XML automatisch gebildet.
          Der Name des Parameters findet sich im Makro, und aß zuordnen zu können.
          Außerdem kümmern sich die Makros um die Zuordnung von Channel (also wenn du den gleichen Code öfters hats zb eben 4 mal einen Taster) zum Parameter.

          Gruß Mike
          OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

          Kommentar


            #6
            Zitat von willisurf Beitrag anzeigen
            Uff, da bin ich jetzt platt 😮
            Das werd ich wohl gesehen haben, ist aber auch schon wieder ein paar Monate her.
            Anscheined sogar auch (?) KNX-Fähig, in der ETS6 gibts allerdings von dem Hersteller dieses Produkt nur was mit dem Namen "Auro" und "Sentido", also keine Ahnung.



            Zitat von thewhobox Beitrag anzeigen
            Waldemar ist dafür bekannt gute, aktuelle und auch sehr ausführliche Doku zu erstellen.
            Du solltest also damit anfangen: https://github.com/OpenKNX/OpenKNXpr...KNXproducer.md
            Oh Vielen Dank! über das Dokument bin ich noch nicht drüber gefallen, das zieh ich mir mal rein!

            - cad435

            Kommentar


              #7
              Zitat von cad435 Beitrag anzeigen
              in der ETS6 gibts allerdings von dem Hersteller dieses Produkt nur was mit dem Namen "Auro" und "Sentido",
              Ja, Basalte hat da eine sehr merkwürdige Vertriebsstrategie. Die Geräte und auch die knxprod(!) gibt es nur über lizensierte Händler.
              Gruß Bernhard

              Kommentar


                #8
                Sooo, jetzt habe ich mal ein bisschen rum gespielt.

                Durch das XML-Thema habe ich mich soweit gut durchgewühlt (siehe Screenshots). Einiges verstanden, einiges einfach zusammenkopiert. Der Github-Copilot im VSCode ist dabei erstaunlich hilfreich.
                Die XML Dateien hänge ich mal an, für Verbesserungsvorschläge/Ratschläge bin ich definitiv dankbar.

                image.png
                image.png

                image.png​​​

                Erste Hardware ist auch schon da, meine Eigenbau-CNC hat schon fleißig erste Plexiglas-Teile gefräst.
                Allerdings habe ich bei der Hintergrundbeleuchtung totalen Mist gebaut, das ist aber in der Nächsten Hardware-Version behoben.

                WhatsApp Image 2025-04-18 at 23.26.49.jpg
                Im lokalen Makerspace haben mich einige darauf aufmerksam gemacht, dass Displays eh viel cooler wären als "nur" hinterleuchteter Text. Daher wird die nächste Hardware beides supporten, da ich mir noch nicht sicher bin ob Ich das optisch ansprechend finde...

                Das zweite PCB zum Anschluss des KNX-Busses ist nun ebenfalls fertig.
                image.png
                image.png

                Eine Frage zum KNXProducer hätte ich noch:
                Gibt es eine Möglichkeit Grafiken einzufügen (keine Icons, größere Bilder)? Ich habe zumindest nichts gefunden...

                - cad435
                Angehängte Dateien
                Zuletzt geändert von cad435; 18.04.2025, 22:49.

                Kommentar


                  #9
                  Zitat von cad435 Beitrag anzeigen
                  Die XML Dateien hänge ich mal an, für Verbesserungsvorschläge/Ratschläge bin ich definitiv dankbar.
                  Was ich schon Dir schon mal spontan als Feedback geben kann:
                  prefix="TASUP4xTouchRGB"
                  Bitte auf keinen Fall Ziffern im Prefix verwenden. Das wird sonst bei geplanten Erweiterungen vom ConfigTransfer für Probleme sorgen. Prefix sollte am besten aus 3 Buchstaben bestehen und muß global in der OpenKNX-Welt eindeutig sein. Gibt eine Liste dafür.

                  Zitat von cad435 Beitrag anzeigen
                  Gibt es eine Möglichkeit Grafiken einzufügen (keine Icons, größere Bilder)?
                  Gibt es. Braucht dafür einen eigenen Parameter-Typ. Wird z.B. auf der Basiskonfigurationsseite aller aktuellen OpenKNX-Applikationen verwendet.
                  OpenKNX www.openknx.de | StateEngine: Universelle Zustandsautomaten in KNX | OpenKNX Konfigurationstransfer

                  Kommentar


                    #10
                    Zitat von cad435 Beitrag anzeigen
                    Gibt es eine Möglichkeit Grafiken einzufügen (keine Icons, größere Bilder)? Ich habe zumindest nichts gefunden...
                    Dann hast Du nicht gut geguckt .
                    Unser Common (erster Tab OpenKNX) hat unser OpenKNX-Logo, das ist ein Bild. OGM-Common/src/Common.share.xml.

                    Gruß, Waldemar
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Als Ergänzung zu coco: Präfix bitte nur aus Großbuchstaben. Nur die ersten 10 Zeichen werden ausgewertet. Wir versuchen, den recht kurz zu halten.

                      Gruß, Waldemar
                      OpenKNX www.openknx.de

                      Kommentar


                        #12
                        Zitat von coko Beitrag anzeigen
                        Bitte auf keinen Fall Ziffern im Prefix verwenden. Das wird sonst bei geplanten Erweiterungen vom ConfigTransfer für Probleme sorgen. Prefix sollte am besten aus 3 Buchstaben bestehen und muß global in der OpenKNX-Welt eindeutig sein. Gibt eine Liste dafür.
                        Danke! Ich bin mir sicher ich hab die Liste irgendwo schon mal gesehen... Ich suche nochmal, bin aber da anscheinend nicht mehr drüber gefallen.


                        Zitat von coko Beitrag anzeigen
                        Gibt es. Braucht dafür einen eigenen Parameter-Typ. Wird z.B. auf der Basiskonfigurationsseite aller aktuellen OpenKNX-Applikationen verwendet.
                        Ah ja! Jap, das war eins der Dinge die ich nicht verstanden habe, mit dem Kommentar hat sich das geklärt! Versuche ich, danke!

                        Kommentar


                          #13
                          Zitat von cad435 Beitrag anzeigen
                          Die XML Dateien hänge ich mal an, für Verbesserungsvorschläge/Ratschläge bin ich definitiv dankbar.
                          Zweiter Blick mit detaillierterem Review:
                          • Paramerer-Type: Name sollte mit letztem Teil in der Id übereinstimmen, Du hast hier teilweise sogar schon Duplikate
                          • Bei Text-Parametern musst Du berücksichtigen, dass diese als Null-terminiert erwartet werden. Im Speicherlayout daher noch ein leeres Byte (befüllt mit 0x00) dainter freilassen, ansonsten müsstestDu in der Firmware eine besondere Behandlung für das Fehlen bei Maximallänge vorsehen.
                          • %AID%_P-%TT%00009 und %AID%_P-%TT%00010 überlappen sind
                          • Du verwendest Kanal-Nummern %C% außerhalb von Kanälen
                          • DPT16 KOs benötigen 14 Bytes Größe. Eine Beschränkung der Text-Länge müsstest Du in der Firmware vornehmen, ggf. in Abhängig von geeigneten Konfigurationen zum Verhalten
                          • Für den Konfigurationsblock solltest Du noch einen eindeutigere Benennung finden (ohne Config) und ein eindeutige Icons. Auf der obersten Ebene sollten diese ebenfalls eindeutig sein.
                          Weitere Fragen/Anregungen:
                          • %AID%_PT-LEDColors: Was für eine Codierung verwendest Du da? Farbwinkel in 8Bit? Wäre eine freie Farbwahl möglich ist von Hardware-Seite und Du diese erlauben willst, dann würde ich empfehlen die Auswahl für externes KO abzutrennen.
                          • %AID%_PT-DisplayContentText: 16Bit deutlich zu groß
                          • %AID%_PT-DisplayContentPict: 16Bit deutlich zu groß
                          • %AID%_PT-DisplayContentPict: Sind das extern vorgegebene Werte?
                          • %AID%_PT-CAPSensitivity: Warum so herum codiert? Könnte auch kleiner sein
                          • Typo in DisplayPcitRight_%C%
                          • Gibt es einen besonderen Grund warum Du keine Unions für die Parameter-Definition verwendest? Du hast zwar aktuell keine überlappenden alternativen Parameter, die Erfahrung hat jedoch gezeigt dass Du mit deren Einsatz flexibler bist, u.A. mit Blick auf wiederholende Strukturen.
                          • <when test="0"> <!-- Do Nothing --> </when> - leere Fälle solltest Du im XML weglassen
                          Spontane Idee zur Benennung:Touch-Taster mit Optionalen Displays (Prefix TTD), wobei es toll wäre wenn wir damit dann beliebig viele Tastenpaare (habe das von Hardware-Seite nicht weiter geprüft) mit einem optionalen Display abbilden könnten. Das ist über Channels recht einfach möglich.
                          OpenKNX www.openknx.de | StateEngine: Universelle Zustandsautomaten in KNX | OpenKNX Konfigurationstransfer

                          Kommentar


                            #14
                            Zitat von willisurf Beitrag anzeigen
                            Die Geräte und auch die knxprod(!) gibt es nur über lizensierte Händler.
                            Stimmt nicht ganz

                            Aber interessantes Projekt was ich weiterlesen werde.

                            Schöne Ostern
                            Punk ist nicht tot, Punk macht jetzt KNX

                            Kommentar


                              #15
                              Zitat von willisurf Beitrag anzeigen
                              Ja, Basalte hat da eine sehr merkwürdige Vertriebsstrategie. Die Geräte und auch die knxprod(!) gibt es nur über lizensierte Händler.
                              Warum eigentlich?

                              Kommentar

                              Lädt...
                              X