Advertisement
otakus

Untitled

Jul 3rd, 2012
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.67 KB | None | 0 0
  1. #include <Servo.h>
  2.  
  3. #define BAUD_RATE 57600
  4.  
  5. #define INPUT_DIGIT_LIMIT 5
  6. #define STEERING_MIN 50
  7. #define STEERING_MAX 115
  8.  
  9. #define START_CODE 300
  10.  
  11. #define Pin_ledR 11
  12. #define Pin_ledG 3
  13. #define Pin_ledB 6
  14. #define Pin_headlights 9
  15. #define Pin_brakes 4
  16. #define Pin_steering 10
  17. #define Pin_drive 5
  18. #define Pin_relay 2
  19. #define Pin_MainV A3
  20. #define Pin_AuxV A2
  21. #define Pin_centerPot A1
  22.  
  23. #define Datapacket_steering 0
  24. #define Datapacket_drive 1
  25. #define Datapacket_relay 2
  26. #define Datapacket_headlights 3
  27. #define Datapacket_brakes 4
  28. #define Datapacket_ledR 5
  29. #define Datapacket_ledG 6
  30. #define Datapacket_ledB 7
  31.  
  32. #define LED_MOD_COUNT 100
  33.  
  34. //Data packet: 127:000:0:00:0:000:000:000:
  35.  
  36.  
  37. int data[8];
  38. int data_old[8];
  39.  
  40. Servo steering;
  41. float sFactorMin;
  42. float sFactorMax;
  43. int steeringOffset;
  44. int headlightTimer;
  45. int headlightTimer2;
  46. int ledCounter;
  47. int LedI;
  48.  
  49. int counterA;
  50. int counterB;
  51. char inputByte;
  52. char inputBytes[INPUT_DIGIT_LIMIT+1];
  53.  
  54. unsigned long time;
  55. unsigned long timeB;
  56. int c;
  57.  
  58.  
  59.  
  60. void setup(){
  61.   Serial.begin(BAUD_RATE);
  62.  
  63.   steeringOffset=(analogRead(Pin_centerPot)/8)+64;
  64.   steering.write(steeringOffset/1.417);
  65.   Serial.print("Steering Center: ");
  66.   Serial.print(steeringOffset);
  67.   sFactorMin=127.0/((steeringOffset/1.417)-STEERING_MIN);
  68.   sFactorMax=127.0/(STEERING_MAX-(steeringOffset/1.417));
  69.   Serial.print(" sFmin: ");
  70.   Serial.print(sFactorMin);
  71.   Serial.print(" sFmax: ");
  72.   Serial.println(sFactorMax);
  73.  
  74.   TCCR0B = TCCR0B & 0b11111000 | 0x01;
  75.   pinMode(Pin_ledR, OUTPUT);
  76.   pinMode(Pin_ledG, OUTPUT);
  77.   pinMode(Pin_ledB, OUTPUT);
  78.   pinMode(Pin_brakes, OUTPUT);
  79.   pinMode(Pin_drive, OUTPUT);
  80.   pinMode(Pin_relay, OUTPUT);
  81.   steering.attach(Pin_steering);
  82.  
  83.   Serial.println("Waiting for start code");
  84.   while(getInput(0)!=START_CODE);
  85.   Serial.println("RC control started!");
  86.   Serial.println("Data packet: 127:000:0:00:0:000:000:000:");
  87.   updateValues();
  88. }
  89.  
  90. void loop()
  91. {
  92.   if(Serial.available()>0){
  93.     for(int i=0;i<8;i++)
  94.       data_old[i]=data[i];
  95.     updateValues();
  96.     if(data_old[Datapacket_steering]!=data[Datapacket_steering ])
  97.       steering.write(max(STEERING_MIN,min(STEERING_MAX,(steeringOffset/1.417)+((data[Datapacket_steering]-127)/((data[Datapacket_steering]>=127)? sFactorMax:sFactorMin)))));
  98.     if(data_old[Datapacket_drive ]!=data[Datapacket_drive  ])
  99.       analogWrite(Pin_drive, data[Datapacket_drive]);
  100.     if(data_old[Datapacket_relay ]!=data[Datapacket_relay  ])
  101.       digitalWrite(Pin_relay, data[Datapacket_relay]);
  102.     if(data_old[Datapacket_brakes ]!=data[Datapacket_brakes  ])
  103.       digitalWrite(Pin_brakes, data[Datapacket_brakes]);
  104.   }
  105.   Headlights();
  106.   Underglow();
  107.  
  108.   //getDebug();
  109. }
  110.  
  111. void getDebug(){
  112.   c++;
  113.   if(c==100){
  114.     timeB=time;
  115.     time=millis();
  116.     Serial.println((time-timeB)/100);
  117.     c=0;
  118.     getVoltages();
  119.   }
  120. }
  121.  
  122. void updateValues(){
  123.   counterA=0;
  124.   counterB=0;
  125.   do{
  126.      while(!(Serial.available()));
  127.        inputByte=Serial.read();
  128.        if(inputByte==':'){
  129.          inputBytes[counterA]='\n';
  130.          data[counterB]=atoi(inputBytes);
  131.          counterB++;
  132.          counterA=0;
  133.        }
  134.        else{
  135.          inputBytes[counterA++]=inputByte;
  136.        }
  137.        if(checkDelim(inputByte)||counterA==INPUT_DIGIT_LIMIT+1)
  138.          break;
  139.   }while(true);
  140. }
  141.  
  142. float Vaux(float in){
  143.   return((in/1024)*12.202);
  144. }
  145. float Vmain(float in){
  146.   return((in/1024)*12.18);
  147. }
  148. void getVoltages(){
  149.     Serial.print("V Aux: ");
  150.     Serial.print(Vaux(analogRead(Pin_AuxV)));  
  151.     Serial.print(" V Main: ");
  152.     Serial.print(Vmain(analogRead(Pin_MainV)));
  153. }
  154.  
  155. void Headlights(){
  156.   if(data[Datapacket_headlights ]==0){
  157.     digitalWrite(Pin_headlights,LOW);
  158.   } else if(data[Datapacket_headlights ]==99){
  159.     digitalWrite(Pin_headlights,HIGH);
  160.   } else{
  161.     if(headlightTimer<=data[Datapacket_headlights ]){
  162.       digitalWrite(Pin_headlights,HIGH);
  163.     } else{
  164.       digitalWrite(Pin_headlights,LOW);
  165.     }
  166.     headlightTimer++;
  167.     if(headlightTimer==100)
  168.       headlightTimer=0;
  169.   }
  170. }
  171.  
  172.  
  173. void Underglow(){
  174.   if(data[Datapacket_ledR]>=256||data[Datapacket_ledG]>=256||data[Datapacket_ledB]>=256){
  175.     if(ledCounter==LED_MOD_COUNT){
  176.       ledCounter=0;
  177.       if(LedI>=1536)
  178.         LedI=0;
  179.       fadeRGB2(LedI);
  180.       LedI++;
  181.     }
  182.     else
  183.       ledCounter++;
  184.   }
  185.   else{
  186.     if(data_old[Datapacket_ledR ]!=data[Datapacket_ledR ]||data[Datapacket_ledR ]==0)
  187.       analogWrite(Pin_ledR,data[Datapacket_ledR ]);
  188.     if(data_old[Datapacket_ledG ]!=data[Datapacket_ledG ]||data[Datapacket_ledG ]==0)
  189.       analogWrite(Pin_ledG,data[Datapacket_ledG ]);
  190.     if(data_old[Datapacket_ledB ]!=data[Datapacket_ledB ]||data[Datapacket_ledB ]==0)
  191.       analogWrite(Pin_ledB,data[Datapacket_ledB ]);
  192.   }
  193. }
  194. void fadeRGB2(int i){
  195.   if(i==0){
  196.     analogWrite(Pin_ledR,255);
  197.   }
  198.   else if(i<256){
  199.     analogWrite(Pin_ledG,i);
  200.   }
  201.   else if(i>256&&i<512){
  202.     analogWrite(Pin_ledR,512-i);
  203.   }
  204.   else if(i>512&&i<768){
  205.     analogWrite(Pin_ledB,i-512);
  206.   }
  207.   else if(i>768&&i<1024){
  208.     analogWrite(Pin_ledG,1024-i);
  209.   }
  210.   else if(i>1024&&i<1280){
  211.     analogWrite(Pin_ledR,i-1024);
  212.   }
  213.   else if(i>1280&&i<1536){
  214.     analogWrite(Pin_ledB,1536-i);
  215.   }
  216. }
  217.  
  218. int getInput(int passthrough){
  219.   counterA=0;
  220.    if(Serial.available()){
  221.      do{
  222.        while(!Serial.available());
  223.          inputByte=Serial.read();
  224.          inputBytes[counterA++]=inputByte;
  225.          if(checkDelim(inputByte)||counterA==INPUT_DIGIT_LIMIT+1)
  226.            break;
  227.      }while(true);
  228.      inputBytes[counterA]='\n';
  229.      return atoi(inputBytes);
  230.    }
  231.    return passthrough;
  232. }
  233.  
  234. boolean checkDelim(int code){
  235.   if(code==10||code==13)
  236.     return true;
  237.   return false;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement