Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
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.
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.
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
Montagem
Neste projeto foi utilizado a aplicação Fritzing, para documentar as ligações entre os
componentes. Conforme as figuras a seguir.
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).
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);
}
};
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
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);
}