Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

268 lines
7.2KB

  1. // Simple test of USB Host Mouse/Keyboard
  2. //
  3. // This example is in the public domain
  4. #include "USBHost_t36.h"
  5. USBHost myusb;
  6. USBHub hub1(myusb);
  7. USBHub hub2(myusb);
  8. USBHIDParser hid1(myusb);
  9. USBHIDParser hid2(myusb);
  10. USBHIDParser hid3(myusb);
  11. USBSerial userial(myusb);
  12. USBDriver *drivers[] = {&hub1, &hub2, &hid1, &hid2, &hid3, &userial};
  13. #define CNT_DEVICES (sizeof(drivers)/sizeof(drivers[0]))
  14. const char * driver_names[CNT_DEVICES] = {"Hub1", "Hub2", "HID1", "HID2", "HID3", "USERIAL1" };
  15. bool driver_active[CNT_DEVICES] = {false, false, false, false};
  16. void setup()
  17. {
  18. pinMode(13, OUTPUT);
  19. pinMode(2, OUTPUT);
  20. pinMode(3, OUTPUT);
  21. for (int i = 0; i < 5; i++) {
  22. digitalWrite(2, HIGH);
  23. delayMicroseconds(50);
  24. digitalWrite(2, LOW);
  25. delayMicroseconds(50);
  26. }
  27. while (!Serial && (millis() < 5000)) ; // wait for Arduino Serial Monitor
  28. Serial.println("\n\nUSB Host Testing - Serial");
  29. myusb.begin();
  30. Serial1.begin(115200); // We will echo stuff Through Serial1...
  31. }
  32. void loop()
  33. {
  34. digitalWrite(13, !digitalRead(13));
  35. myusb.Task();
  36. // Print out information about different devices.
  37. for (uint8_t i = 0; i < CNT_DEVICES; i++) {
  38. if (*drivers[i] != driver_active[i]) {
  39. if (driver_active[i]) {
  40. Serial.printf("*** Device %s - disconnected ***\n", driver_names[i]);
  41. driver_active[i] = false;
  42. } else {
  43. Serial.printf("*** Device %s %x:%x - connected ***\n", driver_names[i], drivers[i]->idVendor(), drivers[i]->idProduct());
  44. driver_active[i] = true;
  45. const uint8_t *psz = drivers[i]->manufacturer();
  46. if (psz && *psz) Serial.printf(" manufacturer: %s\n", psz);
  47. psz = drivers[i]->product();
  48. if (psz && *psz) Serial.printf(" product: %s\n", psz);
  49. psz = drivers[i]->serialNumber();
  50. if (psz && *psz) Serial.printf(" Serial: %s\n", psz);
  51. // If this is a new Serial device.
  52. if (drivers[i] == &userial) {
  53. // Lets try first outputting something to our USerial to see if it will go out...
  54. userial.begin(1000000);
  55. #if 0
  56. userial.println("abcdefghijklmnopqrstuvwxyz");
  57. userial.println("ABCDEFGHIJKLMNOPQURSTUVWYZ");
  58. userial.flush(); // force it out now.
  59. userial.println("0123456789");
  60. userial.flush();
  61. delay(2);
  62. userial.println("abcdefghijklmnopqrstuvwxyz");
  63. userial.println("ABCDEFGHIJKLMNOPQURSTUVWYZ");
  64. delay(2);
  65. userial.println("!@#$%^&*()");
  66. userial.flush();
  67. #endif
  68. }
  69. }
  70. }
  71. }
  72. while (Serial.available()) {
  73. Serial.println("Serial Available");
  74. int ch = Serial.read();
  75. if (ch == '$') {
  76. BioloidTest();
  77. while (Serial.read() != -1);
  78. }
  79. else userial.write(ch);
  80. }
  81. while (Serial1.available()) {
  82. // Serial.println("Serial1 Available");
  83. Serial1.write(Serial1.read());
  84. }
  85. while (userial.available()) {
  86. // Serial.println("USerial Available");
  87. Serial.write(userial.read());
  88. }
  89. }
  90. //#define ID_MASTER 200
  91. #define ID_MASTER 0xfd
  92. // Extract stuff from Bioloid library..
  93. #define AX12_BUFFER_SIZE 128
  94. #define COUNTER_TIMEOUT 12000
  95. /** Instruction Set **/
  96. #define AX_PING 1
  97. #define AX_READ_DATA 2
  98. #define AX_WRITE_DATA 3
  99. #define AX_REG_WRITE 4
  100. #define AX_ACTION 5
  101. #define AX_RESET 6
  102. #define AX_SYNC_WRITE 131
  103. #define AX_TORQUE_ENABLE 24
  104. #define AX_LED 25
  105. #define AX_CW_COMPLIANCE_MARGIN 26
  106. #define AX_CCW_COMPLIANCE_MARGIN 27
  107. #define AX_CW_COMPLIANCE_SLOPE 28
  108. #define AX_CCW_COMPLIANCE_SLOPE 29
  109. #define AX_GOAL_POSITION_L 30
  110. #define AX_GOAL_POSITION_H 31
  111. #define AX_GOAL_SPEED_L 32
  112. #define AX_GOAL_SPEED_H 33
  113. #define AX_TORQUE_LIMIT_L 34
  114. #define AX_TORQUE_LIMIT_H 35
  115. #define AX_PRESENT_POSITION_L 36
  116. #define AX_PRESENT_POSITION_H 37
  117. void BioloidTest() {
  118. uint8_t master_id = 200;
  119. Serial.println("\n*** Bioloid Test ***");
  120. if (ax12GetRegister(master_id, 0, 1) != -1) {
  121. Serial.println("Controller found at 200");
  122. } else {
  123. Serial.println("Controller not at 200 try 0xfd");
  124. master_id = 0xfd;
  125. if (ax12GetRegister(master_id, 0, 1) != -1) {
  126. Serial.println("Controller found at 0xfd");
  127. } else {
  128. Serial.println("Controller not found");
  129. }
  130. }
  131. for (uint8_t reg = 0; reg < 10; reg++) {
  132. myusb.Task();
  133. Serial.print(ax12GetRegister(master_id, reg, 1), HEX);
  134. Serial.print(" ");
  135. }
  136. Serial.println();
  137. // Now assuming we found controller...
  138. // May need to turn on power on controller
  139. ax12SetRegister(master_id, AX_TORQUE_ENABLE, 1);
  140. delay(2);
  141. // Lets see if we can get the current position for any servo
  142. for (int i = 0; i < 254; i++) {
  143. int servo_pos = ax12GetRegister(i, AX_PRESENT_POSITION_L, 2);
  144. if (servo_pos != -1) {
  145. Serial.printf("Servo: %d Pos: %d\n", i, servo_pos);
  146. }
  147. }
  148. }
  149. unsigned char ax_rx_buffer[AX12_BUFFER_SIZE];
  150. int ax12GetRegister(int id, int regstart, int length) {
  151. // 0xFF 0xFF ID LENGTH INSTRUCTION PARAM... CHECKSUM
  152. int return_value;
  153. digitalWriteFast(2, HIGH);
  154. int checksum = ~((id + 6 + regstart + length) % 256);
  155. userial.write(0xFF);
  156. userial.write(0xFF);
  157. userial.write(id);
  158. userial.write(4); // length
  159. userial.write(AX_READ_DATA);
  160. userial.write(regstart);
  161. userial.write(length);
  162. userial.write(checksum);
  163. userial.flush(); // make sure the data goes out.
  164. if (ax12ReadPacket(length + 6) > 0) {
  165. // ax12Error = ax_rx_buffer[4];
  166. if (length == 1)
  167. return_value = ax_rx_buffer[5];
  168. else
  169. return_value = ax_rx_buffer[5] + (ax_rx_buffer[6] << 8);
  170. } else {
  171. digitalWriteFast(3, !digitalReadFast(3));
  172. return_value = -1;
  173. }
  174. digitalWriteFast(2, LOW);
  175. return return_value;
  176. }
  177. void ax12SetRegister(int id, int regstart, int data){
  178. int checksum = ~((id + 4 + AX_WRITE_DATA + regstart + (data&0xff)) % 256);
  179. userial.write(0xFF);
  180. userial.write(0xFF);
  181. userial.write(id);
  182. userial.write(4); // length
  183. userial.write(AX_WRITE_DATA);
  184. userial.write(regstart);
  185. userial.write(data&0xff);
  186. // checksum =
  187. userial.write(checksum);
  188. userial.flush();
  189. //ax12ReadPacket();
  190. }
  191. int ax12ReadPacket(int length) {
  192. unsigned long ulCounter;
  193. unsigned char offset, checksum;
  194. unsigned char *psz;
  195. unsigned char *pszEnd;
  196. int ch;
  197. offset = 0;
  198. psz = ax_rx_buffer;
  199. pszEnd = &ax_rx_buffer[length];
  200. while (userial.read() != -1) ;
  201. uint32_t ulStart = millis();
  202. // Need to wait for a character or a timeout...
  203. do {
  204. ulCounter = COUNTER_TIMEOUT;
  205. while ((ch = userial.read()) == -1) {
  206. if ((millis() - ulStart) > 10) {
  207. //if (!--ulCounter) {
  208. // Serial.println("Timeout");
  209. return 0; // Timeout
  210. }
  211. }
  212. } while (ch != 0xff) ;
  213. *psz++ = 0xff;
  214. while (psz != pszEnd) {
  215. ulCounter = COUNTER_TIMEOUT;
  216. while ((ch = userial.read()) == -1) {
  217. //Serial.printf("Read ch: %x\n", ch);
  218. if (!--ulCounter) {
  219. return 0; // Timeout
  220. }
  221. }
  222. *psz++ = (unsigned char)ch;
  223. }
  224. checksum = 0;
  225. for (offset = 2; offset < length; offset++)
  226. checksum += ax_rx_buffer[offset];
  227. if (checksum != 255) {
  228. return 0;
  229. } else {
  230. return 1;
  231. }
  232. }