Как выгрузить скетч на бутерброд "Arduino UNO atmega328p" + "Arduino USB Host 2.0" Как загрузить скетч ?
- Войдите на сайт для отправки комментариев
Втр, 06/08/2019 - 21:46
Как загрузить скетч ? И Какой скетч выбрать из библиотеки для подключения к бутерброду мой USB клавиатуры ?
Пытаюсь загрузить скетч "USBHIDBootKbd.ino" в бутерброд "Arduino UNO atmega328p" + "Arduino USB Host 2.0" но выдает ошибку при загрузке (даже пустого скетча).
Аналогичная ситуация на ПК2 (тоже с Windows7).
1. Шилд "Arduino USB Host 2.0" надел на "Arduino UNO atmega328p"
2. Попытался на бутерброд Шилд "Arduino USB Host 2.0" надел на "Arduino UNO atmega328p" залить скетч "USBHIDBootKbd.ino" из его библиотеки (с сайта производителя https://github.com/felis/USB_Host_Shield_2.0). Возможно что скетч был один раз загруже.
3. Больше залить скетч на этот бутерброд не получается. Если снять шилд, то на UNO можно залить скетч. Но если опять надеть шилд, то при выгрузке даже пустого скетча выдает Ошибку (см. ниже)
На ПК №2 (ОС- Windows7) аналогичная ситуация.
-----------------------------
Ошибк: То что не выводиться в момент загрузки скетча на бутерброд.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM25 -b9600 -D -Uflash:w:C:\Users\jpn\AppData\Local\Temp
\arduino_build_549205/sketch_aug06b.ino.hex:i
avrdude: Version 6.3-20171130
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"
Using Port : COM25
Using Programmer : arduino
Overriding Baud Rate : 9600
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x16
-----------------------------
"resp" меняеться при каждой загрузке.
resp=0xe0
resp=0x4f
resp=0x28
resp=0x7
А в чём проблема? Снимайте шилд, заливайте скетч, надевайте шилд "взад". Не вижу проблемы.
Я просто хотел уточнить некоторые нуансы
1. Это разве норма что при заливкеь скетч нужно сперва снять шилд ? Я был уверен что можно заливать с надетым и вроди бы с другими шилдами именно так и было. А этот просто шилд специфический и требует снятия перед заливкой?
2. Как увидеть что шилд рабочий. Я так понимаю залить скетч.
"USB_desc.ino"
<span style="font-family: Verdana, Geneva, Arial, sans-serif; font-size: 12px;"> #include <usbhub.h> #include "pgmstrings.h" // Satisfy the IDE, which needs to see the include statment in the ino too. #ifdef dobogusinclude #include <spi4teensy3.h> #endif #include <SPI.h> USB Usb; //USBHub Hub1(&Usb); //USBHub Hub2(&Usb); //USBHub Hub3(&Usb); //USBHub Hub4(&Usb); //USBHub Hub5(&Usb); //USBHub Hub6(&Usb); //USBHub Hub7(&Usb); void PrintAllAddresses(UsbDevice *pdev) { UsbDeviceAddress adr; adr.devAddress = pdev->address.devAddress; Serial.print("\r\nAddr:"); Serial.print(adr.devAddress, HEX); Serial.print("("); Serial.print(adr.bmHub, HEX); Serial.print("."); Serial.print(adr.bmParent, HEX); Serial.print("."); Serial.print(adr.bmAddress, HEX); Serial.println(")"); } void PrintAddress(uint8_t addr) { UsbDeviceAddress adr; adr.devAddress = addr; Serial.print("\r\nADDR:\t"); Serial.println(adr.devAddress, HEX); Serial.print("DEV:\t"); Serial.println(adr.bmAddress, HEX); Serial.print("PRNT:\t"); Serial.println(adr.bmParent, HEX); Serial.print("HUB:\t"); Serial.println(adr.bmHub, HEX); } void setup() { Serial.begin( 115200 ); #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 ); } uint8_t getdevdescr( uint8_t addr, uint8_t &num_conf ); void PrintDescriptors(uint8_t addr) { uint8_t rcode = 0; uint8_t num_conf = 0; rcode = getdevdescr( (uint8_t)addr, num_conf ); if ( rcode ) { printProgStr(Gen_Error_str); print_hex( rcode, 8 ); } Serial.print("\r\n"); for (int i = 0; i < num_conf; i++) { rcode = getconfdescr( addr, i ); // get configuration descriptor if ( rcode ) { printProgStr(Gen_Error_str); print_hex(rcode, 8); } Serial.println("\r\n"); } } void PrintAllDescriptors(UsbDevice *pdev) { Serial.println("\r\n"); print_hex(pdev->address.devAddress, 8); Serial.println("\r\n--"); PrintDescriptors( pdev->address.devAddress ); } void loop() { Usb.Task(); if ( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { Usb.ForEachUsbDevice(&PrintAllDescriptors); Usb.ForEachUsbDevice(&PrintAllAddresses); while ( 1 ) { // stop #ifdef ESP8266 yield(); // needed in order to reset the watchdog timer on the ESP8266 #endif } } } uint8_t getdevdescr( uint8_t addr, uint8_t &num_conf ) { USB_DEVICE_DESCRIPTOR buf; uint8_t rcode; rcode = Usb.getDevDescr( addr, 0, 0x12, ( uint8_t *)&buf ); if ( rcode ) { return ( rcode ); } printProgStr(Dev_Header_str); printProgStr(Dev_Length_str); print_hex( buf.bLength, 8 ); printProgStr(Dev_Type_str); print_hex( buf.bDescriptorType, 8 ); printProgStr(Dev_Version_str); print_hex( buf.bcdUSB, 16 ); printProgStr(Dev_Class_str); print_hex( buf.bDeviceClass, 8 ); printProgStr(Dev_Subclass_str); print_hex( buf.bDeviceSubClass, 8 ); printProgStr(Dev_Protocol_str); print_hex( buf.bDeviceProtocol, 8 ); printProgStr(Dev_Pktsize_str); print_hex( buf.bMaxPacketSize0, 8 ); printProgStr(Dev_Vendor_str); print_hex( buf.idVendor, 16 ); printProgStr(Dev_Product_str); print_hex( buf.idProduct, 16 ); printProgStr(Dev_Revision_str); print_hex( buf.bcdDevice, 16 ); printProgStr(Dev_Mfg_str); print_hex( buf.iManufacturer, 8 ); printProgStr(Dev_Prod_str); print_hex( buf.iProduct, 8 ); printProgStr(Dev_Serial_str); print_hex( buf.iSerialNumber, 8 ); printProgStr(Dev_Nconf_str); print_hex( buf.bNumConfigurations, 8 ); num_conf = buf.bNumConfigurations; return ( 0 ); } void printhubdescr(uint8_t *descrptr, uint8_t addr) { HubDescriptor *pHub = (HubDescriptor*) descrptr; uint8_t len = *((uint8_t*)descrptr); printProgStr(PSTR("\r\n\r\nHub Descriptor:\r\n")); printProgStr(PSTR("bDescLength:\t\t")); Serial.println(pHub->bDescLength, HEX); printProgStr(PSTR("bDescriptorType:\t")); Serial.println(pHub->bDescriptorType, HEX); printProgStr(PSTR("bNbrPorts:\t\t")); Serial.println(pHub->bNbrPorts, HEX); printProgStr(PSTR("LogPwrSwitchMode:\t")); Serial.println(pHub->LogPwrSwitchMode, BIN); printProgStr(PSTR("CompoundDevice:\t\t")); Serial.println(pHub->CompoundDevice, BIN); printProgStr(PSTR("OverCurrentProtectMode:\t")); Serial.println(pHub->OverCurrentProtectMode, BIN); printProgStr(PSTR("TTThinkTime:\t\t")); Serial.println(pHub->TTThinkTime, BIN); printProgStr(PSTR("PortIndicatorsSupported:")); Serial.println(pHub->PortIndicatorsSupported, BIN); printProgStr(PSTR("Reserved:\t\t")); Serial.println(pHub->Reserved, HEX); printProgStr(PSTR("bPwrOn2PwrGood:\t\t")); Serial.println(pHub->bPwrOn2PwrGood, HEX); printProgStr(PSTR("bHubContrCurrent:\t")); Serial.println(pHub->bHubContrCurrent, HEX); for (uint8_t i = 7; i < len; i++) print_hex(descrptr[i], 8); //for (uint8_t i=1; i<=pHub->bNbrPorts; i++) // PrintHubPortStatus(&Usb, addr, i, 1); } uint8_t getconfdescr( uint8_t addr, uint8_t conf ) { uint8_t buf[ BUFSIZE ]; uint8_t* buf_ptr = buf; uint8_t rcode; uint8_t descr_length; uint8_t descr_type; uint16_t total_length; rcode = Usb.getConfDescr( addr, 0, 4, conf, buf ); //get total length LOBYTE( total_length ) = buf[ 2 ]; HIBYTE( total_length ) = buf[ 3 ]; if ( total_length > 256 ) { //check if total length is larger than buffer printProgStr(Conf_Trunc_str); total_length = 256; } rcode = Usb.getConfDescr( addr, 0, total_length, conf, buf ); //get the whole descriptor while ( buf_ptr < buf + total_length ) { //parsing descriptors descr_length = *( buf_ptr ); descr_type = *( buf_ptr + 1 ); switch ( descr_type ) { case ( USB_DESCRIPTOR_CONFIGURATION ): printconfdescr( buf_ptr ); break; case ( USB_DESCRIPTOR_INTERFACE ): printintfdescr( buf_ptr ); break; case ( USB_DESCRIPTOR_ENDPOINT ): printepdescr( buf_ptr ); break; case 0x29: printhubdescr( buf_ptr, addr ); break; default: printunkdescr( buf_ptr ); break; }//switch( descr_type buf_ptr = ( buf_ptr + descr_length ); //advance buffer pointer }//while( buf_ptr <=... return ( rcode ); } /* prints hex numbers with leading zeroes */ // copyright, Peter H Anderson, Baltimore, MD, Nov, '07 // source: http://www.phanderson.com/arduino/arduino_display.html void print_hex(int v, int num_places) { int mask = 0, n, num_nibbles, digit; for (n = 1; n <= num_places; n++) { mask = (mask << 1) | 0x0001; } v = v & mask; // truncate v to specified number of places num_nibbles = num_places / 4; if ((num_places % 4) != 0) { ++num_nibbles; } do { digit = ((v >> (num_nibbles - 1) * 4)) & 0x0f; Serial.print(digit, HEX); } while (--num_nibbles); } /* function to print configuration descriptor */ void printconfdescr( uint8_t* descr_ptr ) { USB_CONFIGURATION_DESCRIPTOR* conf_ptr = ( USB_CONFIGURATION_DESCRIPTOR* )descr_ptr; printProgStr(Conf_Header_str); printProgStr(Conf_Totlen_str); print_hex( conf_ptr->wTotalLength, 16 ); printProgStr(Conf_Nint_str); print_hex( conf_ptr->bNumInterfaces, 8 ); printProgStr(Conf_Value_str); print_hex( conf_ptr->bConfigurationValue, 8 ); printProgStr(Conf_String_str); print_hex( conf_ptr->iConfiguration, 8 ); printProgStr(Conf_Attr_str); print_hex( conf_ptr->bmAttributes, 8 ); printProgStr(Conf_Pwr_str); print_hex( conf_ptr->bMaxPower, 8 ); return; } /* function to print interface descriptor */ void printintfdescr( uint8_t* descr_ptr ) { USB_INTERFACE_DESCRIPTOR* intf_ptr = ( USB_INTERFACE_DESCRIPTOR* )descr_ptr; printProgStr(Int_Header_str); printProgStr(Int_Number_str); print_hex( intf_ptr->bInterfaceNumber, 8 ); printProgStr(Int_Alt_str); print_hex( intf_ptr->bAlternateSetting, 8 ); printProgStr(Int_Endpoints_str); print_hex( intf_ptr->bNumEndpoints, 8 ); printProgStr(Int_Class_str); print_hex( intf_ptr->bInterfaceClass, 8 ); printProgStr(Int_Subclass_str); print_hex( intf_ptr->bInterfaceSubClass, 8 ); printProgStr(Int_Protocol_str); print_hex( intf_ptr->bInterfaceProtocol, 8 ); printProgStr(Int_String_str); print_hex( intf_ptr->iInterface, 8 ); return; } /* function to print endpoint descriptor */ void printepdescr( uint8_t* descr_ptr ) { USB_ENDPOINT_DESCRIPTOR* ep_ptr = ( USB_ENDPOINT_DESCRIPTOR* )descr_ptr; printProgStr(End_Header_str); printProgStr(End_Address_str); print_hex( ep_ptr->bEndpointAddress, 8 ); printProgStr(End_Attr_str); print_hex( ep_ptr->bmAttributes, 8 ); printProgStr(End_Pktsize_str); print_hex( ep_ptr->wMaxPacketSize, 16 ); printProgStr(End_Interval_str); print_hex( ep_ptr->bInterval, 8 ); return; } /*function to print unknown descriptor */ void printunkdescr( uint8_t* descr_ptr ) { uint8_t length = *descr_ptr; uint8_t i; printProgStr(Unk_Header_str); printProgStr(Unk_Length_str); print_hex( *descr_ptr, 8 ); printProgStr(Unk_Type_str); print_hex( *(descr_ptr + 1 ), 8 ); printProgStr(Unk_Contents_str); descr_ptr += 2; for ( i = 0; i < length; i++ ) { print_hex( *descr_ptr, 8 ); descr_ptr++; } } /* Print a string from Program Memory directly to save RAM */ void printProgStr(const char* str) { char c; if (!str) return; while ((c = pgm_read_byte(str++))) Serial.print(c); } </span>или
"USBHIDBootKbd.ino"
#include <hidboot.h> #include <usbhub.h> // Satisfy the IDE, which needs to see the include statment in the ino too. #ifdef dobogusinclude #include <spi4teensy3.h> #endif #include <SPI.h> class KbdRptParser : public KeyboardReportParser { void PrintKey(uint8_t mod, uint8_t key); protected: void OnControlKeysChanged(uint8_t before, uint8_t after); void OnKeyDown (uint8_t mod, uint8_t key); void OnKeyUp (uint8_t mod, uint8_t key); void OnKeyPressed(uint8_t key); }; void KbdRptParser::PrintKey(uint8_t m, uint8_t key) { MODIFIERKEYS mod; *((uint8_t*)&mod) = m; Serial.print((mod.bmLeftCtrl == 1) ? "C" : " "); Serial.print((mod.bmLeftShift == 1) ? "S" : " "); Serial.print((mod.bmLeftAlt == 1) ? "A" : " "); Serial.print((mod.bmLeftGUI == 1) ? "G" : " "); Serial.print(" >"); PrintHex<uint8_t>(key, 0x80); Serial.print("< "); Serial.print((mod.bmRightCtrl == 1) ? "C" : " "); Serial.print((mod.bmRightShift == 1) ? "S" : " "); Serial.print((mod.bmRightAlt == 1) ? "A" : " "); Serial.println((mod.bmRightGUI == 1) ? "G" : " "); }; void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) { Serial.print("DN "); PrintKey(mod, key); uint8_t c = OemToAscii(mod, key); if (c) OnKeyPressed(c); } void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) { MODIFIERKEYS beforeMod; *((uint8_t*)&beforeMod) = before; MODIFIERKEYS afterMod; *((uint8_t*)&afterMod) = after; if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl) { Serial.println("LeftCtrl changed"); } if (beforeMod.bmLeftShift != afterMod.bmLeftShift) { Serial.println("LeftShift changed"); } if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt) { Serial.println("LeftAlt changed"); } if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI) { Serial.println("LeftGUI changed"); } if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl) { Serial.println("RightCtrl changed"); } if (beforeMod.bmRightShift != afterMod.bmRightShift) { Serial.println("RightShift changed"); } if (beforeMod.bmRightAlt != afterMod.bmRightAlt) { Serial.println("RightAlt changed"); } if (beforeMod.bmRightGUI != afterMod.bmRightGUI) { Serial.println("RightGUI changed"); } } void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) { Serial.print("UP "); PrintKey(mod, key); } void KbdRptParser::OnKeyPressed(uint8_t key) { Serial.print("ASCII: "); Serial.println((char)key); }; USB Usb; //USBHub Hub(&Usb); HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb); KbdRptParser Prs; void setup() { Serial.begin( 115200 ); #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 ); HidKeyboard.SetReportParser(0, &Prs); } void loop() { Usb.Task(); }Подключить клавиатуру USB к нему шилду. Открытить монитор и при нажатии клавиш в монитор долна выводиться информация ?
1. Это разве норма что при заливкеь скетч нужно сперва снять шилд ? Я был уверен что можно заливать с надетым и вроди бы с другими шилдами именно так и было.
заливка скетча происходит через USB. И ваш шилд тоже использует USB Дальше обьяснять надо?
те, другие шилды, которые не надо снимать - не взаимодействуют с USB. Любые шилды и модули. задействующие USB или Сериал на ардуино - приходится снимать при прошивке, это норма
Ок - Снимать. Но почему всеже не понятно мне? Если проблема при заливке и его нужно снимать, почему небудет проблемы при работе сендвича "Arduino UNO atmega328p" + "Arduino USB Host 2.0"
Во премя работы они оба подключены к USB шилд получает команды с клавиатуры, а UNO выводит информацию в монитор порта. В этом случае между платами тоже передаеться информация.
Я собрал "бутерброд": на плате Arduino UNO R3 (Atmega328P-DIP28, PL-2303 - USB-to-UART, AMS1117 - 5.0, AMS1117-3.3),
USB host shield на базе MAX3421EE +74HC125 (2 шт).
Библиотека USB_Host_Shield_2.0-master.zip
Никаких перемычек на плате не удалял/не ставил.
Задействованы только следующие сигналы
6-контактный разъем внутрисхемного программирования:
RESET, MISO (=D12), MOSI (=D11), SCK (=D13), +5V, GND
+ 2 сигнала: SS -D10, INT-D9.
Остаются свободными D0-D8, A0-A5.
Библиотечный пример USB_Host_Shield_2.0-master\examples\HID\USBHIDBootKbd
работает. Работают и собственные программы обработки символов с USB клавиатуры.
----------------------------------------
ВОПРОС В ДРУГОМ
____________________________
Имеется китайский штангенциркуль неизвестной марки.
Он имеет внешнее устройство - преобразователь интерфейса с выходом USB.
Компьютером распознается как клавиатура. При нажатии кнопки на коробке в окно ввода на РС вводится текст - текущее значение на дисплее штангенциркуля.
Если я подключаю єту коробку к USB_Host_Shield, то текст принимается с ошибками.
Например вместо " -12.46"<CR>
может быть принято
-12.46<CR> без пробела в начале,
12.46<CR>
-1.46<CR>
-12.4<CR>
-12.6<CR>
-2.46<CR>
либо -12.46 без символа возврата каретки.
Реже
-12.<CR> или -1.46<CR> или что-то в єтом роде.
То есть один (реже - два) символа не принимаются.
Разобрал коробку. Там залитая компаундом ИМС, 1 навесной транзистор, несколько резисторов, конденсаторов, кнопка и разъемы.
Нет даже кварца на 12МГц.
Подозреваю, что проблема может быть связана с тем, что тактовая частота "коробки" далека от 12 МГц.
Но это только робкое предположение.
Кто может подсказать в чем дело и как можно эту проблему решить?
Заранее признателен за ответы.