Go Down

Topic: Código de sensor flex (Read 473 times) previous topic - next topic

9acca9

Buenas a todos.
Resulta que estoy intentando lograr esto.
Tengo un arduino con un sensor flex y un motor pequeño (que saqué de una lectora de cd, con positivo y negativo no más).

Resulta que quiero que una vez se registre un valor igual o mayor a "3" en los grados del sensor flex, y que hayan pasado 3 segundos en ese grado, se encienda el motor, hasta que ese valor vuelva a menos que 3.

Hasta ahora tengo el código de el sensor, ya lo tengo calibrado, peeeeero no sé cómo hacer lo demás.
Si alguien pudiera ponerme un pedazo de código se lo agradecería mucho.
Saludos y gracias

esto es lo del sensor:

Code: [Select]
const int FLEX_PIN = A0;

const float VCC = 4.98; //
const float R_DIV = 4000.0; //


const float STRAIGHT_RESISTANCE = 10200.0;
const float BEND_RESISTANCE = 40000.0;

void setup()
{
        Serial.begin(9600);
        pinMode(FLEX_PIN, INPUT);
}

void loop()
{
          int flexADC = analogRead(FLEX_PIN);
         float flexV = flexADC * VCC / 1023.0;
          float flexR = R_DIV * (VCC / flexV - 1.0);
          Serial.println("Resistance: " + String(flexR) + " ohms");
 
          Serial.println("flexADC: " + String(flexADC) + " ohms");

         
         float angle = map(flexR, STRAIGHT_RESISTANCE, BEND_RESISTANCE,
                   0, 90.0);
         Serial.println("Bend: " + String(angle) + " degrees");
          Serial.println();
 
          delay(500);
}

surbyte

Y tienes el código del motor... muestranos el código del motor asegurando que funciona y te diremos como integrar ambos.

9acca9

Hola. Muchas gracias.
No tengo el codigo del motor. Intente hacerlo yo... supongo que es algo como

if angle >= 3 && (la cuestion del tiempo)
{
Digital.write bla bla HIGH
}

El tema es que no se como decirle que se fije si ese valor o uno mayor duro mas de 3 segundos... como hago para que se de cuenta.
Y ojo, no es que el valor 3 dure 3 segundos, o cualquiera superior 3 segundos. Tambien podria ser valores consecutivos asi 3,4,5 (lo que me da 3 segundos con valores por encima de 3 (suponiendo que cada uno duro un segundo.......))

Pero bueno, como se soluciona este tema???
Muchas gracias!!!

surbyte

Primero, aunque sea 1 línea de código usa siempre etiquetas para código.

Segundo, si no sabes como accionar una simple salida digital pues ve a Documentación => Indice de temas tutoriales  => clases de youtube o lee los Libros ahi sugeridos.
En ellos encontrarás como se resuelve el accionamiento de una salida digital.

tambien puedes usar siempre el lema de mi Perfil: Antes de preguntar busca en Google : Arduino digitalWrite

9acca9

#4
Apr 19, 2019, 09:56 pm Last Edit: Apr 19, 2019, 10:31 pm by 9acca9
Buenas, muchas gracias por tu tiempo.
Finalmente tengo el código, ya lo probé y funciona a las mil maravillas, lo pongo acá para compartirlo por si a alguien le sirve, y también por si se les ocurren críticas.

Y por otro lado, teniendo un motor de lectora de cd con sólo positivo y negativo, no hay manera de controlarlo que no sea a través de un relé no??? porque me encantaría sacar el relé de este prototipo.

Saludos y muchas gracias

Code: [Select]
bool countingTime = false; //to know if the variable has not changed below the threshold
uint32_t startBeing3orMore; //to save the milliseconds when the variable started to be 3 or more


const int FLEX_PIN = A0; // Pin connected to voltage divider output

// Measure the voltage at 5V and the actual resistance of your
// 47k resistor, and enter them below:
const float VCC = 4.98; // Measured voltage of Ardunio 5V line
const float R_DIV = 4000.0; // Measured resistance of 3.3k resistor

// Upload the code, then try to adjust these values to more
// accurately calculate bend degree.
const float STRAIGHT_RESISTANCE = 10200.0;
const float BEND_RESISTANCE = 40000.0;



void setup()
{
        Serial.begin(9600);
        pinMode(FLEX_PIN, INPUT);
        pinMode(2, OUTPUT);
}

void loop()
{
          // Read the ADC, and calculate voltage and resistance from it
          int flexADC = analogRead(FLEX_PIN);
         float flexV = flexADC * VCC / 1023.0;
          float flexR = R_DIV * (VCC / flexV - 1.0);
          Serial.println("Resistance: " + String(flexR) + " ohms");
 
          Serial.println("flexADC: " + String(flexADC) + " ohms");

          // Use the calculated resistance to estimate the sensor's
          // bend angle:
         float angle = map(flexR, STRAIGHT_RESISTANCE, BEND_RESISTANCE,
                   0, 90.0);
         Serial.println("Bend: " + String(angle) + " degrees");
          Serial.println();
 
          delay(500);

//para activar el motor
if (angle >= 3) {
       if (!countingTime) {
       startBeing3orMore = millis();
       }
   countingTime = true;
   } else {
   countingTime = false;
   }
   if (countingTime && millis() - startBeing3orMore > 3000) {
    digitalWrite(2, HIGH);
    Serial.print("motor = ON");
    delay(13);
   }
   if (angle < 3) {
    digitalWrite(2,LOW);
    delay(13);
   }
}



pd.: acabo de encontrar que se puede manejar un motor dc con un transistor, diodo y resistencia. así que adios relé (igual todavía no lo probé).

surbyte

Te falta leer mucho por eso te comento que : Un motor se prende apaga con un RELE o mejor con un transistor pero existe algo que se llama PWM que te permite variar el ancho de pulso a una frecuencia fija, entonces resulta que el valor medio que ve el motor es como si alguien le variara la tensión desde 0 a 5V.
Lo que ves en el motor que varia sus RPM de 0 a máxima velocidad para los 5V.

Existe otra cosa que se llama puente H. Es un arreglo de 2 transitores por rama (total 4) transitores que permite hacerlo girar en uno u otro sentido.
Ejemplo el L298 hasta 2A.

Go Up