firmwareSandsara
WorkingArea.cpp File Reference
#include "WorkingArea.h"
Include dependency graph for WorkingArea.cpp:

Functions

MeanFilter< long > meanFilter (5)
 
MeanFilter< long > meanFilter2 (40)
 
MeanFilter< long > meanFilter3 (10)
 
MeanFilter< long > meanFilter4 (10)
 
void findingSlowSensor2 ()
 Esta funcion continua con el proceso de calibracion una vez que el brazo 2 esta cerca del sensor hall. More...
 
void findingSlowSensor1 ()
 Esta funcion continua con el proceso de calibracion una vez que el brazo 1 esta cerca del sensor hall. More...
 
void findingSlowSensor2Negative ()
 Esta funcion continua con el proceso de calibracion una vez que el brazo 2 esta cerca del sensor hall, esta version de la funcion contempla el polo negativo del iman DESCRIPCION GENERAL Inicia moviendose 100 pasos en sentido antihorario Regresa en sentido horario hasta que es detectado por el sensor Continua moviendose en sentido horario hasta completar 600 pasos, en cada paso toma la medicion del sensor y este dato se almacena en el vector value2_r[] Regresa el brazo en sentido antihorario hasta que es detectado por el sensor Continua moviendose en sentido antihorario hasta completar 600 pasos, en cada paso toma la medicion del sensor y este dato se almacena en el vector value2[] La grafica de ambos vectores es de forma gaussiana por lo cual se determina un limite del rango de busqueda en ambas funciones, dicho rango se establecio como los valores mayores al 90% del valor maximo encontrado. More...
 
void findingSlowSensor1Negative ()
 Esta funcion continua con el proceso de calibracion una vez que el brazo 1 esta cerca del sensor hall, esta version de la funcion contempla el polo negativo del iman DESCRIPCION GENERAL Inicia moviendo el brazo uno 80 pasos en sentido antihorario para salir por completo del rango del sensor Comienza a tomar mediciones del sensor en cada paso que avanza en sentido horario hasta llenar el vector value[] Durante el llenado del vector tambien se determina el valor maximo entre todos los elementos del vector La grafica de los datos tiene forma gaussiana por lo cual se determina un limite del rango en cual se buscara el punto medio de la funcion, dicho rango se establecio como los valores mayores al 90% del valor maximo encontrado. More...
 
void configTimerForMovement ()
 
void move (int pasos, int motor_d, int Speed)
 Esta funcion perimite mover los motores de manera controlada mediante numero de pasos. More...
 
int zero_Hall1 (void)
 Esta funcion determina el nivel de referencia a partir del cual se considera la deteccion de campo magnetico. More...
 
int zero_Hall2 (void)
 Esta funcion determina el nivel de referencia a partir del cual se considera la deteccion de campo magnetico. More...
 
int Pole1 (void)
 Esta funcion determina el polo del campo magnetico correspondiente al iman que interacciona con el brazo 1. More...
 
int Pole2 (void)
 Esta funcion determina el polo del campo magnetico correspondiente al iman que interacciona con el brazo 2. More...
 
int Check_ini (void)
 Esta funcion verifica si ya se han almacenado en la EEPROM las variables iniciales necesarias para en funcionamiento del sistema, lo cual solo es posible cuando se programa por primera vez la ESP32 o despues de un reset completo del sistema. More...
 
void IRAM_ATTR onTimer ()
 
void verif_cal_positiveb1 (void)
 Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero. More...
 
void verif_cal_positiveb2 (void)
 Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero. More...
 
void verif_cal_negativeb1 (void)
 Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero. More...
 
void verif_cal_negativeb2 (void)
 Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero. More...
 

Variables

int MICROSTEPPING = String(String(dataS[1]) + String(dataS[2])).toFloat()
 
byte L
 
byte H
 
int flag = 0
 
int p = 0
 
int motorAngle = 0
 
int Speed = 5000
 
int A = 0
 
int B = 0
 
int maximum = 0
 
int maximum2 = 0
 
int minimum = 5000
 
int minimum2 = 5000
 
int sensorMax1
 
int sensorMin1
 
TMC2209Stepper tmcMotorASERIAL_PORT
 
TMC2209Stepper tmcMotorBSERIAL_PORT2
 
hw_timer_t * timer1 = NULL
 
int value [80]
 
int value_r [80]
 
int value2 [300]
 
int value2_r [300]
 
int meanVector [5]
 
int simiVector [5]
 
int maximumVector [5]
 
int minimumVector [5]
 
int meanVector2 [5]
 
int simiVector2 [5]
 
int maximumVector2 [5]
 
int minimumVector2 [5]
 
int avoid = 0
 
int avoid2 = 0
 
int level_zero1
 
int level_zero2
 
int sensorMax2
 
int sensorMin2
 
int sensorRead2
 
int sensorRead1
 
int sensorPole1
 
int sensorPole2
 
int adjustIniFlag = 0
 

Function Documentation

◆ Check_ini()

int Check_ini ( void  )

Esta funcion verifica si ya se han almacenado en la EEPROM las variables iniciales necesarias para en funcionamiento del sistema, lo cual solo es posible cuando se programa por primera vez la ESP32 o despues de un reset completo del sistema.

Returns
Retorna un 1 si se determina que la EEPROM eseta vacia o un 0 en caso de que ya existan los valores almacenados.

◆ configTimerForMovement()

void configTimerForMovement ( )

◆ findingSlowSensor1()

void findingSlowSensor1 ( )

Esta funcion continua con el proceso de calibracion una vez que el brazo 1 esta cerca del sensor hall.

Inicia moviendo el brazo uno 80 pasos en sentido antihorario para salir por completo del rango del sensor Comienza a tomar mediciones del sensor en cada paso que avanza en sentido horario hasta llenar el vector value[] Durante el llenado del vector tambien se determina el valor maximo entre todos los elementos del vector La grafica de los datos tiene forma gaussiana por lo cual se determina un limite del rango en cual se buscara el punto medio de la funcion, dicho rango se establecio como los valores mayores al 90% del valor maximo encontrado. Se determinan los pasos correspondientes a el limite derecho y el limite izquierdo de la funcion Se calculan los pasos necesarios para llegar al punto medio del sensor

Parameters
value[]En este vector se alamacenan los valores obtenidos del sensor Hall.
limitEn esta variable se define el limite del intervalo en el cual se buscara el punto medio de los datos almacenados en el vector value.
steps_iniAlmacena el numero de pasos para llegar al inicio del intervalo de busqueda.
steps_finAlmacena el numero de pasos para llegar al fin del intervalo de busqueda.
pasEsta variable almacena los pasos necesarios para posicionar el brazo 1 al centro del sensor hall.

◆ findingSlowSensor1Negative()

void findingSlowSensor1Negative ( )

Esta funcion continua con el proceso de calibracion una vez que el brazo 1 esta cerca del sensor hall, esta version de la funcion contempla el polo negativo del iman DESCRIPCION GENERAL Inicia moviendo el brazo uno 80 pasos en sentido antihorario para salir por completo del rango del sensor Comienza a tomar mediciones del sensor en cada paso que avanza en sentido horario hasta llenar el vector value[] Durante el llenado del vector tambien se determina el valor maximo entre todos los elementos del vector La grafica de los datos tiene forma gaussiana por lo cual se determina un limite del rango en cual se buscara el punto medio de la funcion, dicho rango se establecio como los valores mayores al 90% del valor maximo encontrado.

Se determinan los pasos correspondientes a el limite derecho y el limite izquierdo de la funcion Se calculan los pasos necesarios para llegar al punto medio del sensor

Parameters
value[]En este vector se alamacenan los valores obtenidos del sensor Hall.
limitEn esta variable se define el limite del intervalo en el cual se buscara el punto medio de los datos almacenados en el vector value.
steps_iniAlmacena el numero de pasos para llegar al inicio del intervalo de busqueda.
steps_finAlmacena el numero de pasos para llegar al fin del intervalo de busqueda.
pasEsta variable almacena los pasos necesarios para posicionar el brazo 1 al centro del sensor hall.

◆ findingSlowSensor2()

void findingSlowSensor2 ( )

Esta funcion continua con el proceso de calibracion una vez que el brazo 2 esta cerca del sensor hall.

DESCRIPCION GENERAL Inicia moviendose 100 pasos en sentido antihorario Regresa en sentido horario hasta que es detectado por el sensor Continua moviendose en sentido horario hasta completar 600 pasos, en cada paso toma la medicion del sensor y este dato se almacena en el vector value2_r[] Regresa el brazo en sentido antihorario hasta que es detectado por el sensor Continua moviendose en sentido antihorario hasta completar 600 pasos, en cada paso toma la medicion del sensor y este dato se almacena en el vector value2[] La grafica de ambos vectores es de forma gaussiana por lo cual se determina un limite del rango de busqueda en ambas funciones, dicho rango se establecio como los valores mayores al 90% del valor maximo encontrado. Se determinan los pasos correspondientes a el limite derecho y el limite izquierdo de ambas funciones y se usa el limite derecho de la funcion dos y el limite izquierdo de la funcion uno para encontrar el punto medio. Se calculan los pasos necesarios para llegar al punto medio del sensor

Parameters
value2[]En este vector se alamacenan los valores obtenidos del sensor Hall.
limitEn esta variable se define el limite del intervalo en el cual se buscara el punto medio de los datos almacenados en el vector value.
steps_iniAlmacena el numero de pasos para llegar al inicio del intervalo de busqueda.
steps_finAlmacena el numero de pasos para llegar al fin del intervalo de busqueda.
pasEsta variable almacena los pasos necesarios para posicionar el brazo 2 al centro del sensor hall.

◆ findingSlowSensor2Negative()

void findingSlowSensor2Negative ( )

Esta funcion continua con el proceso de calibracion una vez que el brazo 2 esta cerca del sensor hall, esta version de la funcion contempla el polo negativo del iman DESCRIPCION GENERAL Inicia moviendose 100 pasos en sentido antihorario Regresa en sentido horario hasta que es detectado por el sensor Continua moviendose en sentido horario hasta completar 600 pasos, en cada paso toma la medicion del sensor y este dato se almacena en el vector value2_r[] Regresa el brazo en sentido antihorario hasta que es detectado por el sensor Continua moviendose en sentido antihorario hasta completar 600 pasos, en cada paso toma la medicion del sensor y este dato se almacena en el vector value2[] La grafica de ambos vectores es de forma gaussiana por lo cual se determina un limite del rango de busqueda en ambas funciones, dicho rango se establecio como los valores mayores al 90% del valor maximo encontrado.

Se determinan los pasos correspondientes a el limite derecho y el limite izquierdo de ambas funciones y se usa el limite derecho de la funcion dos y el limite izquierdo de la funcion uno para encontrar el punto medio. Se calculan los pasos necesarios para llegar al punto medio del sensor

Parameters
value2[]En este vector se alamacenan los valores obtenidos del sensor Hall.
limitEn esta variable se define el limite del intervalo en el cual se buscara el punto medio de los datos almacenados en el vector value.
steps_iniAlmacena el numero de pasos para llegar al inicio del intervalo de busqueda.
steps_finAlmacena el numero de pasos para llegar al fin del intervalo de busqueda.
pasEsta variable almacena los pasos necesarios para posicionar el brazo 2 al centro del sensor hall.

◆ meanFilter()

MeanFilter<long> meanFilter ( )

◆ meanFilter2()

MeanFilter<long> meanFilter2 ( 40  )

◆ meanFilter3()

MeanFilter<long> meanFilter3 ( 10  )

◆ meanFilter4()

MeanFilter<long> meanFilter4 ( 10  )

◆ move()

void move ( int  pasos,
int  motor_d,
int  Speed 
)

Esta funcion perimite mover los motores de manera controlada mediante numero de pasos.

Parameters
pasosEsta variable indica el numero de pasos que se desea avanzar.
motor_dIndica el motor que se quiere mover, opcion 1 o 2.
SpeedIndica la velocidad del giro, si se disminuye el valor se aumenta la velocidad y si se aumenta este valor la velocidad disminuye .

◆ onTimer()

void IRAM_ATTR onTimer ( )

◆ Pole1()

int Pole1 ( void  )

Esta funcion determina el polo del campo magnetico correspondiente al iman que interacciona con el brazo 1.

DESCRIPCION GFENERAL Antes de entrar a esta funcion el brazo ya se encuentra posicionado correctamente al inicio del sensor Para determinar el polo se avanzan 100 pasos para que al retornar el movimiento el brazo termine en la mis ma posicion en la que inicio. Al retornar el sentido horario almacena el valor maximo y el valor minimo que haya obtenidode las mediciones tomadas en cada paso, este valor se obtiene como un valor absoluto respecto del nivel cero, el cual para este punto del programa ya se conoce. finalmente se compara el valor maximo absoluto obtenido y el valor minimo absoluto obtenido, si el maximo absoluto es mayor que el minimo absoluto se determina que le polo es positivo, en cambio si sucede de forma contraria se determina que el polo es negativo.

Parameters
vect_Pole1Se almacenan un conjunto de datos correspondientes a un barrido del brazo1 por debajo del sensor de efecto Hall.
Returns
Retorna un 1 si se determina que el polo positivo y un 0 si el polo es negativo.

◆ Pole2()

int Pole2 ( void  )

Esta funcion determina el polo del campo magnetico correspondiente al iman que interacciona con el brazo 2.

DESCRIPCION GFENERAL Antes de entrar a esta funcion el brazo ya se encuentra posicionado correctamente al inicio del sensor Para determinar el polo se avanzan 800 pasos para que al retornar el movimiento el brazo termine en la mis ma posicion en la que inicio. Al retornar el sentido horario almacena el valor maximo y el valor minimo que haya obtenidode las mediciones tomadas en cada paso, este valor se obtiene como un valor absoluto respecto del nivel cero, el cual para este punto del programa ya se conoce. finalmente se compara el valor maximo absoluto obtenido y el valor minimo absoluto obtenido, si el maximo absoluto es mayor que el minimo absoluto se determina que le polo es positivo, en cambio si sucede de forma contraria se determina que el polo es negativo.

Parameters
vect_Pole2Se almacenan un conjunto de datos correspondientes a un barrido del brazo2 por debajo del sensor de efecto Hall.
Returns
Retorna un 1 si se determina que el polo positivo y un 0 si el polo es negativo.

◆ verif_cal_negativeb1()

void verif_cal_negativeb1 ( void  )

Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero.

en este caso la funcion contempla solo al brazo 1 con la polaridad del iman negativa. DESCRIPCION GENERAL En la primera condicion de esta funcion se determina si el brazo se encuentra fuera del rango del sensor En caso de entrar en esta condicion inicia una busqueda con rango maximo de 200 pasos en sentido horario Si no se encuentra nada en ese rango inicia una busqueda en sentido antihorario con un rango maximo de 400 pasos Si encuentra el sensor en la primera busqueda se activa una bandera para determinar que esta posicionado del lado izquierdo del sensor posteriormente se mueve 100 pasos en sentido horario y regresa en sentido antihorario para posicionarse al inicio del sensor pero del lado derecho. Existe otro caso en el cual al iniciar la funcion el brazo ya se encuentra dentro del rango del sensor, en ese caso se mueve 100 pasos en sentido horario para garantizar que sale del sensor y posteriormente regresa en sentido antihorario hasta que es detectado por el sensor posicionandose asi del lado derecho del sensor. Finalmente cuando ya esta posicionado al inicio del lado izquierdo del sensor realiza el proceso de slow calibration para centrarse correctamente.

◆ verif_cal_negativeb2()

void verif_cal_negativeb2 ( void  )

Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero.

en este caso la funcion contempla solo al brazo 2 con la polaridad del iman negativa. DESCRIPCION GENERAL En la primera condicion de esta funcion se determina si el brazo se encuentra fuera del rango del sensor En caso de entrar en esta condicion inicia una busqueda con rango maximo de 600 pasos en sentido antihorario Si no se encuentra nada en ese rango inicia una busqueda en sentido horario con un rango maximo de 1200 pasos Si encuentra el sensor en la primera busqueda se activa una bandera para determinar que esta posicionado del lado derecho del sensor posteriormente se mueve 600 pasos en sentido antihorario y regresa en sentido horario para posicionarse al inicio del sensor pero del lado izquierdo. Existe otro caso en el cual al iniciar la funcion el brazo ya se encuentra dentro del rango del sensor, en ese caso se mueve 600 pasos en sentido antihorario para garantizar que sale del sensor y posteriormente regresa en sentido horario hasta que es detectado por el sensor posicionandose asi del lado izquierdo del sensor. Finalmente cuando ya esta posicionado al inicio del lado izquierdo del sensor realiza el proceso de slow calibration para centrarse correctamente.

◆ verif_cal_positiveb1()

void verif_cal_positiveb1 ( void  )

Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero.

en este caso la funcion contempla solo al brazo 1 con la polaridad del iman positiva. DESCRIPCION GENERAL En la primera condicion de esta funcion se determina si el brazo se encuentra fuera del rango del sensor En caso de entrar en esta condicion inicia una busqueda con rango maximo de 200 pasos en sentido horario Si no se encuentra nada en ese rango inicia una busqueda en sentido antihorario con un rango maximo de 400 pasos Si encuentra el sensor en la primera busqueda se activa una bandera para determinar que esta posicionado del lado izquierdo del sensor posteriormente se mueve 100 pasos en sentido horario y regresa en sentido antihorario para posicionarse al inicio del sensor pero del lado derecho. Existe otro caso en el cual al iniciar la funcion el brazo ya se encuentra dentro del rango del sensor, en ese caso se mueve 100 pasos en sentido horario para garantizar que sale del sensor y posteriormente regresa en sentido antihorario hasta que es detectado por el sensor posicionandose asi del lado derecho del sensor. Finalmente cuando ya esta posicionado al inicio del lado derecho del sensor realiza el proceso de slow calibration para centrarse correctamente.

◆ verif_cal_positiveb2()

void verif_cal_positiveb2 ( void  )

Esta funcion se utiliza entre programas para verificar que la siguiente secuencia iniciara en el punto cero.

en este caso la funcion contempla solo al brazo 2 con la polaridad del iman positiva. DESCRIPCION GENERAL En la primera condicion de esta funcion se determina si el brazo se encuentra fuera del rango del sensor En caso de entrar en esta condicion inicia una busqueda con rango maximo de 600 pasos en sentido antihorario Si no se encuentra nada en ese rango inicia una busqueda en sentido horario con un rango maximo de 1200 pasos Si encuentra el sensor en la primera busqueda se activa una bandera para determinar que esta posicionado del lado derecho del sensor posteriormente se mueve 600 pasos en sentido antihorario y regresa en sentido horario para posicionarse al inicio del sensor pero del lado izquierdo. Existe otro caso en el cual al iniciar la funcion el brazo ya se encuentra dentro del rango del sensor, en ese caso se mueve 600 pasos en sentido antihorario para garantizar que sale del sensor y posteriormente regresa en sentido horario hasta que es detectado por el sensor posicionandose asi del lado izquierdo del sensor. Finalmente cuando ya esta posicionado al inicio del lado izquierdo del sensor realiza el proceso de slow calibration para centrarse correctamente.

◆ zero_Hall1()

int zero_Hall1 ( void  )

Esta funcion determina el nivel de referencia a partir del cual se considera la deteccion de campo magnetico.

DESCRIPCION GENERAL Esta funcion inicia moviendo el brazo en sentido antihorario usando la funcion configTimerForMovement y sensando el DIAG_PIN en caso de que el brazo colisione, si colisiona el brazo 1 regresa 300 pasos y el brazo 2 baja a 90 grados para evitar la colision. Si el brazo logra finalizar el primer movimiento sin colisionar regresa 800 pasos e inicia el algoritmo para determinar el nivel cero del sensor. Se toman 5 muestras en angulos distintos, la primera muestra se toma desde donde quedo posicionado el brazo, posteriormente se mueve 10 grados en sentido horario para tomar la segunda muestra, se mueve 10 grados en sentido horario para la tercera medicion, regresa 30 grados en sentido antihorario para la cuarta medicion y avanza 10 grados mas para tomar la quita medicion. En cada una de las 5 muestras se toman 5 mediciones filtradas de las cuales se obtienen el valor maximo, el valor minimo, el valor promedio y un valor al que se le determino como valor similitud ya que es comparado con cada promedio de las 5 muestras tomadas a diferentes algulos y se almacena el contador de cuantos valores son similares al de la muestra analizada. Finalmente se determina que si 3 muestras o mas son similares se ha hallado el valor cero del sensor el cual se almacena en una variable global y se retorna un 1 para indicar que no es necesario repetir el procedimiento.

Parameters
level_zero1esta variable global almacena el nivel de referencia para el sensor Hall 1.
Returns
Retorna un 1 si el calculo del nivel de referencia se obtuvo correctamente, en caso contrario retorna un 0 para repetir de proceso de busqueda del nivel de referencia.

◆ zero_Hall2()

int zero_Hall2 ( void  )

Esta funcion determina el nivel de referencia a partir del cual se considera la deteccion de campo magnetico.

DESCRIPCION GENERAL Esta funcion inicia moviendo el brazo en sentido antihorario usando la funcion configTimerForMovement y sensando el DIAG_PIN en caso de que el brazo colisione, si colisiona el brazo 1 regresa 300 pasos y el brazo 2 baja a 90 grados para evitar la colision. Si el brazo logra finalizar el primer movimiento sin colisionar regresa 800 pasos e inicia el algoritmo para determinar el nivel cero del sensor. Se toman 5 muestras en angulos distintos, la primera muestra se toma desde donde quedo posicionado el brazo, posteriormente se mueve 10 grados en sentido horario para tomar la segunda muestra, se mueve 10 grados en sentido horario para la tercera medicion, regresa 30 grados en sentido antihorario para la cuarta medicion y avanza 10 grados mas para tomar la quita medicion. En cada una de las 5 muestras se toman 5 mediciones filtradas de las cuales se obtienen el valor maximo, el valor minimo, el valor promedio y un valor al que se le determino como valor similitud ya que es comparado con cada promedio de las 5 muestras tomadas a diferentes algulos y se almacena el contador de cuantos valores son similares al de la muestra analizada. Finalmente se determina que si 3 muestras o mas son similares se ha hallado el valor cero del sensor el cual se almacena en una variable global y se retorna un 1 para indicar que no es necesario repetir el procedimiento.

Parameters
level_zero2esta variable global almacena el nivel de referencia para el sensor Hall 2.
Returns
Retorna un 1 si el calculo del nivel de referencia se obtuvo correctamente, en caso contrario retorna un 0 para repetir de proceso de busqueda del nivel de referencia.

Variable Documentation

◆ A

int A = 0

◆ adjustIniFlag

int adjustIniFlag = 0

◆ avoid

int avoid = 0

◆ avoid2

int avoid2 = 0

◆ B

int B = 0

◆ flag

int flag = 0

◆ H

byte H

◆ L

byte L

◆ level_zero1

int level_zero1

◆ level_zero2

int level_zero2

◆ maximum

int maximum = 0

◆ maximum2

int maximum2 = 0

◆ maximumVector

int maximumVector[5]

◆ maximumVector2

int maximumVector2[5]

◆ meanVector

int meanVector[5]

◆ meanVector2

int meanVector2[5]

◆ MICROSTEPPING

int MICROSTEPPING = String(String(dataS[1]) + String(dataS[2])).toFloat()

◆ minimum

int minimum = 5000

◆ minimum2

int minimum2 = 5000

◆ minimumVector

int minimumVector[5]

◆ minimumVector2

int minimumVector2[5]

◆ motorAngle

int motorAngle = 0

◆ p

int p = 0

◆ sensorMax1

int sensorMax1

◆ sensorMax2

int sensorMax2

◆ sensorMin1

int sensorMin1

◆ sensorMin2

int sensorMin2

◆ sensorPole1

int sensorPole1

◆ sensorPole2

int sensorPole2

◆ sensorRead1

int sensorRead1

◆ sensorRead2

int sensorRead2

◆ SERIAL_PORT

TMC2209Stepper tmcMotorA& SERIAL_PORT

◆ SERIAL_PORT2

TMC2209Stepper tmcMotorB& SERIAL_PORT2

◆ simiVector

int simiVector[5]

◆ simiVector2

int simiVector2[5]

◆ Speed

int Speed = 5000

◆ timer1

hw_timer_t* timer1 = NULL

◆ value

int value[80]

◆ value2

int value2[300]

◆ value2_r

int value2_r[300]

◆ value_r

int value_r[80]