Distanzsensoren_auswerten.ino 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <Wire.h>
  2. #include <PPMReader.h>
  3. #include <drivers/PwmOut.h>
  4. // Initialize a PPMReader on digital pin 3 with 6 expected channels.
  5. byte interruptPin = 11;
  6. byte channelAmount = 8;
  7. PPMReader ppm(interruptPin, channelAmount);
  8. #define PIN_TRIGGER 12
  9. #define PIN_ECHO 13
  10. int channel_ID_steering = 1;
  11. int channel_ID_speed = 3;
  12. const int SENSOR_MAX_RANGE = 300; // in cm
  13. unsigned long duration;
  14. unsigned int distance;
  15. class Motor{
  16. int _pina;
  17. int _pinb;
  18. bool _first = true;
  19. float _prev = 0;
  20. mbed::PwmOut* _pwm = NULL;
  21. public:
  22. void Setup(int a, int b)
  23. {
  24. _pina = a;
  25. _pinb = b;
  26. pinMode(_pina, OUTPUT);
  27. pinMode(_pinb, OUTPUT);
  28. }
  29. void SetPower(float pow)
  30. {
  31. if(_first){
  32. _first = false;
  33. _prev = pow;
  34. }
  35. if(_pwm != NULL)
  36. {
  37. delete _pwm;
  38. _pwm = NULL;
  39. }
  40. if(pow < 0)
  41. {
  42. if(_pwm == NULL)
  43. {
  44. _pwm = new mbed::PwmOut(digitalPinToPinName(_pinb));
  45. _pwm->period_ms(2); //500Hz
  46. }
  47. digitalWrite(_pina,0);
  48. _pwm->write(-pow);
  49. }
  50. else
  51. {
  52. if(_pwm == NULL)
  53. {
  54. _pwm = new mbed::PwmOut(digitalPinToPinName(_pina));
  55. _pwm->period_ms(2); //500Hz
  56. }
  57. digitalWrite(_pinb,0);
  58. _pwm->write(pow);
  59. }
  60. }
  61. }; // ; am Ende einer Klasse
  62. Motor motor_fl;
  63. Motor motor_fr;
  64. Motor motor_rl;
  65. Motor motor_rr;
  66. void setup() {
  67. Serial.begin(9600);
  68. motor_fl.Setup(2, 3);
  69. motor_fr.Setup(9, 8);
  70. motor_rl.Setup(5, 4);
  71. motor_rr.Setup(6, 7);
  72. Wire.begin(); // join i2c bus (address optional for master)
  73. pinMode(A4, INPUT_PULLUP);
  74. pinMode(A5, INPUT_PULLUP);
  75. }
  76. void loop() {
  77. int steering_value_raw = ppm.latestValidChannelValue(channel_ID_steering, 0);
  78. int speed_value_raw = ppm.latestValidChannelValue(channel_ID_speed, 0);
  79. float steering_value = (steering_value_raw == 0)? 1 : (1/500.0f) * steering_value_raw - 3; // == Bedingung, danach wenn True: wenn False
  80. float speed_value = (speed_value_raw == 0)? 1 : (1/500.0f) * speed_value_raw - 3;
  81. if (steering_value < -1)
  82. steering_value = -1;
  83. else if (steering_value > 1)
  84. steering_value = 1;
  85. float motor_right = (-steering_value + speed_value);
  86. float motor_left = (steering_value + speed_value);
  87. float factor = max (abs(motor_right), abs(motor_left));
  88. if (factor > 1) {
  89. motor_right = motor_right / factor;
  90. motor_left = motor_left / factor;
  91. }
  92. delay(20);
  93. motor_rr.SetPower(motor_right);
  94. motor_rl.SetPower(motor_left);
  95. motor_fr.SetPower(motor_right);
  96. motor_fl.SetPower(motor_left);
  97. Serial.println(String(motor_left) + "\t" + String(motor_right));
  98. //while(true);
  99. }