collapse

* Posts Recentes

Impressora 3D por filjoa
[Hoje às 02:15]


'Arame' para soldar a baixa temperatura por senso
[Ontem às 09:30]


Covid-19 por Njay
[02 de Abril de 2020, 02:48]


Bateria Parkside não carrega por jm_araujo
[26 de Março de 2020, 11:38]


STM32 inicio por senso
[24 de Março de 2020, 18:23]


Detector de AC - Projecto com PCB por SerraCabo
[23 de Março de 2020, 10:23]


EU Duty Changes, A Whole VAT Of Trouble For Hackers? por SerraCabo
[21 de Março de 2020, 20:24]


LM3915 por Njay
[20 de Março de 2020, 18:18]


Creality Ender 3D printer por Njay
[20 de Março de 2020, 17:24]


Tolerancia para cortar perfil aluminio por jm_araujo
[19 de Março de 2020, 11:47]

Autor Tópico: Projecto - Introdução à Robotica  (Lida 23038 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Projecto - Introdução à Robotica
« Responder #75 em: 05 de Março de 2013, 22:04 »
há caixas para isso na hobbyking se quiseres mesmo.

o que escreveu aquele tutorial que referi guarda as baterias carregadas no frigorífico num saco isolado (para humidade e tal). assim duram muito tempo sem ter de voltar a carregar. pois se descarregarem muito estragam-se.

tenho 3 sonares ao mesmo tempo. com menos de 65ms entre disparos são mais de 15 disparos por segundo. e pelo que vi é 2ma ou 4ma cada.
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline c3dr1c

  • Mini Robot
  • *
  • Mensagens: 854
Re: Projecto - Introdução à Robotica
« Responder #76 em: 25 de Junho de 2013, 20:06 »
Boas.

Aproveitei um sonar de um medidor de distâncias avariado e queria utilizar no robot.

Mas como so tenho mesmo o componente electronico, nao sei bem fazer isso.
Além disso, pelo que me dá a enteder, como é so um sonar este deve transmitir e receber a onda sonora.

Na teoria eu tenho de gerar uma corrente pulsada com alguns ms e depois medir a corrente que o sonar irá receber, acho eu. Então para gerar a onda sonora, baste e ligá-lo a um transistor e depois com pwm gerar essa corrente? E para receber, basta medir a corrente que o sonar irá gerar quando receber a onda sonora? E será preciso amplifica-la?

Cumps

"O único modo de descobrir os limites do possivel é aventurarmo-nos um pouco para além deles em direcção ao impossivel."

Uma das Três Leis de Arthur C. Clarke

Offline c3dr1c

  • Mini Robot
  • *
  • Mensagens: 854
Re: Projecto - Introdução à Robotica
« Responder #77 em: 02 de Julho de 2013, 23:32 »
Boas.

Estive a pensar em como utilizar o PID no meu robot para seguir uma de linha, mas de modo a que perceba o que estou a fazer. A ideia que tenho resume-se na seguinte imagem:



Bem para começar vou usar 5 sensores TCRT5000 e da forma como podem ver na tabela em "Sensores/Linha" de modo a ter uma melhor resolução. Na tabela uso os sensores de forma digital (0, 1) mas como metade do diodo emissor pode ficar em cima da linha, vou usa-los de forma analógica, obtendo ainda melhor resolução.

Então para tal, calculo uma média ponderada atribuindo "pesos" a cada sensor, definindo assim o setpoint.

Sobre o PID, pelo que li a formula mais usada será aquela. Como tal preciso de calcular o erro em função do tempo que traduz-se directamente na velocidade em x, do robot. Isto caso utilize o erro como a distância entre o sensor central e o centro da linha, na direcção x.

Depois aplica-se a formula e obtêm-se o valor do PID. A ultima tabela esta la so para observar os diferentes valores com diferentes velocidades. Trata-se de um comportamento linear, maior velocidade, maior PID.


Agora, cheira-me que isto tá tudo mal e gostava de conhecer as vossas opiniões.
Áh, e agora como utilizo o valor PID para definir as velocidades dos motores (PWM)? De forma percentual?

Cumps


Edit: Esqueci-me de relacionar o setpoint com o erro, mas o que interessa é o conceito.
« Última modificação: 02 de Julho de 2013, 23:41 por c3dr1c »
"O único modo de descobrir os limites do possivel é aventurarmo-nos um pouco para além deles em direcção ao impossivel."

Uma das Três Leis de Arthur C. Clarke

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.668
  • Helpdesk do sitio
Re: Projecto - Introdução à Robotica
« Responder #78 em: 01 de Outubro de 2013, 23:05 »
Sobre PID:
http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

Quanto ao controlo, tens várias maneiras a mais simples é o PID dar logo um valor de 0 ao valor máximo do pwm(255 se for 8 bits) e siga para os registos do timer..

O pid em código é uma duzia de linhas:
Código: [Seleccione]
#include "pid.h"

void pidInit(double pFactor, double iFactor, double dFactor, int16_t outputMin, int16_t outputMax, struct PID_DATA *pid_c){

pid_c->lastInput = 0;
pid_c->iTerm = 0;
pid_c->Kp = pFactor;
pid_c->Ki = iFactor;
pid_c->Kd = dFactor;
pid_c->outMin = outputMin;
pid_c->outMax = outputMax;

}

int16_t pidController(int16_t setPoint, int16_t inputPoint, struct PID_DATA *pid_c){

double error;
double dInput;
double output;

//Compute all the working variables
error = setPoint - inputPoint;
pid_c->iTerm += (pid_c->Ki * error);
if(pid_c->iTerm > pid_c->outMax){
pid_c->iTerm = pid_c->outMax;
}
else if(pid_c->iTerm < pid_c->outMin){
pid_c->iTerm = pid_c->outMin;
}

dInput = (inputPoint - pid_c->lastInput);

//Compute PID output
output = (pid_c->Kp * error) + pid_c->iTerm - (pid_c->Kd * dInput);

if(output > pid_c->outMax){
output = pid_c->outMax;
}
else if(output < pid_c->outMin){
output = pid_c->outMin;
}

pid_c->lastInput = inputPoint; //Remenber the intput

return ((int16_t)output); //Cast the output to int

}

void pidReset(pidData *pid_c){

pid_c->lastInput = 0;
pid_c->iTerm = 0;

}

Código: [Seleccione]
#ifndef PID_H
#define PID_H

typedef struct PID_DATA {
double iTerm;
double lastInput;
double Kp;
double Ki;
double Kd;
int16_t outMin;
int16_t outMax;
} pidData;

void pidInit(double pFactor, double iFactor, double dFactor, int16_t outputMin, int16_t outputMax, struct PID_DATA *pid_c);
int16_t pidController(int16_t setPoint, int16_t inputPoint, struct PID_DATA *pid_c);
void pidReset(pidData *pid_c);

#endif
Avr fanboy