Advertisement
Villalba2006

POST_46

Nov 28th, 2016
1,578
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.85 KB | None | 0 0
  1. /*  TITULO: Camaleón con sensor de reconocimiento del color TCS3200 y LEDS Neopixels.
  2.  
  3.     AUTOR:
  4.    
  5.     MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
  6.     - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
  7.     - TWITTER: https://twitter.com/MarianoCampoGa
  8.     - CORREO: marianodc83@gmail.com
  9.    
  10.    
  11.     DESCRIPCIÓN DEL PROGRAMA
  12.    
  13.     Con este programa simulamos el cambio de color de la piel de un camaleón cuando este se vé en
  14.     una situación de peligro. Mediante un sensor de reconocimiento del color TCS3200 captamos el
  15.     color en cuestión y lo presentamos a través de un disco de 7 LEDS NeoPixel. A través del
  16.     monitor serie del IDE de Arduino podremos ver el color en formato RGB que se está manipulando
  17.     en cada momento.
  18.    
  19.    
  20.     ESQUEMA DE CONEXION
  21.    
  22.                                       +-----+
  23.          +----[PWR]-------------------| USB |--+
  24.          |                            +-----+  |
  25.          |         GND/RST2  [ ][ ]            |
  26.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |    
  27.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |    
  28.          |                             AREF[ ] |
  29.          |                              GND[ ] |
  30.          | [ ]N/C                    SCK/13[ ] |  
  31.          | [ ]IOREF                 MISO/12[ ] |  
  32.          | [ ]RST                   MOSI/11[ ]~|  Pin S3 del sensor de color TCS3200
  33.          | [ ]3V3    +---+               10[ ]~|  Pin S2 del sensor de color TCS3200
  34.          | [ ]5v    -| A |-               9[ ]~|  Pin S1 del sensor de color TCS3200
  35.          | [ ]GND   -| R |-               8[ ] |  Pin S0 del sensor de color TCS3200
  36.          | [ ]GND   -| D |-                    |
  37.          | [ ]Vin   -| U |-               7[ ] |  
  38.          |          -| I |-               6[ ]~|  Pin IN del disco de 7 LEDS NeoPixel
  39.          | [ ]A0    -| N |-               5[ ]~|  
  40.          | [ ]A1    -| O |-               4[ ] |  
  41.          | [ ]A2     +---+           INT1/3[ ]~|  
  42.          | [ ]A3                     INT0/2[ ] |  Pin OUT del sensor de color TCS3200
  43.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  44.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  45.          |            [ ] [ ] [ ]              |
  46.          |  UNO_R3    GND MOSI 5V  ____________/
  47.           \_______________________/
  48.  
  49.   NOTAS:
  50.    
  51.    - Alimentación del sensor de reconocimiento del color TCS3200:
  52.      - VCC --> +5V de Arduino // GND --> GND de Arduino.
  53.      - Pin OE del sensor de reconocimiento del color TCS3200 --> GND de Arduino
  54.    - Alimentación del disco de 7 LEDS NeoPixel:
  55.      - VCC --> +5V de Arduino // GND --> GND de Arduino.    
  56. */
  57.  
  58.   // Incluimos librerías
  59.   #include <Adafruit_NeoPixel.h>
  60.   #include <Metro.h>
  61.   #include <math.h>
  62.  
  63.   // Pin digital (PWM) donde conecto la entrada del Módulo NeoPixel de 7 LEDS
  64.   #define PIN            6
  65.   // Número de NeoPixels del disco conectados a Arduino
  66.   #define NUMEROPIXELS      7
  67.  
  68.   // Objetos de tipo Metro que activan intervalos de 60, 50 y 10 ms respectivamente
  69.   // Cuando se alcanza el tiempo ajustado se activan a nivel alto.
  70.   Metro encender = Metro(60);
  71.   Metro procesar = Metro(50);
  72.   Metro adquirir = Metro(10);
  73.  
  74.   // Objeto de tipo Adafruit_NeoPixel
  75.   Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMEROPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  76.  
  77.   // Variables internas del programa
  78.   int S0 = 8, S1 = 9, S2 = 10, S3 = 11; // Pines digitales para el sensor de color
  79.   int OUT = 2; // Pin digital para el pin OUT del sensor de reconocimiento del color
  80.   int bandera = 0;
  81.   int contador = 0;
  82.   int i = 0;
  83.   int contador_R = 0, contador_G = 0, contador_B = 0;
  84.   int promedio_R = 0, promedio_G = 0, promedio_B = 0;
  85.   int valor_R = 0, valor_G = 0, valor_B = 0;
  86.   static int entrada_R[5] ={0,0,0,0,0}, entrada_G[5] ={0,0,0,0,0}, entrada_B[5] ={0,0,0,0,0};
  87.  
  88.   void setup()
  89.   {
  90.     pixels.begin(); // Inicializa los LED NeoPixel
  91.     Serial.begin(115200); // Comienzo de la comunicación serie
  92.     // Pines digitales como salida
  93.     pinMode(S0,OUTPUT);
  94.     pinMode(S1,OUTPUT);
  95.     pinMode(S2,OUTPUT);
  96.     pinMode(S3,OUTPUT);
  97.   }
  98.  
  99.   // Función de configuración de frecuencia e interrupción.
  100.   void configuracion()
  101.   {
  102.     // Frecuencia de salida al 100%
  103.     digitalWrite(S0,HIGH);
  104.     digitalWrite(S1,HIGH);
  105.     // Llamada a la interrupción INT 0 (Pin digital 2 --> OUT)
  106.     attachInterrupt(0, ISR_INTO, CHANGE);
  107.   }
  108.  
  109.   // Función de servicio de la rutina de la interrupción
  110.   void ISR_INTO()
  111.   {
  112.     contador++;
  113.   }
  114.    
  115.  
  116.   void loop()      
  117.   {
  118.     // Llamada a la función de configuración
  119.     configuracion();
  120.     // Si han transcurrido 10 ms
  121.     if(adquirir.check())
  122.     {
  123.       // Llamada a la función de adquisición de datos
  124.       adquisicion_datos();
  125.     }
  126.     // Si han transcurrido 50 ms
  127.     if(procesar.check())
  128.     {
  129.       // Llamada a la función de procesamiento de datos
  130.       procesamiento_datos();
  131.     }  
  132.     // Si han transcurrido 60 ms
  133.     if(encender.check())
  134.     {
  135.       // Llamada a la función que muestra los datos
  136.       encendido_LEDS();
  137.     }
  138.   }
  139.  
  140.   // Función para adquirir los datos
  141.   void adquisicion_datos()  
  142.   {
  143.     bandera++;
  144.     if(bandera == 1)
  145.     {
  146.       // Filtro Rojo activado
  147.       digitalWrite(S2,LOW);
  148.       digitalWrite(S3,LOW);  
  149.       contador_R = contador;    
  150.       // Filtro Verde activado
  151.       digitalWrite(S2,HIGH);
  152.       digitalWrite(S3,HIGH);
  153.     }    
  154.     else if(bandera == 2)
  155.     {
  156.       contador_G = contador;  
  157.       // Filtro Azul activado
  158.       digitalWrite(S2,LOW);
  159.       digitalWrite(S3,HIGH);  
  160.     }
  161.     else if(bandera == 3)
  162.     {
  163.       contador_B = contador;  
  164.       // Filtro Rojo activado
  165.       digitalWrite(S2,LOW);
  166.       digitalWrite(S3,LOW);  
  167.       bandera = 0;
  168.     }
  169.     contador = 0;
  170.   }
  171.  
  172.   // Función que procesa los datos
  173.   void  procesamiento_datos()
  174.   {
  175.     for(i = 4; i > 0; i--)
  176.     {
  177.       entrada_R[i] = entrada_R[i-1];
  178.       entrada_G[i] = entrada_G[i-1];
  179.       entrada_B[i] = entrada_B[i-1];
  180.     }
  181.    
  182.     if(contador_R < 2500)
  183.       entrada_R[0] = contador_R;
  184.     else
  185.       entrada_R[0] = entrada_R[1];
  186.      
  187.     if(contador_G < 2500)
  188.       entrada_G[0] = contador_G;
  189.     else
  190.       entrada_G[0] = entrada_G[1];
  191.    
  192.     if(contador_B < 2500)
  193.       entrada_B[0] = contador_B;
  194.     else
  195.       entrada_B[0] = entrada_B[1];    
  196.    
  197.     promedio_R = 0;
  198.     promedio_G = 0;
  199.     promedio_B = 0;
  200.    
  201.     for(i = 0; i <= 4; i++)
  202.     {
  203.       promedio_R += entrada_R[i];
  204.       promedio_G += entrada_G[i];
  205.       promedio_B += entrada_B[i];
  206.     }
  207.      
  208.     // Media de los valores RGB
  209.     promedio_R /= 5;
  210.     promedio_G /= 5;
  211.     promedio_B /= 5;      
  212.   }
  213.  
  214.   // Función que enciende los LEDS con el color adquirido
  215.   void  encendido_LEDS()    
  216.   {
  217.     // Igualamos a la media de los valores RGB
  218.     valor_R = promedio_R;
  219.     valor_G = promedio_G;
  220.     valor_B = promedio_B;    
  221.    
  222.     // Restringimos los valores RGB
  223.     valor_R = constrain(valor_R,350,1700);    
  224.     valor_G = constrain(valor_G,350,1650);
  225.     valor_B = constrain(valor_B,350,1500);
  226.    
  227.     // Mapeamos los valores RGB
  228.     valor_R = map(valor_R,350,1700,0,255);  
  229.     valor_G = map(valor_G,350,1650,0,255);
  230.     valor_B = map(valor_B,350,1500,0,255);
  231.    
  232.     // Presentamos los valores RGB a través del monitor serie
  233.     Serial.print("R:");
  234.     Serial.print(valor_R,DEC);
  235.     Serial.print(" ");
  236.     Serial.print("G:");
  237.     Serial.print(valor_G,DEC);
  238.     Serial.print(" ");
  239.     Serial.print("B:");
  240.     Serial.println(valor_B,DEC);
  241.    
  242.     // Enviamos los valores RGB a cada uno de los 7 LEDS NeoPixel
  243.     for(i=0; i<NUMEROPIXELS; i++)
  244.     {
  245.       pixels.setPixelColor(i, pixels.Color(valor_R,valor_G,valor_B));
  246.       pixels.show(); // Actualiza el estado de los LEDS NeoPixel
  247.     }
  248.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement