cinemática inversa - braço robótico com duas liberdades

preciso controlar o braço robotico com duas liberdades e estou tendo as seguintes dificuldades

não tenho certesa de a função acos() é arco cosseno

E preciso ler a tecla digitada no kaypad de modo a fazer calculos com ela e tambem converter para caracteres e printar na tela.

a parte da matriz:
( linha 7)
char keys [linha][coluna] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

eu preciso que la funcione como inteiro (int)

int keys [linha][coluna] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

para poder usar os valores nos calculos:

(linha 18)

int X;
int Y;
int tecla_1x = 0; //recebe o valor do 1° digito do teclado
int tecla_2x = 0;
int tecla_1y = 0;
....

(linha 60)

tecla_1x = keypad.waitForKey (); // função quer busca o valor do teclado, enquanto não for digitado,o programa não avança.
....

nos calculos, acos= arccosseno, apartir da linha 81

programa abaixo....
___________________________________________________________________________________

#include
#include
#include

const byte linha = 4; //4 LINHAS
const byte coluna = 4; //4 COLUNAS
char keys [linha][coluna] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinolinha [linha] = {2, 3, 4, 5};
byte pinocoluna [coluna] = {6, 7, 8, 9};
Keypad keypad = Keypad(makeKeymap(keys), pinolinha, pinocoluna, linha, coluna);

int X;
int Y;
int tecla_1x = 0;
int tecla_2x = 0;
int tecla_1y = 0;
int angulo_A = 0;
int angulo_B = 0;
int angulo_A1 = 0;
int angulo_B1 = 0;
int angulo_B2 = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo servo1;
Servo servo2;

void setup()
{
lcd.begin(16, 2);
Serial.begin(9600);
pinMode (A0, OUTPUT);
pinMode (A1, OUTPUT);
pinMode (A2, OUTPUT);
pinMode (A3, OUTPUT);
pinMode (A4, OUTPUT);
pinMode (A5, OUTPUT);
lcd.clear();
servo1.attach(10);
servo2.attach(11);
}

void loop()
{
servo2.write(90);
servo1.write(90);
lcd.clear();
lcd.setCursor(0, 0);
Serial.println("X1");
lcd.print("Posição em X");
lcd.setCursor(0, 1);
tecla_1x = keypad.waitForKey ();
Serial.println(tecla_1x);
lcd.print(tecla_1x);
lcd.setCursor(1, 1);
Serial.println("X2");
tecla_2x = keypad.waitForKey ();
Serial.println(tecla_2x);
lcd.print(tecla_2x);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
Serial.println("Y");
lcd.print("Posição em Y");
lcd.setCursor(0, 1);
tecla_1y = keypad.waitForKey ();
Serial.println(tecla_1y);
lcd.print(tecla_1y);
delay(2000);
X = 10*tecla_1x + tecla_2x;
Y = tecla_1y;
if (X, Y <= 16, 8) { if (X <= 8) { Serial.println("X<=8"); angulo_A1 = (acos (((X^2)+(Y^2)-128)/-128)); angulo_A = 90 + angulo_A1; angulo_B1 = acos (((Y^2)-(X^2)-((X^2)+(Y^2)))/((-2)*X*(((X^2)+(Y^2))^(1/2)))); angulo_B2 = (180-angulo_A1)/2; angulo_B = angulo_B1 + angulo_B2; servo1.write(angulo_A); servo2.write(angulo_B); } else { Serial.println("X>8"); angulo_A1 = (acos (((X^2)+(Y^2)-128)/-128)); angulo_A = 90 - angulo_A1; angulo_B1 = acos (((Y^2)-(X^2)-((X^2)+(Y^2)))/((-2)*X*(((X^2)+(Y^2))^(1/2)))); angulo_B2 = (180-angulo_A1)/2; angulo_B = 180 - (angulo_B1 + angulo_B2); servo1.write(angulo_A); servo2.write(angulo_B); } } else lcd.print("fora de escala"); }

Exibições: 1156

Responder esta

Respostas a este tópico

acos() é realmente arco-cosseno. Não entendi a sua dúvida.

Realmente ta meio confuso o seu problema. Quanto a função acos() ela faz parte da biblioteca Math:

http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html#ga...

Deu o include?

os números digitado em um keyped 4x4 são impressos na tela de uma LCD 16X2 e a partir da linha 88 do programa utiliza os mesmos numeros para executar cálculos para modificar a posição de um servo motor atravez da função servo.write("variavel_com_o_valor_dos_cáculos").

eu queria uma idéia para ler o keyped de forma que com o "valor" eu possa executar os cálculos e com o "caracter" imprimir na tela LCD.

entre as linhas 5 e 16 são anexado parâmetros ao keypad e nas linhas 20,21 e 22 são declaradas as variáveis que conterão esses valores.

se os parâmetros e as variaveis forem declaradas como char (caractere) eu consigo imprimir mas não consigo fazer os cálculos.

se os parâmetros e as variáveis form declaradas como int o keypad fica louco.

ANEXEI O PROGRAMA DO ARDUÍNO.

Anexos

Bem! Estudar o teu código como um todo pra entender o teu algoritmo, vai ser complicado.

Tenta explicar o funcionamento do robô, forma de controle (me parece que vais digitar as coordenadas X/Y pelo keypad) e onde exatamente estás tendo problema.

Senão vamos começar a chutar soluções totalmente inúteis pro teu problema.

Na LCD16x2 pede para digitar os valores de X/Y no keypad 4x4 o programa lê e imprimi na LCD 16X2 os valores digitados .

na a partir da linha 88 o programa usa as variaveis X/Y com os valores digitados no keyped para executar cálculos de cinemática inversa para mover o servo.

meu problema. Ler a matriz do keypad em inteiros(int) ou converter de os valores lidos em caracteres(char) para int.

acos=arcocosseno, que da respostas em radianos...

Falta converter pra graus com um *180/pi, nao eh isso ??

Boa observação...

mas, pelo que me parece ele já me retorna em graus, mas vou testar e te confirmo a informação...

obrigado!!!

Não, ele retorna em radianos.

é ele retorna em radianos mesmo.

rsrsrs

vlw

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço