정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 레오나르도 2개랑 nRF24L01 2개를 이용해서 유무선 조이스틱 만들기 시도중... 조언좀
박근영 | 2020-05-15

아두이노 레오나르도로 2개를 이용해서 유무선 조이스틱을 만들려고 하는데 어떻게 해야할까요?

우선 유선쪽은 프로그램을 짰는데 받는쪽에서 어떻게 해야 받아올지 모르겠습니다

 

디지털 4~13까지는 버튼 1번~10번이고

아날로그 A0~A3(디지털 18~21)는 상하좌우로 했습니다

2,3은 송수신용으로 설정하고요

 

제 생각에는 우선 디지털 핀으로 받은 값은 조이스틱으로 출력하고 그 값을 송신해서

수신받는쪽에서 그값을 다시 조이스틱으로 출력하게해서

1. 유선으로 연결하면 일반적인 유선조이스틱으로 쓰고

2. 조이스틱에 연결된 아두이노는 배터리로 연결하고

  수신받는쪽을 컴터에 연결해서 조이스틱으로 인식해서

  무선으로 쓰고 싶습니다

 

 

/////////////////////////////////////////////////////////////////////////////

 

 

#include <Joystick.h>  // 조이스틱관련

#include <SPI.h>    // 송수신 통신관련
#include <nRF24L01.h> //
#include <RF24.h>   //

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
    10, 0, // Button Count, Hat Switch Count
    true, true, false, // X and Y, but no Z Axis
    false, false, false, // No Rx, Ry, or Rz
    false, false, // No rudder or throttle
    false, false, false); // No accelerator, brake, or steering

RF24 radio(2, 3);
const byte address[6] = "00001";

void setup() {

        // Initialize Button Pins
        pinMode(4, INPUT_PULLUP);
        pinMode(5, INPUT_PULLUP);
        pinMode(6, INPUT_PULLUP);
        pinMode(7, INPUT_PULLUP);
        pinMode(8, INPUT_PULLUP);
        pinMode(9, INPUT_PULLUP);
        pinMode(10, INPUT_PULLUP);
        pinMode(11, INPUT_PULLUP);
        pinMode(12, INPUT_PULLUP);
        pinMode(13, INPUT_PULLUP);
        pinMode(18, INPUT_PULLUP);
        pinMode(19, INPUT_PULLUP);
        pinMode(20, INPUT_PULLUP);
        pinMode(21, INPUT_PULLUP);

        // Initialize Joystick Library
        Joystick.begin();
        Joystick.setXAxisRange(-1, 1);
        Joystick.setYAxisRange(-1, 1);

        radio.begin();
        radio.openWritingPipe(address);
        radio.setPALevel(RF24_PA_MIN);
        radio.stopListening();
 }

        // Last state of the buttons
        int lastButtonState[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

        void loop() {

            // Read pin values
            for (int index = 0; index < 18; index++) {
                int currentButtonState = !digitalRead(index + 4);
                if (currentButtonState != lastButtonState[index]) {
                    switch (index) {
                        case 0: // Button 1
                            Joystick.setButton(0, currentButtonState);
                            break;
                        case 1: // Button 2
                            Joystick.setButton(1, currentButtonState);
                            break;
                        case 2: // Button 3
                            Joystick.setButton(2, currentButtonState);
                            break;
                        case 3: // Button 4
                            Joystick.setButton(3, currentButtonState);
                            break;
                        case 4: // Button 5
                            Joystick.setButton(4, currentButtonState);
                            break;
                        case 5: // Button 6
                            Joystick.setButton(5, currentButtonState);
                            break;
                        case 6: // Button 7
                            Joystick.setButton(6, currentButtonState);
                            break;
                        case 7: // Button 8
                            Joystick.setButton(7, currentButtonState);
                            break;
                        case 8: // Button 9
                            Joystick.setButton(8, currentButtonState);
                            break;
                        case 9: // Button 10
                            Joystick.setButton(9, currentButtonState);
                            break;
                        case 10: // Button
                            break;
                        case 11: // Button
                            break;
                        case 12: // Button
                            break;
                        case 13: // Button
                            break;
                        case 14: // UP
                            if (currentButtonState == 1) {
                                Joystick.setYAxis(-1);
                            } else {
                                Joystick.setYAxis(0);
                            }
                            break;
                        case 15: // DOWN
                            if (currentButtonState == 1) {
                                Joystick.setYAxis(1);
                            } else {
                                Joystick.setYAxis(0);
                            }
                            break;
                        case 16: // RIGHT
                            if (currentButtonState == 1) {
                                Joystick.setXAxis(-1);
                            } else {
                                Joystick.setXAxis(0);
                            }
                            break;
                        case 17: // LEFT
                            if (currentButtonState == 1) {
                                Joystick.setXAxis(1);
                            } else {
                                Joystick.setXAxis(0);
                            }
                            break;
                    }
                    lastButtonState[index] = currentButtonState;
                    radio.write(&index, sizeof(index));
                    Serial.println(index);
                }
            }
            delay(20);
        }

이전글   |    아두이노 센서확장실드 v4.0 2020-05-14
다음글   |    초음파 센서를 활용하여 서보 모터 작동하기... 2020-05-15