Ви не увійшли.
Всім привіт потрібна допомога, не можу розібратись з кодом
Є 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
Може хтось може мені допомогти в цьому питанні, або підскажіть де копати))