1. Chú ý: Các bạn nên tham khảo Nội quy trước khi viết bài (click vào liên kết bên dưới).
    * Nội quy và Thông báo diễn đàn CNCProVN.com
    * Nếu bạn thấy hứng thú với bài viết. Hãy dùng chức năng Share to facebook để chia sẻ bài viết lên facebook.

          
Kết quả 1 đến 5 của 5

Chủ đề: Giúp đỡ lập trình Aduino thành Gamepad

  1. #1
    Học việc
    Ngày tham gia
    Jan 2017
    Bài viết
    3
    Cám ơn
    0
    Được cám ơn 0 lần
           ở 0 bài viết

    Giúp đỡ lập trình Aduino thành Gamepad

    Mình không rành về code Aduino. Mình có làm 1 gamepad từ Aduino theo hướng dẫn bên vnsimulator.

    Link bài hướng dẫn: https://vnsimulator.com/threads/che-...rduino-r3.434/

    Khi kết nối Aduino với máy tính, lúc này đã nhận như là 1 gamepad, test gamepad thì con trỏ nhảy loạn xạ. Ai có rảnh kiểm tra giùm mình xem sai ở đâu với

  2. #2
    Học việc
    Ngày tham gia
    Jan 2017
    Bài viết
    3
    Cám ơn
    0
    Được cám ơn 0 lần
           ở 0 bài viết
    Phần code đây mọi người

    Mã:
    //Dùng board Arduino Uno r3 làm mạch gamepad, để chế bộ volant cho các game mô phỏng lái xe 
    //Trong đó volant được mô phỏng bằng encoder, nối kênh A vào chân 2, kênh B vào chân 3
    //Các Pedal được mô phỏng bằng chiếc áp, nối chân giữa chiếc áp vào các chân A0-A2 (được 3 pedal)
    //Các phím bấm gamepad được nối vào các chân từ 4 đến 12 và A3, A5 (được 12 phím).
    //Chân 0, 1 dành cho giao tiếp UART; 
    //Chân 2 chạy ngắt ngoài sườn âm, nối với kênh A để đếm xung, đo tốc độ encoder; 
    //Chân 3 nối kênh B, xèt chiều quay encoder
    //Nếu độ phân giải encoder khác 20 xung/vòng thì sửa giá trị phân giải tại dòng lệnh int n = 20;
    
    #include "UnoJoy.h"
    const int encoderA = 2;  //Chân 2 nối vào kênh A encoder, đếm xung encoder
    const int encoderB = 3;  //Chân 3 nối vào kênh B encoder, kiểm tra mức xung B
    volatile int Pulse0 = 0;  //Biến đếm xung  
    volatile int Pulse = 0;   //biến đếm xung quy đổi
    
    int n = 20; //độ phân giải encoder (số xung/vòng), nếu encoder có độ phải khác 20 xung thì sửa lại thông số này.
    int m, k; //hệ số quy đổi số xung
    
    void setup(){
      setupPins();
      setupUnoJoy();
      m = (int)(255/(2.5*n));   
      k = (int)(1.25*n); 
    }
      
    void loop(){
      // Always be getting fresh data
      dataForController_t controllerData = getControllerData();
      setControllerData(controllerData);
    }
    
    void Gocquay(){          
          if (digitalRead(encoderB)) Pulse0++; 
          else Pulse0--; 		
        if (Pulse0 > k) Pulse0 = k;
        if (Pulse0 < -k) Pulse0 = -k;   
        Pulse = m*Pulse0 + 128; 
    }
    
    void setupPins(void){
      // Set all the digital pins as inputs
      // with the pull-up enabled, except for the 
      // two serial line pins
      for (int i = 2; i <= 12; i++){
        pinMode(i, INPUT_PULLUP);
    }
      
      pinMode(A3, INPUT_PULLUP);
      pinMode(A4, INPUT_PULLUP);
      pinMode(A5, INPUT_PULLUP);
      attachInterrupt(0, Gocquay, FALLING); 
     }
    
    dataForController_t getControllerData(void){
      
      // Set up a place for our controller data
      //  Use the getBlankDataForController() function, since
      //  just declaring a fresh dataForController_t tends
      //  to get you one filled with junk from other, random
      //  values that were in those memory locations before
      dataForController_t controllerData = getBlankDataForController();
      // Since our buttons are all held high and
      //  pulled low when pressed, we use the "!"
      //  operator to invert the readings from the pins
    //  controllerData.triangleOn = !digitalRead(2);
    //  controllerData.circleOn = !digitalRead(3);
      controllerData.squareOn = !digitalRead(4);
      controllerData.crossOn = !digitalRead(5);
      controllerData.dpadUpOn = !digitalRead(6);
      controllerData.dpadDownOn = !digitalRead(7);
      controllerData.dpadLeftOn = !digitalRead(8);
      controllerData.dpadRightOn = !digitalRead(9);
      controllerData.l1On = !digitalRead(10);
      controllerData.r1On = !digitalRead(11);
      controllerData.selectOn = !digitalRead(12);
      controllerData.circleOn = !digitalRead(A3);
      controllerData.startOn = !digitalRead(A4);
      controllerData.homeOn = !digitalRead(A5);
      
      // Set the analog sticks
      //  Since analogRead(pin) returns a 10 bit value,
      //  we need to perform a bit shift operation to
      //  lose the 2 least significant bits and get an
      //  8 bit number that we can use  
      controllerData.leftStickX = Pulse; //Đọc góc quay volant encoder, thay cho chiếc áp
      controllerData.leftStickY = analogRead(A0) >> 2; 
      controllerData.rightStickX = analogRead(A1) >> 2;
      controllerData.rightStickY = analogRead(A2) >> 2; 
    
       // And return the data!
      return controllerData;
    }

  3. #3
    Thợ bậc 6 CKD's Avatar
    Ngày tham gia
    Nov 2013
    Bài viết
    6,680
    Cám ơn
    1,733
    Được cám ơn 5,321 lần
           ở 2,595 bài viết
    Mình chưa làm ứng dụng này bao giờ, nên để trị đúng bệnh thì e khó.
    Cũng không rỏ bác chủ đã làm & kết nối bên ngoài thế nào, nên cũng không biết được phần kết nối có ảnh hưởng gì.

    Theo cá nhân, đọc & hiểu một phần code thì thấy có rất nhiều input, cả digital & analog. Digital nó có nhảy loạn hay không thì thông tin của bác chủ vẫn chưa xác định được.
    Nhưng thấy có 4 cái input analog, nếu các input này không có lowpass filter (đơn giản chỉ là cái tụ & trở) thì tín hiệu analog đầu vào có thể có can nhiểu, và tất nhiên là trên màn theo dõi Joy sẽ nhảy loạn trong một biên độ nào đó. Thường là nhỏ.

    Còn nhảy loạn xạ trên toàn biên độ thì chịu phép. Mình không hình dung hết được lý do.
    DT: O7837277II - CKD's Youtube Channel - Facebook - Tổng hợp chủ đề
    17 ds 3, Thạnh Mỹ Lợi, Q2, tp.HCM

  4. #4
    Học việc
    Ngày tham gia
    Jan 2017
    Bài viết
    3
    Cám ơn
    0
    Được cám ơn 0 lần
           ở 0 bài viết
    Trích dẫn Gửi bởi CKD Xem bài viết
    Mình chưa làm ứng dụng này bao giờ, nên để trị đúng bệnh thì e khó.
    Cũng không rỏ bác chủ đã làm & kết nối bên ngoài thế nào, nên cũng không biết được phần kết nối có ảnh hưởng gì.

    Theo cá nhân, đọc & hiểu một phần code thì thấy có rất nhiều input, cả digital & analog. Digital nó có nhảy loạn hay không thì thông tin của bác chủ vẫn chưa xác định được.
    Nhưng thấy có 4 cái input analog, nếu các input này không có lowpass filter (đơn giản chỉ là cái tụ & trở) thì tín hiệu analog đầu vào có thể có can nhiểu, và tất nhiên là trên màn theo dõi Joy sẽ nhảy loạn trong một biên độ nào đó. Thường là nhỏ.

    Còn nhảy loạn xạ trên toàn biên độ thì chịu phép. Mình không hình dung hết được lý do.
    Cái này mình chưa gắn bất cứ cái gì lên Arduino. Mình mới nạp code thôi. Có video lỗi đây

  5. #5
    Thợ bậc 6 CKD's Avatar
    Ngày tham gia
    Nov 2013
    Bài viết
    6,680
    Cám ơn
    1,733
    Được cám ơn 5,321 lần
           ở 2,595 bài viết
    Không xem được video.
    Mà đọc analog, chưa kết nối gì thì chân analog toàn noise, vậy nó nhảy loạn xạ có gì là lạ?
    DT: O7837277II - CKD's Youtube Channel - Facebook - Tổng hợp chủ đề
    17 ds 3, Thạnh Mỹ Lợi, Q2, tp.HCM

Các Chủ đề tương tự

  1. Tìm giúp nơi học lập trình và vận hanh máy phay cnc tại đà nẵng
    Bởi Cuong Anh Nguyen trong diễn đàn Các loại máy CNC khác
    Trả lời: 0
    Bài viết cuối: 08-09-2016, 09:14:39 PM
  2. Cần giúp đỡ chuyển máy Cnc plastma loại 1 ray thành 2 ray
    Bởi Megatex Cơ Khí trong diễn đàn Máy cắt Plasma, Oxy-Gas CNC
    Trả lời: 2
    Bài viết cuối: 18-07-2016, 11:47:09 AM
  3. Đà nẵng_Giáo trình tài liệu video lập trình vận hành máy CNC
    Bởi phuongcadcam trong diễn đàn Gian hàng hết hiệu lực
    Trả lời: 41
    Bài viết cuối: 12-03-2016, 09:02:35 AM
  4. Phẫu thuật thẩm mỹ X thành Z (nhờ giúp đỡ dao kéo)
    Bởi solero trong diễn đàn Kết cấu máy dạng Router
    Trả lời: 4
    Bài viết cuối: 01-07-2014, 08:48:20 AM

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •