Thông báo

Collapse
No announcement yet.

Cảm biến dò line chỉnh bằng nút nhấn,???

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Cảm biến dò line chỉnh bằng nút nhấn,???

    tình hình là trong vòng chung kết RBC 2011 tại đà nẵg,thấy một vài đội tuyển trong đó có Lạc Hồng,vẩn sữ dụng cảm biến bằng quang trở,nhận vạch trắng như mọi năm,nhưng có điều là cách điều chình độ nhạy của cảm biến thì khác hẵn,tức là không như thường là dùng vi trở để chỉnh,mà dùng các nút nhấn ngay trên mạch và điều chỉnh,như ấn Volum,khi nào chuẩn thì thôi,
    Không biêt có bác nào đã nghiên cứu cái này chưa thì bày em với,sch+pcb thì quá tôt,Thank!!!!????

  • #2
    Dùng nút nhấn để chỉnh bằng phần mềm ,coi dải bắt đc mới bắt đc làm 0 hoặc 1 ( mỗi cảm biến có 1 ADC khác nhau )
    Chuyên cung cấp inverter dạng sin chuẩn
    Email :

    Comment


    • #3
      Bọn mình hay gọi là học sân thi đấu


      Add: 97 Quán Nam - Lê Chân - Hải Phòng.
      Tel: 031 518648 Phone: 0904 283 505

      Comment


      • #4
        Pac nào biết về vấn đề này thì phân tích kỹ tí đi, cái này hay đấy.
        Cuộc đời như bánh omi, không biết rồi sẽ về đâu?

        Comment


        • #5
          Giả sử mình có 8bit ADC từ 0-255.
          Coi như là vạch trắng(1) là 100 , màu xanh(0) là 150 đi . Chẳng may 1 chú cho giá trị là 150 vạch trắng ,200 màu xanh ( coi như là nó tuyên tính) .
          Có 2 cách là chỉnh lại cảm biến cho nó về mức cũ (phần cứng) ,2 là chuyển riêng nó riêng ra coi vạch trắng là 150 (1) và màu xanh 200(0) -> dùng phần mềm
          Chuyên cung cấp inverter dạng sin chuẩn
          Email :

          Comment


          • #6
            Nguyên văn bởi ngchien Xem bài viết
            Giả sử mình có 8bit ADC từ 0-255.
            Coi như là vạch trắng(1) là 100 , màu xanh(0) là 150 đi . Chẳng may 1 chú cho giá trị là 150 vạch trắng ,200 màu xanh ( coi như là nó tuyên tính) .
            Có 2 cách là chỉnh lại cảm biến cho nó về mức cũ (phần cứng) ,2 là chuyển riêng nó riêng ra coi vạch trắng là 150 (1) và màu xanh 200(0) -> dùng phần mềm
            chuẩn này
            Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
            Gmail: -Mobile: 0989.194.472

            Comment


            • #7
              Nguyên văn bởi hoangdieupro Xem bài viết
              tình hình là trong vòng chung kết RBC 2011 tại đà nẵg,thấy một vài đội tuyển trong đó có Lạc Hồng,vẩn sữ dụng cảm biến bằng quang trở,nhận vạch trắng như mọi năm,nhưng có điều là cách điều chình độ nhạy của cảm biến thì khác hẵn,tức là không như thường là dùng vi trở để chỉnh,mà dùng các nút nhấn ngay trên mạch và điều chỉnh,như ấn Volum,khi nào chuẩn thì thôi,
              Không biêt có bác nào đã nghiên cứu cái này chưa thì bày em với,sch+pcb thì quá tôt,Thank!!!!????
              the0 em thì, khi dùng vi trở để chỉnh là kiểu xưa ( dùng OA để so sánh điện áp, cái vài cái biến trở màu xanh xanh ý :d ) chưa dùng đến ADC, khi dùng đến ADC thì mỗi kênh tuơng ứng với mỗi tín hiệu vào từ quang trở đến VDK, hệ số ADC 8bit: 0-255, ứng với mỗi màu ở 1 điều kiện nhất định ( AS, điện trở,..) cho ta một giá trị. Chúng ta thường phải test trong sân trước khi thi đấu để lấy giá trị ADC chuẩn với màu đó . Mỗi sân có một chút khác nhau về màu sắc chẳng hạn ( cũng là đỏ nhưng đậm hoặc sáng hơn,...) thì sẽ sảy ra "sai số" nên cần điều chỉnh giá trị cho phù hợp theo từng sân. Để thuận tiện, không phải nạp lại ch0 chip, ta sẽ dùng phím nhấn để điều chỉnh sẽ linh động ,tiết kiệm thời gian, hiểu quả hơn rất nhiều ( không biết em hiểu thế có đugns không các bác ^^)
              Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
              Gmail: -Mobile: 0989.194.472

              Comment


              • #8
                không biết có bác nào nghiên cứu cái SCH chuẩn ko cần chỉnh chưa để Code như các bác đã nói không biết,tình hình là năm nào cũng chổng mông lên trời mà chỉnh cảm biến,ma mắt thường ,tay chân run rẩy,có chuẩn đâu.
                Hôm qua đi xem RBC11 tại nhà thi đấu tổ chim,keke,thấy LH catus,B7 chạy như rồng,LOY 80-100s,chuẩn ko cần chỉnh,bấm là chạy.công nghệ thì PID,siêu âm,vật thể...Nói chung thấy nó chạy vậy cũng ngán

                Comment


                • #9
                  chỉ cần 1 nút ấn là đủ_Học lần lược từng cảm biến. Chỉ cần học 1 vạch trắng là đủ_các màu khác coi là nền.


                  Add: 97 Quán Nam - Lê Chân - Hải Phòng.
                  Tel: 031 518648 Phone: 0904 283 505

                  Comment


                  • #10
                    Nguyên văn bởi hoangdai Xem bài viết
                    chỉ cần 1 nút ấn là đủ_Học lần lược từng cảm biến. Chỉ cần học 1 vạch trắng là đủ_các màu khác coi là nền.
                    Cách làm ntn u?

                    Comment


                    • #11
                      đây là cảm sơ đồ nguyên lí cảm biến học màu mà SPK-KNIGHT đã dùng năm 2009.

                      [IMG][/IMG]
                      |

                      Comment


                      • #12
                        Nguyên văn bởi cnc11 Xem bài viết
                        đây là cảm sơ đồ nguyên lí cảm biến học màu mà SPK-KNIGHT đã dùng năm 2009.

                        [IMG][/IMG]
                        thank bác nhiều nghe,mà nguyên tắc hoạt động,rồi code nữa.và chế độ báo mắt đọc và công tắc hành trình hư nữa?
                        Last edited by hoangdieupro; 12-05-2011, 08:55.

                        Comment


                        • #13
                          Ai cho cái nguyên lý hoạt động với cái code của mạch này đi,mình chưa rõ lắm về vấn đề này.
                          Nhận làm mạch, ĐAMH sử dụng vđk Pic & AVR tại tp.HCM
                          Liên hệ sđt: 0902.808.371

                          Comment


                          • #14
                            Dùng lập trình ADC lập trình cho toàn bộ cảm biến đầu vào với ngưỡng chung nhất định cho vạch trắng. Điều chỉnh ngưỡng phụ thuộc vào chân so sánh điện áp của vi điều khiển. Chân này đươc đầu thông qua 1 biến trở. Biến trở này dùng cho việc học sân.
                            Khi vào sân nếu thông số có sai lệch thì chỉ việc chỉnh 1 biến trở duy nhất.
                            Đây là code mình viết năm 2008 cho ATmega16L. Dùng tương đối tốt, các bạn có thể tham khảo.
                            Thân ái.
                            Code:
                            /*****************************************************
                            This program was produced by the
                            Nguyen The Manh Lop D_TDH 15A2
                            Truong DH Kinh te ky thuat cong nghiep
                            
                            Project : 
                            Version : 
                            Date    : 1/13/2008
                            Author  : F4CG                            
                            Company : F4CG                            
                            Comments: 
                            
                            
                            Chip type           : ATmega16
                            Program type        : Application
                            Clock frequency     : 4.000000 MHz
                            Memory model        : Small
                            External SRAM size  : 0
                            Data Stack size     : 256
                            *****************************************************/
                            
                            #include <mega16.h>
                            
                            // Alphanumeric LCD Module functions
                            #asm
                               .equ __lcd_port=0x15 ;PORTC
                            #endasm
                            #include <lcd.h>
                            #include <math.h>
                            #include <delay.h>
                            bit bien_lcd=0;
                            #define FIRST_ADC_INPUT 0
                            #define LAST_ADC_INPUT 7
                            #define button0 PIND.0
                            #define button1 PIND.1
                            unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
                            #define ADC_VREF_TYPE 0x20
                            
                            // ADC interrupt service routine
                            // with auto input scanning
                            interrupt [ADC_INT] void adc_isr(void)
                            {
                            register static unsigned char input_index=0;
                            // Read the 8 most significant bits
                            // of the AD conversion result
                            adc_data[input_index]=ADCH;
                            // Select next ADC input
                            if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
                               input_index=0;
                            ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
                            // Delay needed for the stabilization of the ADC input voltage
                            delay_us(10);
                            // Start the AD conversion
                            ADCSRA|=0x40;
                            }
                            interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                            { 
                                  if  ( button0==0 ){SPH=0;SPL=0;}
                                  if  ( button1==0 ){bien_lcd=1;}
                            // Place your code here
                            
                            }
                            // Declare your global variables here 
                            
                            
                            //======================================================================
                            void lcd_putnum(unsigned char so,unsigned char x,unsigned char y)
                            {
                                    unsigned char a,b,c;
                                    a=so/100;				// lay fan tram
                                    b=(so-100*a)/10;		// lay fan chuc
                                    c=(so-100*a-10*b); 	// lay hang don vi       
                                    lcd_gotoxy(x,y);		// ve vi tri x,y	
                                    lcd_putchar(a+48);		// day ra hang tram, ma ascii
                                    lcd_putchar(b+48); 		// day ra hang chuc, ma ascii	
                                    lcd_putchar(c+48); 		// day ra hang don vi, ma ascii               
                            }
                            //=======================================================================
                            unsigned int sensor[8],checkSensor[8],bienTG;
                            unsigned char a,b,c,x,y,n,tong,checkSUM,ngatu;
                            unsigned int bienphu;
                            unsigned int trungbinh;
                            void main(void)
                            {
                            // Declare your local variables here
                            
                            // Input/Output Ports initialization
                            // Port A initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                            PORTA=0x00;
                            DDRA=0x00;
                            
                            // Port B initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                            PORTB=0xff;
                            DDRB=0xff;
                            
                            // Port C initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                            PORTC=0x00;
                            DDRC=0x00;
                            
                            // Port D initialization
                            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                            PORTD=0xff;
                            DDRD=0b00010000; //PORD.4 = out
                            
                            // Timer/Counter 0 initialization
                            // Clock source: System Clock
                            // Clock value: Timer 0 Stopped
                            // Mode: Normal top=FFh
                            // OC0 output: Disconnected
                            TCCR0=0x02;
                            TCNT0=0x00;
                            OCR0=0x00;
                            
                            
                            // Timer/Counter 1 initialization
                            // Clock source: System Clock
                            // Clock value: Timer 1 Stopped
                            // Mode: Normal top=FFFFh
                            // OC1A output: Discon.
                            // OC1B output: Discon.
                            // Noise Canceler: Off
                            // Input Capture on Falling Edge
                            // Timer 1 Overflow Interrupt: Off
                            // Input Capture Interrupt: Off
                            // Compare A Match Interrupt: Off
                            // Compare B Match Interrupt: Off
                            TCCR1A=0x00;
                            TCCR1B=0x00;
                            TCNT1H=0x00;
                            TCNT1L=0x00;
                            ICR1H=0x00;
                            ICR1L=0x00;
                            OCR1AH=0x00;
                            OCR1AL=0x00;
                            OCR1BH=0x00;
                            OCR1BL=0x00;
                            
                            // Timer/Counter 2 initialization
                            // Clock source: System Clock
                            // Clock value: Timer 2 Stopped
                            // Mode: Normal top=FFh
                            // OC2 output: Disconnected
                            ASSR=0x00;
                            TCCR2=0x00;
                            TCNT2=0x00;
                            OCR2=0x00;
                            
                            // External Interrupt(s) initialization
                            // INT0: Off
                            // INT1: Off
                            // INT2: Off
                            MCUCR=0x00;
                            MCUCSR=0x00;
                            
                            // Timer(s)/Counter(s) Interrupt(s) initialization
                            TIMSK=0x01;
                            
                            // Analog Comparator initialization
                            // Analog Comparator: Off
                            // Analog Comparator Input Capture by Timer/Counter 1: Off
                            ACSR=0x80;
                            SFIOR=0x00;
                            
                            // ADC initialization
                            // ADC Clock frequency: 1000.000 kHz
                            // ADC Voltage Reference: AREF pin
                            // ADC Auto Trigger Source: None
                            // Only the 8 most significant bits of
                            // the AD conversion result are used
                            ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
                            ADCSRA=0xCA;
                            // LCD module initialization
                            lcd_init(16);
                            
                            // Global enable interrupts
                            #asm("sei")
                            b=1;
                            n=5;// so lan quet
                            // lay gia tri dau tien tu ADC
                            
                            while (1)
                                  { 
                                  //};
                                   //buoc1: nhan gia tri ADC - mang du lieu adc_data
                                   //       hien thi ra LCD
                                   //buoc2: quet n lan luu vao Mang khac
                                   //buoc3: tinh gia tri trung binh tren 1 mat
                                   //buoc4: so sanh gia tri trung binh 1 mat voi khoang gia tri dinh truoc
                                   //buoc5: dua ra PORTB 
                                  
                                  /*
                                   while (a<8)
                                    {
                                            bienphu = adc_data[a];
                                            lcd_putnum(bienphu,x,y);        
                                            a++;
                                            x=x+4;                                         //Khoa chan lai khong cho hien thi LCD .
                                            if (x==16) { x=0;y=1;}
                                    }; 
                                    a=0;
                                    x=0;
                                    y=0;
                                    */
                                   //-----------------------------------------------------
                                   // luu du lieu tu ADC vao bien Sensor - Quet n lan 
                                   while (x<=5)         // n=5
                                    {      while (y<8)
                                            {
                                                    sensor[y] = sensor[y] + adc_data[y];
                                                    y++;
                                            };
                                            y=0;
                                            x++;
                                    };
                                     x=0;         
                                     y=0;
                                    //--------------- Tinh trung binh gia tri sensor ---------------
                            
                                    while (x<8)
                                     { 
                                            sensor[x] = sensor[x] / 5;        // n so lan quet     // n=5            
                                            x++;
                                            // neu lan sau gia tri thay doi khac 2 dv thi cap nhat gia tri moi
                                            //switch (sensor[x])
                                            //{
                                            //  case 19: {sensor[x]=20; break ;}
                                            //  case 41: {sensor[x]=40; break ;}
                                            //} 
                                            if (abs(sensor[x] - checkSensor[x]) > 2 ) 
                                              {sensor[x]=sensor[x];
                                              checkSensor[x]=sensor[x];}
                                            else
                                              sensor[x]=checkSensor[x];
                                     };
                                     x=0;   
                                    
                                    //---------------------------------------------------
                                  /*
                                    while (x<8)
                                     { 
                                        if ((20 <= sensor[x]) &  (sensor[x] <=40))
                                            sensor[x]=0;
                                        else              
                                            sensor[x]=1;                                         // Phan xuat sang PORT B
                                     x++;
                                     };
                                     x = 0;
                                   */
                                     
                                     while (a<8)
                                      {
                                            bienphu = sensor[a];
                                            if (bien_lcd==1) lcd_putnum(bienphu,x,y);        
                                            a++;
                                            x=x+4;
                                            if (x==16) { x=0;y=1;}
                                      }; 
                                    a=0;
                                    x=0;
                                    y=0;
                                     // ********** DUA GIA TRI DA DUOC XU LY CUA SENSOR *** UMI *********
                                     if ((137<=sensor[0]) & (sensor[0]<=250))    //100     // 17 - 45
                                            sensor[0]=0;
                                     else   sensor[0]=1;
                                        /////////////////
                                     if ((127<=sensor[1]) & (sensor[1]<=250))    //90     // 15 - 40
                                            sensor[1]=0;
                                     else   sensor[1]=1;
                                        ////////////////////
                                     if ((116<=sensor[2]) & (sensor[2]<=250))   //66      // 28 - 50
                                            sensor[2]=0;
                                     else   sensor[2]=1;
                                        ///////////////////
                                     if ((112<=sensor[3]) & (sensor[3]<=250))   //130      // 17 - 45
                                            sensor[3]=0;
                                     else   sensor[3]=1;
                                        //////////////////
                                     if ((110<=sensor[4]) & (sensor[4]<=250))   //72      // 18 - 45
                                            sensor[4]=0;
                                     else   sensor[4]=1;
                                         ///////////////////                        // 25 - 50
                                     if ((141<=sensor[5]) & (sensor[5]<=250)) //150
                                            sensor[5]=0;
                                     else   sensor[5]=1;
                                         //////////////////
                                     if ((156<=sensor[6]) & (sensor[6]<=250))  //33      // 18 - 40
                                            sensor[6]=0;
                                     else   sensor[6]=1; 
                                     
                                     if ((70<=sensor[7]) & (sensor[7]<=250))  //42
                                            sensor[7]=0;
                                     else   sensor[7]=1;
                                         /////////////////////
                                               
                                     //----------------- Kiem tra nga tu ---------------
                                      tong = sensor[0] + sensor[1] + sensor[2] + sensor[3] + sensor[4] + sensor[5] ;
                                      if ( tong <= 2 )      // 4
                                        {PORTD.4=0;PORTB=0B11000000;checkSUM = 0;ngatu = 0;b=0;}     // 10000000
                                        // ngay 23 - 02 - 2009
                                        // them 2 dong lenh
                                        // bao co vach bang bit PORTD.4=0;
                                      else
                                          {                
                                          checkSUM = 0; 
                                          ngatu = 0;
                                          b=1;
                                          PORTD.4=1;
                                          } 
                                     // ---------------dua ra PORTB---------------
                                     if    (b)
                                            { 
                                              PORTB.0 = sensor[0];
                                              PORTB.1 = sensor[1];
                                              PORTB.2 = sensor[2];
                                              PORTB.3 = sensor[3];
                                              PORTB.4 = sensor[4];
                                              PORTB.5 = sensor[5];
                                              PORTB.6 = sensor[6];
                                              PORTB.7 = sensor[7];
                                           } 
                              } 
                                   
                                  
                                  
                            }

                            Comment


                            • #15
                              Các bạn có thể dùng mạch OP với hskd phù hợp. Sau đó đưa vào ADC. Mỗi màu là một mức ADC, cái này bạn đem lên sân để nhận biết. Như vậy bạn có thể đọc được rất nhiều màu đường

                              Comment

                              Về tác giả

                              Collapse

                              hoangdieupro Tìm hiểu thêm về hoangdieupro

                              Bài viết mới nhất

                              Collapse

                              • mèomướp
                                Trả lời cho Công thức điện tử
                                bởi mèomướp
                                Dạ thời thế giờ thay đổi theo hướng tích cực hơn rồi chú trung sĩ ạ. Kiến thức được chia sẻ ngày càng nhìu nên làm ăn gian dối ko còn dễ dàng như trước đâu ạ. Những thợ nhỏ rồi sẽ thành công nhân sản xuất đồ mới hết thay vì sửa chữa lặt vặt...
                                Hôm qua, 21:21
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ cùng chuẩn tín hiệu thì chắc chắn là nhận ạ. Vì bản chất oled hay lcd thì đều phải có mạch chuyển đổi trên thanh gỗ rồi chuyển sang những chip xử lý hàng nghìn chân gắn trên những tab mỏng dính rồi mới ra các điểm ảnh theo hàng...
                                Hôm qua, 20:31
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                Ok , thanks bác đã chỉ...
                                Hôm qua, 15:06
                              • nguyendinhvan
                                Công thức điện tử
                                bởi nguyendinhvan
                                Sau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !

                                Chập thì thay. Cháy thì tháo
                                Làm thì láo. Báo thì hay
                                May thì khoe. Rủi thì bỏ
                                Thành tích nhỏ. Báo thành to
                                Làm cho có. Báo chi li
                                Sai cả li. Báo
                                ...
                                Hôm qua, 00:35
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                có chắc ko b, màn lcd phải có cao áp mới sáng, màn led thì ko có, ko có cáp chuyển đổi thì lắp thế nào đc ??...
                                25-11-2024, 22:31
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
                                25-11-2024, 22:14
                              • bactho
                                Trả lời cho Tự làm máy đo Cuộn cảm
                                bởi bactho
                                Hay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
                                25-11-2024, 21:48
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                màn của mình là LCD , giờ m muốn mua màn LED để thay thế (ko muốn dùng màn LCD nữa) , lên muốn hỏi xem có cáp chuyển đổi nào có thể cắm đc màn LED vào ko , tất nhiên phải có cùng số chân pin với màn cũ rồi . VD: màn cũ là lcd mỏng , 40 pin...
                                25-11-2024, 21:43
                              • bactho
                                Trả lời cho các bạn giúp mình về file HEX với!!!
                                bởi bactho
                                Bạn vào trang phuclanshop.com ,tìm đến góc kỹ thuật. Tác giả vương khánh hưng nói rất rõ về điều bạn tìm...
                                25-11-2024, 21:21
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ màn hình lcd đều có thể lai cấy cho nhau được hết ạ. Các loại cáp, bo mạch chuyển đổi lvds rất nhìu, với dòng sony còn phải nhổ cả chip nhớ của main cũ đưa lên gỗ thì mới lắp sang máy khác đc, chưa kể các bệnh về màu... ngay cả...
                                25-11-2024, 20:43
                              Đang tải...
                              X