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

Tem havido inovações contínuas na indústria automotiva, seja no uso de Near Field Communication nos próximos modelos de carros ou nos carros futuristas autônomos. Estas inovações são impulsionadas por um motivo: tornar a condução cada vez mais confortável e inteligente ou mais segura. Este projeto também é uma tentativa semelhante de tornar a condução do carro mais segura, modificando os faróis para faróis adaptativos.

Os faróis de qualquer carro geralmente são fixos. Portanto, ao virar o carro durante a condução noturna, os motoristas enfrentam problemas, pois os faróis fixos não estão realmente iluminando o caminho onde o motorista está virando. Isso torna a condução noturna propensa a acidentes e o motorista precisa fazer curvas com cuidado extra. Se os faróis forem girados junto com a direção em que o carro virou, o motorista poderá ter uma visão completa do caminho real que está percorrendo nas curvas. Isto é possível montando os faróis em servo motores e automatizando os servos em coordenação com a direção do carro. O movimento de direção pode ser traçado por meio de um conjunto mecânico acoplado a um potenciômetro.

Neste projeto, esta inovação foi realizada utilizando as placas Arduino e conectando o circuito do servo motor ao circuito de controle instalado na direção através do Módulo 434 RF. Em vez de modificar a carroceria de um carro para mudar a montagem do farol, o projeto demonstrou a aplicação utilizando LEDs montados sobre servos RC. O circuito de controle também não é fabricado com montagem mecânica completa em uma direção, mas um potenciômetro é utilizado no projeto para ilustrar o funcionamento bruto. Porém, o projeto pode ganhar um tamanho real implementando a modificação da carroceria do carro com a montagem de faróis giratórios no carro e instalando o circuito de controle com montagem mecânica adequada na direção.

Componentes necessários

Sr. Não. Componentes necessários Quantidade
1 Módulo RF Rx (434Mhz) 1
2 Módulo RF Tx (434Mhz) 1
3 Arduino pro mini 2
4 LIDERADO 2
5 Pote 10k 1
6 Servo motor 2
7 Bateria – 9V 2
8 Tábua de ensaio 2
9 Conectando fios

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

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

Conexões de Circuito

Existem dois circuitos no projeto – Circuito de Entrada de Controle de Direção e circuito Servo do Farol. No circuito de entrada de controle de direção, um potenciômetro de 10K ohm é conectado ao pino analógico A2 do Arduino Pro Mini. Os outros dois terminais do potenciômetro estão conectados ao VCC e ao terra. O Arduino faz interface com o transmissor RF conectando o pino de entrada serial (pino 2) do transmissor RF ao pino 12 do Arduino. Uma antena pode ser utilizada no pino 4 do transmissor RF para melhorar a transmissão do sinal, porém é opcional e não é realmente necessária pois o alcance operacional do projeto será limitado às dimensões frontais do carro. Na implementação do projeto em tamanho real, alguma montagem mecânica precisa ser projetada para que o botão do potenciômetro gire em relação à rotação do volante.

No circuito Servo, um receptor RF é conectado a outra placa Arduino conectando o pino de saída serial (pino 2) do módulo receptor ao pino 11 do Arduino. Novamente, uma antena pode ser usada com o receptor RF, o que é opcional apenas para melhorar a intensidade do sinal. Existem dois LEDs conectados nos pinos 9 e 7 do Arduino que são considerados os faróis do carro no circuito. Esses LEDs são montados nos servomotores. Existem dois servo motores RC conectados aos pinos de dados 5 e 6 do Arduino em relação ao farol que representa os LEDs.

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

Fig. 2: Protótipo de Circuito Transmissor para Faróis Adaptativos de Carros

Como funciona o circuito

Para entender o funcionamento deste projeto, é importante entender como funciona um potenciômetro. O potenciômetro é uma tira de material de resistência. É um terminal conectado ao ânodo e outro terminal conectado ao cátodo. A saída de tensão é extraída de um terceiro terminal que tem contato deslizante com o material resistivo. À medida que o contato se fecha na extremidade do ânodo, a saída de tensão se aproxima da tensão de alimentação devido à baixa resistência. Quando o contato se afasta da extremidade do ânodo, a tensão de saída cai devido a uma resistência mais alta entre o ânodo e o terminal de saída, porque a resistência aumenta proporcionalmente ao comprimento do material resistivo entre eles. Na extremidade da direção, o potenciômetro é ajustado para um valor médio por padrão, conforme a direção gira em qualquer direção, o contato do potenciômetro desliza para fora ou se aproxima da extremidade do ânodo e a tensão de saída do potenciômetro é reduzida ou aumentada em relação a o valor padrão.

A saída de tensão do potenciômetro é lida como dados analógicos no pino A2 do Arduino do lado do transmissor. A leitura é convertida em formato de caractere e transmitida por RF usando as funções da biblioteca VirtualWire no código do programa.

A leitura do potenciômetro é detectada no receptor RF e enviada em série para o pino 11 do Arduino do lado do receptor. O código do programa no lado do receptor do Arduino detecta a leitura do potenciômetro lendo o buffer de caracteres transmitidos e convertendo a leitura em um valor inteiro. O valor é comparado com um valor calibrado padrão e a direção de giro é avaliada de acordo. Ao detectar a direção em que o carro virou, os sinais PWM são transmitidos aos servos RC para girar ao longo da direção de giro. Os LEDs permanecem acesos por padrão e giram junto com o servo à medida que são montados neles. Confira o código Arduino do lado do transmissor para saber como a leitura analógica do potenciômetro é detectada no código e convertida em forma de caractere e transmitida serialmente por RF. Em seguida, verifique o código Arduino do lado do receptor para saber como o buffer de caracteres é lido e interpretado para um valor inteiro e com base no valor lido, os servos são operados.

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

Fig. 3: Protótipo de Circuito Receptor para Faróis Adaptativos de Carros

Guia de programação

No lado do transmissor Arduino, primeiro, o código do programa importa as bibliotecas padrão necessárias. A biblioteca VirtualWire é necessária para ler a leitura analógica do pino A2. As variáveis ​​globais ledPin e Sensor1Pin são declaradas e mapeadas para o pino 13 onde o LED indicador de progresso da transmissão está conectado e o pino A2 onde o pino de saída do potenciômetro está conectado respectivamente. Uma variável Sensor1Data é declarada para armazenar a leitura da tensão do potenciômetro. Uma matriz de caracteres Sensor1CharMsg é declarada para representação decimal armazenada da leitura do potenciômetro.

#include
//LEDs
const int ledPin = 13;
//Sensores
const int Sensor1Pin = A2;
// const int Sensor2Pin = 3;
int Sensor1Dados;
//intSensor2Data;
char Sensor1CharMsg(4);

Uma função setup é chamada onde o pino do LED indicador é definido para saída enquanto o pino conectado ao sensor é definido para o modo de entrada usando a função pinMode . A taxa de transmissão do Arduino é definida para 9.600 bits por segundo usando a função serial.begin . A taxa de transmissão para saída serial é definida para 2.000 bits por segundo usando a função vw_setup da biblioteca VirtualWire.

Uma função loop é chamada onde a leitura analógica (em termos de medição de tensão no pino) é obtida usando a função analogRead e armazenada na variável “Sensor1Data”. A leitura do potenciômetro (um valor inteiro) é convertida para o caractere de base 10 usando a função itoa e armazenada no array Sensor1CharMsg.

A leitura do potenciômetro é emitida em série como texto ASCII legível por humanos usando as funções Serial.print e Serial.println .

O LED indicador de progresso da transmissão é ligado passando um HIGH para o pino 13. A mensagem de caractere contendo a leitura do potenciômetro é enviada serialmente usando a função vw_send e vw_wait_tx é usada para bloquear a transmissão até que uma nova mensagem esteja disponível para transmissão. O LED no pino 13 é desligado passando um LOW para indicar a transmissão bem-sucedida da mensagem.

Isso encerra o código Arduino do lado do transmissor.

No Arduino do lado do receptor, o código do programa primeiro importa as bibliotecas padrão necessárias. A biblioteca VirtualWire é importada para receber leitura do potenciômetro de RF. Os pinos onde os servos estão conectados são mapeados para variáveis ​​“servo” e “servo1” e outras variáveis ​​globais – “ângulo” para representar o ângulo de rotação dos servos e “PWM” para a respectiva duração da largura de pulso são declaradas. O “Sensor1Data” é declarado para armazenar o valor inteiro da leitura e o array Sensor1CharMsg é declarado para conter a representação de caracteres da leitura através de RF.

Uma função setup é chamada onde a taxa de transmissão do Arduino é definida como 9600 bits por segundo. Os pinos conectados ao servo e ao LED são configurados para saída digital usando as funções pinMode . Os pinos onde os LEDs estão conectados são definidos como HIGH para manter os LEDs ligados por padrão.

O módulo transmissor e receptor de RF não possui pino Push To Talk. Eles ficam inativos quando nenhum dado está presente para transmitir ou receber, respectivamente. Portanto, vw_set_ptt_inverted(true) é usado para configurar a polaridade push to talk e solicitar que o receptor continue recebendo dados após buscar o primeiro caractere. A taxa de transmissão para entrada serial é definida para 2.000 bits por segundo usando a função vw_setup . A recepção dos dados é iniciada usando vw_rx_start .

Uma função loop é chamada dentro da qual são declaradas a matriz “buf ” para ler o buffer serial e a variável “buflen” para armazenar o comprimento do buffer.
O buffer de caracteres é detectado usando a função vw_get_message ; se estiver presente, um contador “i” é inicializado. O buffer de caracteres é armazenado na matriz Sensor1CharMsg usando o loop for com o contador inicializado.

O caractere nulo é detectado no fluxo de buffer para que nenhum valor lixo seja armazenado. Os caracteres recebidos do buffer são convertidos para o valor inteiro e armazenados na variável “Sensor1Data”.

O valor da variável junto com as strings relevantes incluídas é passado para o buffer do microcontrolador e o valor Sensor1Data é passado para as funções personalizadas servoPulse e servoPulse1 como um parâmetro para girar servos.

Na função servoPulse, o Sensor1Data que foi passado como parâmetro de ângulo é obtido e multiplicado por 11 e depois adicionado a 1000 para obter a duração da largura do pulso em microssegundos. O pino conectado ao servo é definido como HIGH e o atraso da duração calculada é passado. A saída HIGH para o pino conectado ao servo é então finalizada.

A mesma lógica implementada na função servoPulse é implementada como na função servoPulse1.

Isso encerra o código Arduino do lado do receptor.

Código-fonte do projeto

###


#include 

// LED's

const int ledPin = 13;

// Sensors 

const int Sensor1Pin = A2;

// const int Sensor2Pin = 3; 

int Sensor1Data;

//int Sensor2Data;

char Sensor1CharMsg(4);

void setup  {

// PinModes
// LED 

pinMode(ledPin,OUTPUT);

// Sensor(s)

pinMode(Sensor1Pin,INPUT);

// for debugging

Serial.begin(9600); 

// VirtualWire setup

vw_setup(2000);     // Bits per sec

}
void loop  {

// Read and store Sensor 1 data

Sensor1Data = analogRead(Sensor1Pin);

// Convert integer data to Char array directly 

itoa(Sensor1Data,Sensor1CharMsg,10);

// DEBUG
Serial.print("Sensor1 Integer: ");

Serial.print(Sensor1Data);

Serial.print(" Sensor1 CharMsg: ");

Serial.print(Sensor1CharMsg);

Serial.println(" ");

delay(10);
// END DEBUG

digitalWrite(13, true); // Turn on a light to show transmitting

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

vw_wait_tx ; // Wait until the whole message is gone

delay(12);
}   // END void loop...

#include 

int servo = 5;

int servo1 = 9;

int angle;

int pwm;

// Sensors 

int Sensor1Data;

// RF Transmission container

char Sensor1CharMsg(4); 

void setup  {
Serial.begin(9600);

pinMode(servo, OUTPUT);

pinMode(servo1, OUTPUT);

pinMode(3, OUTPUT);

pinMode(8, OUTPUT);

digitalWrite(3,HIGH);

digitalWrite(8,HIGH);

// sets the digital pin as output

// VirtualWire 

// Initialise the IO and ISR

// Required for DR3100

vw_set_ptt_inverted(true);
// Bits per sec

vw_setup(2000);     

// Start the receiver PLL running

vw_rx_start ;       

} // END void setup

void loop {

uint8_t buf(VW_MAX_MESSAGE_LEN);

uint8_t buflen = VW_MAX_MESSAGE_LEN;

// Non-blocking

if (vw_get_message(buf, &buflen)) 

{
int i;

// Message with a good checksum received, dump it. 

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

{            

// Fill Sensor1CharMsg Char array with corresponding 

// chars from buffer.   

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

}
// Null terminate the char array

// This needs to be done otherwise problems will occur

// when the incoming messages has less digits than the

// one before. 

Sensor1CharMsg(buflen) = '';

 // Convert Sensor1CharMsg Char array to integer

Sensor1Data = atoi(Sensor1CharMsg);

// DEBUG 

Serial.print("Sensor 1: ");

Serial.println(Sensor1Data); 

servoPulse(servo, Sensor1Data); 

servoPulse1(servo1, Sensor1Data);       

 }
}

void servoPulse (int servo, int angle)

{

 pwm = (angle*11) + 1000;      // Convert angle to microseconds

 digitalWrite(servo, HIGH);

 delayMicroseconds(pwm);

 digitalWrite(servo, LOW);

 delay(15);                   // Refresh cycle of servo

}

void servoPulse1 (int servo1, int angle)

{

 pwm = (angle*11) + 1000;      // Convert angle to microseconds

 digitalWrite(servo1, HIGH);

 delayMicroseconds(pwm);

 digitalWrite(servo1, LOW);

 delay(15);                   // Refresh cycle of servo

}

###

Diagramas de circuito

Diagrama de circuito-faróis adaptativos para carros baseados em Arduino

Vídeo do projeto

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.