#1 2022-09-30 16:31:41

Андр.
Учасник
Зареєстрований: 2015-12-01
Повідомлень: 19

USB Host Shield 2.0 -Stepper motor та Thrustmaster USB Joystick

Всім привіт потрібна допомога, не можу розібратись з кодом

Є Arduino Mega та USB Host Shield 2.0 я підключив джойстик (Thrustmaster USB Joystick)

залив скетч з рідної бібліотеки  USB Host Shield 2.0 (USBHIDJoystick)

За допомогою джойстика хочу керувати шаговим двигуном (підключений через драйвер).


Проблема полягає в тому що коли я переміщаю ручку джойстика в ліва або в право то двигун працює тільки коли змінюються положення джойстика, коли значення не змінні то двигун не рухається, але значення змінились

Без USB Host Shield 2.0 двигун працює, я назначив на кнопки на клавіатурі, але коли підключив USB Host Shield 2.0 то дуже повільно по кроково і стоїть на місці.

USBHIDJoystick

#include <usbhid.h>
#include <hiduniversal.h>
#include <usbhub.h>

// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

#include "hidjoystickrptparser.h"

USB Usb;
USBHub Hub(&Usb);
HIDUniversal Hid(&Usb);
JoystickEvents JoyEvents;
JoystickReportParser Joy(&JoyEvents);

void setup() {
        Serial.begin(19200);
        
#if !defined(__MIPSEL__)
        while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
        Serial.println("Start");

        if (Usb.Init() == -1)
                Serial.println("OSC did not start.");

        delay(200);

        if (!Hid.SetReportParser(0, &Joy))
                ErrorMessage<uint8_t > (PSTR("SetReportParser"), 1);
}

void loop() {
  
        Usb.Task();
        
}

hidjoystickrptparser.cpp

#include "hidjoystickrptparser.h"

#include <AccelStepper.h>

const int PUL = 7;
const int DIR = 6;
const int ENA = 5;

const int SPEED = 6400;
 
const int setSPEED = 2000;

AccelStepper stepper(AccelStepper::DRIVER, PUL, DIR);

JoystickReportParser::JoystickReportParser(JoystickEvents *evt) :
joyEvents(evt),
oldHat(0xDE),
oldButtons(0) {
        for (uint8_t i = 0; i < RPT_GEMEPAD_LEN; i++)
                oldPad[i] = 0xD;
}

void JoystickReportParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
        bool match = true;

        // Checking if there are changes in report since the method was last called
        for (uint8_t i = 0; i < RPT_GEMEPAD_LEN; i++)
                if (buf[i] != oldPad[i]) {
                        match = false;
                        break;
                }

        // Calling Game Pad event handler
        if (!match && joyEvents) {
                joyEvents->OnGamePadChanged((const GamePadEventData*)buf);

                for (uint8_t i = 0; i < RPT_GEMEPAD_LEN; i++)oldPad[i] = buf[i];
        }

        uint8_t hat = (buf[5] & 0xF);

        // Calling Hat Switch event handler
        if (hat != oldHat && joyEvents) {
                joyEvents->OnHatSwitch(hat);
                oldHat = hat;
        }

        uint16_t buttons = (0x0000 | buf[6]);
        buttons <<= 4;
        buttons |= (buf[5] >> 4);
        uint16_t changes = (buttons ^ oldButtons);

        // Calling Button Event Handler for every button changed
        if (changes) {
                for (uint8_t i = 0; i < 0x0C; i++) {
                        uint16_t mask = (0x0001 << i);

                        if (((mask & changes) > 0) && joyEvents) {
                                if ((buttons & mask) > 0)
                                        joyEvents->OnButtonDn(i + 1);
                                else
                                        joyEvents->OnButtonUp(i + 1);
                        }
                }
                oldButtons = buttons;
        }
}

void JoystickEvents::OnGamePadChanged(const GamePadEventData *evt) {
  
        stepper.setEnablePin(ENA);
        stepper.enableOutputs();
        stepper.setMaxSpeed(SPEED);
        stepper.setAcceleration(1500);

        uint8_t X1 = evt->X;
        uint8_t Y1 = evt->Y; 
        int setSPEED;
        
              
        if((X1 >= 128)&&(X1 <= 251)){
            setSPEED = map(X1, 251, 128, -5, -500); 
            stepper.setSpeed(setSPEED); 
        }
        if((X1 >= 4)&&(X1 <= 127)){
            setSPEED = map(X1, 4, 127, 5, 500);
            stepper.setSpeed(setSPEED);
        }
        if((X1 > 251)||(X1 < 4)){
            setSPEED = 0;
            stepper.setSpeed(setSPEED);
        }
        
        
        /*Serial.print("tY1: ");
        Serial.print(evt->Y, DEC);
        Serial.print("tX2: ");
        Serial.print(evt->Z1, DEC);
        Serial.print("tY2: ");
        Serial.print(evt->Z2, DEC);
        Serial.print("tRz: ");
        Serial.print(evt->Rz, DEC);
        Serial.println("");
        */
        stepper.runSpeed();
        }

void JoystickEvents::OnHatSwitch(uint8_t hat) {
        Serial.print("Hat Switch: ");
        PrintHex<uint8_t > (hat, 0x80);
        Serial.println("");
}

void JoystickEvents::OnButtonUp(uint8_t but_id) {
        Serial.print("Up: ");
        Serial.println(but_id, DEC);
}

void JoystickEvents::OnButtonDn(uint8_t but_id) {
        Serial.print("Dn: ");
        Serial.println(but_id, DEC);
}

hidjoystickrptparser.h

#if !defined(__HIDJOYSTICKRPTPARSER_H__)
#define __HIDJOYSTICKRPTPARSER_H__

#include <usbhid.h>

struct GamePadEventData {
        
        uint8_t X, Y, Z1, Z2, Rz;      
};

class JoystickEvents {
public:
        virtual void OnGamePadChanged(const GamePadEventData *evt);
        virtual void OnHatSwitch(uint8_t hat);
        virtual void OnButtonUp(uint8_t but_id);
        virtual void OnButtonDn(uint8_t but_id);
};

#define RPT_GEMEPAD_LEN		5

class JoystickReportParser : public HIDReportParser {
        JoystickEvents *joyEvents;

        uint8_t oldPad[RPT_GEMEPAD_LEN];
        uint8_t oldHat;
        uint16_t oldButtons;

public:
        JoystickReportParser(JoystickEvents *evt);

        virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};

#endif // __HIDJOYSTICKRPTPARSER_H__

Знайшов на Arduino.cc форумі таку ж саму тему, але відповіді там не знайшов.

https://forum.arduino.cc/t/controlling- … ick/649874


Може хтось може мені допомогти в цьому питанні, або підскажіть де копати))

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму