GoPLUS2.ino 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /*
  2. Description: Use GoPLUS Module for four-channel servo test and three-channel
  3. ADC test.
  4. */
  5. #include <M5Stack.h>
  6. #include <Wire.h>
  7. #include <driver/rmt.h>
  8. #include <math.h>
  9. #include "GoPlus2.h"
  10. GoPlus2 goPlus;
  11. #define X_LOCAL 40
  12. #define Y_LOCAL 30
  13. #define X_OFFSET 160
  14. #define Y_OFFSET 23
  15. #define rrmt_item32_timemout_us 9500
  16. int _hub1, hub1 = 0;
  17. rmt_item32_t signals[1024];
  18. size_t received = 0;
  19. int flag = 0;
  20. int num = 0;
  21. void header(const char *string, uint16_t color) {
  22. M5.Lcd.fillScreen(color);
  23. M5.Lcd.setTextSize(1);
  24. M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  25. M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLACK);
  26. M5.Lcd.setTextDatum(TC_DATUM);
  27. M5.Lcd.drawString(string, 160, 3, 4);
  28. }
  29. void Motor() {
  30. while (num == 0) {
  31. M5.Lcd.fillRect(0, 40, 320, 100, TFT_BLACK);
  32. M5.Lcd.setCursor(20, 40, 4);
  33. M5.Lcd.println("Motor Test");
  34. M5.Lcd.setCursor(20, 60, 4);
  35. M5.Lcd.println("Motor Speed: -127");
  36. goPlus.Motor_write_speed(MOTOR_NUM1, -127);
  37. goPlus.Motor_write_speed(MOTOR_NUM0, -127);
  38. delay(1000);
  39. goPlus.Motor_write_speed(MOTOR_NUM1, 0);
  40. goPlus.Motor_write_speed(MOTOR_NUM0, 0);
  41. delay(1000);
  42. M5.Lcd.fillRect(0, 60, 320, 180, TFT_BLACK);
  43. M5.Lcd.setCursor(20, 60, 4);
  44. M5.Lcd.println("Motor Speed: 127");
  45. goPlus.Motor_write_speed(MOTOR_NUM1, 127);
  46. goPlus.Motor_write_speed(MOTOR_NUM0, 127);
  47. delay(1000);
  48. goPlus.Motor_write_speed(MOTOR_NUM1, 0);
  49. goPlus.Motor_write_speed(MOTOR_NUM0, 0);
  50. delay(1000);
  51. }
  52. }
  53. void Servo() {
  54. while (num == 1) {
  55. M5.Lcd.fillRect(0, 40, 320, 100, TFT_BLACK);
  56. M5.Lcd.setCursor(20, 40, 4);
  57. M5.Lcd.println("Servo Test");
  58. M5.Lcd.setCursor(20, 60, 4);
  59. M5.Lcd.println("Servo Angle: 0");
  60. goPlus.Servo_write_angle(SERVO_NUM0, 0);
  61. goPlus.Servo_write_angle(SERVO_NUM1, 0);
  62. goPlus.Servo_write_angle(SERVO_NUM2, 0);
  63. goPlus.Servo_write_angle(SERVO_NUM3, 0);
  64. delay(1000);
  65. M5.Lcd.fillRect(0, 60, 320, 100, TFT_BLACK);
  66. M5.Lcd.setCursor(20, 60, 4);
  67. M5.Lcd.println("Pluse Width: 2000");
  68. goPlus.Servo_write_plusewidth(SERVO_NUM0_PW, 2500);
  69. goPlus.Servo_write_plusewidth(SERVO_NUM1_PW, 2500);
  70. goPlus.Servo_write_plusewidth(SERVO_NUM2_PW, 2500);
  71. goPlus.Servo_write_plusewidth(SERVO_NUM3_PW, 2500);
  72. delay(1000);
  73. }
  74. }
  75. void Port_B() {
  76. M5.Lcd.fillRect(0, 40, 320, 100, TFT_BLACK);
  77. while (num == 2) {
  78. M5.Lcd.setCursor(0, 40, 4);
  79. hub1 = goPlus.hub1_a_read_value(HUB1_R_ADDR);
  80. if (abs(hub1 - _hub1) > 3) {
  81. M5.Lcd.fillRect(160, 40, 70, 20, TFT_BLACK);
  82. }
  83. _hub1 = hub1;
  84. M5.Lcd.printf("HUB1 Analog: %d \r\n", hub1);
  85. int hub2 = goPlus.hub2_d_read_value(HUB2_R_O_ADDR);
  86. M5.Lcd.printf("HUB2 Digital: %d\r\n", hub2);
  87. if (M5.BtnC.wasPressed()) {
  88. flag = !flag;
  89. goPlus.hub3_wire_value(HUB3_W_ADDR, flag);
  90. }
  91. M5.update();
  92. M5.Lcd.printf("HUB3 State: %d\r\n", flag);
  93. }
  94. }
  95. void rx_channel_init() {
  96. rmt_config_t rmt_rx;
  97. rmt_rx.channel = RMT_CHANNEL_0;
  98. rmt_rx.gpio_num = GPIO_NUM_35;
  99. rmt_rx.clk_div = 80;
  100. rmt_rx.mem_block_num = 4;
  101. rmt_rx.rmt_mode = RMT_MODE_RX;
  102. rmt_rx.rx_config.filter_en = false;
  103. rmt_rx.rx_config.filter_ticks_thresh = 0;
  104. rmt_rx.rx_config.idle_threshold = 5000;
  105. rmt_config(&rmt_rx);
  106. rmt_driver_install(rmt_rx.channel, 1000, 0);
  107. }
  108. void tx_channel_init() {
  109. rmt_config_t rmt_tx;
  110. rmt_tx.rmt_mode = RMT_MODE_TX;
  111. rmt_tx.channel = RMT_CHANNEL_4;
  112. rmt_tx.gpio_num = GPIO_NUM_5;
  113. rmt_tx.mem_block_num = 4;
  114. rmt_tx.clk_div = 80;
  115. rmt_tx.tx_config.loop_en = false;
  116. rmt_tx.tx_config.carrier_duty_percent = 50;
  117. rmt_tx.tx_config.carrier_freq_hz = 38000;
  118. rmt_tx.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;
  119. rmt_tx.tx_config.carrier_en = 1;
  120. rmt_tx.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
  121. rmt_tx.tx_config.idle_output_en = true;
  122. rmt_config(&rmt_tx);
  123. rmt_driver_install(rmt_tx.channel, 0, 0);
  124. }
  125. void rmt_rx_task() {
  126. RingbufHandle_t rb = NULL;
  127. rmt_get_ringbuf_handle(RMT_CHANNEL_0, &rb);
  128. rmt_rx_start(RMT_CHANNEL_0, 1);
  129. size_t rx_size = 0;
  130. M5.Lcd.setCursor(20, 40, 4);
  131. M5.Lcd.println("wait ir signal...");
  132. rmt_item32_t *item = (rmt_item32_t *)xRingbufferReceive(rb, &rx_size, 3000);
  133. rmt_rx_stop(RMT_CHANNEL_0);
  134. if (!item) {
  135. M5.Lcd.println("no data received");
  136. return;
  137. }
  138. M5.Lcd.print("received items: ");
  139. M5.Lcd.println(rx_size);
  140. memcpy(signals, item, sizeof(rmt_item32_t) * rx_size);
  141. for (int i = 0; i < rx_size; ++i) {
  142. signals[i].level0 = ~signals[i].level0;
  143. signals[i].level1 = ~signals[i].level1;
  144. }
  145. received = rx_size;
  146. vRingbufferReturnItem(rb, (void *)item);
  147. M5.Lcd.println("recv done");
  148. rmt_rx_stop(RMT_CHANNEL_0);
  149. rmt_tx_task();
  150. }
  151. void rmt_tx_task() {
  152. M5.Lcd.println("send...");
  153. M5.Lcd.println(received);
  154. rmt_write_items(RMT_CHANNEL_4, signals, received, false);
  155. rmt_wait_tx_done(RMT_CHANNEL_4, 2000);
  156. M5.Lcd.println("send done");
  157. }
  158. void IR() {
  159. while (num == 3) {
  160. M5.Lcd.fillRect(0, 40, 320, 200, TFT_BLACK);
  161. rmt_rx_task();
  162. }
  163. }
  164. void doTask() {
  165. if (num == 4) {
  166. num = 0;
  167. } else {
  168. num++;
  169. }
  170. Serial.println(num);
  171. }
  172. void setup() {
  173. M5.begin();
  174. goPlus.begin();
  175. delay(100);
  176. rx_channel_init();
  177. tx_channel_init();
  178. // goPlus.hub1_set_io(HUB1_R_O_ADDR, 1); //set digital_output to
  179. // digital_input goPlus.hub2_set_io(HUB2_R_O_ADDR, 1); //set
  180. // digital_output to digital_input goPlus.hub3_set_io(HUB3_R_O_ADDR, 1);
  181. // //set digital_output to digital_input
  182. header("GoPlus 2", TFT_BLACK);
  183. M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK);
  184. attachInterrupt(digitalPinToInterrupt(38), doTask, RISING);
  185. }
  186. void loop() {
  187. Servo();
  188. Motor();
  189. Port_B();
  190. IR();
  191. // int val1 = goPlus.hub1_d_o_read_value(HUB1_R_O_ADDR); //read
  192. // digtial_input int val2 = goPlus.hub2_d_o_read_value(HUB2_R_O_ADDR);
  193. // //read digtial_input int val3 =
  194. // goPlus.hub3_d_o_read_value(HUB3_R_O_ADDR); //read digtial_input
  195. // Serial.println(val1);
  196. // Serial.println(val2);
  197. // Serial.println(val3);
  198. }