Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BMX055 Motor Way
main.cpp
- Committer:
- yasunorihirakawa
- Date:
- 2020-01-16
- Revision:
- 9:87df9f0ec367
- Parent:
- 8:1c1c72c69af4
File content as of revision 9:87df9f0ec367:
#include "mbed.h" #include "motor.h" DigitalOut motor_mode(D9); DigitalOut LED(D10); Motor motorL(D5, D6); Motor motorR(D3, D4); InterruptIn pg1(D12); InterruptIn pg2(D11); AnalogIn reflectorFL(A6); AnalogIn reflectorFM(A3); AnalogIn reflectorFR(A2); AnalogIn reflectorBL(A1); AnalogIn reflectorBR(A0); Thread thread_trace; Thread thread_motor; const float INTVAL_REFLECTOR(0.01);//0.01); const float INTVAL_MOTOR(0.01); float dist = 0.0; float x = 0.0; float y = 0.0; float fast_rpm = 0; float standard_rpm = 0; float slow_rpm = 0; int curve = 0; void count_pg1() { motorL.count(); } void count_pg2() { motorR.count(); } void line_trace() { //const float fast_rpm = 0; //const float standard_rpm = 0; //const float slow_rpm = 0; static float gap_pre = 0.0; const float KP = 700; const float KD = 100; const int L = 0; const int R = 1; int flag; motorL.Set_phase(L); motorR.Set_phase(R); while (1) { if(true)//curve==0) { if(reflectorFL > 0.1) { flag = L; } if(reflectorFR > 0.1) { flag = R; } if( reflectorFM<=0.4 ) { if( flag == L ) { motorL.Set_phase(L); motorL.Set_target(0); motorR.Set_phase(R); motorR.Set_target(standard_rpm); } else { motorL.Set_phase(L); motorL.Set_target(standard_rpm); motorR.Set_phase(R); motorR.Set_target(0); } } else { if( reflectorFL>0.1 && reflectorFR>0.1 ) { motorL.Set_phase(L); motorL.Set_target(fast_rpm); motorR.Set_phase(R); motorR.Set_target(fast_rpm); } else { if( reflectorBL.read() >= reflectorBR.read() ) { float voltage_gap = reflectorBL.read() - reflectorBR.read(); motorR.Set_phase(R); motorR.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre)); motorL.Set_phase(L); motorL.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre)); gap_pre = voltage_gap; } else { float voltage_gap = reflectorBR.read() - reflectorBL.read(); motorR.Set_phase(R); motorR.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre)); motorL.Set_phase(L); motorL.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre)); gap_pre = voltage_gap; } } } } else { if( reflectorFM<=0.4 ) { if( flag == L ) { motorL.Set_phase(L); motorL.Set_target(0); motorR.Set_phase(R); motorR.Set_target(standard_rpm); } else { motorL.Set_phase(L); motorL.Set_target(standard_rpm); motorR.Set_phase(R); motorR.Set_target(0); } } else { if( reflectorFL>0.1 && reflectorFR>0.1 ) { motorL.Set_phase(L); motorL.Set_target(fast_rpm); motorR.Set_phase(R); motorR.Set_target(fast_rpm); } else { if( reflectorBL.read() >= reflectorBR.read() ) { float voltage_gap = reflectorBL.read() - reflectorBR.read(); motorR.Set_phase(R); motorR.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre)); motorL.Set_phase(L); motorL.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre)); gap_pre = voltage_gap; } else { float voltage_gap = reflectorBR.read() - reflectorBL.read(); motorR.Set_phase(R); motorR.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre)); motorL.Set_phase(L); motorL.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre)); gap_pre = voltage_gap; } } } } //printf("%f %f %f %f %f flag: %d \n", reflectorFL.read(), reflectorFM.read(), reflectorFR.read(), reflectorBL.read(), reflectorBR.read(), flag); wait(INTVAL_REFLECTOR); } } void odometry() { const float pi = 3.14159265359; const float gear_ratio = 1 / 38.2; const float tire_size = 57.0 / 2; static float v_pre = 0.0; static float dist_count = 0.0; float vl = motorL.Get_rpm() / 60 * gear_ratio * 2 * pi * tire_size; float vr = motorR.Get_rpm() / 60 * gear_ratio * 2 * pi * tire_size; float v = (vl + vr) / 2; dist += (v + v_pre) * INTVAL_MOTOR / 2; dist_count += (v + v_pre) * INTVAL_MOTOR / 2; v_pre = v; if (dist<=6850) { fast_rpm = 5000; standard_rpm = 4500; curve = 0; } else if(dist<=7350) { fast_rpm = 4000; standard_rpm = 4000; curve = 0; } else { fast_rpm = 5000; standard_rpm = 4500; curve = 0; } //printf("%f\n", dist); if (dist_count >= 200) { LED = !LED; dist_count -= 200; } } void control_motor() { while (1) { motorL.drive(); motorR.drive(); odometry(); wait(INTVAL_MOTOR); } } int main() { motor_mode = 1; LED = 1; pg1.rise(&count_pg1); pg1.fall(&count_pg1); pg2.rise(&count_pg2); pg2.fall(&count_pg2); thread_trace.start(callback(line_trace)); thread_motor.start(callback(control_motor)); }