Advertisement
patryk

CS_przemo

May 13th, 2015
579
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.93 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/delay.h>
  3. #include <avr/interrupt.h>
  4. #include "tcs3200.h"
  5.  
  6. #define CL_PURPLE     0x701
  7. #define CL_YELLOW     0x702
  8. #define CL_GREEN      0x703
  9. #define CL_ORANGE     0x704
  10. #define CL_RED        0x705
  11.  
  12. #define POS_COLLECT   0x801
  13. #define POS_SENSOR    0x802
  14. #define POS_DROP      0x803
  15.  
  16. #define SRV_STOP      0x555
  17.  
  18. #define ERR_NO_CANDY  0x999
  19.  
  20. #define CL_PURPLE_R   102
  21. #define CL_PURPLE_G   81
  22. #define CL_PURPLE_B   103
  23. #define CL_PURPLE_C   305
  24.  
  25. #define CL_YELLOW_R   139
  26. #define CL_YELLOW_G   110
  27. #define CL_YELLOW_B   115
  28. #define CL_YELLOW_C   384
  29.  
  30. #define CL_GREEN_R    108
  31. #define CL_GREEN_G    97
  32. #define CL_GREEN_B    106
  33. #define CL_GREEN_C    331
  34.  
  35. #define CL_ORANGE_R   130
  36. #define CL_ORANGE_G   91
  37. #define CL_ORANGE_B   108
  38. #define CL_ORANGE_C   348
  39.  
  40. #define CL_RED_R      113
  41. #define CL_RED_G      82
  42. #define CL_RED_B      103
  43. #define CL_RED_C      317
  44.  
  45.  
  46. volatile int measureReady;
  47. volatile int overflowTicks;
  48. volatile int actuallArmPosition;
  49.  
  50. volatile int CL_PURPLE_VALUE_R;
  51. volatile int CL_PURPLE_VALUE_G;
  52. volatile int CL_PURPLE_VALUE_B;
  53. volatile int CL_PURPLE_VALUE_C;
  54.  
  55. volatile int CL_YELLOW_VALUE_R;
  56. volatile int CL_YELLOW_VALUE_G;
  57. volatile int CL_YELLOW_VALUE_B;
  58. volatile int CL_YELLOW_VALUE_C;
  59.  
  60. volatile int CL_GREEN_VALUE_R;
  61. volatile int CL_GREEN_VALUE_G;
  62. volatile int CL_GREEN_VALUE_B;
  63. volatile int CL_GREEN_VALUE_C;
  64.  
  65. volatile int CL_ORANGE_VALUE_R;
  66. volatile int CL_ORANGE_VALUE_G;
  67. volatile int CL_ORANGE_VALUE_B;
  68. volatile int CL_ORANGE_VALUE_C;
  69.  
  70. volatile int CL_RED_VALUE_R;
  71. volatile int CL_RED_VALUE_G;
  72. volatile int CL_RED_VALUE_B;
  73. volatile int CL_RED_VALUE_C;
  74.  
  75. void moveArm (int colorID) {
  76.     DDRB |= (1 << PB1);     // PWM Output
  77.     TCCR1A = 0;
  78.     ICR1 = 19999;           // 20ms pulse width - 50Hz
  79.  
  80.     TCCR1A = (1 << WGM11);
  81.     TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
  82.  
  83.     TCCR1A |= 2 << 6;       // PB1 as PWM Output
  84.  
  85.     actuallArmPosition = colorID;
  86.  
  87.     switch (colorID) {
  88.         case CL_PURPLE:
  89.             OCR1A = 600;        // PURPLE
  90.             break;
  91.  
  92.         case CL_YELLOW:
  93.             OCR1A = 1050;       // YELLOW
  94.             break;
  95.  
  96.         case CL_GREEN:
  97.             OCR1A = 1500;       // GREEN
  98.             break;
  99.  
  100.         case CL_ORANGE:
  101.             OCR1A = 1950;       // ORANGE
  102.             break;
  103.  
  104.         case CL_RED:
  105.             OCR1A = 2400;       // RED
  106.             break;
  107.  
  108.         case SRV_STOP:          // SERVO STOP
  109.             OCR1A = 0;
  110.             break;
  111.     }
  112. }
  113.  
  114. void spinWheel (int moveTo) {
  115.     DDRB |= (1 << PB2);
  116.     TCCR1A = 0;
  117.     ICR1 = 19999;
  118.  
  119.     TCCR1A = (1 << WGM11);
  120.     TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
  121.  
  122.     TCCR1A |= 2 << 4;
  123.  
  124.     switch (moveTo) {
  125.         case POS_COLLECT:       // POSITION 1
  126.             OCR1B = 2350;
  127.             break;
  128.  
  129.         case POS_SENSOR:        // POSITION 2
  130.             OCR1B = 1420;
  131.             break;
  132.  
  133.         case POS_DROP:          // POSITION 3
  134.             OCR1B = 600;
  135.             break;
  136.  
  137.         case SRV_STOP:          // SERVO STOP
  138.             OCR1B = 0;
  139.             break;
  140.     }
  141. }
  142.  
  143. void collectCandy() {
  144.     spinWheel(POS_COLLECT);
  145.     _delay_ms(1500);
  146.     spinWheel(SRV_STOP);
  147. }
  148.  
  149. uint32_t checkRed() {
  150.     PORTC &= ~(1 << PC4);   // S2 - L
  151.     PORTC &= ~(1 << PC5);   // S3 - L
  152.     _delay_ms(10);
  153.     return TCSMeasure();
  154. }
  155.  
  156.  
  157. uint32_t checkBlue() {
  158.     PORTC &= ~(1 << PC4);   // S2 - L
  159.     PORTC |= (1 << PC5);    // S3 - H
  160.     _delay_ms(10);
  161.     return TCSMeasure();
  162. }
  163.  
  164. uint32_t checkGreen() {
  165.     PORTC |= (1 << PC4);    // S2 - H
  166.     PORTC |= (1 << PC5);    // S3 - H
  167.     _delay_ms(10);
  168.     return TCSMeasure();
  169. }
  170.  
  171. uint32_t checkClear(){
  172.     PORTC |= (1<<PC4);
  173.     PORTC &= ~(1<<PC5);
  174.     _delay_ms(10);
  175.     return TCSMeasure();
  176. }
  177.  
  178. int dif(uint32_t a,uint32_t b) {
  179.     if(a>b) {
  180.         return a - b;
  181.     }
  182.     return b-a;
  183. }
  184. int pickColor(uint32_t R, uint32_t G, uint32_t B, uint32_t C) {
  185.     uint32_t Rdif=0;
  186.     uint32_t Gdif=0;
  187.     uint32_t Pdif=0;
  188.     uint32_t Odif=0;
  189.     uint32_t Ydif=0;
  190.     int kt = CL_RED;
  191.  
  192.     Rdif=dif(CL_RED_VALUE_R,R)+dif(CL_RED_VALUE_G,G)+dif(CL_RED_VALUE_B,B);
  193.     Gdif=dif(CL_GREEN_VALUE_R,R)+dif(CL_GREEN_VALUE_G,G)+dif(CL_GREEN_VALUE_B,B);
  194.     Pdif=dif(CL_PURPLE_VALUE_R,R)+dif(CL_PURPLE_VALUE_G,G)+dif(CL_PURPLE_VALUE_B,B);
  195.     Odif=dif(CL_ORANGE_VALUE_R,R)+dif(CL_ORANGE_VALUE_G,G)+dif(CL_ORANGE_VALUE_B,B);
  196.     Ydif=dif(CL_YELLOW_VALUE_R,R)+dif(CL_YELLOW_VALUE_G,G)+dif(CL_YELLOW_VALUE_B,B);
  197.  
  198.     //w Rdif jest minimum
  199.     if(Rdif>Gdif) {
  200.         Rdif = Gdif;
  201.         kt =  CL_GREEN;
  202.     }
  203.     if(Rdif>Pdif) {
  204.         Rdif = Pdif;
  205.         kt = CL_PURPLE;
  206.     }
  207.     if(Rdif>Odif) {
  208.         Rdif = Odif;
  209.         kt = CL_ORANGE;
  210.     }
  211.     if(Rdif>Ydif){
  212.         Rdif = Ydif;
  213.         kt = CL_YELLOW;
  214.     }
  215.     return kt;
  216. }
  217. void checkColor() {
  218.     spinWheel(POS_SENSOR);
  219.     _delay_ms(700);
  220.  
  221.     //spinWheel(SRV_STOP);
  222.     //int nextPosition;
  223.     uint32_t R=0;
  224.     uint32_t G=0;
  225.     uint32_t B=0;
  226.     uint32_t C=0;
  227.  
  228.     int i;
  229.  
  230.     for(i = 0 ; i < 5 ; i++) {
  231.         R += checkRed()/100;
  232.         G += checkGreen()/100;
  233.         B += checkBlue()/100;
  234.         C += checkClear()/100;
  235.     }
  236.  
  237.     R = R/5;
  238.     G = G/5;
  239.     B = B/5;
  240.     C = C/5;
  241.  
  242.     int nextPosition = pickColor(R, G, B, C);
  243.  
  244.     if (nextPosition != ERR_NO_CANDY) {
  245.         moveArm(nextPosition);
  246.         _delay_ms(1000);
  247.         moveArm(SRV_STOP);
  248.     }
  249. }
  250.  
  251.  
  252. void dropCandy() {
  253.     spinWheel(POS_DROP);
  254.     _delay_ms(700);
  255. }
  256.  
  257. void prepareColors() {
  258.     int i;
  259.  
  260.     for(i = 0 ; i < 5 ; i++) {
  261.         collectCandy();
  262.         spinWheel(POS_SENSOR);
  263.         _delay_ms(700);
  264.  
  265.         uint32_t R = 0;
  266.         uint32_t G = 0;
  267.         uint32_t B = 0;
  268.         uint32_t C = 0;
  269.  
  270.         int j;
  271.  
  272.         for(j = 0 ; j < 5 ; j++) {
  273.             R += checkRed()/100;
  274.             G += checkGreen()/100;
  275.             B += checkBlue()/100;
  276.             C += checkClear()/100;
  277.         }
  278.  
  279.         R = R/5;
  280.         G = G/5;
  281.         B = B/5;
  282.         C = C/5;
  283.  
  284.         if (i == 0) {
  285.             moveArm(CL_PURPLE);
  286.             _delay_ms(900);
  287.             moveArm(SRV_STOP);
  288.  
  289.             CL_PURPLE_VALUE_R = R;
  290.             CL_PURPLE_VALUE_G = G;
  291.             CL_PURPLE_VALUE_B = B;
  292.             CL_PURPLE_VALUE_C = C;
  293.         }
  294.  
  295.         if (i == 1) {
  296.             moveArm(CL_YELLOW);
  297.             _delay_ms(900);
  298.             moveArm(SRV_STOP);
  299.  
  300.             CL_YELLOW_VALUE_R = R;
  301.             CL_YELLOW_VALUE_G = G;
  302.             CL_YELLOW_VALUE_B = B;
  303.             CL_YELLOW_VALUE_C = C;
  304.         }
  305.  
  306.         if (i == 2) {
  307.             moveArm(CL_GREEN);
  308.             _delay_ms(900);
  309.             moveArm(SRV_STOP);
  310.  
  311.             CL_GREEN_VALUE_R = R;
  312.             CL_GREEN_VALUE_G = G;
  313.             CL_GREEN_VALUE_B = B;
  314.             CL_GREEN_VALUE_C = C;
  315.         }
  316.  
  317.         if (i == 3) {
  318.             moveArm(CL_ORANGE);
  319.             _delay_ms(900);
  320.             moveArm(SRV_STOP);
  321.  
  322.             CL_ORANGE_VALUE_R = R;
  323.             CL_ORANGE_VALUE_G = G;
  324.             CL_ORANGE_VALUE_B = B;
  325.             CL_ORANGE_VALUE_C = C;
  326.         }
  327.  
  328.         if (i == 4) {
  329.             moveArm(CL_RED);
  330.             _delay_ms(900);
  331.             moveArm(SRV_STOP);
  332.  
  333.             CL_RED_VALUE_R = R;
  334.             CL_RED_VALUE_G = G;
  335.             CL_RED_VALUE_B = B;
  336.             CL_RED_VALUE_C = C;
  337.         }
  338.         dropCandy();
  339.     }
  340. }
  341.  
  342. void moveServo(int pulseWidth) {
  343.     TCCR1A = 0;
  344.     ICR1 = 19999;
  345.  
  346.     TCCR1A = (1 << WGM11);
  347.     TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
  348.  
  349.     TCCR1A |= 2 << 6;
  350.  
  351.     OCR1A = pulseWidth;
  352. }
  353.  
  354. void MAIN_INIT() {
  355.     DDRC |= (1 << PC5) | (1 << PC4) | (1 << PC3) | (1 << PC2) | (1 << PC1);
  356.     PORTC |= (1 << PC3);
  357.  
  358.     moveArm(CL_GREEN);
  359.     _delay_ms(1000);
  360.     moveArm(SRV_STOP);
  361.  
  362.     spinWheel(POS_COLLECT);
  363.     _delay_ms(1000);
  364.     spinWheel(SRV_STOP);
  365.  
  366.     prepareColors();
  367. }
  368.  
  369. void MAIN_LOOP() {
  370.     while (1) {
  371.         collectCandy();
  372.         checkColor();
  373.         dropCandy();
  374.     }
  375. }
  376.  
  377. int main() {
  378.  
  379.     moveArm(CL_RED);
  380.     _delay_ms(1000);
  381.     moveArm(SRV_STOP);
  382.  
  383.     MAIN_INIT();
  384.     MAIN_LOOP();
  385.  
  386.     return 0;
  387. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement