123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #include <Wire.h>
- #include <PPMReader.h>
- #include <drivers/PwmOut.h>
- //git add -A
- //git commit
- //git push origin master
- // Initialize a PPMReader on digital pin 3 with 6 expected channels.
- byte interruptPin = 11;
- byte channelAmount = 8;
- PPMReader ppm(interruptPin, channelAmount);
- #define PIN_TRIGGER 12
- #define PIN_ECHO 13
- int channel_ID_steering = 1;
- int channel_ID_speed = 3;
- const int SENSOR_MAX_RANGE = 300; // in cm
- unsigned long duration;
- unsigned int distance;
- class Motor{
- int _pina;
- int _pinb;
- bool _first = true;
- float _prev = 0;
- mbed::PwmOut* _pwm = NULL;
- public:
- void Setup(int a, int b)
- {
- _pina = a;
- _pinb = b;
- pinMode(_pina, OUTPUT);
- pinMode(_pinb, OUTPUT);
- }
- void SetPower(float pow)
- {
- if(_first){
- _first = false;
- _prev = pow;
- }
- if(_pwm != NULL)
- {
- delete _pwm;
- _pwm = NULL;
- }
- if(pow < 0)
- {
- if(_pwm == NULL)
- {
- _pwm = new mbed::PwmOut(digitalPinToPinName(_pinb));
- _pwm->period_ms(2); //500Hz
- }
- digitalWrite(_pina,0);
-
- _pwm->write(-pow);
- }
- else
- {
- if(_pwm == NULL)
- {
- _pwm = new mbed::PwmOut(digitalPinToPinName(_pina));
- _pwm->period_ms(2); //500Hz
- }
- digitalWrite(_pinb,0);
-
- _pwm->write(pow);
- }
- }
- }; // ; am Ende einer Klasse
- Motor motor_fl;
- Motor motor_fr;
- Motor motor_rl;
- Motor motor_rr;
- void setup() {
- Serial.begin(9600);
-
- motor_fl.Setup(2, 3);
- motor_fr.Setup(9, 8);
- motor_rl.Setup(5, 4);
- motor_rr.Setup(6, 7);
- Wire.begin(); // join i2c bus (address optional for master)
- pinMode(A4, INPUT_PULLUP);
- pinMode(A5, INPUT_PULLUP);
- }
-
- void loop() {
- int steering_value_raw = ppm.latestValidChannelValue(channel_ID_steering, 0);
- int speed_value_raw = ppm.latestValidChannelValue(channel_ID_speed, 0);
- float steering_value = (steering_value_raw == 0)? 1 : (1/500.0f) * steering_value_raw - 3; // == Bedingung, danach wenn True: wenn False
- float speed_value = (speed_value_raw == 0)? 1 : (1/500.0f) * speed_value_raw - 3;
- if (steering_value < -1)
- steering_value = -1;
- else if (steering_value > 1)
- steering_value = 1;
- float motor_right = (-steering_value + speed_value);
- float motor_left = (steering_value + speed_value);
- float factor = max (abs(motor_right), abs(motor_left));
- if (factor > 1) {
- motor_right = motor_right / factor;
- motor_left = motor_left / factor;
- }
-
- delay(20);
-
- motor_rr.SetPower(motor_right);
- motor_rl.SetPower(motor_left);
- motor_fr.SetPower(motor_right);
- motor_fl.SetPower(motor_left);
- Serial.println(String(motor_left) + "\t" + String(motor_right));
- //while(true);
- }
|