afar Posted March 27, 2012 at 03:07 AM Report #445833 Posted March 27, 2012 at 03:07 AM 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); } } }
bubulindo Posted March 27, 2012 at 10:12 AM Report #445866 Posted March 27, 2012 at 10:12 AM 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 () { }
afar Posted April 14, 2012 at 04:17 AM Author Report #449115 Posted April 14, 2012 at 04:17 AM 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); } } }
bubulindo Posted April 14, 2012 at 07:15 AM Report #449117 Posted April 14, 2012 at 07:15 AM 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 () { }
afar Posted April 14, 2012 at 02:38 PM Author Report #449165 Posted April 14, 2012 at 02:38 PM Estou usando arduino mega, quero controlar com as letras a variação de velocidade dos motores.
bubulindo Posted April 14, 2012 at 03:55 PM Report #449177 Posted April 14, 2012 at 03:55 PM 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 () { }
afar Posted April 14, 2012 at 04:09 PM Author Report #449181 Posted April 14, 2012 at 04:09 PM 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
bubulindo Posted April 14, 2012 at 11:30 PM Report #449230 Posted April 14, 2012 at 11:30 PM 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 () { }
afar Posted April 15, 2012 at 12:11 PM Author Report #449270 Posted April 15, 2012 at 12:11 PM Vou testar e ver se deu certo, obrigado pela ajuda 😕
afar Posted April 16, 2012 at 03:12 PM Author Report #449431 Posted April 16, 2012 at 03:12 PM 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. }
bubulindo Posted April 16, 2012 at 09:19 PM Report #449475 Posted April 16, 2012 at 09:19 PM Qual if? include <ai se te avio> Mãe () { }
afar Posted April 17, 2012 at 06:24 PM Author Report #449570 Posted April 17, 2012 at 06:24 PM 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?
bubulindo Posted April 17, 2012 at 10:48 PM Report #449626 Posted April 17, 2012 at 10:48 PM Pergunta estúpida... como ligaste os motores ao Arduino? include <ai se te avio> Mãe () { }
afar Posted April 17, 2012 at 10:59 PM Author Report #449627 Posted April 17, 2012 at 10:59 PM 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?
bubulindo Posted April 17, 2012 at 11:14 PM Report #449630 Posted April 17, 2012 at 11:14 PM 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 () { }
afar Posted April 17, 2012 at 11:26 PM Author Report #449638 Posted April 17, 2012 at 11:26 PM São speed control http://www.hobbyking.com/hobbyking/store/__324__182__ESC_UBEC_VR-HobbyKing_ESC.html?gclid=CPmiy5yEva8CFUOb7QodshBdzg
bubulindo Posted April 18, 2012 at 05:02 AM Report #449649 Posted April 18, 2012 at 05:02 AM Já experimentaste com os LEDs? O link não tem um manual... include <ai se te avio> Mãe () { }
afar Posted April 18, 2012 at 01:46 PM Author Report #449686 Posted April 18, 2012 at 01:46 PM 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.
bubulindo Posted April 18, 2012 at 02:21 PM Report #449700 Posted April 18, 2012 at 02:21 PM 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 () { }
afar Posted April 19, 2012 at 01:53 PM Author Report #449978 Posted April 19, 2012 at 01:53 PM 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
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