Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.63 KB | None | 0 0
  1. #include <AFMotor.h>
  2. #include <NewPing.h>
  3.  
  4. enum Maneuver {
  5. LEFT_MVR,
  6. RIGHT_MVR
  7. };
  8.  
  9. NewPing sonarL(37,39, 150);
  10. NewPing sonarC(41,43, 150);
  11. NewPing sonarR(40,42, 150);
  12. NewPing sonarB(30,32, 150);
  13. NewPing sonarSL(31,33, 150);
  14. NewPing sonarSR(50,52, 150);
  15.  
  16. AF_DCMotor m_FL(4, MOTOR34_64KHZ);
  17. AF_DCMotor m_FR(3, MOTOR34_64KHZ);
  18. AF_DCMotor m_BL(1, MOTOR12_64KHZ);
  19. AF_DCMotor m_BR(2, MOTOR12_64KHZ);
  20.  
  21. float distL, lastDistC, distC, distR, distSideR, distSideL, distB;
  22. unsigned int balancer = 8; //количество циклов прямой езды
  23. Maneuver lastManeuver; //последний манёвр
  24.  
  25. int direction = 0; //текущий курс относительно начального. Стремится к нулю
  26.  
  27. void ultrazvuk(){
  28. lastDistC=distC;
  29.  
  30. distL = sonarL.ping_cm();
  31. if(distL==0) distL=150;
  32. distC = sonarC.ping_cm();
  33. if(distC==0) distC=150;
  34. distR = sonarR.ping_cm();
  35. if(distR==0) distR=150;
  36. distB = sonarB.ping_cm();
  37. if(distB==0) distB=150;
  38. distSideL = sonarSL.ping_cm();
  39. if(distSideL==0) distSideL=150;
  40. distSideR = sonarSR.ping_cm();
  41. if(distSideR==0) distSideR=150;
  42. }
  43.  
  44. void dvig (int sFL, int sFR,int sBL,int sBR) {
  45. if(abs(sFL) > 250) {
  46. return;
  47. }
  48. if (sFL > 0){
  49. m_FL.run(FORWARD);
  50. }
  51. else {
  52. m_FL.run(BACKWARD);
  53. sFL=-sFL;
  54. }
  55. if (sFR > 0){
  56. m_FR.run(BACKWARD);
  57. }
  58. else {
  59. m_FR.run(FORWARD);
  60. sFR=-sFR;
  61. }
  62. if (sBL > 0){
  63. m_BL.run(BACKWARD);
  64. }
  65. else {
  66. m_BL.run(FORWARD);
  67. sBL=-sBL;
  68. }
  69. if (sBR > 0){
  70. m_BR.run(FORWARD);
  71. }
  72. else {
  73. m_BR.run(BACKWARD);
  74. sBR=-sBR;
  75. }
  76. m_FL.setSpeed(sFL);
  77. m_FR.setSpeed(sFR);
  78. m_BL.setSpeed(sBL);
  79. m_BR.setSpeed(sBR);
  80. }
  81.  
  82. //Можно ли совершить определённый манёвр. Во избежание неконтролируемых поворотов, нельзя менять направление поворота до прямолинейной траектории
  83. bool canPerfomManeuver(Maneuver maneuver) {
  84. if(maneuver==LEFT_MVR){
  85. return lastManeuver!=LEFT_MVR && balancer<8;
  86. }
  87. else{
  88. return lastManeuver!=RIGHT_MVR && balancer<8;
  89. }
  90. }
  91.  
  92. //Движение вперёд с поправкой скорости при приближении к препятствию
  93. void straight() {
  94. //Средняя скорость
  95. int avgSpeed = 115 - 1000/distC;
  96. if(distC<20 && lastDistC>distC) {
  97. Serial.println(min((lastDistC-distC)*3,30));
  98. avgSpeed-=min((lastDistC-distC)*3,30);
  99. }
  100.  
  101. int distSide = min(distSideL,distSideR);
  102. if(distSide<6){ //Разные скорости по бокам, если боковое препятствие близко
  103. int diff = 50/distSide;
  104. if(distSideL<distSideR) {
  105. dvig(avgSpeed+diff,avgSpeed-diff,avgSpeed+diff,avgSpeed-diff);
  106. }
  107. else {
  108. dvig(avgSpeed-diff,avgSpeed+diff,avgSpeed-diff,avgSpeed+diff);
  109. }
  110. }
  111. else{
  112. dvig(avgSpeed,avgSpeed,avgSpeed,avgSpeed);
  113. }
  114. balancer++;
  115. }
  116.  
  117. //Поворот на определённое количество градусов. Положительное направление - по часовой стрелке
  118. void turn(int degree){
  119. if(degree<0) {
  120. dvig(-150,150,-150,150);
  121. direction--;
  122. }
  123. else {
  124. dvig(150,-150,150,-150);
  125. direction++;
  126. }
  127. balancer=0;
  128. delay(4.2*abs(degree));
  129. }
  130.  
  131. void m_speed (){
  132. if(distL > 7 && distC > 7 && distR > 7) { //Путь свободен
  133. if((distL > 15 || distSideL > 15) && direction>0 && canPerfomManeuver(LEFT_MVR)){ //Возвращение направления при перекосе вправо
  134. turn(-20);
  135. }
  136. else if((distR > 15 || distSideR > 15) && direction<0 && canPerfomManeuver(RIGHT_MVR)) { //Возвращение направления при перекосе влево
  137. turn(20);
  138. }
  139. else { //Движение вперёд, медленно приближаясь к препятствию
  140. straight();
  141. }
  142. }
  143. else if(distSideL > 15 || distSideR > 15) { //Поворот
  144. if(canPerfomManeuver(LEFT_MVR)){
  145. if(distSideL>=distSideR || !canPerfomManeuver(RIGHT_MVR)){
  146. turn(-20);
  147. }
  148. else{
  149. turn(20);
  150. }
  151. }
  152. else if (canPerfomManeuver(RIGHT_MVR)){
  153. turn(20);
  154. }
  155. }
  156. else { //Остановка
  157. dvig(0,0,0,0);
  158. }
  159. }
  160.  
  161. void setup() {
  162. ultrazvuk(); //для вычисление последнего расстояния по центральной оси
  163. Serial.begin(9600);
  164. }
  165.  
  166. void loop() {
  167. ultrazvuk();
  168. straight();
  169. //m_speed();
  170. delay(50);
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement