USB HOST не определяет устройства
- Войдите на сайт для отправки комментариев
Втр, 14/07/2020 - 12:56
Сразу говорю - до пайки всё 100% работало! Решил я топорно спаять (ибо травить плату нет никакого желания) на макетной плате устройство (передатчик сигналов с геймпада на rc самолёт самопальный). После пайки произошли чудеса: модуль не выдаёт никакой ошибки (например, что не подключен), инициализируется, но ничего не принимает. Припаяно всё правильно и контакт хороший.
Похожая проблема была с nrf24l01. Она решилась заменой проводов на медную проволку, но тут и это не помогло.
и в чем вопрос? предлагаете приехать к вам и перепаять плату, чтобы работало?
Где хотя бы схема устройства и фото пайки? А лучше еще и код программы
Код программы состоит из трёх файлов (все файлы, кроме .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
(Сервер отказывается принимать эти фотки)
?
Меня интересует возможная причина сего деяния. Т.е. почему оно не инициализирует девайсы аля геймпад.
Не плохо было бы ещё скрин usb-устройств с пк как там что определяется. А так фото и фото, пальцем в небо тыкать - можно в чей-то анус попасть...