Límites de mi comunicación Arduino - Smartphone

5

Quiero transferir las señales de mi teléfono inteligente a mi Arduino Uno mediante el conector de audio. He conectado directamente un canal del audio al analógico en la placa. El teléfono inteligente está enviando ~ + -0.5V. Esto se interpretará como señales de 1 o 0 bits.

Obtuve el Arduino para leer el voltaje dentro de ~ 10 microsegundos (100kHz). Mi problema es que no puedo enviar datos con esta velocidad, pero quiero acelerar la transmisión en la medida de lo posible.

Abajo puede ver el voltaje que se lee con 100kHz. En la parte superior derecha se puede ver el valor del bit. Los bits fueron enviados con 10kHz. Con una mayor frecuencia de envío, los "bloques" de bits ya no son como bloques y se confunden entre sí.

¿Es este un problema del teléfono inteligente? ¿No puede producir buenas señales con estas altas frecuencias?

¿O es un problema del circuito?

¿Qué puedo hacer para obtener una mejor señal?

Editar: Aquí está el código de Arduino Uno:

byte data[500];
unsigned long lastRead =micros();
int i;

void setup() {
  bitClear(ADCSRA,ADPS0) ; //boost up analogread
  bitSet(ADCSRA,ADPS1) ;
  bitClear(ADCSRA,ADPS2) ;
  Serial.begin(9600);
}

void loop() { 
 while(analogRead(A0)<50) (true); //wait for start of transmission
  for(i = 0; i<500;i++){
   data[i]=analogRead(A0);    
  }
  for(int i = 0;i<500;i++){
    Serial.println(data[i]);
  }
  delay(1000);//just prevent starting again to soon
}
    
pregunta Butterkekskrumel

2 respuestas

7

La salida de audio de su teléfono inteligente está equipada con un filtro de paso de banda: paso alto para proteger la membrana de sus audífonos / altavoces contra la corriente continua que podría causar una tensión mecánica inútil, y paso bajo para asegurarse de que se escuche un poco de ruido. Dado que el audio es de aproximadamente 20Hz-20kHz, las señales con una frecuencia más alta se atenuarán a una velocidad dependiendo del orden del filtro, al menos -3dB / década.

De hecho, esa salida ni siquiera puede emitir con precisión señales digitales de hasta 20 kHz. ¿Por qué? Porque los bordes afilados de las señales digitales están formados por un número infinito de sinusoides elementales. Cuanto más baja sea la frecuencia de corte, más armónicos atenuará, distorsionando la señal de esta manera:

Puedefiltrarloquemideparaintentarreconstruirlaondacuadrada,peroaúnasí,noesmuyatractivo.

Ahora,puedeaumentarelíndicededatosparaunafrecuenciaportadorarazonable(porejemplo,4kHz),cambiandolamodulacióny/olacodificación.Lamodulacióneselprocesoquetransformalosdatosparaenviarlosenunaseñalqueseaplicaalmediodetransmisión(atravésdeunamplificadordepotencia.+Antena,porejemplo),lacapadetransporte,porasídecirlo.Lacodificaciónesdenivelsuperior,seocupadeladetecciónycorreccióndeanomalías.Lasuyaestápordefectoensuformamássimple(bitsdeparidad,encomparaciónconlasmáquinasdeestadomásavanzadas,etc.),peroelprimerpasoparaaumentarlafechadelacomunicaciónnocríticaeslamodulación.

Hay una gama de posibles técnicas de modulación por ahí . Cada uno de ellos tendrá una relación señal / ruido diferente - relación de tasa de error y también una tasa de símbolo diferente para una entrada de datos dada.

Entre todos estos, recomiendo la modulación de amplitud digital más simple. A medida que aumenta el número de niveles de salida posibles, la relación señal a ruido disminuirá, por lo que tendrá que encontrar el punto óptimo. Para aumentar tu fecha de vencimiento en N, deberás poder leer 2 ^ N niveles diferentes.

Nota: Olvídese de la portadora (el medio no es aire, por lo que no necesita RF), y en este ejemplo, 0 está codificado con cierta amplitud pero no necesita serlo.

Si necesita más, puede mejorar su codificación para disminuir la relación señal / ruido requerida y, por lo tanto, aumentar la cantidad de niveles un poco más. Si no es suficiente, eche un vistazo a una técnica más compleja, por ejemplo, QAM. ADSL usó esa modulación para aumentar el datarate en las mismas líneas; No recuerdo la velocidad de los símbolos, pero el operador era de alrededor de 1MHz para evitar interferir con el teléfono < 4kHz, y lograron al menos 512kb / s en ese momento, imposible de lograr sin una modulación muy densa. No estoy seguro de si el Arduino es lo suficientemente potente como para esto más tu aplicación, sin embargo.

    
respondido por el Mister Mystère
0

Yo usaría un transistor para amplificar la señal y luego utilizaría un pin de entrada digital en lugar de analógico. La lectura digital es más rápida y se puede usar en las interrupciones de cambio en lugar de verificar constantemente el valor. En los esquemas a continuación, la entrada será negada.

simular este circuito : esquema creado usando CircuitLab

    
respondido por el Cano64

Lea otras preguntas en las etiquetas