afar Posted March 27, 2012 Report Share Posted March 27, 2012 Estou programando com arduino um 4 ESC para controlar 4 motor brushless. Sem os IF minha programação fuinciona corretamente, oque tem de errado no meu código? o Código: #define MINCOMMAND 1000 #define MAXCOMMAND 1400 #define DIRCOMMAND 1600 int motorPinL = 2; // onde L= Lefth , R= Right , U= Up, D= Down int motorPinU = 4; // por causa de direita e dianteiro int motorPinD = 6; int motorPinR = 8; void setup() { pinMode(motorPinL , OUTPUT); pinMode(motorPinR , OUTPUT); pinMode(motorPinU , OUTPUT); pinMode(motorPinD , OUTPUT); arm(); } void arm() { analogWrite(motorPinL, MINCOMMAND / 8); analogWrite(motorPinR, MINCOMMAND / 8); analogWrite(motorPinU, MINCOMMAND / 8); analogWrite(motorPinD, MINCOMMAND / 8); } void loop() { int a=0; int d=0; for(int motorCommand = MINCOMMAND ; motorCommand <= MAXCOMMAND; motorCommand +=5) { analogWrite(motorPinL, motorCommand / 8); analogWrite(motorPinR, motorCommand / 8); analogWrite(motorPinU, motorCommand / 8); analogWrite(motorPinD, motorCommand / 8); } Serial.println(" Digite A,S,D,W"); //D para direita, E para esqueradr F para frente e T para traseira "); a=Serial.read(); d=a+2; //delay(1000); Serial.println(d); if (d==99) { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=5) { analogWrite(motorPinL, motorCommand / 8); } } if (d==117) { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10) { analogWrite(motorPinD, MINCOMMAND / 8); } } if (d==102) { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10) { analogWrite(motorPinR, motorCommand / 8); } } if (d==121) { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10) { analogWrite(motorPinU, motorCommand / 8); } } } Link to comment Share on other sites More sharing options...
bubulindo Posted March 27, 2012 Report Share Posted March 27, 2012 Antes de mais, sê bem-vindo. Depois, deves usar tags para código C. Depois, deves dar uma vista de olhos aqui -> asciitable.com #define MINCOMMAND 1000 #define MAXCOMMAND 1400 #define DIRCOMMAND 1600 int motorPinL = 2; // onde L= Lefth , R= Right , U= Up, D= Down int motorPinU = 4; // por causa de direita e dianteiro int motorPinD = 6; int motorPinR = 8; void setup() { pinMode(motorPinL , OUTPUT); pinMode(motorPinR , OUTPUT); pinMode(motorPinU , OUTPUT); pinMode(motorPinD , OUTPUT); arm(); } void arm() { analogWrite(motorPinL, MINCOMMAND / 8); analogWrite(motorPinR, MINCOMMAND / 8); analogWrite(motorPinU, MINCOMMAND / 8); analogWrite(motorPinD, MINCOMMAND / 8); } void loop() { int a=0; // int d=0;//desnecessário for(int motorCommand = MINCOMMAND ; motorCommand <= MAXCOMMAND; motorCommand +=5) { analogWrite(motorPinL, motorCommand / 8); analogWrite(motorPinR, motorCommand / 8); analogWrite(motorPinU, motorCommand / 8); analogWrite(motorPinD, motorCommand / 8); } Serial.println(" Digite A,S,D,W"); //D para direita, E para esqueradr F para frente e T para traseira "); a=Serial.read(); //d=a+2; //desnecessário (aqui pelo menos) //delay(1000); Serial.println(a); if (a=='A') { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=5) { analogWrite(motorPinL, motorCommand / 8); } } if (a=='S') { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10) { analogWrite(motorPinD, MINCOMMAND / 8); } } if (a=='D') { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10) { analogWrite(motorPinR, motorCommand / 8); } } if (a=='W') { for(int motorCommand = MAXCOMMAND ; motorCommand <= motorPinD ; motorCommand +=10) { analogWrite(motorPinU, motorCommand / 8); } } } Isto resolve o teu problema dos ifs... no entanto, o teu problema não é nos ifs. É nas condições do ciclo for, repara: Para motorCommand = 1400 Enquanto motorCommand (1400) <= motorPinD (6) //Isto é sempre negativo, logo o ciclo não executa Passo: motorCommand+5 ou +10 O que pretendes fazer com o ciclo for? Uma rampa de aceleração até à velocidade máxima? Nota que mesmo assim a rampa é inexistente. O microcontrolador vai ser mais rápido que a inércia do motor e vais ver o motor a ir quase imediatamente para a velocidade máxima. A não ser, claro, que tenhas uma espécie de delay (ou imenso código) após ou antes destas instruções. Edit: Reparei agora no delay(1000). Tenta fazer este controlo de outra forma. Mete um timer a correr e apenas se o timer passar um certo tempo é que corres este código em vez de usares o delay. Isto apenas porque o delay vai estar a comer-te ciclos do processador. Já agora, isto é para o Arduino... e o serial.read() se não me engano bloqueia.... que pode ser outro problema mais à frente. include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 14, 2012 Author Report Share Posted April 14, 2012 me desculpa pelos erros sou novo no fórum, pretendo que com esse for controlar a potencia dos motores para que eu possa pelo menos por enquanto controlar a direção do quadricoptero (pelo teclado mesmo) e futuramente adaptar para a função DO. ALguem tem alguma ideia de como fazer isso. Mudei a programação também agora está da seguinte maneira int motorPin = 8; int motor2Pin = 6; int motor3Pin = 4; int motor4Pin = 2; #define MINCOMMAND 1000 #define MAXCOMMAND 1600 #define DIRCOMMAND 2000 void setup() { Serial.begin(9600); pinMode(motorPin , OUTPUT); pinMode(motor2Pin , OUTPUT); pinMode(motor3Pin , OUTPUT); pinMode(motor4Pin , OUTPUT); arm(); } void arm() { analogWrite(motorPin, MINCOMMAND / 8); analogWrite(motor2Pin, MINCOMMAND / 8); analogWrite(motor3Pin, MINCOMMAND / 8); analogWrite(motor4Pin, MINCOMMAND / 8); } void loop() { for(int MC = MINCOMMAND ; MC <= MAXCOMMAND; MC +=10) { analogWrite(motorPin, MC / 8); analogWrite(motor2Pin, MC / 8); analogWrite(motor3Pin, MC / 8); analogWrite(motor4Pin, MC / 8); delay(500); } int dir,a=10; Serial.println(" D para direita, E para esquerda F para frente e W para traseira "); dir=Serial.read(); Serial.println(a); delay(1000); if (dir = 'a') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motorPin, MC / 8); Serial.println(dir); } } if (dir = 's') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motor2Pin, MC / 8); Serial.println(dir); } } if (dir = 'w') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motor3Pin, MC / 8); Serial.println(dir); } } if (dir = 'd') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motor4Pin, MC / 8); Serial.println(dir); } } } Link to comment Share on other sites More sharing options...
bubulindo Posted April 14, 2012 Report Share Posted April 14, 2012 Que Arduino estás a usar? Se for o Uno/2009 acho que vais ter de mudar algumas coisas... a comecar pelos pinos: PWM: 3, 5, 6, 9, 10, and 11. Provide 8-bit PWM output with the analogWrite() function. Que é que o programa não está a fazer? include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 14, 2012 Author Report Share Posted April 14, 2012 Estou usando arduino mega, quero controlar com as letras a variação de velocidade dos motores. Link to comment Share on other sites More sharing options...
bubulindo Posted April 14, 2012 Report Share Posted April 14, 2012 Mesmo sem saber qual é o teu problema, aqui ficam algumas coisas: Porque é que tens o controlo do motor de 1000 a 2000 e no entanto, divides por 8 antes de dar o comando? Porque não ter o controlo de 125 a 200? E fazeres uma curva de aceleração de 8 em 8 por exemplo... é menos um sítio para teres problemas. Depois o PWM só vai ser de bits, logo e apesar de saber que não deve ser esse o problema aqui, podias trocar a variável MC de int para unsigned char. Outra coisa, podias livrar-te do delay(1000); e veres se existe algum caracter disponível para ser lido pela porta série. //inicializas a velocidade dos motores. if (Serial.available() >0) { //existem caracteres para ler dir=Serial.read(); Serial.println(a); //altera a velocidade consoante o caracter. } Fica muito mais eficiente para o microcontrolador e mais rápido a responder ao teu comando. Por último, o teu código não está a testar se o caracter recebido é 'a', 's', 'w' e 'd'. Está a dar esses valores à variável dir. if (dir = 'a') ... if (dir = 's') ... if (dir = 'w') ... if (dir = 'd') //devia ser if (dir == 'a') ... if (dir == 's') ... if (dir == 'w') ... if (dir == 'd') Isto resolve o teu problema? Se fores mais específico relativamente ao que está a acontecer, é muito mais simples de ajudar-te. Assim estou só a tentar adivinhar o que pode estar mal. include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 14, 2012 Author Report Share Posted April 14, 2012 Vou contarei projeto completo: quadricoptero com vôo programado, com sensores acelerômetro , giroscopio, sonar ultrassonico. Minha idéia e programar um vôo e os sensores fazer ajustes no vôo Link to comment Share on other sites More sharing options...
bubulindo Posted April 14, 2012 Report Share Posted April 14, 2012 Vou contarei projeto completo: quadricoptero com vôo programado, com sensores acelerômetro , giroscopio, sonar ultrassonico. Minha idéia e programar um vôo e os sensores fazer ajustes no vôo Eu já percebi isso. Mas o que é que aquele pedaço de código que meteste aqui não faz? include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 15, 2012 Author Report Share Posted April 15, 2012 Vou testar e ver se deu certo, obrigado pela ajuda 😕 Link to comment Share on other sites More sharing options...
afar Posted April 16, 2012 Author Report Share Posted April 16, 2012 olhando mais atentamente essa parte aqui tem que ser fora do if correto ? /inicializas a velocidade dos motores. if (Serial.available() >0) { //existem caracteres para ler dir=Serial.read(); Serial.println(a); //altera a velocidade consoante o caracter. } Link to comment Share on other sites More sharing options...
bubulindo Posted April 16, 2012 Report Share Posted April 16, 2012 Qual if? include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 17, 2012 Author Report Share Posted April 17, 2012 está com problema no loop mesmo, eu não consigo fazer funcionar os 4 motores e muito menos controlar as velocidades deles. Tem alguma ideia de como possa ser feito? Link to comment Share on other sites More sharing options...
bubulindo Posted April 17, 2012 Report Share Posted April 17, 2012 Pergunta estúpida... como ligaste os motores ao Arduino? include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 17, 2012 Author Report Share Posted April 17, 2012 Vou explicar a situação toda: eu ligo os motores nos ESC's que são ligados nas saídas pwm do arduino. Esses esc são controlados como se fossem servo motores. Entendeste? Link to comment Share on other sites More sharing options...
bubulindo Posted April 17, 2012 Report Share Posted April 17, 2012 O que é um ESC? Tens um manual? Já agora... faz um pequeno teste. Liga LEDs com a devida resistência de limitacão nas saídas PWM do Arduino. include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 17, 2012 Author Report Share Posted April 17, 2012 São speed control http://www.hobbyking.com/hobbyking/store/__324__182__ESC_UBEC_VR-HobbyKing_ESC.html?gclid=CPmiy5yEva8CFUOb7QodshBdzg Link to comment Share on other sites More sharing options...
bubulindo Posted April 18, 2012 Report Share Posted April 18, 2012 Já experimentaste com os LEDs? O link não tem um manual... include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 18, 2012 Author Report Share Posted April 18, 2012 http://www.hobbyking.com/hobbyking/store/uploads/8656078X637952X10.pdf ESC´s São controladores eletrônicos de velocidade o meu é esse : http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=3731 Eles são controlados como se fossem servo motores. Link to comment Share on other sites More sharing options...
bubulindo Posted April 18, 2012 Report Share Posted April 18, 2012 Ok... já experimentaste com LEDs? Já experimentaste sem usares a porta série para escrever valores de PWM? Só com um pouco de código e um site que não tem um esquema de ligações, a ajuda que consigo dar não é muita... Experimenta o que escrevi em cima e posta aqui o resultado. include <ai se te avio> Mãe () { } Link to comment Share on other sites More sharing options...
afar Posted April 19, 2012 Author Report Share Posted April 19, 2012 as vezes agente está dentro de um problema e não consegue ver as soluções. Bem acabei de testar com os LED´s, todos eles ficavam ligados, olhei a programação de novo e percebi que no loop eu encerrava ele com um } antes de entrar nos if. Modifiquei isso e com os LED´s obtive o seguinte resultado. A letra que eu aperto faz o led piscar mais forte. Vou testar agora com os motores. a programação ficou desse jeito. int motorPin = 8; int motor2Pin = 6; int motor3Pin = 4; int motor4Pin = 2; #define MINCOMMAND 1000 #define MAXCOMMAND 1600 #define DIRCOMMAND 2000 void setup() { Serial.begin(9600); pinMode(motorPin , OUTPUT); pinMode(motor2Pin , OUTPUT); pinMode(motor3Pin , OUTPUT); pinMode(motor4Pin , OUTPUT); arm(); } void arm() { analogWrite(motorPin, MINCOMMAND / 8); analogWrite(motor2Pin, MINCOMMAND / 8); analogWrite(motor3Pin, MINCOMMAND / 8); analogWrite(motor4Pin, MINCOMMAND / 8); } void loop() { for(int MC = MINCOMMAND ; MC <= MAXCOMMAND; MC +=10) { analogWrite(motorPin, MC / 8); analogWrite(motor2Pin, MC / 8); analogWrite(motor3Pin, MC / 8); analogWrite(motor4Pin, MC / 8); delay(500); //tirei o } daqui int dir; Serial.println(" D para direita, E para esquerda F para frente e W para traseira "); if (Serial.available() >0) { //existem caracteres para ler dir=Serial.read(); Serial.println(dir); //altera a velocidade consoante o caracter. } if (dir == 'a') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motorPin, MC / 8); Serial.println(dir); } } if (dir == 's') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motor2Pin, MC / 8); Serial.println(dir); } } if (dir == 'w') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motor3Pin, MC / 8); Serial.println(dir); } } if (dir == 'd') { for(int MC = MAXCOMMAND ; MC <= DIRCOMMAND ; MC +=10) { analogWrite(motor4Pin, MC / 8); Serial.println(dir); } } } } //inseri ele aqui Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now