Boa tarde a todos,

estou tentando programar um robô que anda normalmente e quando encontra algo a menos de 15cm de distância ele, da ré e vira para a direita.

Estou usando um carrinho de controle remoto com 2 motores, 1 na frente e 1 atrás.

O da frente movimenta as rodas para a direita e para a esquerda e o de trás é a tração.

Quando eu adicionar corrente no da frente, passando do fio amarelo para o verde(como podem ver  na segunda imagem), ele vira para a direita e se eu

inverter o sentido ele vira para a direção contrária.

Como podem ver essa é uma imagem do motor dianteiro.

Aquela parte branca mais a direita da imagem é que fica conectada ao motor. Quando o motor for ligado, movimenta esta peça que por

sua vez faz com que as rodas virem para a direita ou para a esquerda, simultaneamente.

Um dos problemas está ai, pois se o motor der mais do que uma volta aquela peça desencaixa e não volta mais, deixando as rodas "livres".

Estou medindo a distância com o sensor Ultra-sônico, que me devolve a distância em cm.

Mas como sou leigo em programação acredito que eu esteja fazendo algo errado na

programação, pois os motores M1 e M2 não são acionados e minha programação está muito básica,

muito leiga.

A tensão que chega a eles é de 0.08V.

Eu sinto eles tentando girar, mas não conseguem devido a baixa tensão.

Minha programação:

#include <AFMotor.h>
#include "Ultrasonic.h"
Ultrasonic ultrasonic(2,5);
int Echo_pin = 5;
int Trig_pin = 2;
AF_DCMotor motor (1, MOTOR12_64KHZ); // Motor cc em M1
AF_DCMotor motor2 (2, MOTOR12_64KHZ); //motor CC em M2

void setup() {
Serial.begin(9600);
pinMode(Echo_pin, INPUT);
pinMode(Trig_pin, OUTPUT);
motor.setSpeed(255);
motor2.setSpeed(100);
}

// Liga o motor (tração)
void loop() {
motor.run(FORWARD);

digitalWrite(Trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(Trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(Trig_pin, LOW);
int i = (ultrasonic.Ranging(CM));
Serial.print("Distancia em CM: ");
Serial.println(i);
if (i < 10) {
motor.run(RELEASE);
motor2.run(FORWARD);
delay(10);
motor2.run(RELEASE);
motor.run(BACKWARD);

}
}

Quando cito motor.run(FORWARD) ou motor2.run(FORWARD)

a tensão(0.08V) segue do fio amarelo para o fio verde.

OBS: Tem o Arduino que vai abaixo do MotorShield e é alimentado com 6V.

Muito Obrigado,

Amauri

Exibições: 3745

Responder esta

Respostas a este tópico

Sou eu de novo cara.. hahahhah

Aquele poste era meu,

Abraços

TOTAL FAIL!!! =x

hahaha nem me dei o trabalho de ver o autor do outro tópico, que burro eu xD

Amauri

    Sugiro uma abordagem simples para descobrir o por que nao esta funcionando.

     Conecte somente a motorshield ao arduino e escreva um programa bem simples para ligar uma saida e depois a outra, com um multimetro verifique a tensao em cada uma das saidas. 

    Pelo o que observei utiliza PWM para controlar os motores, teste algumas frequencias diferentes pode resolver. verifique a tensao dos motores e se sao compativeis com a motorshield

Eu já conectei só o MotorShield e funcionou tudo beleza..

A tensão dos motores esta OK com a do MotorShield.

Vou tentar mudar as freqüências.

Abraços,

Amauri

Você não pode conectar o sensor de ultrassom nos pinos 3 e 5, estes são usado pelo Motorshield. 

Quando usar esse shield, opte por usar os pinos analógicos (A0 a A5), estes não são usados pelo shield.

Outra recomendação para este shield, retirado diretamente do wik da Ladyada, é de que você não deve usar baterias de 9V ou pilhas comuns, não perca seu tempo, use baterias mais duráveis como as NiMH usadas em modelismo.

Além disso você deve separar a alimentação do shield e do Arduino, motores costumam gerar ruídos e isso afeta a parte lógica do circuito. 

Dê uma olhada neste tópico, provavelmente você retirará todas as suas dúvidas em relação a este Motor Shield. 

http://www.ladyada.net/make/mshield/use.html

Muito obrigado Luís,

você de novo me salvando. rsrs

Vou ler aquilo e caso surja mais alguma dúvida eu te pergunto.

Obrigado,

Amauri

Luís, uma outra dúvida é como farei para controlar o motor da frente, que não pode dar mais que meia volta.

Tem como controlar a potencia dele? Pensei em um potenciômetro, mas queria algo ligado a programação e não físico.

Obrigado,

Amauri

Boa tarde, Amauri.

Estou finalizando um projeto bem parecido com o seu, como você pode ver no link abaixo:

https://sites.google.com/site/softelli/projetos/ex-f1

Talvez possa responder algumas de suas dúvidas...

Também tive o problema com o motor dianterio, que direcionava o veículo (Fórmula 1) por meio de um motor CC, num esquema corôa e pinhão. A corôa gira no máximo 30º pra cada lado - característica do (único disponível) veículo que escolhi, e que acabou sendo uma péssima restrição ao projeto:

- a direção era centrada por mola (só houve força suficiente no motor quando substituí a bateria tradicional por uma LiPO), mas por ter mudado a característica física do veículo (de 4 para 3 rodas), nem sempre a força da mola era suficiente para centralizar.

- não tenho feedback da direção, isto é: não sei se está exterçada ou não.

- tentei colocar botões como fim-de-curso, mas o motor não tinha força suficiente para quebrar a resistência da mola dos mesmos.

Na fase atual, acabei utilizando um potenciômetro de 10k como pivô da roda dianteira. Muito embora a restrição de exterçar  permaneça (pelo tamanho da engrenagem), pelo menos consigo saber se a direção girou ou não. Ainda existem alguns problemas (elétricos, mecânicos e de programação) que serão resolvidos e suas soluções publicadas nas férias.

Qualquer questão é só perguntar.

Edson,

muito obrigado pela atenção e pelas várias dicas válidas,

na próxima vez em que eu for mexer no projeto tentarei

adotar algumas dessas medidas.

Tentarei colocar um potenciômetro no motor dianteiro e ver se ele terá força para movimentar,

a direção e com vários testes eu escolho determino o tempo necessário para ele virar a roda para direita e depois endireitar.

Qualquer coisa tentarei colocar um servo motor e calculo em graus.

Abraços,

Amauri

Não existe uma maneira precisa de fazer esse controle em motores DC, o que você fazer é girar para esquerda ou direita, durante um tempo e depois pará-lo. 

Acredito que para este teu projeto você teria outras opções melhores, conforme comentou Amauri. 

Pense também na possibilidade de colocar um servo motor para guiar as rodas da frente. 

Você também pode deixar uma roda boba na frente, deixando o robo com 3 rodas, e limitando-se apenas a tocar as rodas traseiras. 

Para isso ("deixar o robot com 3 rodas"), o seu acionamento deveria ser com motores independentes para cada roda traseira, e não apenas motor + engrenagens de diferencial, como é a característica do meu projeto.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço