Mesa estabilizada

gostaria de iniciar um projeto de uma “mesa” controlada nos dois eixos por servos, de maneira que se eu inclinar a base da “mesa” ela se estabilize. sei que deve usar acelerometro, mas não sei por onde começar a programação.

Primeira coisa é esquecer o acelerômetro e trocar por um giroscópio. O acelerômetro pode até ser usado como um backup, mas o giroscópio é o cara que dará respostas mais rápidas. Eu gosto de usar TDD (http://pt.wikipedia.org/wiki/Test_Driven_Development) quando estou desenvolvendo um projeto, deveria fazer o mesmo. O primeiro teste é ver se você consegue conectar o movimento do giroscópio a rotação do servo.
Mais no final do projeto, você vai querer deixar os movimentos mais suaves, aí te aconselho a colocar um Filtro de Kalman (http://pt.wikipedia.org/wiki/Filtro_de_Kalman).

achei esse video


mais ou menos isso

o filtro de kalman que sugeriu sabe como implemento ele em C?

pessoal olha o que encontrei:

1 curtida

Boa tarde Daniel. Estou tentando usar acelerômetros com arduino, mas sem sucesso. Primeiro usei o adxl345, depois o adxl335. Tudo qu consegui foram uns números sem sentido que quase sempre não mudavam quando eu inclinava o acelerômetro, e quando mudavam, não faziam muito sentido. Será que o giroscópio é mais simples?

Mostra um pouco do seu projeto, código, esquema essas coisas e vamos ver do que se tratam estes números que você não soube interpretar.

Ola Sksdutra. Obrigado por responder. Essa tela mostra o código e o monitor com os números que recebo do arduino. Ele deveria mostrar a aceleração da gravidade nos 3 eixos do acelerômetro, mas esse números mudam sem eu sequer mexer nele.

Olá @Lucena, eu estou no trabalho e não tenho como fazer maiores pesquisas ou considerações, mas se alguém não aparecer eu irei dar uma olhadinha no problema, apesar de não ter os acelerômetros comigo, aliás, se tiver como postar o esquema das ligações, ficaria melhor para efeito de comparação com o código, pode ser uma foto ou uma imagem do Fritzing.

Olá Sksdutra. Veja esse desenho e código que achei no site da Sparkfun, fabricante do acelerômetro. É bem simples, mas não funciona, os valores ficam mudando mesmo com o acelerômetro parado.

int x, y, z;

void setup()
{
  Serial.begin(9600);      // sets the serial port to 9600
}

void loop()
{
  x = analogRead(0);       // read analog input pin 0
  y = analogRead(1);       // read analog input pin 1
  z = analogRead(2);       // read analog input pin 1
  Serial.print("accelerations are x, y, z: ");
  Serial.print(x, DEC);    // print the acceleration in the X axis
  Serial.print(" ");       // prints a space between the numbers
  Serial.print(y, DEC);    // print the acceleration in the Y axis
  Serial.print(" ");       // prints a space between the numbers
  Serial.println(z, DEC);  // print the acceleration in the Z axis
  delay(100);              // wait 100ms for next reading
}

Você está usando o Arduino UNO?

Sim, estou usando arduino Uno.

Será que não seria esse o problema? O UNO tem voltagem operacional de 5V, na imagem que você postou está afirmando que o dispositivo deve ser ligado com 3.3V e que usar 5V pode causar dano permanente ao aparelho.

É mas o Arduino também tem voltagem de saída de 3,3 Volts. Veja na imagem o segundo pino da esquerda pra direito em baixo. Acho que o problema não é esse.

Beleza @Lucena, é que eu não tenho esses sensores aqui, então vou colocando as sugestões mais simples para as mais complexas até chegarmos na causa do problema. Vamos à próxima tentativa…

O referencial analógico das placas Arduinos é sempre setado para DEFAULT, e este padrão varia conforme a placa, como você está usando uma UNO, esse referencial analógico é de 5V. O código da Sparkfun deve dar certo porque eles estão usando uma Wiring de 3.3V e essa é a referência analógica DEFAULT para ela.

Então vamos tentar mudar um pouco o código, adicionando o referencial analógico correto para o 3.3V conforme a documentação do Arduino.

Como a maioria dos referenciais só funciona no Arduino Mega (segundo o documento), vamos tentar usar o EXTERNAL.

Além de conectar o pino 3.3V no Vin do sensor, conecte-o também no pino AREF (Analog Reference), e adicione ao código na seção “Setup” a seguinte linha:

analogReference(EXTERNAL);

Esse código vai fazer com que o Arduino modifique o referencial analógico dele para o que for aplicado no pino AREF (entre 0 e 5V), como você está aplicando os 3.3V do pino 3.3V, ele fará com que a referência analógica seja 3.3V ao invés do padrão que é 5V. Vamos ver no que dá…