USB HOST не определяет устройства

Nemizan
Offline
Зарегистрирован: 26.06.2020

Сразу говорю - до пайки всё 100% работало! Решил я топорно спаять (ибо травить плату нет никакого желания) на макетной плате устройство (передатчик сигналов с геймпада на rc самолёт самопальный). После пайки произошли чудеса: модуль не выдаёт никакой ошибки (например, что не подключен), инициализируется, но ничего не принимает. Припаяно всё правильно и контакт хороший.

Похожая проблема была с nrf24l01. Она решилась заменой проводов на медную проволку, но тут и это не помогло.

b707
Offline
Зарегистрирован: 26.05.2017

и в чем вопрос? предлагаете приехать к вам и перепаять плату, чтобы работало?

Где хотя бы схема устройства и фото пайки? А лучше еще и код программы

Nemizan
Offline
Зарегистрирован: 26.06.2020

Код программы состоит из трёх файлов (все файлы, кроме .ino - немного изменённые файлы из примера)

TX_Pult.ino:

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

#include "hidjoystickrptparser.h"

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

#include "RF24.h" 

RF24 radio(7,8);
const uint64_t pipe = 0xF0F0F0F0F0LL; 
int msg[8];

void setup(void)
{
  Serial.begin(9600);
  if(Usb.Init() == -1) Serial.println("OSC did not start.");
  if(!Hid.SetReportParser(0, &Joy))ErrorMessage<uint8_t > (PSTR("SetReportParser"), 1);
  /*pinMode(A2,INPUT_PULLUP);
  pinMode(A3,INPUT_PULLUP);
  pinMode(A4,INPUT_PULLUP);*/
  radio.begin();
  radio.openWritingPipe(pipe);
}
void loop()
{
  Usb.Task();
  
  msg[0] = map(JoystickEvents::mostRecentEvent.X, 0, 255, 10, 170);
  msg[2] = map(JoystickEvents::mostRecentEvent.Y, 0, 255, 10, 170);

  if(JoystickEvents::butt_id==5) msg[1]=10; // LEFT
  else if(JoystickEvents::butt_id==6) msg[1]=170; // RIGHT
  else msg[1]=88;

  if(JoystickEvents::butt_id==8) msg[3]=255;
  else
  {
  msg[3] = map(JoystickEvents::mostRecentEvent.Rz,128,0,0,255);
  msg[3] = constrain(msg[3],0,255);
  }
  Serial.println(msg[0]);
  Serial.println(msg[1]);
  Serial.println(msg[2]);
  Serial.println(msg[3]);
  Serial.println();
  radio.write(msg,8);
}

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);
        static GamePadEventData mostRecentEvent;
        static int butt_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__

hidjoystickrptparser.cpp:

#include "hidjoystickrptparser.h"

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;
        }
}

GamePadEventData JoystickEvents::mostRecentEvent;
void JoystickEvents::OnGamePadChanged(const GamePadEventData *evt)
{
        /*Serial.print("X1: ");
        Serial.print(evt->X);
        Serial.print("\tY1: ");
        Serial.print(evt->Y);
        Serial.print("\tX2: ");
        Serial.print(evt->Z1);
        Serial.print("\tY2: ");
        Serial.print(evt->Z2);
        Serial.print("\tRz: ");
        Serial.print(evt->Rz);
        Serial.println("");*/
        mostRecentEvent = *evt;
}

void JoystickEvents::OnHatSwitch(uint8_t hat)
{
        /*Serial.print("Hat Switch: ");
        PrintHex<uint8_t > (hat, 0x80);
        Serial.println("");*/
}
int JoystickEvents::butt_id;
void JoystickEvents::OnButtonUp(uint8_t but_id)
{
        /*Serial.print("Up: ");
        Serial.println(but_id, DEC);*/
        butt_id=0;
}

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

 

 

Фото, как подключаю к ардуине:

Фото пайки и вид сверху (соответственно):

https://psv4.userapi.com/c856228/u601227532/docs/d4/82f0d945aaec/IMG_20200714_125122.jpg?extra=GEBor524V-nbvfyLfRTZgPpkrGBa77nipRDceaJuTvuP5yYC0D7RupQ0WIglQ_WBpZMtYXhiLDIlAYZh1REi57W8UFfFeJbXLyJdMpjqLaH4y3akH9MBWekH4G5DfEYHktPas5Xayeeaeplkn6PtMW6W

https://psv4.userapi.com/c856228/u601227532/docs/d14/41ed4e8353b6/IMG_20200714_125133.jpg?extra=L5L_2sIyCy4R9LvoDiDzeaWCPRuSoHg6V3O49POiHFcLKr_eH8-FpbVW6cR2PY_lmBSMiOga2bbOgRxoe68VyN0ybP5SeUQtSycYK5c3ofJsUQ78MTZk0E0KZ7He8-v9qCx2kgv27HI0wYulqCfEZBkK

(Сервер отказывается принимать эти фотки)

Nemizan
Offline
Зарегистрирован: 26.06.2020

?

Nemizan
Offline
Зарегистрирован: 26.06.2020

Меня интересует возможная причина сего деяния. Т.е. почему оно не инициализирует девайсы аля геймпад.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Не плохо было бы ещё скрин usb-устройств с пк как там что определяется. А так фото и фото, пальцем в небо тыкать - можно в чей-то анус попасть...