Proyecto Arduino Uno y Sensor TSL1402R

Hola a todos soy nuevo en arduino y estoy trabajando en un proyecto con un arreglo de sensores TSL1402R que posee dos arreglos de 128 sensores fotonicos cada uno, el cual para procesar la informacion luminica recibida posee una ecuación de tiempo de integración

la cual es Tint = (1/frecuencia Clock)*(n-18)+20us

donde n es la cantidad de sensores fotonicos a usar (maximo 128 por cada arreglo por separado).

estoy utilizando este codigo para la lectura (tomado y modificado desde https://playground.arduino.cc/Main/TSL1402R)

int CLKpin = 5; // <-- Pin Arduino que entrega los pulsos de reloj al pin 5 (CLK) del TSL1402R
int SIpin = 4; // <-- Pin Arduino que entrega el impulso SI (entrada serie) al pin 4 del TSL1402R
int AOpin1 = 4; // <-- Pin Arduino conectado al pin 4 (salida analógica 1) del TSL1402R// salida analoga 1
int AOpin2 = 5; // <-- Pin Arduino conectado al pin 5 (salida analógica 5) del TSL1402R// salida Analoga 2
int IntArray[256]; // <-- El Array donde se almacena la lectura de los fotodiodos, como números enteros entre 0 y 1023.
int np = 128; //numero de datos
int Ch1Pin2 = 2;


//caracterizacion de entradas y salidas.
void setup()
{
  // Inicializa dos pines de Arduino como salida.
  
  pinMode(CLKpin, OUTPUT);
  pinMode(SIpin, OUTPUT);
  
  //Limpia todos los pines análogos y digitales del Arduino:
  
  for ( int i = 0; i < 14; i++ )
  {
    digitalWrite(i, LOW);
  }
  // Retirar cualquier impulso SI existente a través del registro ccd:
  for (int i = 0; i < 260; i++)
  {
    ClockPulse();
  }
  // Crear un nuevo pulso de reloj de SI y que mismo pulso SI a través del registro del sensor:
  digitalWrite(SIpin, HIGH);
  ClockPulse();
  digitalWrite(SIpin, LOW);
  for (int i = 0; i < 260; i++)
  {
    ClockPulse();
  }
  Serial.begin(115200);
  
  //Pin para la primera Salida Digital en pos de paralelizar los canales (Canal 1 en pin 2 digital).
  pinMode(Ch1Pin2, OUTPUT);
}

//lectura serial del arreglo de sensores.
void loop()
{
 
  //Detiene la integración continua de los quantos de luz de cada fotodiodo mediante un pulso de reloj de SI en el registro de sensores:
  digitalWrite(SIpin, HIGH);
  ClockPulse();
  digitalWrite(SIpin, LOW);
  
   // A continuación, se leen los 256 píxeles en paralelo. Se Guarda el resultado en un array. 
  // Cada pulso de reloj hace que un nuevo píxel exponga su valor en las dos salidas:
  
  for (int i = 0; i < np; i++)
  {
    // delayMicroseconds(20);// <-- Añadimos un retraso para estabilizar la salida AO del sensor
    
    IntArray[i] = analogRead(AOpin1);
    IntArray[i + np] = analogRead(AOpin2);
    ClockPulse();
  }
  // A continuación, se detiene la integración en curso de los cuantos de luz de cada fotodiodo mediante un pulso reloj en SI:
  
  digitalWrite(SIpin, HIGH);
  ClockPulse();
  digitalWrite(SIpin, LOW);

  // A continuación, se envia la medición almacenada en el arreglo a la computadora usando el puerto serial usb.
  // Esto lleva al rededor de 80 ms durante el cual no hay pulsos de reloj que alcancen el sensor.
  // No ocurre ninguna integración durante este tiempo a partir de los fotodiodos ya que la integración comienza
  // después del décimo octavo pulso de reloj después de insertar un pulso SI envía los datos de forma serial.
  
  Serial.print(" linea : ");
  for (int i = 0; i < 256; i++)
  {
    //Serial.print(IntArray[i]);
    //Serial.print(" ");
    //Discrimina sobre y bajo lecura de 250 e imprime por consola serial el valor.
    if (IntArray[i]> 250){
      Serial.print(IntArray[i]);
      Serial.print("Alto");
      Serial.print(" ");
    }else{
      Serial.print(IntArray[i]);
      Serial.print("Bajo");
      Serial.print(" ");
    }
  }
  Serial.println(" "); // <-- Envíe un salto de línea para indicar que la medición se transmite.
  for (int i = 0; i < 255; i++)
  {
    digitalWrite(CLKpin, HIGH);
    digitalWrite(CLKpin, LOW);
  }
  // El tiempo de integración del ciclo de medición actual del programa es ~ 3ms. Si se desea un mayor tiempo de integración, descomente la siguiente línea:
  // delay(2); // <-- Añadir tiempo de integración, aumentar el tiempo de integracion en 2us.
}

// Esta función genera un pulso de reloj saliente desde el pin digital de Arduino 'CLKpin'. Este impulso de reloj alimenta al pin 5 del sensor lineal:

void ClockPulse()
{
  digitalWrite(CLKpin, HIGH);
  digitalWrite(CLKpin, LOW);
}

mis dudas son la siguiente:

  1. El tiempo de integración del sensor es modificable? , se que al final abajo dice para agregar tiempo de integracion pero esto es para aumentar el tiempo de integracion solamente y el calculo de la ecuacion que ya mencione es transparente por ende no se a que frecuencia esta trabajando dado que arduino uno tiene clock de 16Mhz y el sensor trabaja en el rango de 5Khz a 8Mhz.

  2. Por lo ultimo deberia asumir que esta trabajando a maxima frecuencia?

Gracias por el tiempo utilizado en leer el post y perdón si esta en un apartado diferente al correcto
en el foro.

La frecuencia de trabajo tendras que medirla porque la establece el Arduino, ya que fija el Clock del array a traves de ClockPulse().
Una manera es usando micros() para ver en que tiempo se cumple un ciclo de pulsos

  for (int i = 0; i < np; i++)
  {
    // delayMicroseconds(20);// <-- Añadimos un retraso para estabilizar la salida AO del sensor
    
    IntArray[i] = analogRead(AOpin1);
    IntArray[i + np] = analogRead(AOpin2);
    ClockPulse();
  }

Esta claro que es esta parte donde se establece tu Tint

Esta librería luce interesante, te recomiendo la mires... no cambia mucho pero tiene los tiempos algo mas espaciados a intervalos de 4useg en ciclos configurables.

Librería
La inicialización pide TSL1402R::TSL1402R(byte SI, byte CLK, byte SO, byte AO, int SPEED)

Hay comentarios desalentadores respecto al código básico del playground que ya usaste.
ver links y otros de éxito Link de experiencia mas video

Muchas Gracias Surbyte, mirare la libreria que me recomiendas y seguire investigando,
si llego a tener alguna otra duda lo posteare por acá.

Surbyte una consulta como podria medir el clock pusle con micros(), realmente soy muy nuevo en arduino
y me pierdo con facilidad, descomente la parte del codigo que me mencionaste pero, al revisar el monitor
aparece un array leido y luego comienza a leer a velocidad de rayo.

disculpa lo inconveniente que te pueda causar, muchas gracias.

PD: sobre la libreria que me enviaste no supe como utilizarla, dado que no se como modificar los valores
de los pines que estoy usando que son los del codigo que puse inicialemente.

Usar micros es lo mismo que usar millis().
Ambos devuelven datos del tipo unsigned long

Veamos esto.. cuando demora ClockPulse(); que sabemos que es

void ClockPulse()
{
  digitalWrite(CLKpin, HIGH);
  digitalWrite(CLKpin, LOW);
}

la forma de medir sería

   unsigned long startmicros = micros();
   ClockPulse();
   unsigend long demora = micros()-startmicros();
   char buffer[20];                                      
   sprintf(buffer, "Demora : %ld useg", demora);
   Serial.println(buffer);
   // Todo esto pudo hacerse asi
   // Serial.print("Demora : ");
   // Serial.print(demora);
   // Serial.println(" useg");

Claro que solo estoy mirando esta parte y me olvido de todo lo demás.
Intenta ver si de esta manera vas viendo el tiempo de integración que te preocupa.

Doy por cerrado el tema, encontre una solución para la parte de la frecuencia siendo el maximo utilizable por el sensor 161.4kHz para poder leer y almacenar los datos en un arreglo en arduino uno.