Faróis Adaptativos para Carros (Parte 21/23)

Faros adaptativos para automóviles (Parte 21/23)

Ha habido continuas innovaciones en la industria automotriz, ya sea el uso de Near Field Communication en los próximos modelos de automóviles o automóviles autónomos futuristas. Estas innovaciones están impulsadas por una razón: hacer que la conducción sea cada vez más cómoda e inteligente o más segura. Este proyecto también es un intento similar de hacer que la conducción de automóviles sea más segura modificando los faros por faros adaptativos.

Los faros de cualquier coche suelen ser fijos. Por lo tanto, al girar el automóvil durante la conducción nocturna, los conductores enfrentan problemas ya que los faros fijos en realidad no iluminan el camino donde el conductor está girando. Esto hace que la conducción nocturna sea propensa a sufrir accidentes y el conductor debe tomar las curvas con especial precaución. Si los faros se giran en la dirección en la que gira el coche, el conductor puede tener una visión completa del camino real que está tomando al tomar una curva. Esto es posible montando los faros en servomotores y automatizando los servos en coordinación con la dirección del automóvil. El movimiento de dirección se puede trazar mediante un conjunto mecánico acoplado a un potenciómetro.

En este proyecto esta innovación se llevó a cabo utilizando placas Arduino y conectando el circuito del servomotor al circuito de control instalado en la dirección a través del Módulo RF 434. En lugar de modificar la carrocería de un automóvil para cambiar el soporte de los faros, el proyecto demostró la aplicación utilizando LED montados en servos RC. El circuito de control tampoco se fabrica con un ensamblaje mecánico completo en una dirección, pero se utiliza un potenciómetro en el diseño para ilustrar el funcionamiento aproximado. Sin embargo, el proyecto puede ganar tamaño real implementando la modificación de la carrocería del automóvil montando faros giratorios en el automóvil e instalando el circuito de control con un soporte mecánico adecuado en la dirección.

Componentes necesarios

Sr. No. Componentes necesarios Cantidad
1 Módulo de recepción RF (434 Mhz) 1
dos Módulo de transmisión RF (434 Mhz) 1
3 Arduino para mini dos
4 CONDUJO dos
5 bote de 10k 1
6 servo motor dos
7 Batería – 9V dos
8 tablero de prueba dos
9 Cables de conexión

Diagrama de blocos de faróis adaptativos baseados em Arduino para carros

Figura 1: Diagrama de bloques de faros adaptativos para automóviles basados ​​en Arduino

Conexiones de circuito

Hay dos circuitos en el proyecto: circuito de entrada de control de dirección y circuito de servo de faros. En el circuito de entrada de control de dirección, se conecta un potenciómetro de 10K ohmios al pin analógico A2 del Arduino Pro Mini. Los otros dos terminales del potenciómetro están conectados a VCC y tierra. El Arduino interactúa con el transmisor de RF conectando el pin de entrada en serie (pin 2) del transmisor de RF al pin 12 del Arduino. Se puede usar una antena en el pin 4 del transmisor de RF para mejorar la transmisión de la señal, pero es opcional y no realmente necesario ya que el rango operativo del proyecto se limitará a las dimensiones frontales del automóvil. Al implementar el proyecto de tamaño completo, es necesario diseñar algún conjunto mecánico de modo que la perilla del potenciómetro gire en relación con la rotación del volante.

En el circuito Servo, se conecta un receptor de RF a otra placa Arduino conectando el pin de salida en serie (pin 2) del módulo receptor al pin 11 del Arduino. Nuevamente, se puede usar una antena con el receptor de RF, que es opcional sólo para mejorar la intensidad de la señal. Hay dos LED conectados a los pines 9 y 7 del Arduino que se consideran los faros del coche en el circuito. Estos LED están montados en los servomotores. Hay dos servomotores RC conectados a los pines de datos 5 y 6 del Arduino en relación con la baliza que representa los LED.

Protótipo de Circuito Transmissor para Faróis Adaptativos de Carros

Fig. 2: Circuito transmisor prototipo para faros adaptativos de automóvil

Cómo funciona el circuito

Para entender cómo funciona este proyecto, es importante entender cómo funciona un potenciómetro. El potenciómetro es una tira de material de resistencia. Es un terminal conectado al ánodo y otro terminal conectado al cátodo. La salida de voltaje se toma de un tercer terminal que tiene contacto deslizante con el material resistivo. A medida que el contacto se cierra en el extremo del ánodo, la salida de voltaje se acerca al voltaje de suministro debido a la baja resistencia. Cuando el contacto se aleja del extremo del ánodo, el voltaje de salida cae debido a una mayor resistencia entre el ánodo y el terminal de salida, porque la resistencia aumenta en proporción a la longitud del material resistivo entre ellos. En el extremo de la dirección, el potenciómetro está configurado en un valor promedio de forma predeterminada, a medida que la dirección gira en cualquier dirección, el contacto del potenciómetro se desliza hacia afuera o se acerca al extremo del ánodo y el voltaje de salida del potenciómetro se reduce o aumenta en relación con el valor predeterminado.

La salida de voltaje del potenciómetro se lee como datos analógicos en el pin A2 de Arduino en el lado del transmisor. La lectura se convierte a formato de caracteres y se transmite vía RF utilizando las funciones de la biblioteca VirtualWire en el código del programa.

La lectura del potenciómetro se detecta en el receptor de RF y se envía en serie al pin 11 del Arduino en el lado del receptor. El código de programa en el lado del receptor del Arduino detecta la lectura del potenciómetro leyendo el búfer de caracteres transmitidos y convirtiendo la lectura a un valor entero. El valor se compara con un valor calibrado estándar y se evalúa en consecuencia el sentido de giro. Al detectar la dirección en la que giró el automóvil, las señales PWM se transmiten a los servos RC para que giren en la dirección de giro. Los LED permanecen encendidos por defecto y giran con el servo mientras están montados en ellos. Consulte el código Arduino en el lado del transmisor para ver cómo la lectura del potenciómetro analógico se detecta en el código y se convierte en forma de carácter y se transmite en serie a través de RF. Luego verifique el código Arduino del lado del receptor para saber cómo se lee e interpreta el búfer de caracteres en un valor entero y, en función del valor leído, se operan los servos.

Protótipo de Circuito Receptor para Faróis Adaptativos de Carros

Fig. 3: Prototipo de circuito receptor para faros adaptativos de automóvil

guía de programación

En el lado del transmisor Arduino, primero, el código del programa importa las bibliotecas estándar requeridas. Se requiere la biblioteca VirtualWire para leer la lectura analógica del pin A2. Las variables globales ledPin y Sensor1Pin se declaran y asignan al pin 13 donde está conectado el LED indicador de progreso de la transmisión y al pin A2 donde está conectado el pin de salida del potenciómetro, respectivamente. Se declara una variable Sensor1Data para almacenar la lectura de voltaje del potenciómetro. Se declara una matriz de caracteres Sensor1CharMsg para la representación decimal almacenada de la lectura del potenciómetro.

#incluir
//LED
constante int ledPin = 13;
//Sensores
constante int Sensor1Pin = A2;
// constante int Sensor2Pin = 3;
int Sensor1Datos;
//intSensor2Data;
char Sensor1CharMsg(4);

Se llama a una función de configuración donde el pin del indicador LED se configura en salida mientras que el pin conectado al sensor se configura en modo de entrada usando la función pinMode. La velocidad en baudios de Arduino se establece en 9600 bits por segundo utilizando la función serial.begin. La velocidad en baudios para la salida en serie se establece en 2000 bits por segundo utilizando la función vw_setup de la biblioteca VirtualWire.

Se llama a una función de bucle donde la lectura analógica (en términos de medición de voltaje en el pin) se obtiene usando la función analogRead y se almacena en la variable "Sensor1Data". La lectura del potenciómetro (un valor entero) se convierte al carácter de base 10 usando la función itoa y se almacena en la matriz Sensor1CharMsg.

La lectura del potenciómetro se emite en serie como texto ASCII legible por humanos mediante las funciones Serial.print y Serial.println.

El LED indicador de progreso de la transmisión se enciende pasando un ALTO al pin 13. El mensaje de caracteres que contiene la lectura del potenciómetro se envía en serie usando la función vw_send y vw_wait_tx se usa para bloquear la transmisión hasta que haya un nuevo mensaje disponible para transmisión. El LED en el pin 13 se apaga pasando un nivel BAJO para indicar la transmisión exitosa del mensaje.

Esto finaliza el código Arduino en el lado del transmisor.

En el lado del receptor Arduino, el código del programa primero importa las bibliotecas estándar requeridas. La biblioteca VirtualWire se importa para recibir lecturas del potenciómetro de RF. Los pines donde se conectan los servos se asignan a las variables “servo” y “servo1” y se declaran otras variables globales: “ángulo” para representar el ángulo de rotación de los servos y “PWM” a la duración del ancho de pulso respectivo. Se declara que “Sensor1Data” almacena el valor entero de la lectura y se declara que la matriz Sensor1CharMsg contiene la representación de caracteres de la lectura a través de RF.

Se llama a una función de configuración donde la velocidad en baudios de Arduino se establece en 9600 bits por segundo. Los pines conectados al servo y al LED están configurados para salida digital usando las funciones pinMode. Los pines donde están conectados los LED están configurados en ALTO para mantener los LED encendidos de forma predeterminada.

El módulo transmisor y receptor de RF no tiene un pin Push To Talk. Están inactivos cuando no hay datos presentes para transmitir o recibir respectivamente. Por lo tanto, vw_set_ptt_inverted(true) se utiliza para configurar la polaridad de pulsar para hablar y solicitar al receptor que continúe recibiendo datos después de recuperar el primer carácter. La velocidad en baudios para la entrada en serie se establece en 2000 bits por segundo mediante la función vw_setup. La recepción de datos se inicia utilizando vw_rx_start.

Se llama a una función de bucle dentro de la cual se declaran la matriz "buf" para leer el búfer en serie y la variable "buflen" para almacenar la longitud del búfer.
El almacenamiento en búfer de caracteres se detecta mediante la función vw_get_message; si está presente, se inicializa un contador “i”. El búfer de caracteres se almacena en la matriz Sensor1CharMsg utilizando el bucle for con el contador inicializado.

El carácter nulo se detecta en la secuencia del búfer para que no se almacenen valores basura. Los caracteres recibidos del búfer se convierten al valor entero y se almacenan en la variable "Sensor1Data".

El valor de la variable junto con las cadenas relevantes incluidas se pasa al búfer del microcontrolador y el valor Sensor1Data se pasa a las funciones personalizadas servoPulse y servoPulse1 como parámetro para rotar los servos.

En la función servoPulse, el Sensor1Data que se pasó como parámetro de ángulo se toma y se multiplica por 11 y luego se suma a 1000 para obtener la duración del ancho del pulso en microsegundos. El pin conectado al servo se establece en ALTO y se pasa el retraso de duración calculado. Luego se termina la salida ALTA al pin conectado al servo.

Se implementa la misma lógica implementada en la función servoPulse que en la función servoPulse1.

Esto finaliza el código Arduino en el lado del receptor.

Código fuente del proyecto

###


 #incluir

 // LED
 
constante int ledPin = 13;

 // Sensores

 constante int Sensor1Pin = A2;

 // constante int Sensor2Pin = 3;

 int Sensor1Datos;

 //int Sensor2Datos;

 char Sensor1CharMsg(4);

 configuración nula {

 // Modos Pin
 // CONDUJO

 pinMode(ledPin,SALIDA);

 // Sensor(es)

 pinMode(Sensor1Pin,ENTRADA);

 // para depurar

 Serie.begin(9600);

 // configuración de VirtualWire

 vw_setup(2000); // Bits por segundo

 }
 bucle vacío {

 // Leer y almacenar datos del Sensor 1

 Sensor1Data = analogRead(Sensor1Pin);

 // Convierte datos enteros a una matriz Char directamente

 itoa(Sensor1Datos,Sensor1CharMsg,10);

 // DEPURAR
 Serial.print("Sensor1 Entero: ");

 Serie.print(Sensor1Data);

 Serial.print(" Sensor1 CharMsg: ");

 Serial.print(Sensor1CharMsg);

 Serial.println(" ");

 retraso(10);
 // FINALIZAR LA DEPURACIÓN

 escritura digital (13, verdadero); // Enciende una luz para mostrar la transmisión

 vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg));

 vw_wait_tx; // Espera hasta que desaparezca todo el mensaje

 retraso(12);
 } // FINALIZAR bucle vacío...

 #incluir

 int sirviente = 5;

 intservo1 = 9;

 enredar;

 intpwm;

 // Sensores

 int Sensor1Datos;

 // Contenedor de transmisión RF

 char Sensor1CharMsg(4);

 configuración nula {
Serie.begin(9600);

 pinMode(servo, SALIDA);

 pinMode(servo1, SALIDA);

 pinMode(3, SALIDA);

 pinMode(8, SALIDA);

 escritura digital (3, ALTO);

 escritura digital (8, ALTO);

 // establece el pin digital como salida

 //Cable virtual

 // Inicializa IO e ISR

 // Requerido para DR3100

 vw_set_ptt_inverted(verdadero);
 // Bits por segundo

 vw_setup(2000);

 // Inicia la ejecución del PLL del receptor

 vw_rx_start;

 } // FINALIZAR la configuración nula

 bucle vacío {

 uint8_t buf(VW_MAX_MESSAGE_LEN);

 uint8_t buflen = VW_MAX_MESSAGE_LEN;

 // Sin bloqueo

 si (vw_get_message(buf, &buflen))

 {
 ent i;

 // Mensaje con una buena suma de comprobación recibida, descárgalo.

 para (i = 0; i < buflen; i++)

 {

 // Rellena la matriz Sensor1CharMsg Char con el correspondiente

 // caracteres del buffer.

 Sensor1CharMsg(i) = char(buf(i));

 }
 // Terminación nula de la matriz de caracteres

 // Esto debe hacerse, de lo contrario ocurrirán problemas

 // cuando los mensajes entrantes tienen menos dígitos que los

 // uno antes.

 Sensor1CharMsg(buflen) = '';

 // Convierte la matriz de caracteres Sensor1CharMsg a un número entero

 Sensor1Data = atoi(Sensor1CharMsg);

 // DEPURAR

 Serie.print("Sensor 1: ");
 
Serie.println(Sensor1Data);

 servoPulse(servo, Sensor1Datos);

 servoPulse1(servo1, Sensor1Datos);

 }
 }

 void servoPulse(int servo, int ángulo)

 {

 pwm = (ángulo*11) + 1000; // Convertir ángulo a microsegundos

 escritura digital (servo, ALTO);

 retrasoMicrosegundos(pwm);

 escritura digital (servo, BAJO);

 retraso(15); // Actualizar ciclo del servo

 }

 void servoPulse1 (int servo1, int ángulo)

 {

 pwm = (ángulo*11) + 1000; // Convertir ángulo a microsegundos

 escritura digital (servo1, ALTO);

 retrasoMicrosegundos(pwm);

 escritura digital (servo1, BAJO);

 retraso(15); // Actualizar ciclo del servo

 } 

###

Diagramas de circuito

Diagrama de circuito: faros adaptables para automóviles basados ​​en Arduino

Vídeo del proyecto

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.