motors.c 1021 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "assert.h"
  4. #include "periph/gpio.h"
  5. #include "timex.h"
  6. #include "roomba.h"
  7. #include "board.h"
  8. #define RADIUS_STRAIGHT 0x8000
  9. void motors_drive(int16_t speed, int16_t radius)
  10. {
  11. uint8_t data[4];
  12. if ((speed > 500) || (speed < (0 - 500)) || (radius > 2000) || (radius < (0 - 2000)))
  13. motors_stop();
  14. data[0] = ((uint16_t)speed) & 0xFF;
  15. data[1] = (((uint16_t)speed) & 0xFF00) >> 8;
  16. if ((radius == 0) && (speed != 0))
  17. radius = RADIUS_STRAIGHT;
  18. data[2] = ((uint16_t)radius) & 0xFF;
  19. data[3] = (((uint16_t)radius) & 0xFF00) >> 8;
  20. roomba_cmd(ROOMBA_DRIVE, data, 4);
  21. }
  22. void motors_stop(void)
  23. {
  24. motors_drive(0, 0);
  25. motors_clean_set(0,0,0);
  26. }
  27. void motors_spin(int cw)
  28. {
  29. if(cw)
  30. motors_drive(10, -1);
  31. else
  32. motors_drive(10, 1);
  33. }
  34. void motors_clean_set(int brush, int vac, int side)
  35. {
  36. uint8_t data;
  37. data = ((!!brush) << 2) | ((!!vac) << 1) | (!!side);
  38. roomba_cmd(ROOMBA_MOTORS, &data, 1);
  39. }