Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

328 lines
9.6KB

  1. // Simple test of USB Host Mouse/Keyboard
  2. //
  3. // This example is in the public domain
  4. #include "USBHost_t36.h"
  5. #define USBBAUD 115200
  6. uint32_t baud = USBBAUD;
  7. uint32_t format = USBHOST_SERIAL_8N1;
  8. USBHost myusb;
  9. USBHub hub1(myusb);
  10. USBHub hub2(myusb);
  11. USBHIDParser hid1(myusb);
  12. USBHIDParser hid2(myusb);
  13. USBHIDParser hid3(myusb);
  14. // There is now two versions of the USBSerial class, that are both derived from a common Base class
  15. // The difference is on how large of transfers that it can handle. This is controlled by
  16. // the device descriptor, where up to now we handled those up to 64 byte USB transfers.
  17. // But there are now new devices that support larger transfer like 512 bytes. This for example
  18. // includes the Teensy 4.x boards. For these we need the big buffer version.
  19. // uncomment one of the following defines for userial
  20. USBSerial userial(myusb); // works only for those Serial devices who transfer <=64 bytes (like T3.x, FTDI...)
  21. //USBSerial_BigBuffer userial(myusb, 1); // Handles anything up to 512 bytes
  22. //USBSerial_BigBuffer userial(myusb); // Handles up to 512 but by default only for those > 64 bytes
  23. USBDriver *drivers[] = {&hub1, &hub2, &hid1, &hid2, &hid3, &userial};
  24. #define CNT_DEVICES (sizeof(drivers)/sizeof(drivers[0]))
  25. const char * driver_names[CNT_DEVICES] = {"Hub1", "Hub2", "HID1", "HID2", "HID3", "USERIAL1" };
  26. bool driver_active[CNT_DEVICES] = {false, false, false, false};
  27. void setup()
  28. {
  29. pinMode(13, OUTPUT);
  30. pinMode(2, OUTPUT);
  31. pinMode(3, OUTPUT);
  32. for (int i = 0; i < 5; i++) {
  33. digitalWrite(2, HIGH);
  34. delayMicroseconds(50);
  35. digitalWrite(2, LOW);
  36. delayMicroseconds(50);
  37. }
  38. while (!Serial && (millis() < 5000)) ; // wait for Arduino Serial Monitor
  39. Serial.println("\n\nUSB Host Testing - Serial");
  40. myusb.begin();
  41. Serial1.begin(115200); // We will echo stuff Through Serial1...
  42. }
  43. void loop()
  44. {
  45. digitalWrite(13, !digitalRead(13));
  46. myusb.Task();
  47. // Print out information about different devices.
  48. for (uint8_t i = 0; i < CNT_DEVICES; i++) {
  49. if (*drivers[i] != driver_active[i]) {
  50. if (driver_active[i]) {
  51. Serial.printf("*** Device %s - disconnected ***\n", driver_names[i]);
  52. driver_active[i] = false;
  53. } else {
  54. Serial.printf("*** Device %s %x:%x - connected ***\n", driver_names[i], drivers[i]->idVendor(), drivers[i]->idProduct());
  55. driver_active[i] = true;
  56. const uint8_t *psz = drivers[i]->manufacturer();
  57. if (psz && *psz) Serial.printf(" manufacturer: %s\n", psz);
  58. psz = drivers[i]->product();
  59. if (psz && *psz) Serial.printf(" product: %s\n", psz);
  60. psz = drivers[i]->serialNumber();
  61. if (psz && *psz) Serial.printf(" Serial: %s\n", psz);
  62. // If this is a new Serial device.
  63. if (drivers[i] == &userial) {
  64. // Lets try first outputting something to our USerial to see if it will go out...
  65. userial.begin(baud);
  66. }
  67. }
  68. }
  69. }
  70. if (Serial.available()) {
  71. Serial.println("Serial Available");
  72. while (Serial.available()) {
  73. int ch = Serial.read();
  74. if (ch == '$') {
  75. BioloidTest();
  76. while (Serial.read() != -1);
  77. } else if (ch == '#') {
  78. // Lets see if we have a baud rate specified here...
  79. uint32_t new_baud = 0;
  80. for(;;) {
  81. ch = Serial.read();
  82. if ((ch < '0') || (ch > '9'))
  83. break;
  84. new_baud = new_baud*10 + ch - '0';
  85. }
  86. // See if the user is specifying a format: 8n1, 7e1, 7e2, 8n2
  87. // Note this is Quick and very dirty code...
  88. //
  89. if (ch == ',') {
  90. char command_line[10];
  91. ch = Serial.read();
  92. while (ch == ' ') Serial.read(); // ignore any spaces.
  93. uint8_t cb = 0;
  94. while ((ch > ' ') && (cb < sizeof(command_line))) {
  95. command_line[cb++] = ch;
  96. ch = Serial.read();
  97. }
  98. command_line[cb] = '\0';
  99. if (CompareStrings(command_line, "8N1")) format = USBHOST_SERIAL_8N1;
  100. else if (CompareStrings(command_line, "8N2")) format = USBHOST_SERIAL_8N2;
  101. else if (CompareStrings(command_line, "7E1")) format = USBHOST_SERIAL_7E1;
  102. else if (CompareStrings(command_line, "7O1")) format = USBHOST_SERIAL_7O1;
  103. }
  104. Serial.println("\n*** Set new Baud command ***\n do userial.end()");
  105. digitalWriteFast(2, HIGH);
  106. userial.end(); // Do the end statement;
  107. digitalWriteFast(2, LOW);
  108. if (new_baud) {
  109. baud = new_baud;
  110. Serial.print(" New Baud: ");
  111. Serial.println(baud);
  112. Serial.print(" Format: ");
  113. Serial.println(format, HEX);
  114. digitalWriteFast(3, HIGH);
  115. userial.begin(baud, format);
  116. digitalWriteFast(3, LOW);
  117. Serial.println(" Completed ");
  118. } else {
  119. Serial.println(" New Baud 0 - leave disabled");
  120. }
  121. while (Serial.read() != -1);
  122. } else {
  123. userial.write(ch);
  124. }
  125. }
  126. }
  127. while (Serial1.available()) {
  128. // Serial.println("Serial1 Available");
  129. Serial1.write(Serial1.read());
  130. }
  131. while (userial.available()) {
  132. // Serial.println("USerial Available");
  133. Serial.write(userial.read());
  134. }
  135. }
  136. bool CompareStrings(const char *sz1, const char *sz2) {
  137. while (*sz2 != 0) {
  138. if (toupper(*sz1) != toupper(*sz2))
  139. return false;
  140. sz1++;
  141. sz2++;
  142. }
  143. return true; // end of string so show as match
  144. }
  145. //#define ID_MASTER 200
  146. #define ID_MASTER 0xfd
  147. // Extract stuff from Bioloid library..
  148. #define AX12_BUFFER_SIZE 128
  149. #define COUNTER_TIMEOUT 12000
  150. /** Instruction Set **/ #define AX_PING 1
  151. #define AX_READ_DATA 2
  152. #define AX_WRITE_DATA 3
  153. #define AX_REG_WRITE 4
  154. #define AX_ACTION 5
  155. #define AX_RESET 6
  156. #define AX_SYNC_WRITE 131
  157. #define AX_TORQUE_ENABLE 24
  158. #define AX_LED 25
  159. #define AX_CW_COMPLIANCE_MARGIN 26
  160. #define AX_CCW_COMPLIANCE_MARGIN 27
  161. #define AX_CW_COMPLIANCE_SLOPE 28
  162. #define AX_CCW_COMPLIANCE_SLOPE 29
  163. #define AX_GOAL_POSITION_L 30
  164. #define AX_GOAL_POSITION_H 31
  165. #define AX_GOAL_SPEED_L 32
  166. #define AX_GOAL_SPEED_H 33
  167. #define AX_TORQUE_LIMIT_L 34
  168. #define AX_TORQUE_LIMIT_H 35
  169. #define AX_PRESENT_POSITION_L 36
  170. #define AX_PRESENT_POSITION_H 37
  171. void BioloidTest() {
  172. uint8_t master_id = 200;
  173. Serial.println("\n*** Bioloid Test ***");
  174. if (ax12GetRegister(master_id, 0, 1) != -1) {
  175. Serial.println("Controller found at 200");
  176. } else {
  177. Serial.println("Controller not at 200 try 0xfd");
  178. master_id = 0xfd;
  179. if (ax12GetRegister(master_id, 0, 1) != -1) {
  180. Serial.println("Controller found at 0xfd");
  181. } else {
  182. Serial.println("Controller not found");
  183. }
  184. }
  185. for (uint8_t reg = 0; reg < 10; reg++) {
  186. myusb.Task();
  187. Serial.print(ax12GetRegister(master_id, reg, 1), HEX);
  188. Serial.print(" ");
  189. }
  190. Serial.println();
  191. // Now assuming we found controller...
  192. // May need to turn on power on controller
  193. ax12SetRegister(master_id, AX_TORQUE_ENABLE, 1);
  194. delay(2);
  195. // Lets see if we can get the current position for any servo
  196. for (int i = 0; i < 254; i++) {
  197. int servo_pos = ax12GetRegister(i, AX_PRESENT_POSITION_L, 2);
  198. if (servo_pos != -1) {
  199. Serial.printf("Servo: %d Pos: %d\n", i, servo_pos);
  200. }
  201. }
  202. }
  203. unsigned char ax_rx_buffer[AX12_BUFFER_SIZE];
  204. int ax12GetRegister(int id, int regstart, int length) {
  205. // 0xFF 0xFF ID LENGTH INSTRUCTION PARAM... CHECKSUM
  206. int return_value;
  207. digitalWriteFast(2, HIGH);
  208. int checksum = ~((id + 6 + regstart + length) % 256);
  209. userial.write(0xFF);
  210. userial.write(0xFF);
  211. userial.write(id);
  212. userial.write(4); // length
  213. userial.write(AX_READ_DATA);
  214. userial.write(regstart);
  215. userial.write(length);
  216. userial.write(checksum);
  217. userial.flush(); // make sure the data goes out.
  218. if (ax12ReadPacket(length + 6) > 0) {
  219. // ax12Error = ax_rx_buffer[4];
  220. if (length == 1)
  221. return_value = ax_rx_buffer[5];
  222. else
  223. return_value = ax_rx_buffer[5] + (ax_rx_buffer[6] << 8);
  224. } else {
  225. digitalWriteFast(3, !digitalReadFast(3));
  226. return_value = -1;
  227. }
  228. digitalWriteFast(2, LOW);
  229. return return_value;
  230. }
  231. void ax12SetRegister(int id, int regstart, int data){
  232. int checksum = ~((id + 4 + AX_WRITE_DATA + regstart + (data&0xff)) % 256);
  233. userial.write(0xFF);
  234. userial.write(0xFF);
  235. userial.write(id);
  236. userial.write(4); // length
  237. userial.write(AX_WRITE_DATA);
  238. userial.write(regstart);
  239. userial.write(data&0xff);
  240. // checksum =
  241. userial.write(checksum);
  242. userial.flush();
  243. //ax12ReadPacket();
  244. }
  245. int ax12ReadPacket(int length) {
  246. unsigned long ulCounter;
  247. unsigned char offset, checksum;
  248. unsigned char *psz;
  249. unsigned char *pszEnd;
  250. int ch;
  251. offset = 0;
  252. psz = ax_rx_buffer;
  253. pszEnd = &ax_rx_buffer[length];
  254. while (userial.read() != -1) ;
  255. uint32_t ulStart = millis();
  256. // Need to wait for a character or a timeout...
  257. do {
  258. ulCounter = COUNTER_TIMEOUT;
  259. while ((ch = userial.read()) == -1) {
  260. if ((millis() - ulStart) > 10) {
  261. //if (!--ulCounter) {
  262. Serial.println("Timeout");
  263. return 0; // Timeout
  264. }
  265. }
  266. } while (ch != 0xff) ;
  267. *psz++ = 0xff;
  268. while (psz != pszEnd) {
  269. ulCounter = COUNTER_TIMEOUT;
  270. while ((ch = userial.read()) == -1) {
  271. //Serial.printf("Read ch: %x\n", ch);
  272. if (!--ulCounter) {
  273. return 0; // Timeout
  274. }
  275. }
  276. *psz++ = (unsigned char)ch;
  277. }
  278. checksum = 0;
  279. for (offset = 2; offset < length; offset++)
  280. checksum += ax_rx_buffer[offset];
  281. if (checksum != 255) {
  282. return 0;
  283. } else {
  284. return 1;
  285. }
  286. }