Dúvida acionamento motor de passo com Arduíno e Tip 122

Boa noite, sou iniciante em eletrônica, e estou com uma dúvida sobre motores de passo,

uso o NEMA 23 unipolar, como na minha cidade não encontrei um driver, resolvi seguir o esquema abaixo:

Estou alimentando com uma fonte de PC 12v. Também fiz a ligação do GND do Arduíno com o GND da fonte. Entre o arduíno e o esquema estou usando um resistor de 1k na base do transistor.

Desta forma consegui acionar o motor porém ele esquenta muitíssimo rápido e os Tip122 também.

Além do mais, notei que ao tocar o motor com a mão, alguns leds na protoboard acendem involuntariamente.

Se alguém puder me ajudar, desde já agradeço. 

Exibições: 992

Responder esta

Respostas a este tópico

#include <PS2X_lib.h> //for v1.6
#include <Stepper.h> // inclui a biblioteca dos motores de passo

PS2X ps2x; // create PS2 Controller Class

//right now, the library does NOT support hot pluggable controllers, meaning
//you must always either restart your Arduino after you conect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;

const int stepsPerRevolution = 200; // numero de passos totais do motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, A0, A1, A2, A3);


//Declaração dos Leds
int LEDy = 9;
int LEDx = 6;
int LEDX = 5;
int LEDY = 3;
int brilloLedY = 0; // variable para guardar el valor con el que se iluminara el led
int brilloLedx = 0; // variable para guardar el valor con el que se iluminara el led
int brilloLedX = 0; // variable para guardar el valor con el que se iluminara el led
int brilloLedy = 0; // variable para guardar el valor con el que se iluminara el led

void setup(){
Serial.begin(57600);

// set the speed at 30 rpm:
myStepper.setSpeed(150);

//Definição de Leds
pinMode(LEDX, OUTPUT);
pinMode(LEDx, OUTPUT);
pinMode(LEDY, OUTPUT);
pinMode(LEDy, OUTPUT);


//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************

error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error

if(error == 0){
Serial.println("Found Controller, configured successful");
Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
Serial.println("holding L1 or R1 will print out the analog stick values.");
Serial.println("Go to www.billporter.info for updates and to report bugs.");
}

else if(error == 1)
Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");

else if(error == 2)
Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");

else if(error == 3)
Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

//Serial.print(ps2x.Analog(1), HEX);

type = ps2x.readType();
switch(type) {
case 0:
Serial.println("Unknown Controller type");
break;
case 1:
Serial.println("DualShock Controller Found");
break;
case 2:
Serial.println("GuitarHero Controller Found");
break;
}

}

void loop(){
/* You must Read Gamepad to get new values
Read GamePad and set vibration values
ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
if you don't enable the rumble, use ps2x.read_gamepad(); with no values

you should call this at least once a second
*/



if(error == 1) //skip loop if no controller found
return;

if(type == 2){ //Guitar Hero Controller

ps2x.read_gamepad(); //read controller

if(ps2x.ButtonPressed(GREEN_FRET))
Serial.println("Green Fret Pressed");
if(ps2x.ButtonPressed(RED_FRET))
Serial.println("Red Fret Pressed");
if(ps2x.ButtonPressed(YELLOW_FRET))
Serial.println("Yellow Fret Pressed");
if(ps2x.ButtonPressed(BLUE_FRET))
Serial.println("Blue Fret Pressed");
if(ps2x.ButtonPressed(ORANGE_FRET))
Serial.println("Orange Fret Pressed");

if(ps2x.ButtonPressed(STAR_POWER))
Serial.println("Star Power Command");

if(ps2x.Button(UP_STRUM)) //will be TRUE as long as button is pressed
Serial.println("Up Strum");
if(ps2x.Button(DOWN_STRUM))
Serial.println("DOWN Strum");


if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");


if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE
{
Serial.print("Wammy Bar Position:");
Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);
}
}

else { //DualShock Controller

ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed

if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");

/*
if(ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
}
if(ps2x.Button(PSB_PAD_RIGHT)){
Serial.print("Right held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
}
if(ps2x.Button(PSB_PAD_LEFT)){
Serial.print("LEFT held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
}
if(ps2x.Button(PSB_PAD_DOWN)){
Serial.print("DOWN held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
}

*/
vibrate = ps2x.Analog(PSAB_BLUE); //this will set the large motor vibrate speed based on
//how hard you press the blue (X) button

if (ps2x.NewButtonState()) //will be TRUE if any button changes state (on to off, or off to on)
{



if(ps2x.Button(PSB_L3))
Serial.println("L3 pressed");
if(ps2x.Button(PSB_R3))
Serial.println("R3 pressed");
if(ps2x.Button(PSB_L2))
Serial.println("L2 pressed");
if(ps2x.Button(PSB_R2))
Serial.println("R2 pressed");
if(ps2x.Button(PSB_GREEN))
Serial.println("Triangle pressed");

}


if(ps2x.ButtonPressed(PSB_RED)) //will be TRUE if button was JUST pressed
Serial.println("Circle just pressed");

if(ps2x.ButtonReleased(PSB_PINK)) //will be TRUE if button was JUST released
Serial.println("Square just released");

if(ps2x.NewButtonState(PSB_BLUE)) //will be TRUE if button was JUST pressed OR released
Serial.println("X just changed");


if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
{
Serial.print("Stick Values:");
Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX
Serial.print(",");
Serial.print(ps2x.Analog(PSS_LX), DEC);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_RY), DEC);
Serial.print(",");
Serial.println(ps2x.Analog(PSS_RX), DEC);
} //fim do if(ps2x...)

//Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map()
int a = map(ps2x.Analog(PSS_LY), 100, 1, 4, 250);
if(a > 0){ brilloLedY = a;}else{brilloLedY = 0;}
analogWrite(LEDY, brilloLedY);
if(brilloLedY > 0 && brilloLedY < 100){
// step one revolution in one direction:
myStepper.step(1);
}
if(brilloLedY >= 100 && brilloLedY <= 255){
// step one revolution in one direction:
myStepper.step(20);
}

//Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map()
int b = map(ps2x.Analog(PSS_LY), 155, 255, 4, 255);
if(b > 0 && b< 256){ brilloLedy = b;}else{brilloLedy = 0;}
analogWrite(LEDy, brilloLedy);
if(brilloLedy > 0 && brilloLedy < 100){
// step one revolution in one direction:
myStepper.step(-1);
}
if(brilloLedy >= 100 && brilloLedy <= 255){
// step one revolution in one direction:
myStepper.step(-20);
}

//Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map()
int c = map(ps2x.Analog(PSS_LX), 100, 1, 4, 250);
if(c > 0){ brilloLedx = c;}else{brilloLedx = 0;}
analogWrite(LEDx, brilloLedx);

//Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map()
int d = map(ps2x.Analog(PSS_LX), 155, 255, 4, 255);
if(d > 0 && b< 256){ brilloLedX = d;}else{brilloLedX = 0;}
analogWrite(LEDX, brilloLedX);


Serial.println(brilloLedy);

}//fim do else dualshockcontroller





delay(5);

}

Boa noite,

Poderia postar o esquema completo de como esta ligado o circuito, a mão mesmo, ou o link de onde copiou, sem saber como esta a ligação dos componentes entre si fica difícil opinar, o fato de os leds estarem acendendo apenas com a proximidade da mão, indica que existe falta de aterramento nas entradas que estão fazendo os mesmo serem acionados, com um resistor de 10K ligado no GND talvez resolva, mas é apenas uma possibilidade, não entendi bem onde esta ligado um R de 100K, por isso trate de melhorar a informação do circuito para que todos possam ajuda-lo melhor.

Abs.

olá Carlos, postei a foto do cicuito pronto, o problema do aquecimento eu resolvi com a ajuda do Rui, eu estava usando 12v, onde deveria ser 6v. Agora falta ver sobre os leds que estão ligados no arduino, e acendem devido a aproximação da mão no motor. Abraço.

Olá Eliezer,

Bom que solucionou , o Rui, é massa.

As entradas que acionam os leds, devem ter um resistor de 10K ligados no GND e a entrada da porta de acionamento, segue imagem.

Isso evita disparos erráticos, ou por estática como no seu caso.

Poderia ser isso.

Abs.

Olá Carlos, a entrada que aciona os leds é o programa do Arduíno, ele pega a leitura do bit do controle de PS2 interpreta, e aciona o led correspondente com brilho proporcional ao analógico do controle, entre o Arduíno e o led tem um resistor de 1k pra não queimar o led. Até aí tudo bem, começou a dar problema quando coloquei junto o Stepper, poderia ser porque usei dois tipos de diodo? (conforme a foto acima)

Olá Eliezer,

Eu entendi essa parte, mas veja uma coisa, os botões do controle do PS não vão ligados nas portas analógicas, eu confesso que nunca me aprofundei neste tipo de projetos, mas imagino que as botoeiras de comando enviam sinal nas portas, e que se estas estão em algum momento flutuando entre nenhum estado, nem high nem low precisam de alguma referencia para não ser uma antena para qualquer tipo de ruído elétrico estático.

Li brevemente alguma coisa aqui, anexo uma foto e um link de discussão sobre tema relacionado, será que as portas analógicas não precisam de resistores que ente a não presença de sinal as leve a um estado GND por exemplo? (Posso estar enganado)

Fico na duvida também, e conversando a gente vai ter varias opiniões que servira para aprendizado de todos.

Links:

http://imgkid.com/playstation-2-controller-buttons.shtml

http://www.billporter.info/2011/03/27/arduino-playstation-2-control...

Abs.

Anexos

Olá Carlos, foi exatamente este esquema da foto que segui, e outros modelos que vi também seguiam a mesma ligação. Imagino que meu problema seja corrente reversa ocasionada pelo motor, que haje como um gerador quando desligo a corrente, agora que diminui a voltagem está aparecendo estes picos com bem nenos frequência. Estou pesquisando sobre proteções com capacitores. vlw

A Proteção mais comum para acabar com isso é o diodo colocado de maneira inversa a sua condução, segue imagem.

Quando o motor desliga e gera uma corrente inversa que circula pelo diodo que consome essa corrente eliminando a mesma.

Seguem link, um deles imagino também serviu de fonte para seu projeto, por tanto neste sentido já estaria com a devida proteção, ou não colocou os diodos?

http://www.cin.ufpe.br/~ags/eletr%F4nica/aula_transistor_aplicacoes...


http://www.ebah.com.br/content/ABAAAAcKQAJ/acionamento-motores-passo

Embora o fato de acenderem com a proximidade de mão não deveria ter relação com isso, e sim com correntes estáticas. Uma pergunta, isso ocorre estando o circuito em repouso que como eu estou imaginando, ou apenas quando esta funcionando?

Eliezer, acho que estou interpretando mal o problema, depois de escrever voltei a ler e vi que na realidade você descreve que os leds acendem quando toca o motor com a mão, desculpe, eu entendi antes que era ao aproximar a mão perto da placa do Arduino, e meu raciocínio todo foi baseado neste sentido, por tanto desconsidere, os diodos sim devem ser colocados sempre para proteção do TIP ou de qualquer drive quando manejamos motores ou qualquer outra carga indutiva como a bobina de um rele por exemplo.

Quanto ao motor, experimente mandar sua carcaça e massa, ou seja aterra a carcaça ligando um GND da fonte se tem carcaça de metal e faça o teste, já que a corrente ou campo magnético gerado seria eliminado enviando este a terra (GND neste caso)

Abs.

ocorre quando a fonte está ligada, ou seja, notei que os Tip122 deixam uma corrente passar de 0,75v em cada bobina quando o motor está parado, ainda recebe esse valor em cada bobina, o Rui me explicou que o Tip122 nunca zera. Então ele fica "esquentando" e recebendo carga durante o periodo de "Low" dos transistores... Fiz a ligação dos diodos, como mostra na foto seguindo os esquemas, como não especificaram, coloquei os que eu tinha que são diferentes, não sei se isso poderia alterar alguma coisa...

estou pensando em mudar minhas ligações para um capacitor como mostra a figura...

neste caso, trocar os diodos pelo capacitor, o que acha? e qual capacitor eu poderia colocar? 

  • Aterra a carcaça do motor
  • Isole a fonte do motor da fonte do arduíno
  • Alimente o motor com fonte e/ou reguladores de tensão separados
  • Sempre tenha capacitores nas fontes: 1 de 100nF e outro maior do que 50uF eletrolítico, com a tensão bem maior do que a máxima fornecida pela fonte.
  • Portas não utilizadas devem ter pull-up ou pull down, nem que seja de 100K
  • Instale uma carcaça de chumbo em torno do motor
  • Por ultimo mais efetivo: Aterre sua mão!!!

Boa sorte!

  'Eiju

 Experimente colocar dissipadores de calor em os transistores.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço