Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.41 KB | None | 0 0
  1. #define PIN_ENL A1
  2. #define PIN_LW A2
  3. #define PIN_LB A3
  4. #define PIN_LR A4
  5. #define PIN_LG A5
  6.  
  7. #define PIN_ENR 7
  8. #define PIN_RW 8
  9. #define PIN_RB 9
  10. #define PIN_RR 10
  11. #define PIN_RG 11
  12.  
  13. #define BPIN 12
  14.  
  15. #define STEPNUM 200
  16. #define STEPANG 1.8
  17. #define AXLEDIST 295
  18. #define DIAMETER 100
  19. #define MINTIME 10
  20.  
  21. int phaseLeft = 1;
  22. int phaseRight = 1;
  23.  
  24. // these variables were failing to be declared inside a function, so they're global to suppress that error
  25. unsigned long gtime;
  26. long outSteps,inSteps = 0;
  27. long a,b,c,d;
  28. long num,den;
  29.  
  30. void setup() {
  31.   pinMode(PIN_ENL, OUTPUT);
  32.   pinMode(PIN_LW, OUTPUT);
  33.   pinMode(PIN_LB, OUTPUT);
  34.   pinMode(PIN_LR, OUTPUT);
  35.   pinMode(PIN_LG, OUTPUT);
  36.  
  37.   pinMode(PIN_ENR, OUTPUT);
  38.   pinMode(PIN_RW, OUTPUT);
  39.   pinMode(PIN_RB, OUTPUT);
  40.   pinMode(PIN_RR, OUTPUT);
  41.   pinMode(PIN_RG, OUTPUT);
  42.  
  43.   pinMode(BPIN, INPUT_PULLUP);
  44.  
  45.   writeMotors();
  46.  
  47. // This loop stalls the program until the start button is pressed
  48. // It also aligns the motors with the phase, to avoid errors
  49. // They are pulsed on and off to waste less battery and prevent overheating
  50.   while (digitalRead(BPIN)==HIGH) {
  51.     killMotors();
  52.     delay(50);
  53.     writeMotors();
  54.     delay(10);
  55.   }
  56.  
  57.   pinMode(13, OUTPUT);
  58.   digitalWrite(13, HIGH); //built-in LED indicator, turns on to indicate program has started
  59. //  Serial.begin(9600);
  60.   delay(3000);
  61. }
  62.  
  63. void loop() {
  64.   curve(300,-30,MINTIME,true); // CCW turn, 300mm radius, 30 degrees, forwards
  65.   straight(180,true); // drive forwards 180mm
  66.   curve(0,-64,MINTIME,true); // CCW turn, on the spot, 64 degrees
  67.   straight(600,true); // drive forwards 600mm
  68.   killMotors();
  69.   delay(1000000);
  70. }
  71.  
  72. // car drives in a straight line for <dist> millimetres
  73. // dir: true->forwards, false->backwards
  74. void straight(long dist,bool dir) {
  75.   for (long i=0;i*DIAMETER*PI<dist*STEPNUM;i++) {
  76.     dir?stepForwardLeft():stepBackLeft();
  77.     dir?stepForwardRight():stepBackRight();
  78.     delay(MINTIME);
  79.   }
  80. }
  81.  
  82. // car drives in a circular arc
  83. // pivot->centre of circle, in millimetres to the right of the midpoint between the wheels
  84. // angle->number of degrees to turn. positive->clockwise, negative->counter-clockwise
  85. // timer->number of milliseconds between each step of the outer wheel. typically MINTIME, use higher numbers if it struggles with torque
  86. // dir: true->forwards, false->backwards
  87. void curve(long pivot, long angle, long timer, bool dir) {
  88.   gtime=millis();
  89.   outSteps=0;
  90.   inSteps=0;
  91.   num=0;
  92.   den=1;
  93.   while (abs(num/den)<abs(angle)) {
  94.     d=outSteps*timer;
  95.     if (millis()-gtime>=d) {
  96.       (angle>0)?(dir?stepForwardLeft():stepBackRight()):(dir?stepForwardRight():stepBackLeft());
  97.       outSteps++;
  98.     }
  99.     a=inSteps*timer;
  100.     b=(2*pivot)+AXLEDIST;
  101.     c=(2*pivot)-AXLEDIST;
  102.     d=(a*b)/c;
  103.     if (2*pivot>AXLEDIST && millis()-gtime>=d) {
  104.       (angle>0)?(dir?stepForwardRight():stepBackLeft()):(dir?stepForwardLeft():stepBackRight());
  105.       inSteps++;
  106.     }
  107.     if (2*pivot<AXLEDIST && millis()-gtime>=d) {
  108.       (angle>0)?(dir?stepBackRight():stepForwardLeft()):(dir?stepBackLeft():stepForwardRight());
  109.       inSteps--;
  110.     }
  111.     delay(1);
  112.     num=outSteps*DIAMETER*360;
  113.     den=STEPNUM*(2*pivot+AXLEDIST);
  114.   }
  115. }
  116.  
  117. void stepForwardLeft() {
  118.   phaseLeft++;
  119.   writeMotors();
  120. }
  121.  
  122. void stepBackLeft() {
  123.   phaseLeft--;
  124.   writeMotors;
  125. }
  126.  
  127. void stepForwardRight() {
  128.   phaseRight++;
  129.   writeMotors();
  130. }
  131.  
  132. void stepBackRight() {
  133.   phaseRight--;
  134.   writeMotors();
  135. }
  136.  
  137. void killMotors() {
  138.   digitalWrite(PIN_ENL, LOW);
  139.   digitalWrite(PIN_LW, LOW);
  140.   digitalWrite(PIN_LB, LOW);
  141.   digitalWrite(PIN_LR, LOW);
  142.   digitalWrite(PIN_LG, LOW);
  143.  
  144.   digitalWrite(PIN_ENR, LOW);
  145.   digitalWrite(PIN_RW, LOW);
  146.   digitalWrite(PIN_RB, LOW);
  147.   digitalWrite(PIN_RR, LOW);
  148.   digitalWrite(PIN_RG, LOW);
  149. }
  150.  
  151. void writeMotors() {
  152.   while (phaseLeft>4) phaseLeft-=4;
  153.   while (phaseLeft<1) phaseLeft+=4;
  154.   while (phaseRight>4) phaseRight-=4;
  155.   while (phaseRight<1) phaseRight+=4;
  156.   digitalWrite(PIN_ENL, HIGH);
  157.   switch (phaseLeft) {
  158.     case 1:
  159.       digitalWrite(PIN_LW, HIGH);
  160.       digitalWrite(PIN_LB, LOW);
  161.      
  162.       digitalWrite(PIN_LR, HIGH);
  163.       digitalWrite(PIN_LG, LOW);
  164.       break;
  165.     case 2:
  166.       digitalWrite(PIN_LW, LOW);
  167.       digitalWrite(PIN_LB, HIGH);
  168.      
  169.       digitalWrite(PIN_LR, HIGH);
  170.       digitalWrite(PIN_LG, LOW);
  171.       break;
  172.     case 3:
  173.       digitalWrite(PIN_LW, LOW);
  174.       digitalWrite(PIN_LB, HIGH);
  175.      
  176.       digitalWrite(PIN_LR, LOW);
  177.       digitalWrite(PIN_LG, HIGH);
  178.       break;
  179.     case 4:
  180.       digitalWrite(PIN_LW, HIGH);
  181.       digitalWrite(PIN_LB, LOW);
  182.      
  183.       digitalWrite(PIN_LR, LOW);
  184.       digitalWrite(PIN_LG, HIGH);
  185.       break;
  186.   }
  187.   digitalWrite(PIN_ENR, HIGH);
  188.   switch (phaseRight) {
  189.     case 1:
  190.       digitalWrite(PIN_RW, HIGH);
  191.       digitalWrite(PIN_RB, LOW);
  192.      
  193.       digitalWrite(PIN_RR, HIGH);
  194.       digitalWrite(PIN_RG, LOW);
  195.       break;
  196.     case 2:
  197.       digitalWrite(PIN_RW, HIGH);
  198.       digitalWrite(PIN_RB, LOW);
  199.      
  200.       digitalWrite(PIN_RR, LOW);
  201.       digitalWrite(PIN_RG, HIGH);
  202.       break;
  203.     case 3:
  204.       digitalWrite(PIN_RW, LOW);
  205.       digitalWrite(PIN_RB, HIGH);
  206.      
  207.       digitalWrite(PIN_RR, LOW);
  208.       digitalWrite(PIN_RG, HIGH);
  209.       break;
  210.     case 4:
  211.       digitalWrite(PIN_RW, LOW);
  212.       digitalWrite(PIN_RB, HIGH);
  213.      
  214.       digitalWrite(PIN_RR, HIGH);
  215.       digitalWrite(PIN_RG, LOW);
  216.       break;
  217.   }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement