Werkt dit?
Dependencies: mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
main.cpp@8:6f6a4dc12036, 2019-10-04 (annotated)
- Committer:
- PatrickZieverink
- Date:
- Fri Oct 04 17:44:30 2019 +0000
- Revision:
- 8:6f6a4dc12036
- Parent:
- 7:78bc59c7753c
- Child:
- 9:6537eead1241
Werkend met motoren, of ze beide werken geen idee;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RobertoO | 0:67c50348f842 | 1 | #include "mbed.h" |
RobertoO | 1:b862262a9d14 | 2 | #include "MODSERIAL.h" |
joostbonekamp | 2:bbaa6fca2ab1 | 3 | #include "FastPWM.h" |
joostbonekamp | 2:bbaa6fca2ab1 | 4 | #include "QEI.h" |
RobertoO | 0:67c50348f842 | 5 | |
PatrickZieverink | 7:78bc59c7753c | 6 | Serial pc(USBTX, USBRX); //verbinden met pc |
joostbonekamp | 4:36e32ddf2443 | 7 | DigitalOut motor2_direction(D4); //verbinden met motor 2 op board (altijd d4) |
joostbonekamp | 5:aa8b5d5e632f | 8 | FastPWM motor2_pwm(D5); //verbinden met motor 2 pwm (altijd d5) |
PatrickZieverink | 8:6f6a4dc12036 | 9 | DigitalOut motor1_direction(D6); //verbinden met motor 2 op board (altijd d4) |
PatrickZieverink | 8:6f6a4dc12036 | 10 | FastPWM motor1_pwm(D7); //verbinden met motor 2 pwm (altijd d5) |
joostbonekamp | 5:aa8b5d5e632f | 11 | Ticker loop_ticker; //used in main() |
PatrickZieverink | 8:6f6a4dc12036 | 12 | AnalogIn Pot1(A1); //pot 1 op biorobotics shield |
PatrickZieverink | 8:6f6a4dc12036 | 13 | AnalogIn Pot2(A0); //pot 2 op biorobotics shield |
PatrickZieverink | 8:6f6a4dc12036 | 14 | InterruptIn but1(D10); //knop 1 op birorobotics shield |
PatrickZieverink | 8:6f6a4dc12036 | 15 | InterruptIn but2(D9); //knop 1 op birorobotics shield |
PatrickZieverink | 8:6f6a4dc12036 | 16 | QEI encoder1 (D11, D12, NC, 8400, QEI::X4_ENCODING); //encoder 1 gebruiken |
PatrickZieverink | 8:6f6a4dc12036 | 17 | QEI encoder2 (D1, D2, NC, 8400, QEI::X4_ENCODING); //encoder 2 gebruiken |
joostbonekamp | 3:e3d12393adb1 | 18 | |
joostbonekamp | 5:aa8b5d5e632f | 19 | //variables |
joostbonekamp | 5:aa8b5d5e632f | 20 | enum States {idle, cw, ccw, end, failure}; |
PatrickZieverink | 8:6f6a4dc12036 | 21 | States current_state; //Definieren van de current_state met als keuzes Idle, cw, ccw, end en failure |
PatrickZieverink | 8:6f6a4dc12036 | 22 | |
PatrickZieverink | 8:6f6a4dc12036 | 23 | class motor_state { // Een emmer met variabelen die je hierna motor gaat noemen. |
PatrickZieverink | 8:6f6a4dc12036 | 24 | public: //Wat is public? |
joostbonekamp | 5:aa8b5d5e632f | 25 | float pwm1; //pwm of 1st motor |
joostbonekamp | 5:aa8b5d5e632f | 26 | float pwm2; //pwm of 2nd motor |
joostbonekamp | 5:aa8b5d5e632f | 27 | int dir1; //direction of 1st motor |
joostbonekamp | 5:aa8b5d5e632f | 28 | int dir2; //direction of 2nd motor |
PatrickZieverink | 8:6f6a4dc12036 | 29 | float speed1; // speed motor 1 |
PatrickZieverink | 8:6f6a4dc12036 | 30 | double speed2; // speed motor 2 |
joostbonekamp | 5:aa8b5d5e632f | 31 | }; |
PatrickZieverink | 8:6f6a4dc12036 | 32 | motor_state motor; //Een emmer met variabelen met motor.iets als naam bijv. motor.speed1 |
joostbonekamp | 5:aa8b5d5e632f | 33 | |
joostbonekamp | 5:aa8b5d5e632f | 34 | bool state_changed = false; |
PatrickZieverink | 8:6f6a4dc12036 | 35 | volatile bool but1_pressed = false; |
PatrickZieverink | 8:6f6a4dc12036 | 36 | volatile bool but2_pressed = false; |
PatrickZieverink | 8:6f6a4dc12036 | 37 | float pot_1 = 0; |
PatrickZieverink | 8:6f6a4dc12036 | 38 | float pot_2 = 0; |
joostbonekamp | 5:aa8b5d5e632f | 39 | |
PatrickZieverink | 8:6f6a4dc12036 | 40 | // the funtions needed to run the program |
PatrickZieverink | 8:6f6a4dc12036 | 41 | void measure_signals() { |
PatrickZieverink | 8:6f6a4dc12036 | 42 | pot_1 = Pot1.read(); |
PatrickZieverink | 8:6f6a4dc12036 | 43 | pc.printf("pot_1 = %f",pot_1); // Dit doet hij niet, waarom niet? Er scheelt niet veel aan, maar toch |
PatrickZieverink | 8:6f6a4dc12036 | 44 | motor.speed1 = pot_1*0.75; //pod_read * 0.75 (dus max 75%) |
PatrickZieverink | 8:6f6a4dc12036 | 45 | |
PatrickZieverink | 8:6f6a4dc12036 | 46 | pot_2 = Pot2.read(); |
PatrickZieverink | 8:6f6a4dc12036 | 47 | pc.printf("pot_2 = %f",pot_2); // Dit doet hij niet, waarom niet? Er scheelt niet veel aan, maar toch |
PatrickZieverink | 8:6f6a4dc12036 | 48 | motor.speed2 = pot_2*0.75; //pod_read * 0.75 (dus max 75%) |
PatrickZieverink | 8:6f6a4dc12036 | 49 | return; |
PatrickZieverink | 8:6f6a4dc12036 | 50 | } |
joostbonekamp | 5:aa8b5d5e632f | 51 | |
joostbonekamp | 5:aa8b5d5e632f | 52 | void do_nothing() { |
PatrickZieverink | 8:6f6a4dc12036 | 53 | motor.speed1 = 0; |
PatrickZieverink | 8:6f6a4dc12036 | 54 | motor.speed2 = 0; |
PatrickZieverink | 7:78bc59c7753c | 55 | |
PatrickZieverink | 8:6f6a4dc12036 | 56 | if (but1_pressed == true) { //this moves the program from the idle to cw state |
joostbonekamp | 5:aa8b5d5e632f | 57 | current_state = cw; |
joostbonekamp | 6:354a6509405f | 58 | state_changed = true; //to show next state it can initialize |
joostbonekamp | 5:aa8b5d5e632f | 59 | pc.printf("Changed state from idle to cw\r\n"); |
PatrickZieverink | 8:6f6a4dc12036 | 60 | but1_pressed = false; //reset button 1 |
joostbonekamp | 5:aa8b5d5e632f | 61 | } |
PatrickZieverink | 7:78bc59c7753c | 62 | |
joostbonekamp | 5:aa8b5d5e632f | 63 | } |
PatrickZieverink | 7:78bc59c7753c | 64 | |
PatrickZieverink | 7:78bc59c7753c | 65 | |
joostbonekamp | 5:aa8b5d5e632f | 66 | void rotate_cw() { |
joostbonekamp | 5:aa8b5d5e632f | 67 | if (state_changed) { |
joostbonekamp | 5:aa8b5d5e632f | 68 | pc.printf("State changed to CW\r\n"); |
joostbonekamp | 6:354a6509405f | 69 | state_changed = false; //reset this so it wont print next loop |
joostbonekamp | 5:aa8b5d5e632f | 70 | } |
PatrickZieverink | 8:6f6a4dc12036 | 71 | motor.dir1 = 1; //todo: check if this is actually clockwise |
PatrickZieverink | 7:78bc59c7753c | 72 | motor.dir2 = 1; //todo: check if this is actually clockwise |
PatrickZieverink | 7:78bc59c7753c | 73 | |
PatrickZieverink | 8:6f6a4dc12036 | 74 | if (!state_changed && but1_pressed) { //state wasnt just changed, button 1 has been pressed -> change state |
joostbonekamp | 5:aa8b5d5e632f | 75 | current_state = ccw; |
joostbonekamp | 5:aa8b5d5e632f | 76 | state_changed = true; |
PatrickZieverink | 8:6f6a4dc12036 | 77 | but1_pressed = false; //reset this |
joostbonekamp | 5:aa8b5d5e632f | 78 | } |
PatrickZieverink | 8:6f6a4dc12036 | 79 | |
joostbonekamp | 5:aa8b5d5e632f | 80 | } |
PatrickZieverink | 7:78bc59c7753c | 81 | |
joostbonekamp | 5:aa8b5d5e632f | 82 | void rotate_ccw() { |
joostbonekamp | 6:354a6509405f | 83 | //similar to rotate_cw() |
joostbonekamp | 5:aa8b5d5e632f | 84 | if (state_changed) { |
joostbonekamp | 5:aa8b5d5e632f | 85 | pc.printf("State changed to CCW\r\n"); |
joostbonekamp | 5:aa8b5d5e632f | 86 | state_changed = false; |
joostbonekamp | 5:aa8b5d5e632f | 87 | } |
PatrickZieverink | 8:6f6a4dc12036 | 88 | motor.dir1 = 0; |
joostbonekamp | 5:aa8b5d5e632f | 89 | motor.dir2 = 0; |
PatrickZieverink | 7:78bc59c7753c | 90 | |
PatrickZieverink | 8:6f6a4dc12036 | 91 | if (!state_changed && but1_pressed) { //state niet veranderd, button 1 gepressd -> state verandert |
joostbonekamp | 5:aa8b5d5e632f | 92 | current_state = cw; |
joostbonekamp | 5:aa8b5d5e632f | 93 | state_changed = true; |
PatrickZieverink | 8:6f6a4dc12036 | 94 | but1_pressed = false; |
joostbonekamp | 5:aa8b5d5e632f | 95 | } |
joostbonekamp | 5:aa8b5d5e632f | 96 | } |
joostbonekamp | 5:aa8b5d5e632f | 97 | |
PatrickZieverink | 8:6f6a4dc12036 | 98 | void motor_controller() { |
PatrickZieverink | 8:6f6a4dc12036 | 99 | motor1_pwm.period(0.0000625f); // 1/frequency van waarop hij draait |
PatrickZieverink | 8:6f6a4dc12036 | 100 | motor1_direction = motor.dir1; // Zet de richting goed |
PatrickZieverink | 8:6f6a4dc12036 | 101 | motor1_pwm.write(motor.speed1); // Zet het op de snelheid van motor.speed1 |
PatrickZieverink | 8:6f6a4dc12036 | 102 | |
PatrickZieverink | 8:6f6a4dc12036 | 103 | motor2_pwm.period(0.0000625f); // 1/frequency van waarop hij draait |
PatrickZieverink | 8:6f6a4dc12036 | 104 | motor2_direction = motor.dir2; |
PatrickZieverink | 8:6f6a4dc12036 | 105 | motor2_pwm.write(motor.speed2); |
PatrickZieverink | 8:6f6a4dc12036 | 106 | return; |
PatrickZieverink | 8:6f6a4dc12036 | 107 | } |
PatrickZieverink | 8:6f6a4dc12036 | 108 | |
joostbonekamp | 5:aa8b5d5e632f | 109 | void output() {return;} |
joostbonekamp | 5:aa8b5d5e632f | 110 | |
PatrickZieverink | 8:6f6a4dc12036 | 111 | void but1_interrupt () { |
PatrickZieverink | 8:6f6a4dc12036 | 112 | but1_pressed = true; |
PatrickZieverink | 8:6f6a4dc12036 | 113 | pc.printf("Button 1 pressed \n\r"); |
PatrickZieverink | 8:6f6a4dc12036 | 114 | } |
PatrickZieverink | 8:6f6a4dc12036 | 115 | |
PatrickZieverink | 8:6f6a4dc12036 | 116 | void but2_interrupt () { |
PatrickZieverink | 8:6f6a4dc12036 | 117 | but2_pressed = true; |
PatrickZieverink | 8:6f6a4dc12036 | 118 | pc.printf("Button 2 pressed \n\r"); |
joostbonekamp | 5:aa8b5d5e632f | 119 | } |
joostbonekamp | 5:aa8b5d5e632f | 120 | |
joostbonekamp | 5:aa8b5d5e632f | 121 | void state_machine() { |
joostbonekamp | 5:aa8b5d5e632f | 122 | |
PatrickZieverink | 8:6f6a4dc12036 | 123 | if (but2_pressed){ // Is dit de goede locatie hiervoor? |
PatrickZieverink | 8:6f6a4dc12036 | 124 | current_state = idle; |
PatrickZieverink | 8:6f6a4dc12036 | 125 | but2_pressed = false; |
PatrickZieverink | 8:6f6a4dc12036 | 126 | pc.printf("Do_nothing happened due to pressing button 2 \n\r"); |
PatrickZieverink | 8:6f6a4dc12036 | 127 | } |
PatrickZieverink | 8:6f6a4dc12036 | 128 | |
joostbonekamp | 5:aa8b5d5e632f | 129 | //run current state |
joostbonekamp | 5:aa8b5d5e632f | 130 | switch (current_state) { |
PatrickZieverink | 7:78bc59c7753c | 131 | case idle: // hoezo de :? |
joostbonekamp | 5:aa8b5d5e632f | 132 | do_nothing(); |
joostbonekamp | 5:aa8b5d5e632f | 133 | break; |
joostbonekamp | 5:aa8b5d5e632f | 134 | case cw: |
joostbonekamp | 5:aa8b5d5e632f | 135 | rotate_cw(); |
joostbonekamp | 5:aa8b5d5e632f | 136 | break; |
joostbonekamp | 5:aa8b5d5e632f | 137 | case ccw: |
joostbonekamp | 5:aa8b5d5e632f | 138 | rotate_ccw(); |
joostbonekamp | 5:aa8b5d5e632f | 139 | break; |
joostbonekamp | 5:aa8b5d5e632f | 140 | case end: |
joostbonekamp | 5:aa8b5d5e632f | 141 | break; |
joostbonekamp | 5:aa8b5d5e632f | 142 | case failure: |
joostbonekamp | 5:aa8b5d5e632f | 143 | break; |
joostbonekamp | 5:aa8b5d5e632f | 144 | } |
joostbonekamp | 5:aa8b5d5e632f | 145 | } |
joostbonekamp | 5:aa8b5d5e632f | 146 | |
PatrickZieverink | 8:6f6a4dc12036 | 147 | |
joostbonekamp | 5:aa8b5d5e632f | 148 | void main_loop() { |
joostbonekamp | 5:aa8b5d5e632f | 149 | measure_signals(); |
joostbonekamp | 5:aa8b5d5e632f | 150 | state_machine(); |
joostbonekamp | 5:aa8b5d5e632f | 151 | motor_controller(); |
joostbonekamp | 5:aa8b5d5e632f | 152 | output(); |
joostbonekamp | 5:aa8b5d5e632f | 153 | } |
joostbonekamp | 3:e3d12393adb1 | 154 | |
joostbonekamp | 2:bbaa6fca2ab1 | 155 | int main() { |
joostbonekamp | 3:e3d12393adb1 | 156 | pc.baud(115200); |
PatrickZieverink | 8:6f6a4dc12036 | 157 | pc.printf("Executing main()... \r\n"); |
joostbonekamp | 5:aa8b5d5e632f | 158 | current_state = idle; |
joostbonekamp | 3:e3d12393adb1 | 159 | |
joostbonekamp | 5:aa8b5d5e632f | 160 | motor.dir1 = 0; |
joostbonekamp | 5:aa8b5d5e632f | 161 | motor.dir2 = 0; |
PatrickZieverink | 7:78bc59c7753c | 162 | |
PatrickZieverink | 8:6f6a4dc12036 | 163 | but1.fall(&but1_interrupt); |
PatrickZieverink | 8:6f6a4dc12036 | 164 | but2.fall(&but2_interrupt); |
PatrickZieverink | 7:78bc59c7753c | 165 | loop_ticker.attach(&main_loop, 0.1f); //main loop at 1kHz |
PatrickZieverink | 8:6f6a4dc12036 | 166 | pc.printf("Main_loop is running\n \r"); |
joostbonekamp | 5:aa8b5d5e632f | 167 | while (true) {} |
joostbonekamp | 6:354a6509405f | 168 | } |