Você está na página 1de 13

Ministério da Educação

Universidade Tecnológica Federal do Paraná


Câmpus Curitiba
Bacharelado em Engenharia Eletrônica

Relatório Final - Carro e Controle RF Arduino


Eletrônica na Prática

Daniel Belmiro Pereira RA 2087111

Curitiba
2021
OBJETIVOS
O projeto consiste na criação de um de um carro operado por rádio frequência, em
que o carro é controlado por um arduino e o controle com outro arduino.

DESCRIÇÃO DO PROJETO
Para o carro foi usado o Arduino nano com unidade de processamento, um módulo
de controle com L298N, e como interface de rádio frequência o módulo NRF24L01, e para o
controle usado também um arduino nano com outra interface de rádio frequência NRF24L01
aliado à um módulo de joystick. A seguir uma breve explicação sobre cada módulo utilizado.
Arduino Nano
O arduino é uma placa aberta de desenvolvimento, muito utilizada em prototipação
de aplicações e em ambiente educacional. Com ele podemos ler dados de sensores e
transformar esses dados em informações ou movimento com no caso deste projeto. É
composto de um controlador ATmega328p, com uma tensão de operação de 5 V, com 8
pinos analógicos e 14 digitais, dos quais 6 podem operar em PWM.

Figura 01 - Arduino Nano

Fonte: Site Arduino Store

Módulo driver ponte H L298N


Este módulo é composto por um chip ST L298, o qual possui duas pontes H, possui
nível lógico em 5V e pode ser alimentado em tensões de 5V a 35 V, e é ideal para controle
de 2 motores ou 1 servomotor.
Figura 02 - Módulo driver ponte H L298N

Fonte: Site Filipeflop

Módulo NRF24L01
O NRF24L01 é um módulo de radiofrequência que opera em 2,4 GHz, que pode ser
utilizado com transmissor, receptor ou ambos ao mesmo tempo. Usa comunicação SPI por
isso o modo de transmissão é full-duplex. Possui nível lógico de 3,3 V, que neste projeto foi
ligado diretamente à saída 3v3 do arduino.

Figura 03 - Módulo NRF24L01

Fonte: Site Filipeflop

Módulo Joystick
Este módulo possui um componente COM-09032, que é um joystick que usa 2
potenciômetros para os eixos xy e um botão para o eixo z. Ele simplifica as conexões para
uso em protoboard.
Figura 03 - Módulo Joystick

Fonte: Site EletricalLibrary

Montagem
Neste projeto foi utilizado a aplicação Fritzing, para documentar as ligações entre os
componentes. Conforme as figuras a seguir.

Figura 04 - Esquemático ligações do carro

Fonte: Produção do autor


Figura 06 - Montagem do carro

Fonte: Produção do autor

Figura 05 - Montagem do controle

Fonte: Produção do autor

Figura 05 - Esquemático ligações do controle


Fonte: Produção do autor

Funcionamento
O joystick gera um valor analógico de 0 a 5V em cada eixo xy e um valor booleano
no eixo z. Os analógicos x e y são lidos nos pinos A0 e A1 com valores de 0 a 1023, em que
na posição de repouso deveria obter um valor de 512, onde na prática foi obtido um valor
entre 490 e 500. O programa do arduino foi desenvolvido para transformar o valor de 0 a
1023 em um valor de -255 a 255, visando abstrair o repouso do joystick como (0,0). Em
seguida o programa encapsula os valores em um pacote com estrutura abaixo, para então
enviar ao carro, através do NRF24L01. (Os códigos-fonte estarão ao final do relatório).

typedef struct direction{


int X;
int Y;
}Direction;

typedef struct package{


Direction dir;
bool move=false;
}Package;

Já no carro o arduino recebe o pacote com a informação de direction e o booleano


move, e se move for falso o módulo de ponte H desabilita os motores. Quando é
pressionado o eixo Z no joystick, o arduino inverte o valor de move. Se Y for positivo o carro
se move para frente, se negativo se move para trás. Se X positivo ele gira para direita, se
negativo gira para esquerda. Os movimentos são sempre em velocidade proporcional ao
deslocamento no eixo do joystick, onde foi usado as saídas PWM do arduino para controle
de velocidade. O projeto pode ser visualizado em https://youtu.be/0XLrPlORqlw.
CONCLUSÃO
Este projeto apesar de ser simples, gerou neste estudante vários aprendizados,
como o funcionamento da comunicação serial SPI, sinais PWM, e a utilização de outro
software de desenho de circuito além dos já utilizados nesta e em outras disciplinas. Além
disso este projeto possui alta escalabilidade, podendo ser implementado outras funções e
componentes, tornando-o mais autônomo e inteligente.
REFERÊNCIAS

https://www.arduino.cc/en/Guide/Introduction

https://www.instructables.com/Arduino-Remote-Control-Car-w-Nrf24l01-and-L298n/

https://store.arduino.cc/usa/arduino-nano

https://www.filipeflop.com/blog/motor-dc-arduino-ponte-h-l298n/

https://www.electricalelibrary.com/2019/07/05/tutorial-de-arduino-parte-13-joystick/

https://www.embarcados.com.br/spi-parte-1/
ANEXO I - Código fonte carro

#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#include <math.h>

class L298nCar{
private:
int pin1motor1;
int pin1motor2;
int pin2motor1;
int pin2motor2;

public:
L298nCar(int IN1,int IN2,int IN3,int IN4){
pin1motor1 = IN1;
pin2motor1 = IN2;
pin1motor2 = IN3;
pin2motor2 = IN4;
pinMode(pin1motor1, OUTPUT);
pinMode(pin2motor1, OUTPUT);
pinMode(pin1motor2, OUTPUT);
pinMode(pin2motor2, OUTPUT);
}
void moveCar(int velX,int velY){
int norma;
norma = sqrt(pow(velX-0,2)+pow(velY-0,2));
if(velY>15){
analogWrite(pin1motor1,0);
analogWrite(pin2motor1,norma);
analogWrite(pin1motor2,0);
analogWrite(pin2motor2,norma);
}else if(velY<-15){
analogWrite(pin1motor1,norma);
analogWrite(pin2motor1,0);
analogWrite(pin1motor2,norma);
analogWrite(pin2motor2,0);
}

if(velX>15){
analogWrite(pin1motor1,0);
analogWrite(pin2motor1,norma);
analogWrite(pin1motor2,norma);
analogWrite(pin2motor2,0);
}else if(velX<-15){
analogWrite(pin1motor1,norma);
analogWrite(pin2motor1,0);
analogWrite(pin1motor2,0);
analogWrite(pin2motor2,norma);
}
if(velY<15&&velY>-15&&velX<15&&velX>-15)
releaseCar();
};
void releaseCar(){
analogWrite(pin1motor1,0);
analogWrite(pin2motor1,0);
analogWrite(pin1motor2,0);
analogWrite(pin2motor2,0);
}
};

RF24 myRadio (7, 8);


typedef struct direction{
int X;
int Y;
}Direction;

typedef struct package{


Direction dir;
bool move=false;
}Package;

const uint64_t pipe = 0xE8E8F0F0E1LL;


L298nCar myCar(5,6,9,10);
Package data;

void setup(){
Serial.begin(9600);
Serial.print("Inicializando...\n");
delay(1000);
myRadio.begin();
myRadio.openReadingPipe(0, pipe);
myRadio.setChannel(115);
myRadio.setPALevel(RF24_PA_MIN);
myRadio.setDataRate( RF24_250KBPS );
myRadio.startListening();
L298nCar myCar(5,6,9,10);
myCar.releaseCar();
Serial.print("Pronto.\n");
}

void loop(){
while (myRadio.available())
{
myRadio.read( &data, sizeof(data) );
}
myCar.moveCar(data.dir.X, data.dir.Y);

if(!data.move) myCar.releaseCar();
Serial.print("X:");
Serial.print(data.dir.X);
Serial.print("\t");
Serial.print("Y:");
Serial.print(data.dir.Y);
Serial.print("\t");
Serial.print("Move:");
Serial.println(data.move);
}
ANEXO II - Código fonte controle

#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
#define JoyX A0
#define JoyY A1
#define JoySw 4

RF24 myRadio (7, 8);


const uint64_t pipe = 0xE8E8F0F0E1LL;

typedef struct direction{


int X;
int Y;
}Direction;
typedef struct package{
Direction dir;
bool move=false;
}Package;

Package data;

void setup(){
Serial.begin(9600);
delay(1000);
myRadio.begin();
myRadio.openWritingPipe(pipe);
myRadio.setChannel(115);
myRadio.setPALevel(RF24_PA_HIGH);
myRadio.setDataRate( RF24_250KBPS ) ;
myRadio.stopListening();

pinMode(JoySw,INPUT);
delay(50);
}

void loop(){
int x,y;
int button=digitalRead(JoySw);

if(button==LOW)data.move=!data.move;

myRadio.write(&data, sizeof(data));
Serial.print("X:");
Serial.print(data.dir.X);
Serial.print("\t");
Serial.print("Y:");
Serial.print(data.dir.Y);
Serial.print("\t");
Serial.print("Move:");
Serial.println(data.move);
x = analogRead(JoyX);
y = analogRead(JoyY);
data.dir.X = map(x,0,1023,-255,255);
data.dir.Y = map(y,0,1023,-255,255);
delay(100);
}

Você também pode gostar