GoPLUS2.ino 6.2 KB

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