0
Offline
Newbie
Karma: 0
Posts: 11
Arduino rocks
|
 |
« on: May 01, 2010, 08:57:37 am » |
Galera, eu comprei um arduino 2009, mas eu não entendo nada desse tipo de programação, eu estou pesquisando mas mesmo assim ainda estou muito confuso, gostaria que voces me ajudassem com o seguinte, (é um programa muito simples mas nao consigo executar, se alguem estiver disposto a me ajudar agradeceria muito):
Preciso controlar 2 motores de passo, o programa iria fazer o seguinte: 1) Girar o primeiro motor de passo por 9 passos e depois disso ele iria parar. 2) Assim que o primeiro motor parasse, o segundo motor iria girar 19 passos e após isso iria parar
Só isso o programa é bem simples consiste em girar o primeiro motor, para-lo e em seguida girar um segundo motor e finalizar o programa, so que eu estou encontrando muita dificuldade pra fazer isso :-/.
Como eu vou informar no programa os pinos onde os motores esteriam conectado ? (eu ja fiz os DOIS circuitos no protoboard com o ULN2003) mas agora parei nisso eu não sei COMO FAZER O PROGRAMA e QUAIS PINOS DO ARDUINO LIGAR NOS CI's
Grato
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 41
Arduino rocks
|
 |
« Reply #1 on: May 05, 2010, 03:41:40 pm » |
Podes ligar em qualquer pino, desde que no program declares qual o pino que usaste, o IDE tem um exemplo para um stepper, e um potenciometro, faz isso, se funcionar, percebe melhor o código, e não deve ser dificil adicionar outro stepper, e fazer o que queres 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 11
Arduino rocks
|
 |
« Reply #2 on: May 05, 2010, 04:43:29 pm » |
Então eu dei um molhada em algumas programações, so que assim eu consigo ligar 2 motores mas nao consigo definir o quanto de "passos" cada um deles vai dar será que alguem pode me ajudar com isso ?
Olha como ta minha programação:
"int motorPin1 = 8; int motorPin2 = 9; int motorPin3 = 10; int motorPin4 = 11; int delayTime = 500;
void setup() { pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); }
void loop() { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); delay(delayTime); digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); delay(delayTime); } "
A programação está feita, mas nesse exemplo apenas o motor vai girar sem nenhuma precisão, eu preciso definir o NÚMERO DE PASSOS QUE O MOTOR VAI DAR e a VELOCIDADE,
AJUDA :-/
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 70
Arduino rocks
|
 |
« Reply #3 on: May 06, 2010, 08:25:21 am » |
cara eu tenho uns programinhas pra testar isso em casa, assim que chegar lá te mando.
|
|
|
|
« Last Edit: May 06, 2010, 08:26:07 am by arilsonm »
|
Logged
|
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #4 on: May 06, 2010, 09:04:41 am » |
Amigo já viu a biblioteca disponível para isso? http://arduino.cc/en/Reference/Steppervocê configura seus motores assim por exemplo: include <Stepper.h>
Stepper motor1(num_passos, pino1, pino2, pino3,pino4); // num_passos, é o numero de passos que seu motor executa em 1 volta, se nao souber pode chutar Stepper motor2(num_passos, pino1, pino2, pino3,pino4); // o numero de passos serve para calcular a velocidade
void setup() { motor1.setSpeed(veloc); // seta velocidade em rpm motor2.setSpeed(veloc); }
void loop() { motor1.step(passos); // passos, é o numero de passos que voce deseja que o motor execute motor2.step(passos); delay(1000); }
|
|
|
|
|
Logged
|
|
|
|
|
Sao Paulo - Brazil
Offline
Sr. Member
Karma: 0
Posts: 268
|
 |
« Reply #5 on: May 06, 2010, 12:07:07 pm » |
A biblioteca resolve muto bem! mas você pode fazer seu próprio código tbm, diga nos se estiver interessado!
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 70
Arduino rocks
|
 |
« Reply #6 on: May 06, 2010, 01:40:01 pm » |
Cara essa biblioteca que Osias mostrou é o teu caminho, é simples e resolve. Não esqueça que você terá que amplificar o sinal através de transistores de potência (EX. TIP31) ou mosfets tipo IRF620, e uma fonte externa deverá ser usada. Qual o transistor, qual fonte e qual o tipo de controle dependerá da especificação do teu motor e do que você quer fazer com ele.
Esse modo de controle direto da potência (com 4 pinos, um pra cada bobina do motor)é chamado phase drive e pode ser usado se você não precisa de muito torque nem muita velocidade. Existe uma outra maneira de controlar motores de passo chamada Chopper ou step-dir (passo e direção) onde se usa apenas dois pinos do uControlador, um controla os passos e o outro a direção do giro. A placa fica mais complicada e usa um CI tipo o L297 que é quem controla a carga, porem, com esse tipo de controladora consegue-se mais torque e velocidade.
|
|
|
|
« Last Edit: May 06, 2010, 01:46:48 pm by arilsonm »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 11
Arduino rocks
|
 |
« Reply #7 on: May 06, 2010, 04:05:22 pm » |
Certo osias, me ajudou bastante agora somente algumas perguntas para finalizar ^^
1) No código que você me passou os dois motores trabalham juntos ou seja enquanto um deles anda por exemplo 10 passos o outro motor ao mesmo funciona por exemplo dando 15 passos, mas o que eu preciso é exatamente o oposto, eu preciso que o motor 1 de 10 passos e somente após que o primeiro motor dar os 10 passos o segundo motor ligue dando outros 15 passos (os motores nao podem trabalhar ao mesmo tempo)
2) o meu motor tem 200 passos se na linha dos passos eu colocar o número negativo na frente, por exemplo: motor2.step(-40) o motor vai girar no outro sentido ? se não for isso como eu faço para ele girar no sentido oposto
3) pelo que vi na programação, após isso o arduino iria executar um LOOP ou seja aposs 1000 de delay, os motores iriam fazer a mesma operação e isso nao pode acontecer, por exemplo após o segundo motor dar X passos ele teria que encerrar o programa, se eu colocar delay = 0 isso acontece ?
obrigado pela atenção
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 70
Arduino rocks
|
 |
« Reply #8 on: May 07, 2010, 08:49:32 am » |
na questão: 1 O programa do Osias faz oque você quer, ou seja executa a primeira instrução até o fim, motor1.step(passos);depois de dar todos os passos executa a segunda instrução, motor1.step(passos)na questão: 2 Acredito que sua suposição esteja certa pois pelo exemplo na pagina da biblioteca não há restrições em se usar números negativos e parece algo lógico, mas também, dá pra testar; na questão: 3 você tem razão, estando dentro do loop vai ficar repetindo com o codigo como está, você deveria criar funções e chamar estas a partir do seu programa. colocando 0 de delay você estária acelerando o loop e não interrompendo. você não quer descrever melhor o que você quer fazer pra gente ter idéia de como lhe ajudar? Você disse que quer que faça esse movimento 1 vez só, mas nunca mais vai fazer? Não volta ao estado inicial? Não há interação com o usuário? Em que momento executar o procedimento? Você pode começar os testes usando leds ligados aos pinos do arduino(em série com resistores de 1k), se colocar velocidades bem baixas vai ver os leds piscando em sequência é bem legal
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 1
Arduino rocks
|
 |
« Reply #9 on: May 07, 2010, 12:27:40 pm » |
então arilson, obrigado pela atenção, aqui é o BRENO mas estou respondendo da conta de um amigo.
o que eu quero fazer é o seguinte:
Toda hora eu vou precisar mudar o numero de passos do MOTOR 1, ou seja ele vai executar uma vez o programa com por exemplo 12 passos, depois que o programa terminar o usuário iria na própria programação do arduino e mudaria o valor de passos do primeiro motor, por exemplo 25 passos após mudar o número de passos no programa o usuário iria dar um UPLOAD no programa e a programação que o OSIAS me passou iria se repitir mas agora com outro valor de passo no MOTOR 1, ou seja o programa não poderia executar um LOOP pois toda hora que os motores executassem a tarefa com por exemplo 10 passos, o usuario teria que mudar o valor no proprio programa do arduino. O único problema é que esses passos que o MOTOR 1 irá dar não são passos previamente definidos eles são passos aleatórios ou seja, não posso colocar no programa um número certo de passos, toda vez eu precisarei mudar o número de passos a partir do programa do arduino e não pode fazer LOOP, resumindo, o programa tem que executar uma única vez a programação e após isso eu irei mudar o número de passos no programa e dar um NOVO UPLOAD para executar o programa, mas agora com um novo valor de passos
--> só mas uma duvida, qual o valor em RPM que eu coloco no programa para os motores de passo ? eu que decido esse valor ou tem algum específico
--> para eu testar o programa com os leds qual o valor da velocidade eu coloco ? Uns 5 RPM ?
Obrigado pela atenção
|
|
|
|
|
Logged
|
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #10 on: May 07, 2010, 12:53:12 pm » |
Breno, para que o programa execute apenas uma vez, e não faça mais nada até um reset físico, você deve colocar as funções dentro apenas do setup. Funciona assim, o setup executa apenas uma vez, quando você liga o controlador, logo em seguida ele executa o loop, e ao terminar ele volta ao inicio do loop e fica executando sempre. Deixando o loop() vazio, ele não fará "nada" até que você resete o controlador. ficaria assim: include <Stepper.h>
Stepper motor1(num_passos, pino1, pino2, pino3,pino4); // num_passos, é o numero de passos que seu motor executa em 1 volta, se nao souber pode chutar Stepper motor2(num_passos, pino1, pino2, pino3,pino4); // o numero de passos serve para calcular a velocidade
void setup() { motor1.setSpeed(veloc); // seta velocidade em rpm motor2.setSpeed(veloc);
motor1.step(passos); // passos, é o numero de passos que voce deseja que o motor execute motor2.step(passos); }
void loop() { }
Só por curiosidade, quando você manda compilar, o Arduino gera um código parecido com esse: void main() { setup();
while(1) { loop(); } }
|
|
|
|
|
Logged
|
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #11 on: May 07, 2010, 01:10:09 pm » |
Só respondendo suas outras perguntas,
se você colocar valor negativo para os passos, ele irá girar no sentido ao contrário sim,
o RPM você define de acordo com a velocidade que você quer, para testar com leds, vai experimentando... diminui a velocidade até você ver claramente... 5 RPM talvez fique bem lento, mas começa dae e vai testando.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 70
Arduino rocks
|
 |
« Reply #12 on: May 07, 2010, 05:02:07 pm » |
Agora tu resolve, isso vai funcionar pra entender, porem a grande vantagem do Arduino é justamente processar informações autonomamente, sem precisar de um computador, mas pra começar tá muito bom, boa sorte!
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 11
Arduino rocks
|
 |
« Reply #13 on: May 07, 2010, 07:07:49 pm » |
Nossa valeu mesmo, voces ajudaram muito agora so mais uma perguintinha e eu finalizo meu projeto xD:
O meu motor de passo tem 6 fios (é um motor unipolar) eu ja consigui distinguir os dois lados:
Lado 1 (3 Fios): Preto, Vermelho, Azul Lado 2 (3 Fios): Amarelo, Branco, Laranja
só que tem um problema eu sei que de cada lado existe 1 fio comum (onde eu vou ligar esse fio na alimentação) mas eu nao to conseguindo identificar esses fios comuns e o pior eu não consigui achar nenhum datasheet do meu motor =/ (comprei ele usado)
e outra depois que eu identificar os 2 fios comuns os outros 4 fios é so eu ligar nas saidas do ULN2003 ou eu preciso identificar o fio A no lado 1 e o fio A no lado 2 ?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 70
Arduino rocks
|
 |
« Reply #14 on: May 08, 2010, 08:37:21 am » |
Breno pra identificar os comuns faça assim, com um multimetro meça a resistência entre os fios Preto e vermelho Preto e azul vermelho e azul Ex (vamos dizer que cada bobina do seu motor tem 15R) então você deve ler algo assim: Preto e vermelho 15R Preto e azul 15 R vermelho e azul 30 R O preto é o teu comum, percebe que quando mede pelo preto tem a resistência de apenas uma bobina? Agora é só repetir pro outro grupo de fios. Busque por um esquematico de motor de passo que vai entender oque estou falando, agora a ordem das bobinas só testando são 24 combinações possiveis:-/ Espero que você esteja com sorte 
|
|
|
|
|
Logged
|
|
|
|
|
|