estou precisando de uma ajuda p/ programar um ultrasom servo + ponte H(L298N) + Arduino UNO
programei ele mas so anda p/ frente
Tags:
PH, bom dia.
Voce não deve usar o mesmo pino para as duas funções.
Vi que voce não utiliza as portas analógicas.
Nunca usei elas para isto, mas acho que pode usar os pinos das portas analogicas para isto.
Rui
para fazer funcionar preciso de 6 portas e so restou 5
PH,
testei o LCD nas portas analógicas de A0 até A5 e funcinou ok.
Para teste usei este code:
Rui
//Testa LCD
int Teste = 8080;
#include <LiquidCrystal.h> //Inclui a biblioteca do LCD
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
void setup() {
lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2(Colunas x Linhas)
}
void loop(){
lcd.clear();// Limpa do buffer do LCD
lcd.setCursor(0, 0);
lcd.print("Imprimindo TXT");
lcd.setCursor(0, 1);
lcd.print("Linha 1");
lcd.setCursor(10, 1);
lcd.print(Teste);
delay(500);
}
fiz duas programações diferentes, se eu te passar vc pode analisar p/ min e ver oq acha?
Sim
a que ficou melhor foi essa
// inclusão de bibliotecas.
#include <Servo.h> // inclui biblioteca de manipulação de servos motores.
#include <Ultrasonic.h> // inclui biblioteca de manipulação do sensor ultrassónico.
#include <LiquidCrystal.h> // inclui biblioteca de manipulação do monitor LCD 16x2
#define echoPin 9 //Pino 9 será o Echo do sensor era 8
#define trigPin 8 //Pino 8 será o TRig do sensor era 12
Servo servo_ultra_sonico; // nomeando o servo motor
Ultrasonic ultrasonic(8,9); // nomeando o sensor
int BUZZER = 11; // Ligar o buzzer (Som) no pino 11
int in1 = 4; // pino 1 do motor 1
int in2 = 5; // pino 2 do motor 1
int in3 = 6; // pino 1 do motor 2
int in4 = 7; // pino 2 do motor 2
int distancia_cm = 0; //variável do valor da distância
//variáveis para uso da função do LCD
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); // ligando o display no arduino
int pinoPotenciometro = 0; // controle do brilho do LCD
long valorPotenciometro = 0; // controle do brilho do LCD
boolean dist = true; // Variável para saber se é para exibir a distância ou não
String lado = ""; //Variável para escrever qual o lado da medição
String frase = ""; //Variável para escrever uma frase na parte de cima
String frase2 = ""; //Variável para escrever uma frase na parte de baixo
int valor = 0; //Variável para colocar o valor da distancia
// executado na inicialização do Arduino
void setup(){
lcd.begin(16, 2); // inicia o LCD
Serial.begin(9600); // inicializa a comunicação serial para mostrar dados em um display LCD
escrever_LCD(dist = false, lado = "",valor = 0, frase = ">> Car. Eng. " , frase2 = "Iniciando..." );
delay(500);
//configurações do servos motores
servo_ultra_sonico.attach(10); // anexa o servo motor lógico ao físico no pino 10.
pinMode(trigPin, OUTPUT); // define o pino triger como saída.
pinMode(echoPin, INPUT); // define o pino echo como entrada.
pinMode(BUZZER,OUTPUT); // define o pino do buzzer como saída.
servo_ultra_sonico.write(90); // inicialmente servo do sensor à 90 graus
rotacao_Parado;
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
escrever_LCD(dist = false, lado = "",valor = 0, frase = "** Criado por **" , frase2 = "CRCA");
delay(2000);
}
// função principal do Arduino
void loop(){
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Pensando..." , frase2 = ">> Car. Eng. ");
//seta o pino 8 com um pulso baixo "LOW" ou desligado ou ainda 0
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
//seta o pino 8 com pulso alto "HIGH" ou ligado ou ainda 1
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
//seta o pino 8 com pulso baixo novamente
digitalWrite(trigPin, LOW);
andar();
}
//função para unir outras funções para poder andar com o robô
void andar(){
reposicionaServoSonar();
int distancia = lerSonar();
if (distancia > 25) {
rotacao_Frente();
}else{
posicionaCarroMelhorCaminho();
andar();
}
}
//função para ler o sensor ultrassónico
int lerSonar(){
return ultrasonic.Ranging(CM);
}
//função para calcular a distancia do centro
int calcularDistanciaCentro(){
servo_ultra_sonico.write(90);
delay(200);
int leituraDoSonar = lerSonar();// Ler sensor de distância
delay(600);
leituraDoSonar = lerSonar();
delay(600);
Serial.print("Distancia Centro: "); // Exibe no serial
Serial.println(leituraDoSonar);
return leituraDoSonar;
}
//função para calcular a distancia da direita
int calcularDistanciaDireita(){
servo_ultra_sonico.write(30);
delay(200);
int leituraDoSonar = lerSonar();
delay(600);
leituraDoSonar = lerSonar();
delay(600);
Serial.print("Distancia Direita: ");
Serial.println(leituraDoSonar);
return leituraDoSonar;
}
//função para calcular a distancia da esquerda
int calcularDistanciaEsquerda(){
servo_ultra_sonico.write(150);
delay(200);
int leituraDoSonar = lerSonar();
delay(600);
leituraDoSonar = lerSonar();
delay(600);
Serial.print("Distancia Esquerda: ");
Serial.println(leituraDoSonar);
return leituraDoSonar;
}
//função para pegar as distancia lidas e calcular qual a melhor distancia
char calculaMelhorDistancia(){
int esquerda = calcularDistanciaEsquerda();
int centro = calcularDistanciaCentro();
int direita = calcularDistanciaDireita();
reposicionaServoSonar();
int maiorDistancia = 0;
char melhorDistancia = '0';
if (centro > direita && centro > esquerda){
melhorDistancia = 'c';
maiorDistancia = centro;
}else if (direita > centro && direita > esquerda){
melhorDistancia = 'd';
maiorDistancia = direita;
}else if (esquerda > centro && esquerda > direita){
melhorDistancia = 'e';
maiorDistancia = esquerda;
}
if (maiorDistancia <= 25) {
rotacao_Re();
posicionaCarroMelhorCaminho();
}
reposicionaServoSonar();
return melhorDistancia;
}
// função para colocar o carrinho na melhor distancia, ou seja girar ele para a melhor distancia
void posicionaCarroMelhorCaminho(){
char melhorDist = calculaMelhorDistancia();
Serial.print("melhor Distancia: ");
Serial.println(melhorDist);
if (melhorDist == 'c'){
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Melhor Distancia....: " , frase2 = "Frente" );
andar();
}else if (melhorDist == 'd'){
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Melhor Distancia....: " , frase2 = "Direita" );
rotacao_Direita();
}else if (melhorDist == 'e'){
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Melhor Distancia....: " , frase2 = "Esquerta" );
rotacao_Esquerda();
}else{
rotacao_Re();
}
reposicionaServoSonar();
}
//função para deixar o sensor "olho" do robô no centro
void reposicionaServoSonar(){
servo_ultra_sonico.write(90);
delay(200);
}
//função para escrever no LCD
void escrever_LCD(boolean dist, String lado, int valor, String frase, String frase2 )
{
lcd.clear();
valorPotenciometro = analogRead(pinoPotenciometro); // brilho do lcd
if (dist == true ) {
lcd.setCursor(0,0);
lcd.print("Distancia ");
lcd.print(lado+" : ");
lcd.setCursor(0,1);
lcd.print(valor);
}
if (dist == false){
lcd.setCursor(0,0);
lcd.print(frase);
lcd.setCursor(0,1);
lcd.print(frase2);
}
}
// função que faz o carro (servo motor) parar
void rotacao_Parado()
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// função que faz o carro (servo motor) andar para frente
void rotacao_Frente()
{
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Indo para:" , frase2 = "Frente");
// apenas pinos secundarios em HiGH, definindo o movimento para frente
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(600);
rotacao_Parado();
}
// função que faz o carro (servo motor) andar para traz
void rotacao_Re()
{
tone(11,300,300);
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Indo para:" , frase2 = "Tras");
tone(11,300,300);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(600);
tone(11,300,300);
rotacao_Parado();
}
// função que faz o carro (servo motor) vira a direita
void rotacao_Direita()
{
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Virando para:" , frase2 = "Direita");
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(250);
rotacao_Parado();
}
// função que faz o carro (servo motor) vira a esquerda
void rotacao_Esquerda()
{
escrever_LCD(dist = false, lado = "",valor = 0, frase = "Virando para:" , frase2 = "Esquerta");
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(250);
rotacao_Parado();
}
Oi PH,
o que posso dizer é o seguinte.
Se funciona, isto é o bom.
O importante é que o code atenda à sua necessidede e expectativa.
Se atender, é o ótimo.
Agora, a performance, eu não tenho como testar,
pois para isto teria que montar um carro igual aos seu, e não tenho os materiaisi para isto.
Rui
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por