Go Down

Topic: Puente Analogo (Read 977 times) previous topic - next topic

Sodro

Estimados(as)

Estoy haciendo una un proyecto con botones y señales analogas variables

Necesito hacer un Kill-Switch para hacer que mi señal se corte cuando presiono un boton.
he puesto un led que enciende cuando el boton esta presionado y el dilema es ahora.

no se como hacer que mi señal analoga A0 salga por la señal A1 mientras el boton no está presionado.

el codigo es simple, se los dejo


Code: [Select]
      int boton = 8;
      int led = 9;
      int entradaAnaloga = A0;
      int salidaAnaloga = A1;
 

     void setup(){
               pinMode(boton, INPUT);       
               pinMode(led, OUTPUT);
               pinMode(entradaAnaloga, INPUT);       
               pinMode(salidaAnaloga, OUTPUT);
               Serial.begin(9600);
          }

     void loop(){         
                         
        if(digitalRead(8)==HIGH){// Si el boton está presionado
                        digitalWrite(led,HIGH); //Prende el led

                        // Aqui debería ir el comando que le da continuidad a la señal analoga
                       
                      }else{// Si el boton no está presionado
                        digitalWrite(led,LOW); //Apaga el led

                         // Aqui debería ir el comando que interrumpe la señal analoga
                       
                      }
              delay(50);
            }


desde ya, gracias por aportar

Lucario448

Que yo sepa, para interrumpir un flujo eléctrico se necesita... pues un interruptor. ¿Cómo una señal analógica interrumpe a otra?

Además, lo más cercano a un DAC es el PWM.

surbyte

Quote
no se como hacer que mi señal analoga A0 salga por la señal A1 mientras el boton no está presionado.
que pretendes con esto?

Sodro

#3
Jul 31, 2017, 03:53 pm Last Edit: Jul 31, 2017, 04:13 pm by Sodro
Lo que necesito es lo de la foto.




Para que lo quiero?
Lo quiero para poder interrumpir la señal de una guitarra (KillSwitch) con un botón arcade.
Por qué con arduino? Por qué además incorporaré otros botónes con otras funciones y algunas tiras led que reaccionarán a la cantidad de señal que tenga la entrada, pero primero lo primero. Necesito hacer que lo que entre por A0 salga por A1.

Espero sea viable, gracias

Lucario448

Lo que necesito es lo de la foto.
No se ve.


Para que lo quiero?
Lo quiero para poder interrumpir la señal de una guitarra (KillSwitch) con un botón arcade.
Eso ya lo tienes, supongo...


y algunas tiras led que reaccionarán a la cantidad de señal que tenga la entrada, pero primero lo primero. Necesito hacer que lo que entre por A0 salga por A1.
No hombre, un convertidor análogo-digital no puede hacer el proceso inverso; así no es como funcionan los pines Ax.

Recuerdas cuando dije...
Además, lo más cercano a un DAC es el PWM.
Ahí está la respuesta...

Sodro

Eso ya lo tienes, supongo...
No, Justo eso es lo que necesito

No hombre, un convertidor análogo-digital no puede hacer el proceso inverso; así no es como funcionan los pines Ax.

Recuerdas cuando dije...Ahí está la respuesta...
no necesito que pase de digital a analogo, lo que quiero es que con la entrada de señal analoga (que me da una variacion de voltaje) asignar valores a una salida digital para una tira led.

Lucario448

lo que quiero es que con la entrada de señal analoga (que me da una variacion de voltaje) asignar valores a una salida digital para una tira led.
¿Ah entonces que sea solo encendido o apagado?
Entonces fijas un umbral para A0 y declaras A1 como salida.
Reitero: Ax como salida es solamente digital, no analógica

rodripelto

Hola, lo primero las entradas analógicas son eso entradas.
Entonces tienes que usar una entrada analógica y un pin digital de los marcados con PWM.
La entrada analógica son 1024 valores.
La salida PWM son 256 valores.
Por lo tanto 1024/256=4

analogWrite(pin, digitalRead(pin)/4)

Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

surbyte

Quote
analogWrite(pin, digitalRead(pin)/4)
digitalRead(pin) dará 1/0
1/4 = 0 como división entera

No se de que hablas?

rodripelto

#9
Jul 31, 2017, 09:13 pm Last Edit: Jul 31, 2017, 09:29 pm by rodripelto
digitalRead(pin) dará 1/0
1/4 = 0 como división entera

No se de que hablas?
Efectivamente me he equivocado donde he puesto digitalread es analogread.

Pero de ahí a un ¿ no se de que hablas? Creo que con la explicación cualquiera lo podía deducir.

analogWrite(pin, analogRead(pin)/4)
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

Sodro

Entonces, segun lo planteado arriba

Code: [Select]

  int boton = 8;
      int led = 9;
      int entradaAnaloga = A0;
      int salidaAnaloga = A1;
 

     void setup(){
               pinMode(boton, INPUT);       
               pinMode(led, OUTPUT);
               pinMode(entradaAnaloga, INPUT);       
               pinMode(salidaAnaloga, OUTPUT);
               Serial.begin(9600);
          }

     void loop(){         
                         
        if(digitalRead(8)==HIGH){// Si el boton está presionado
                        digitalWrite(led,HIGH); //Prende el led

                        analogWrite(A1, analoglogRead(A0,LOW);//para que no deje de pasar señal
                       
                      }else{// Si el boton no está presionado
                        digitalWrite(led,LOW); //Apaga el led

                         analogWrite(A1, analoglogRead(A0); // para que deje pasar la señal
                       
                      }
              delay(50);
            }


Así deberia de ser si es que no entendí mal?

alfredomrh

Hola, yo creo que Rodripelto te ha dado la solución pero pienso que debes mejorar detalles del codigo.
Code: [Select]

  int boton = 8;
      int led = 9;
      int entradaAnaloga = A0;
      int salidaAnaloga = A1;
 

     void setup(){
               pinMode(boton, INPUT);       
               pinMode(led, OUTPUT);
               pinMode(entradaAnaloga, INPUT);       
               pinMode(salidaAnaloga, OUTPUT);
               Serial.begin(9600);
          }

     void loop(){         
                         
        if(digitalRead(boton)==HIGH){// Si el boton está presionado
                        digitalWrite(led,HIGH); //Prende el led

                        analogWrite(salidaAnaloga, (analogRead(entradaAnaloga)/4));//para que no deje de pasar señal
                       
                      }else{// Si el boton no está presionado
                        digitalWrite(led,LOW); //Apaga el led

                          analogWrite(salidaAnaloga, (analogRead(entradaAnaloga)/4)) // para que deje pasar la señal
                       
                      }
              delay(50);
            }


Creo que debes usar el nombre de las variables en la llamada a las funciones en lugar de su valor, pues para eso las has declarado. Tambien te sobra el Low del primer analogRead, ya que esa función solo lleva un parametro que yo sepa, el pin analogico a leer. Y después como te ha dicho el compañero lo debes dividir entre cuatro antes de escribirlo en un pin con modulacion de pulso PWM.

También seguramente deberás hacer un debounced de la señal de entrada para eliminar el rebote del boton.

Saludos

rodripelto

Bueno, lo voy a intentar explicar otra vez, ya que parece que al único que le a quedado algo claro es a alfredomrh.
Primero revisemes que comento Lucario448 y que yo tambien comente.
Reitero: Ax como salida es solamente digital, no analógica
Hola, lo primero las entradas analógicas son eso entradas.
Si analizamos las dos respuestas, deducimos que los pines analógicos A0..A5, si es arduino uno, son solo entras analógicas, no son salidas analógicas. Por lo que quieres hacer directamente no es posible. Y no podemos usar un pin analógico como salida analógica
Arduino no dispone de salida analógica por lo que copiar la señal de entrada no es posible, pero si dispone de salidas PWM que por decirlo de alguna manera simulan una señal analógica, no voy a entrar en teoría.
Estas salidas están en algunos pines digitales, depende el modelo de arduino.

Dicho esto la entrada analógica tiene en DAC de 10 bits, esto nos da que cuando tengamos 5V en el pin analógico nuestro arduino lo interpreta como 1023.

Bien, los pines PWM para obtener el valor de 5V escribiremos en su entrada 255, por lo tanto no puedo pasar un valor de un pin analógico directamente a un pin PWM, antes tengo que calcular el valor de conversión, que seria 1023/255=4,011764 en el post anterior dije que era 4, no sea que alguien diga que no se dividir.

Por lo tanto el código deveria de ser algo así
Code: [Select]
if(digitalRead(boton)==HIGH){// Si el botón está presionado
                        digitalWrite(led,HIGH); //Prende el led

                        analogWrite(Pin PWM, 0);// Salida = 0V
                       
                      }else{// Si el boton no está presionado
                        digitalWrite(led,LOW); //Apaga el led

                          analogWrite(Pin PWM, (analogRead(entradaAnaloga)/4,011764)) // V en salida PWM = V en pin analógico.
                       
                      }

Si pinchas aquí tienes un ejemplo de como usarlo.

Espero no haberme equivocado y ahora si se sapa de que hablo.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

Lucario448

antes tengo que calcular el valor de conversión, que seria 1023/255=4,011764 en el post anterior dije que era 4, no sea que alguien diga que no se dividir.
Yo no diría que no sabes dividir; es parte de las reglas de dividir con enteros: todo decimal se descarta a manera de redondeo en función piso.
Por esta razón, la única forma en que dicha división resulte en 256, es que analogRead retorne 1024 (nunca).

1023 / 4 = 255.75; al aplicar redondeo en función piso (regla de la división entre enteros), nos damos cuenta que ni con 1023 se nos desbordaría el ciclo de trabajo de analogWrite


PD: hay una alternativa a este mapeo que consume menos ciclos de reloj: eliminar los dos bits menos significativos de la lectura analógica, mediante dos desplazamientos a la derecha. Ejemplo:

Code: [Select]
analogWrite(Pin PWM, analogRead(entradaAnaloga) >> 2);
Tiene sentido porque eliminar bits menos significativos equivale a dividir entre 2^n, donde n es el número de bits eliminados

Sodro

Entiendo entonces que:

1.- no puedo sacar una salida analoga como tal.
2.- puedo transformar una señal analoga en digital.
3.- sacar esa señal por PWM (una copia de mi señal analoga reducida a 256 muestras)

con respecto a esto:
Dicho esto la entrada analógica tiene en DAC de 10 bits, esto nos da que cuando tengamos 5V en el pin analógico nuestro arduino lo interpreta como 1023.
mi señal alcanzará maximo 0,4v lo que quiere decir que ocupará aprox el 18% de la conversion total.

mi pregunta es: es efectiva esta conversión o debo colocar un DAC a la salida del PWM?

La linea de salida sería entonces:

Code: [Select]
analogWrite(PWM,(analogRead(entrada)/4);??

Creo entender un poco mas que al principio con respecto a esto, aunque habia hecho un par de cosas mas simples como barreras laser, cronometros, sensores de movimiento, etc. se programar en 3 lenguajes pero tengo falta de conocimiento mas electronico. por eso les doy gracias por la paciencia.

Go Up