Advertisement
otakus

Untitled

Oct 23rd, 2012
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.77 KB | None | 0 0
  1. #include <Servo.h>
  2.  
  3. #define commTimeout 300 //ms
  4. #define cutoff 3.2
  5. #define temp A5
  6. #define cell1 A3
  7. #define cell2 A4
  8. #define cell3 A2
  9. #define cell4 A1
  10. #define STEERING_MIN 60
  11. #define STEERING_MAX 160
  12.  
  13. #define steeringOffsetPin A0
  14. #define relayPin 8
  15. #define relayPin2 7
  16. #define steeringPin 3
  17. #define drivePin 5
  18.  
  19. #define TX_INTERVAL 100 //ms
  20. #define DELAY 10  //ms
  21.  
  22. unsigned long old_tx;
  23. int cells[4];
  24. Servo steering;
  25. int steeringOffset;
  26. int steeringPos;
  27. int steeringCalc;
  28. float sFactorMin;
  29. float sFactorMax;
  30.  
  31. int drive;
  32. int brake;
  33. boolean relay;
  34. boolean relay2;
  35. boolean setDelay;
  36. boolean resetDelay;
  37.  
  38. boolean rumbleToggle=false;
  39.  
  40. unsigned long timeout;
  41. unsigned long delayTimer;
  42.  
  43. char inChar;
  44. String inStr;
  45. String retStr;
  46.  
  47. char buff[15];
  48.  
  49. void initializePins(){
  50.    pinMode(drivePin,OUTPUT);
  51.    digitalWrite(drivePin,LOW);
  52.    pinMode(relayPin,OUTPUT);
  53.    digitalWrite(relayPin,LOW);
  54.    pinMode(relayPin2,OUTPUT);
  55.    digitalWrite(relayPin2,LOW);
  56.    steering.attach(steeringPin);
  57. }
  58.  
  59. /*-------------------------------------------Main loop---------------------------------------*/
  60. void setup(){
  61.   initializePins();
  62.   Serial.begin(57600);
  63. }
  64.  
  65. void loop(){
  66.   getBatt();
  67.   sendData();
  68.   getInputs();
  69.   checkTimeout();
  70.   calcSteering();
  71.   steering.write(steeringCalc);
  72.   setOutputs();
  73. }
  74.  
  75. /*-----------------------------------------Main functions---------------------------------*/
  76. //  127000000
  77.  
  78. void checkTimeout(){
  79.   if(millis()>timeout+commTimeout){
  80.     drive=0;
  81.     steeringPos=127;
  82.     relay=0;
  83.     relay2=1;
  84.   }
  85. }
  86.  
  87. void getBatt(){
  88.   cells[0]=(analogRead(cell1)*0.645);
  89.   cells[1]=(analogRead(cell2)*1.200);
  90.   cells[2]=(analogRead(cell3)*2.519);
  91.   cells[3]=(analogRead(cell4)*1.977);
  92.   cells[3]-=cells[2];
  93.   cells[2]-=cells[1];
  94.   cells[1]-=cells[0];
  95.   for(int i=0;i<4;i++){
  96.     if(cells[i]<0)
  97.       cells[i]=0;
  98.     if(cells[i]<=(cutoff*100))
  99.       rumbleToggle=true;
  100.   }
  101. }
  102.  
  103. void getInputs(){
  104.   if(Serial.available()>9){
  105.     inStr="";
  106.     do{
  107.       inChar=Serial.read();
  108.       inStr+=inChar;
  109.     }while(inChar!='\n');
  110.     if(inStr.length()==10){
  111.       inStr.substring(0,3).toCharArray(buff,4);
  112.       steeringPos=atoi(buff);
  113.       inStr.substring(3,6).toCharArray(buff,4);
  114.       drive=atoi(buff);
  115.       inStr.substring(6,8).toCharArray(buff,3);
  116.       relay=atoi(buff);
  117.       inStr.substring(8,9).toCharArray(buff,2);
  118.       relay2=atoi(buff);
  119.       timeout=millis();
  120.     }
  121.   }
  122. }
  123.  
  124. void calcSteering(){
  125.   steeringOffset=(analogRead(steeringOffsetPin)/8)+64;
  126.   sFactorMin=127.0/(steeringOffset-STEERING_MIN);
  127.   sFactorMax=127.0/(STEERING_MAX-steeringOffset);
  128.   steeringCalc=(steeringOffset+((127-steeringPos)/((steeringPos<=127)? sFactorMax:sFactorMin)));
  129. }
  130.  
  131. void sendData(){
  132.   if(millis()>=old_tx+TX_INTERVAL){
  133.     retStr="";
  134.     for(int i=0;i<4;i++){
  135.       retStr+=pad(cells[i]);
  136.     }
  137.     retStr+=rumbleToggle;
  138.     retStr+=pad(analogRead(temp),4);
  139.     retStr+="\n";
  140.     Serial.print(retStr);
  141.     old_tx=millis();
  142.   }
  143. }
  144.  
  145. void setOutputs(){
  146.   if(relay2){
  147.     digitalWrite(relayPin2,HIGH);
  148.     digitalWrite(relayPin,LOW);
  149.   }
  150.   else if(relay){
  151.     digitalWrite(relayPin2,HIGH);
  152.     digitalWrite(relayPin,HIGH);
  153.     if(!setDelay&&!resetDelay){
  154.       delayTimer=millis();
  155.       setDelay=true;
  156.     }
  157.   }
  158.   else{
  159.     digitalWrite(relayPin2,LOW);
  160.     digitalWrite(relayPin,LOW);
  161.     resetDelay=false;
  162.   }
  163.   analogWrite(drivePin,drive);
  164.   /*
  165.   if(!setDelay){
  166.     analogWrite(drivePin,drive);
  167.   }
  168.   else if(millis()>delayTimer+DELAY){
  169.     setDelay=false;
  170.     resetDelay=true;
  171.   }*/
  172. }
  173.  
  174. String pad(int number){
  175.   return pad(number,3);
  176. }
  177. String pad(int number,int digits){
  178.   String ret="";
  179.   for(int i=0; i < (digits-1) - byte(log10(number)); i++)
  180.     ret+='0';
  181.   ret+=number;
  182.   return ret;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement