Indicar ângulos com acelerômetro

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Indicar ângulos com acelerômetro

Mensagempor rosiley » 11 Set 2008 09:22

Bom dia pessoal, sou novo na area de programação e estou precisando fazer um projeto que tenha a finalidade de indicar ângulos no computador via soft e hard, adquiri alguns componentes para o meu projeto: max 232, acelerometro adxl213, pic 16f648, adc 16 bits ads 1110, multiplex cd 4051 e componentes diversos.
O problema está em fazer a lógica para que o meu projeto indique graus negativos e positivos. Já fiz toda a interface gráfica e estou utilizando o c++ builder na programação, caso necessitem posso mandar um screen de como ela vai ficar.
rosiley
Nibble
 
Mensagens: 51
Registrado em: 01 Jul 2008 19:38
Localização: rio das ostras

Re: Indicar ângulos com acelerômetro

Mensagempor Djalma Toledo Rodrigues » 11 Set 2008 09:48

rosiley escreveu:... tenha a finalidade de indicar ângulos ...adquiri alguns componentes para o meu projeto: ... acelerometro adxl213, pic 16f648, adc 16 bits ads 1110, multiplex cd 4051 e componentes diversos..


Vem cá Acelerômetro, para indicar ângulo ?
Multiplex CD4051 ?
Dá para confirmar se é isso mesmo.
Mande mais detalhes de seu projeto. O que é, como funciona, para que serve.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor rosiley » 11 Set 2008 10:17

Como voce deve saber, o acelerômetro informa em tensão nos seus eixos X , Y e Z, estas informações passaram pelo multiplex e serão selecionadas pelo pic que deverá informar para o cumputador via serial 232 ou 485, o acelerômetro que estou utilizando para teste informa no eixo X +/- 4. 033mv na posição de repouso e no eixo Y +/- 2.500mv.
Que ao ser variado de posição muda os seus valores. Não sei se conseguir esplicar direito. Caso necessite posso enviar um screen da tela.
rosiley
Nibble
 
Mensagens: 51
Registrado em: 01 Jul 2008 19:38
Localização: rio das ostras

Mensagempor joao » 11 Set 2008 10:33

vc está tentando fazer exatamente o que com o potenciometro?
Pegar ele na mão e fazer um angulo no ar?
Ou girar ele como se fosse um acelerometro no celular?

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor rosiley » 11 Set 2008 11:04

Dá uma olhada neste link que voce vai entender melhor o que eu quero.

http://www.ppgia.pucpr.br/~santin/ee/20 ... ducao.html

Amigo João, não é um potenciómetro e sim acelerômetro, vou postar aqui um código utilizado no basic stamp que pode servir como base para o meu projeto..

Obs.: é só como referência

Código: Selecionar todos
' =========================================================================
'
' {$STAMP BS2}
' {$PBASIC 2.5}
'
' =========================================================================


' -----[ Program Description ]---------------------------------------------
'
' Test program for the H48C 3-Axis Accelerometer module.
'
' Connections:
'
' +------------+
' | * |
' CLK | o o | Vdd (+5v)
' | +--+ |
' DIO [ o | | o | CS\
' | +--+ |
' Vss | o o | 0G (free-fall indication)
' | |
' +------------+
'
' How it Works:
'
' An onboard MCP3204 12-bit ADC is used to read the VRef, X-, Y-, and
' Z-axis outputs from the Hitachi H48C accelerometer. The reference
' voltage output from H48C is 1.65 volts (3.3 / 2).
'
' After reading the reference voltage and an output channel the g-force
' for the channel is calculated with this formula:
'
' axis - vref 3.3
' G = ----------- x ------
' 4095 0.3663
'
' For use in the program the forumla can be simplified to:
'
' G = (axis - vref) x 0.0022
'
' To allow the display of fractional g-force in the integer system of the
' BASIC Stamp we multiply 0.0022 by 100 -- this will allow us to display
' g-force in 0.01g units.


' -----[ Revision History ]------------------------------------------------


' -----[ I/O Definitions ]-------------------------------------------------

Dio PIN 15 ' data to/from module
Clk PIN 14 ' clock output
CS PIN 13 ' active-low chip select


' -----[ Constants ]-------------------------------------------------------

XAxis CON 0 ' adc channels
YAxis CON 1
ZAxis CON 2
VRef CON 3

Cnt2Mv CON $CE4C ' counts to millivolts
' 0.80586 with **
GfCnv CON $3852 ' g-force conversion
' 0.22 with **
GgCnv CON $0000 ' g-grau conversion
' 0.163339 with **
' -----[ Variables ]-------------------------------------------------------

axis VAR Nib ' axis selection
rvCount VAR Word ' ref voltage adc counts
axCount VAR Word ' axis voltage adc counts
mVolts VAR Word ' millivolts
gForce VAR Word ' axis g-force
gCount VAR Word ' graus

dValue VAR Word ' display value
dPad VAR Nib ' display pad
dGrau VAR Word ' display grau

' -----[ EEPROM Data ]-----------------------------------------------------


' -----[ Initialization ]--------------------------------------------------

Reset:
HIGH CS ' deselect module
DEBUG CLS, ' paint display
"================================", CR,
" H48C 3-Axis Accelerometer ", CR,
"================================", CR,
CR,
" Count Volts G Graus", CR,
" ----- ----- ----- -----", CR,
"VRef ", CR,
" X ", CR,
" Y ", CR,
" Z ", CR,
"Grau "

' -----[ Program Code ]----------------------------------------------------

Main:
FOR axis = XAxis TO ZAxis ' loop through each axis
GOSUB Get_H48C ' read vRef & axis counts

dValue = rvCount ' display vRef count
DEBUG CRSRXY, 6, 6
GOSUB RJ_Print

dValue = axCount ' display axis count
DEBUG CRSRXY, 6, (7 + axis)
GOSUB RJ_Print

dValue = gCount ' display grau count
DEBUG CRSRXY, 6, 10
GOSUB RJ_Print

mVolts = rvCount ** Cnt2Mv ' convert vref to mv
DEBUG CRSRXY, 13, 6, ' display
DEC (mVolts / 1000), ".",
DEC3 mVolts

mVolts = axCount ** Cnt2Mv ' convert axis to mv
DEBUG CRSRXY, 13, (7 + axis),
DEC (mVolts / 1000), ".",
DEC3 mVolts

mVolts = gCount ** Cnt2Mv ' convert mv to grau
DEBUG CRSRXY, 13, 10, ' display
DEC (mVolts / 1000), ".",
DEC3 mVolts

' calculate g-force
' -- "gForce" is signed word

IF (axCount >= rvCount) THEN
gForce = (axCount - rvCount) ** GfCnv ' positive g-force
ELSE
gForce = -((rvCount - axCount) ** GfCnv) ' negative g-force
ENDIF
DEBUG CRSRXY, 20, (7 + axis), ' display g-force
" " + (gForce.BIT15 * 13),
DEC1 (ABS(gForce) / 100), ".",
DEC2 ABS(gForce)

' calculate g-Grau
' -- "gGrau" is signed word

IF (gCount >= rvCount) THEN
dGrau = (gCount - rvCount) ** GgCnv ' positive g-grau
ELSE
dGrau = -((rvCount - gCount) ** GgCnv) ' negative g-grau
ENDIF
DEBUG CRSRXY, 27, (10), ' display g-grau
" " + (dGrau.BIT15 * 13),
DEC1 (ABS(dGrau) / 100), ".",
DEC2 ABS(dGrau)

NEXT
PAUSE 200
GOTO Main


' -----[ Subroutines ]-----------------------------------------------------

' Reads VRef and selected H48C axis through an MCP3204 ADC
' -- pass axis (0 - 2) in "axis"
' -- returns reference voltage counts in "rvCount"
' -- returns axis voltage counts in "axCounts"

Get_H48C:
LOW CS
SHIFTOUT Dio, Clk, MSBFIRST, [%11\2, VRef\3] ' select vref register
SHIFTIN Dio, Clk, MSBPOST, [rvCount\13] ' read ref voltage counts
HIGH CS
PAUSE 1
LOW CS
SHIFTOUT Dio, Clk, MSBFIRST, [%11\2, axis\3] ' select axis
SHIFTIN Dio, Clk, MSBPOST, [axCount\13] ' read axis voltage counts
HIGH CS
RETURN

' -------------------------------------------------------------------------

' Right-justify value in 5-digit field
' -- move cursor first, then call with value in "dValue"

RJ_Print:
LOOKDOWN dValue, >=[10000, 1000, 100, 10, 0], dPad
DEBUG REP " "\dPad, DEC dValue
RETURN
rosiley
Nibble
 
Mensagens: 51
Registrado em: 01 Jul 2008 19:38
Localização: rio das ostras

Mensagempor renatokodaira » 11 Set 2008 11:06

Voce vai precisar colocar uma tabela de valores trigonometricos e angulos correspondentes no seu programa (se o seu compilador nao tiver funçoes trigonometricas) e calcular o angulo em relaçao a vertical.
Por exemplo, se o acelerometro estiver inclinado 90 graus na vertical, a saida Z vai indicar uma tensao equivalente a tensao para 1G x seno 90º. Se estiver inclinado 45º, a tensao no eixo Z vai ser multiplicada por seno de 45º (0,707). Basta voce achar o arcoseno do valor de tensao medido/valor tensao 1G para descobrir o angulo (por isso eh melhor ter uma tabela de busca). Nos outros eixos o processo é o mesmo, desde que haja inclinaçao em relaçao ao eixo vertical (Z). Se os eixos X e Y estiverem na horizontal, nao vao medir nada (se o meidor estiver estatico e sem aceleraçao).
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor rosiley » 11 Set 2008 11:19

Ok Renato, mais se ao inves eu ter estes valores trigonométricos e utilizar uma tensão de referência para que os eixos lidos pelo multiplex e inseridos no adc informem os graus correspondentes, como no exemplo:

Se ângulo x for maior ou igual a referência ele indicaria de 0º a 90º positivo e se ângulo x for menor ou igual a referência ele indicaria de -0º a -90º negativo e assim pros outros eixos.

Como nessa fórmula exemplo:

G = (axis - vref) x 0.0022

calculate g-force
' -- "gForce" is signed word

IF (axCount >= rvCount) THEN
gForce = (axCount - rvCount) ** GfCnv ' positive g-force
ELSE
gForce = -((rvCount - axCount) ** GfCnv) ' negative g-force
ENDIF
DEBUG CRSRXY, 20, (7 + axis), ' display g-force
" " + (gForce.BIT15 * 13),
DEC1 (ABS(gForce) / 100), ".",
DEC2 ABS(gForce)
rosiley
Nibble
 
Mensagens: 51
Registrado em: 01 Jul 2008 19:38
Localização: rio das ostras

Mensagempor renatokodaira » 11 Set 2008 15:10

Pelo que eu tô vendo na pagina do fabricante do ADXL213, voce nao vai poder usar esse codigo.

Primeiro porque o ADXL213 tem saida PWM, onde o valor de aceleraçao eh convertido em largura de pulso (30% a cada 1G) e nao em tensao a ser medida pelo ADC do microcontrolador. Ou seja se ele estiver na horizontal e nao sofrer nenhuma aceleraçao, as saidas serao sinais de 1kHz com 50% de duty cycle. Se voce inclinar o sensor e alinhar um dos eixos extamente na vertical, o sensor sofrerah aceleraçao da gravidade (1G = 9,81m/s2) e a saida do eixo deverah ser de 1kHz @ 20% (-90º) ou 80% (90º) de DC. Qualquer outra posiçao, o valor deverah ser calculado por trigonometria.

Depois o ADXL tem somente dois eixos e nao tres como o codigo foi escrito. Se voce for usar um desses, nao precisa do multiplexador analogico. Basta usar um PIC com conversor AD com mais de 3 canais (quase todos tem mais de 3 canais). Cada saida de eixo voce liga em um canal diferente. Para ler saidas PWM do ADXL213, voce precisa de PICs com modulos CCP (e usar o capture para medir a largura do pulso do sinal de 1kHz).

Nao estou entendendo o seu raciocionio, voce quer medir apenas o quadrante do angulo ou quer medir o angulo ? Nao eh possivel estabelecer uma relaçao linear do Duty Cycle (no caso do ADXL213) ou tensao (de um ADXL330) com os angulos, porque a relaçao trigonometrica nao é linear (lembra das aulas de trigonometria ?).

Esse codigo deve ter sido escrito para um sensor como o ADXL330 que tem 3 eixos e mede de -3G a +3G. Ele eh o sensor de posicionamento do Wiimote (o controle do videogame). Se voce usar um sensor desses, nao precisa usar o multiplexador analogico porque o PIC com conversor AD tem mais de 3 canais, basta ligar cada saida de eixo a um dos canais do conversor. No caso do ADXL213 para ler as saidas PWM voce precisa de modulo CCP (no caso o capture para medir a largura do pulso do sinal de 1kHz).
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor rosiley » 11 Set 2008 15:28

O código acima é só um exemplo, não que eu venha a utiliza-lo, o adxl 213 realmente só fornece dois eixos e fornece em PWM e analógico desde que voce ligue nas saidas Cy filt e Cx filt, pois esta fornece tensão com variação no seu valor, onde será utilizado um ADC. O valor foi medido com um multimetro e verificado com osciloscópio.
O projeto em si é para medir ângulos com inclinação de 0 a 90 graus tanto positivo como negativo, a ideia é a mesma do site que eu indiquei só que a informação deve ser enviada para a Cpu a uma distância de 1000 metros e já convertida, para que o usuário tenha a visualização em numeral. Eu não sei se é possivel colocar um screen aqui, se for colocarei e ficará mais fácil de entender.
rosiley
Nibble
 
Mensagens: 51
Registrado em: 01 Jul 2008 19:38
Localização: rio das ostras

Mensagempor Djalma Toledo Rodrigues » 11 Set 2008 21:29

rosiley escreveu:O projeto em si é para medir ângulos com inclinação de 0 a 90 graus tanto positivo como negativo.


É um Incrinómetro então ? Não seria mais simples e preciso usar um RESOLVER. com um pêndulo no eixo ?
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor rosiley » 11 Set 2008 21:49

Seria sim, se o mesmo não sofrese ação da agua salgada, pois eu teria que fazer um housing de acetal ou inox para proteger todo o circuito, e usando um aceleròmetro com todo o circuito resinado e com apenas um penetrador para conexão de alimentação e transmissão de dados.
Existe no mercado um nivel eletrônico da 3M ou como este do link abaixo.

http://www.importecnica.com.br/niveis.html
rosiley
Nibble
 
Mensagens: 51
Registrado em: 01 Jul 2008 19:38
Localização: rio das ostras

Mensagempor msamsoniuk » 11 Set 2008 22:08

Djalma Toledo Rodrigues escreveu:
rosiley escreveu:O projeto em si é para medir ângulos com inclinação de 0 a 90 graus tanto positivo como negativo.


É um Incrinómetro então ? Não seria mais simples e preciso usar um RESOLVER. com um pêndulo no eixo ?


nao eh *exatamente* a mesma coisa ? tanto o pendulo quanto o acelerometro estao sujeitos a acao da gravidade e ambos indicam a direcao do chao... o acelerometro tem a vantagem de ser compacto e do mecanismo estar lacrado dentro de um chip.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor lucaszampar » 11 Set 2008 23:26

Bom... vamos por partes...
Fiz um projeto igual ao que está querendo fazer, e seguem algumas considerações.

É possível sim, fazer um inclinometro com um acelerometro... porém....
1) A saída de um acelerometro é a decomposicao da aceleracao G. Apenas quando o equipamento está estático. Logo, a sua saída em tensão será:

G*Seno(alpha).
Esse alpha sim é o angulo que você quer medir.
G*Seno é a saída do seu acelerometro.

2) Repare que devido à questão anterior, o inclinometro medirá muito bem angulo próximos à zero, porém perderá razoalvelmente a resolução conforme o angulo for ficando próximo à +90º e -90º.
Isso se deve ao fato que para uma pequena variação do valor de seno, há uma grande variacao no angulo.


2) Forma de saída do acelerometro: Como o pessoal e você comentou, esse ADXL que está usando possuí uma saída digital, mas colocando um filtro passa baixa, se transforma em analógica.
No meu caso, utilizei a opção analógica e passei por uma etapa com Amp. operacional....

3) Como estamos tratando de um acelerometro, e supondo saídas analógicas, é necessário realizar uma calibração no equipamento. A rotina de calibração que fiz foi fazer com que o usuário dê 360º no equipamento lentamente. Pego os valores mínimos e máximos e os defino como sendo -90º e +90º. O ponto central desses valores (Média) será o meu 0º....

Acho que é só...

qualquer coisa, posta aí....
Avatar do usuário
lucaszampar
Byte
 
Mensagens: 105
Registrado em: 11 Out 2006 22:30
Localização: Limeira - SP

Mensagempor msamsoniuk » 12 Set 2008 01:21

se vc usar um acelerometro de dois eixos, vc pode medir simultaneamente g*sen e g*cos, assim quando um perde precisao em funcao da rotacao, o outro vai estar ganhando precisao. e talvez eu esteja enganado, mas creio que os acelerometros da freescale tem saida analogica e jah vem corretamente calibrados (ou tem uma memoria para offset de calibracao, algo do genero, nao lembro).

lucaszampar escreveu:Bom... vamos por partes...
Fiz um projeto igual ao que está querendo fazer, e seguem algumas considerações.

É possível sim, fazer um inclinometro com um acelerometro... porém....
1) A saída de um acelerometro é a decomposicao da aceleracao G. Apenas quando o equipamento está estático. Logo, a sua saída em tensão será:

G*Seno(alpha).
Esse alpha sim é o angulo que você quer medir.
G*Seno é a saída do seu acelerometro.

2) Repare que devido à questão anterior, o inclinometro medirá muito bem angulo próximos à zero, porém perderá razoalvelmente a resolução conforme o angulo for ficando próximo à +90º e -90º.
Isso se deve ao fato que para uma pequena variação do valor de seno, há uma grande variacao no angulo.


2) Forma de saída do acelerometro: Como o pessoal e você comentou, esse ADXL que está usando possuí uma saída digital, mas colocando um filtro passa baixa, se transforma em analógica.
No meu caso, utilizei a opção analógica e passei por uma etapa com Amp. operacional....

3) Como estamos tratando de um acelerometro, e supondo saídas analógicas, é necessário realizar uma calibração no equipamento. A rotina de calibração que fiz foi fazer com que o usuário dê 360º no equipamento lentamente. Pego os valores mínimos e máximos e os defino como sendo -90º e +90º. O ponto central desses valores (Média) será o meu 0º....

Acho que é só...

qualquer coisa, posta aí....
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor MOR_AL » 12 Set 2008 08:07

Olá Rosiley. Tudo bem?

Já que você deseja observar o ângulo no PC, você pode "fugir" dos cálculos no microcontrolador. Basta fazê-los no próprio PC por meio de um software qualquer.
1 - O PIC converterá o valor analógico ou delta em byte(s).
2 - O PIC conversará com o PC via serial, por exemplo, e transferirá os bytes para o PC.
3 - Este poderá criar um arquivo com todas as leituras obtidas.
4 - O PC tratará estas leituras.
a) Lerá os valores.
b) Calculará os ângulos.
c) Verificará qual seria a equação a ser usada para obter uma melhor precisão na medida, fugindo de dV/d(teta) --> 0.

Se você não precisar do valor numérico do ângulo e sim desejar apenas a visualização na tela do PC, basta compor o ângulo por meio das suas projeções x e y.

Agora outro detalhe. Como é caro este bichinho!!! R$81,36 na Farnell, e ainda tem que aguardar a importação.
MOR_AL
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Próximo

Voltar para PIC

Quem está online

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

cron

x