Simulador de Aceleração ?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Simulador de Aceleração ?

Mensagempor egb » 30 Mar 2007 12:39

Ola pessoal,

Tive uma ideia para um projeto, mas vou empacar na matematica...
ai queria ver se alguem ja manja do assunto.

queria fazer um controle de velocidade (macio e sem trancos) para um motor dc de um carro controle remoto( brinquedo srsrs).

O que eu queria fazer era adaptar um joystik analogico de video game, e desenvolver um algoritimo que simulasse a aceleracao e desaceleracao do motor dc. Imaginando o carro parado, quando o usuario acelerasse ao maximo, deveria acontecer um arranque inicial e depois tenderia a estabilizar. Da mesma forma quando na frenagem, deveria reduzir a velocidade mais de pressa. E por fim quando "tirasse o pé", deveria reduzir mais lentamente (simular o embalo).

Esse tipo de matematica deve ser a mesma usada pra desenvolver um simulador ou jogo de carro de um video game qualquer. Problema é que não sou tão bom em matematica como gostaria.

pretendo usar o 16f877. acho que usaria o ADC interno, fazeria os calculos e jogava pro PWM. (ou não...?)
digam tambem o que vcs acham da ideia.

Se alguem tiver interesse em ajudar, agradeço.
E no fim daqui algum tempo publico o projeto aqui.

Ate+
egb
Bit
 
Mensagens: 12
Registrado em: 27 Mar 2007 15:05

Mensagempor MOR_AL » 30 Mar 2007 16:41

Caro egb!

Isso está me parecendo uma função exponencial.
Vamos por partes:

1 - Partindo de uma velocidade inicial (Vi) e chegando em uma velocidade final (VF) em função do tempo.


v(t) = Vi (+/-) Vacr *(1 - e ^(- t / tal)).

Lê-se: Velocidade em função do tempo (v(t)) é igual à velocidade inicial (Vi), somado ou subtraído (vai depender se a velocidade aumenta ou diminui) do acréscimo de velocidade desejada (Vacr), multiplicada por; 1 menos exponencial (e), elevada ao tempo, com sinal trocado, dividido por tal.

2 - Repare que: v(t = infinito) = Vi (+/-) Vacr = VF (velocidade final). O seu "infinito pode ser, por exemplo, t = 3 * tal, o que equivale a velocidade ter alcançado 95% do seu valor final.

3 - Esta equação serve para todas as situações:

3.1 - Acelerando de um valor inicial (exemplo 20km/h) para um valor final (exemplo 100km/h). Vi = 20km/h, Vacr = 80km/h. O sinal da opção é +.

3.2 - Acelerando de zero a 100km/h. Vi = 0km/h, Vacr = 100km/h e o sinal da opção é positivo (+).

3.3 - Reduzindo a velocidade (exemplo) de 100km/h para 40km/h. Vi = 100km/h, Vacr = 60km/h e o sinal da opção é negativo (-).

3.4 - Parando de 80km/h. Vi = 80km/h, Vacr = 80km/h e o sinal da opção é negativo (-).

4 - A rapidez com que a velocidade varia vai depender do valor de "tal". Sendo assim, você pode simular desde uma variação bem lenta, como de uma lesma (tal grande em relação ao tempo de variação), até uma aceleração de um foguete ou uma batida em um muro (tal pequeno em relação ao tempo da variação).
Valores pequenos de tal. tal = tempo da variação / 10.
Valores grandes de tal. tal = tempo da variação * 10.


5 - Repare também, que você pode "fugir da exponencial"
5.1 - Pode calculá-la "na mão" e fazer uma tabela no PIC.
5.2 - Pode aproximá-la por duas, tres ou quatro retas e substituir a equação exponencial por duas, tres ou quatro equações de retas.


Acho que é isso aí.

MOR_AL
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor egb » 30 Mar 2007 18:38

Caro amigo MOR_AL,

Obrigado pela explicação. Terei que reler varias vezes até ter segurança do assunto, mas percebi que vc explica muito bem!!! obrigado.

Imagino que na minha aplicação o valor de Vacr seria o valor do ADC, Vi uma variavel interna representando a velocidade atual, e tal seria uma relação entre a velocidade atual e o novo valor de Vacr (ADC). Diferenca grande = tal pequeno, diferenca pequena = tal grande.

Logico que o valor do ADC seria trabalhado, inclusive pra determinar o sinal da equacao...

Essas suposições conferem???
se sim:
que tipo de calculo poderia usar pra determinar o valor de tal?

Só pra garantir: imagine vc com o pé até embaixo no acelerador e o carro em ponto morto, ai vc engata a primeira!!!
essa equação cobre essa situação tambem???

vc citou algumas coisas no item 5.
mas não entendi muito bem...qual de todas as maneiras é a mais eficiente pro pic?? a parte das retas nem imagino o que é.

Obrigado.
egb
Bit
 
Mensagens: 12
Registrado em: 27 Mar 2007 15:05

Mensagempor MOR_AL » 30 Mar 2007 23:01

Vamos lá egb!
1 - Nessa sua corrida, você deve imaginar que seu carro atinja até 250km/h (exemplo). Sendo assim, o valor máximo da velocidade Vi mais o valor da velocidade Vacr seriam 250km/h. Logo parta da velocidade máxima (Vmáx). Aliás, um ótimo valor seria 255km/h. Aí sua variável velocidade (em função do tempo), seria composta por apenas um byte. Outra opção seria um múltiplo inteiro (2*255 = 510km/h). Sua variável também seria composta por um byte, porém assumindo valores pares (0, 2, 4, ..., 510).

2 - Vi é o valor da velocidade que o carro se encontra no momento em que você deseja fazer alguma alteração. Verifique nos ítens 3.1, 3.2, 3.3 e 3.4.
3 - Vacr é a velocidade que você quer acrescentar para alcançar v(t), após algum tempo. Novamente. Vi + Vacr <= Vmáx. Imagine que seu aceleradopr seja um potenciômetro ligado entre +5V e terra, com o pino central podendo fornecer de 0 a +5V. Se você acelerar pouco, por exemplo, a tensão do pino central sendo igual a 1,5V, terá que corresponder a um Vacr pequeno. Cada tensão do potenciômetro corresponderá a uma posição no acelerador. Se o acelerador estiver em uma posição que corresponde à velocidade Vi, significa que você está em velocidade constante, o que corresponde a Vacr = 0km/h.
A tensão do potenciômetro do acelerador é que deve ser convertida (CA/D). Seu valor deve ser comparado com Vi atual e aí sim obter Vacr.
4 - O "tal" é uma variável que vai te fornecer a "rapidez" com que a velocidade vai ser alterada. Ela vai depender de Vacr, da potência do motor de seu carro e de Vi.
Imagine que seu carro é um 1000cc. É pouca potência. Então Vmáx vale 145km/h (exemplo). Se você está em baixa velocidade, o ar cria pouca resistência ao avanço do carro, pizando fundo, a velocidade deve aumentar mais rapidamente. Considere neste caso um tal aproximadamente igual a 0,3 (exemplo). Isso fará com que a velocidade v(t), aumente rapidamente até o valor final de Vi + Vacr. Na realidade o valor de tal não é constante, ele varia com a velocidade do carro.
5 - Quanto a substituir a exponencial por uma reta, é o seguinte:
Pegue uma calculadora científica comum. Estipule valores fixos de Vi, Vacr e tal. Calcule v(t). Faça t = 0, ..., 10s (50 valores por exemplo). Faça um gráfico no computador (Excell por exemplo). Tente colocar pedaços de linhas retas que quase coincidam com a curva calculada. Após tê-lo feito, você pode substituir a equação exponencial por um grupo de retas. Você sai de cálculo exponencial dentro do PIC para soma e multiplicação. A equação da reta é v(t) = a * t + Vi. Vacr sai desta equação e o tempo também.
6 - Você pode substituir toda esta trabalheira por uma tabela apenas. A entrada na tabela será em função dos valores de Vi, Vacr e tempo de aceleração (ou frenagem).
7 - Você terá que ter outro potenciômetro para simular o freio. Ele deve possuir as mesmas regras que o acelerador.

Existem inúmeras maneiras de se fazer isso, eu apresentei apenas algumas. Acredito que quanto mais a gente conversa, vão aparecendo mais detalhes. Aí é que a coisa pega. Os detalhes provocam alterações nas suposições iniciais. Você refaz e aos poucos vai se aproximando do que realmente deseja. O refinamento apenas depende de você.

MOR_AL
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor egb » 05 Abr 2007 11:20

Desculpe a demora em responder,
Agora sim tow vendo luz nessa estoria :idea:

eu tava tentando escrever uma expecie de pseudo logica/codigo, mas vou ter que ver com mais calma antes de postar, pra evitar escrever "muita" bobagem. ("pouca" bobagem tudo bem srsrsr)

Pretendo usar apenas um potenciometro para acelerar e freiar entao
Vou criar uma variavel para a conversao A/D: Vadc
apos alguma logica essa variavel vai possuir valores positivos ou negativos que representarao aceleracao ou frenagem respectivamente.


Será que estou certo na forma de verificar as situacoes possiveis:

1 - em caso de aceleracao: Vadc > Vi e Vadc é positivo

2 - em caso de desaceleracao(nao frenagem): Vadc < Vi mas ainda positivo

3 - mantendo a velocidade: Vadc = Vi

4 - frenagem: Vadc < Vi e Vadc é negativo

Será que vai ter problema na hora de decidir se é frenagem ou Ré?
e da mesma forma se é aceleracao ou frenagem da ré?

fiquei impreciso nessas questoes mas vou ter ver no fim de semana.
Vou aproveitar e tentar girar um motor!!!

Ate+
egb
Bit
 
Mensagens: 12
Registrado em: 27 Mar 2007 15:05

Mensagempor msamsoniuk » 05 Abr 2007 22:55

o truque por tras de tudo eh forca e a massa. em um foguete, que eh um exemplo mais compreensivel para estudar isso, tudo comeca com um sistema de forcas:

F = thrust - m*g

onde m*g eh a massa do foguete vezes a aceleracao da gravidade e o thrust eh justamente a forca gerada pelo motor do foguete. assim, para um foguete que pesa 100kg, vc precisa de um thrust maior que 1000N para que ele consiga sair do chao (a forca gerada pelo motor sera entao maior que a forca que o prende ao chao). no caso de um foguete real, vc poderia coletar F diretamente atraves de um acelerometro: ele jah mede a forca resultante da conta acima.

obviamente quando pensamos em um sistema embarcado ou simulacao, nosso sistema deve ser dinamico, entao tem que calcular as coisas conforme elas vao ocorrendo. nesse caso, teriamos um timer periodico que permite calcular periodicamente as grandezas que descrevem a situacao atual do nosso foguete ou sua simulacao:

a = F/m
v = v + a*dt
h = h + v*dt

onde dt eh simplesmente o intervalo de tempo entre os recalculos periodicos. conforme o tempo vai passando, vc vai recalculando e atualizando os valores de a, v e h. em uma simulacao, vc vai ver o foguete ganhando velocidade e altitude.

uma coisa q chama a atencao eh que h = h + v*dt eh uma eq de reta, portanto nao descreve um movimento acelerado. porem, para intervalos dt suficientemente pequenos, vc vai ter uma sucessao de pequenas retas que se adaptam perfeitamente a curva real produzida pelo movimento acelerado do foguete. valores de dt entre 1/10 e 1/1000 de segundo permitem boas aproximacoes.

em numeros praticos, um foguete de 10 kN e massa de 100kg (supondo g=10m/s²), teria em 1 segundo os seguintes valores de a, v e h:

F = 10000N - 100kg*10m/s² = 9000N
a = 9000N/(100kg*10m/s²) = 9m/s²
v = 9m/s² * 1s = 9 m/s
h = 9m/s * 1s = 9m

no proximo intervalo de 1 segundo teriamos:

F = 10000N - 100kg*10m/s² = 9000N
a = 9000N/(100kg*10m/s²) = 9m/s²
v =9m/s + 9m/s² * 1s = 18 m/s
h = 9m + 18m/s * 1s = 27m

e assim por diante.

bom. comparando a simulacao com o ambiente real, vc vai encontrar uma serie de detalhes interessantes que podem enriquecer seu sistema. comeca com o fato de F nao ser constante. quando vc liga os motores, obviamente, o valor do thrust vai crescer de zero a um valor determinado, mas esse valor pode ser controlado conforme vc controla o combustivel enviado para os motores. outros fatores ambientais e mecanicos podem tambem fazer o thrust variar. conforme o thrust varia, fica claro que a F resultante varia, mas nao apenas isso: conforme o tempo passa, o combustivel eh consumido e a propria massa do sistema varia. alem disso, a medida que a velocidade aumenta, a resistencia do ar entra em jogo, assim, a cada interacao, precisamos calcular um valor dinamico para F, a partir de algo como:

F = thrust(t) - m(t)*g - drag(v)

de modo que, supondo que nosso foguete aumenta o thrust do motor ateh um valor fixo e ali fica ateh acabar o combustivel, ele vai variar com t (tempo absoluto desde o inicio dos calculos) e tambem a massa vai variar com t, pois conforme o combustivel eh queimado, a massa total do sistema diminui. alem disso, adicionamos o arrasto aerodinamico drag() como uma funcao da velocidade: conforme a velocidade aumenta, ela se opoe ao movimento.

obviamente, no recalculo da aceleracao teremos tambem m(t).

o resultado normal disso eh que nosso foguete comeca a ganhar velocidade e, conforme o combustivel vai sendo consumido, ele vai ganhando mais forca resultante em funcao do peso diminuir. ao mesmo tempo, ele vai perdendo forca resultante em funcao do arrasto aerodinamico. depois de determinado tempo, o combustivel acaba e a forca de arrasto aerodinamico e a gravidade acabam gerando uma resultante contraria ao movimento, que forca a desaceleracao, ateh que o foguete chegue a altura maxima e comeca a cair. durante a queda, o arrasto aerodinamico tambem atua, de modo que, a partir de uma certa velocidade, o foguete passa a cair com velocidade constante, apesar da aceleracao da gravidade.

agora, para levar isso para um motor DC a coisa pode complicar. eu jah fiz testes com motores de passo, no caso, o motor de passo acelerava ateh uma boa velocidade, entao precisava mudar de direcao. isso era complicado pq a massa do sistema fazia simplesmente o motor de passo continuar girando alem do ponto onde deveria mudar de direcao. alem disso, o motor nao conseguia vencer a inercia do sistema e simplesmente zumbia sem sair do lugar, pois em alta rotacao ele eh muito fraco e isso obrigava a usar correntes maiores e velocidades muito menores. a solucao para otimizar o sistema foi acelerar continuamente ateh metade do trajeto e entao comecar a desacelerar ateh parar totalmente no ponto final do trajeto, permitindo entao mudar a direcao e voltar a acelerar, tudo de forma suave. obviamente a velocidade maxima do sistema dependia do comprimento do trajeto, de modo q apenas em trajetos suficientemente longos era possivel acelerar a maxima velocidade. nesse caso, calcula-se o tempo em que o motor ficou efetivamente acelerando e usa-se o mesmo tempo para efetuar a frenagem, para que nao passe do ponto correto. alem da precisao, a velocidade maxima aumentou, pq mesmo ficando mais fraco, era possivel acelerar o motor ateh a maxima velocidade em que ele conseguia manter o mecanismo em movimento.

bom, sobre a implementacao interativa, alguem pode argumentar que o problema ali em cima do foguete eh resolvido em qq livro de mecanica classica, o que eh verdade, mas apenas no caso de thrust variar com o tempo. se o sistema eh dinamico e possui um operador capaz de controlar o fluxo de combustivel, o resultado do problema eh imprevisivel e eh aih que entra a solucao interativa: a cada passagem pelo loop de recalculo eh possivel alimentar o sistema com novas informacoes, de modo que a simulacao em software siga as mesmas decisoes aplicadas ao equipamento embarcado. assim, se a simulacao for suficientemente precisa, vc pode usar a propria simulacao no equipamento embarcado para q ele tome decisoes, apoiado em um numero menor de sensores externos: por ex, a partir de um simples acelerometro, vc calcula o resto e estima velocidade e posicao no simulador interno, dispensando sensores extras.

ah sim, a relacao F/m eh essencial: tal como em aeronaves de combate, cuja relacao potencia/peso determina a agilidade da aeronave, a relacao similar F/m determina a aceleracao do sistema: vc nao pode acelerar ou frenar arbitrariamente, tem q respeitar a inercia do sistema. diminuir a massa e aumentar a forca resultante melhoram a agilidade do sistema, mas claro que vc vai visualizar limites no que pode mexer.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x