Sou o Bruno Serrano, sou português e novo com Arduino. Tenho o Arduino Uno e o 2009.
Estou a fazer um pequeno braço robotizado em que uso 4 motores de passo e cada motor é controlado por um chip da Pololu 4988, funciona muito bem.
O que gostaria de saber é como referenciar os motores numa posição zero, numa posição inicial. Imaginamos, os motores no final de um ciclo ficam parados numa determinada posição, mas se eu desligar a alimentação e os mover à mão eles não sabem que se moveram e quando iniciarem um novo ciclo já começam do local errado. É possivel eles se referenciarem e procurarem a posição incial?
#define VELOCIDAD 11000
#define VELOCIDADe 15000
int steps = 2;
int direccion = 3;
int reset = 9;
int pasosmax = 50;
int pasosmin = 30;
const int indetectar = 13;
int indetecta = 0;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(steps, OUTPUT);
pinMode(direccion, OUTPUT);
pinMode(reset, OUTPUT);
pinMode(indetectar, INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
indetecta = digitalRead(indetectar);
digitalWrite(reset, LOW); //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(1000);
digitalWrite(reset, HIGH); //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, HIGH);
for (int i = 0; i<pasosmax; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
digitalWrite(steps, HIGH); // This LOW to HIGH change is what creates the
digitalWrite(steps, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(VELOCIDAD); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
for (int i = 0; i<pasosmin; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
digitalWrite(steps, HIGH); // This LOW to HIGH change is what creates the
digitalWrite(steps, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(VELOCIDADe); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
digitalWrite(reset, LOW); //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
delay(1000);
digitalWrite(reset, HIGH); //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
digitalWrite(direccion, LOW);
for (int i = 0; i<pasosmax; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
digitalWrite(steps, LOW); // LOW to HIGH hace que el motor avance ya que da la orden
digitalWrite(steps, HIGH); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(VELOCIDAD); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
for (int i = 0; i<pasosmin; i++) //Equivale al numero de vueltas (200 es 360º grados) o micropasos
{
digitalWrite(steps, LOW); // LOW to HIGH hace que el motor avance ya que da la orden
digitalWrite(steps, HIGH); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(VELOCIDADe); // Regula la velocidad, cuanto mas bajo mas velocidad.
}
}
Com um motor DC, o ideal é usar um encoder. No entanto, por causa do controlo que tens nos passos que dás no motor de passo, a maneira mais fácil de o fazer é colocando um fim de curso. Ou seja, um contacto numa posicão conhecida que faz o reset da tua posicão.
Quantos graus de liberdade tens? Tens uma foto do braco?
O melhor exemplo que tenho para te dar de fim-de-curso é o de uma persiana controlada por um motor de passo.
Nessa aplicacão, se colocares o teu fim-de-curso a ser actuado quando a persiana está completamente fechada, sabes que sempre que esse contacto for activado a persiana está fechada. Então nesse evento colocas o contador de passos a zero.
Se por algum motivo perdes o número de passos sem que a persiana esteja no fim de curso, apenas tens de dar comandos à persiana até veres o fim de curso.
No caso dum braco é mais complicado se tiveres vários graus de liberdade uma vez que para atingires o fim de curso precisas de coordenar vários movimentos. Podes, por exemplo, criar um fim de curso para cada motor e assim sabes onde cada motor estará.
O fim de curso pode ser isto:
Ou então até um foto-transistor, desde que te indique a posicão inequivoca do braco.
_Nota que um encoder pode não ser suficiente para te indicar a posicão do braco. Se por exemplo, o motor tiver de dar mais que uma revolucão para atingir um local, o encoder torna-se inútil para o que queres e então a única hipótese é mesmo o fim de curso.
Tambem concordo com esta afirmaçao do Bubulindo.Se fores louco por precisao compra encoder absolutos.Encontras no ebay a bom preço. http://www.ebay.com/itm/10-Pcs-12mm-Rotary-Encoder-Switches-Dia-6mm-360-Degree-New-/221097795878?pt=LH_DefaultDomain_0&hash=item337a74a126
Se nao quiseres comprar isso e quiseres tentar de forma artesanal podes sempre tentar usar potenciometros lineares, só que eles nao rodam 360 graus.Tudo depende depois da junta onde o irás ligar, que tipo de angulo pode fazer, incremento minimo ...
Com os encoders absolutos caso te falhe a energia, se leres os encoders de todas as juntas podes obter a posiçao onde se encontra o braço.
O código seria algo como mover o braco no sentido do fim de curso. No caso da persiana isto é facilimo, é para baixo. Nos braco dum robot, suponho que terias de criar um fim de curso para cada motor e assim saberes onde cada um deles estava.
Com encoder absoluto (que te diz o angulo a que o veio está), sabes sempre onde o motor está, SE O MOTOR NUNCA DER MAIS QUE UMA VOLTA.
O problema do encoder absoluto é que ocupa imensos pinos do Arduino.
bubulindo:
Com encoder absoluto (que te diz o angulo a que o veio está), sabes sempre onde o motor está, SE O MOTOR NUNCA DER MAIS QUE UMA VOLTA.
O problema do encoder absoluto é que ocupa imensos pinos do Arduino.
E qual é a velocidade?
Digo isto porque se a velocidade do motor for relativamente baixa poderias, por exemplo, usar um shift register para ler as posicões dos encoders. Isso ocuparia um pino por encoder mais um para clock.
Um problema é que esses encoders são caros... e algo volumosos.
Não tenho nada ainda, tenho apenas o motor, os arduinos e o pololu A4988, mas vai ter 3 graus de liberdade.
Tou a avaliar e tentar perceber qual o material adequado e a melhor forma de o fazer.
Eu compreendo que não tenhas material. Isso é normal. Não compreendo é que não tenhas pelo menos um desenho ou algo definido acerca do que pretendes.
Os três graus vou assumir que seja um grau na base para rodares o braco 360 graus, outro para levantar um braco e outro para mexer o (chamemos-lhe) antebraco. Estou correcto?
Tipo este
Mas sem a ultima juncão perto da garra.
Neste caso, podes ter um fim de curso na base indicando onde é o zero.
No caso da articulacão inferior, podes colocar o fim de curso na base.
A articulacão superior é mais problemática, mas podes colocar o fim de curso para ser actuado com o braco completamente estendido (apesar de não ser muito seguro fazer assim).
O material para um fim de curso pode ser mecânico ou uma foto transistor ou até um switch magnético.