collapse

* Posts Recentes

Arame de Estendal por almamater
[Ontem às 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

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

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

Offline c3dr1c

  • Mini Robot
  • *
  • Mensagens: 854
Re: Projecto - Introdução à Robotica
« Responder #30 em: 22 de Janeiro de 2013, 00:55 »
Boas.

Bem vamos la começar a construir o codigo para controlar os motores.
Primeiro vou começar com o PWM para o controlo de potência.

------------------------------------
Pelo que li devo usar Phase Correct PWM

Para tal vou usar o pino OC1A.

Para configurar o modo uso o register TCCR1A e os bits COM1B0, COM1A0, COM1B1 e COM1A1. O modo que vou utilizar será o Set (up-counting) on match, Clear (down-counting) on match, portanto tenho de colocar todos os bits a 1.

O register OCR1A é usado para definir o TOP que queremos (define o valor de PWM). O contador ao chegar ao valor de TOP liga o pino OC1A, depois ao chegar ao TOP real do contador começa a contar para tras e ao chegar de novo ao TOP, desliga a saida OC1A. Depois chega ao BOTTOM e começa de novo a contar para a frente.

Tambem é preciso definir o waveform generation mode bit. Temos de configurar como CTC de modo a actualizar no momento da comparação o OC1A. Colocamos o bit WGM12 a 1, do register TCCR1B.


Para o clock, é preciso escolher se queremos prescaling e quanto queremos usar. Ou entao nao usar prescaling.

Para tal configura-se os bits CS10, CS11 e CS12 atraves do register TCCR1B. Ao configurar-se, o contador é iniciado.
---------------------------

Eu devo estar aqui a dizer um monte de barbaridades, mas pelas primeiras leituras rapidas que fiz dos tutoriais de avr-gcc e pela datasheet do atmega, penso que a teoria seja esta.

Posso continuar ou nao é nada disto?  :P ;D
« Última modificação: 22 de Janeiro de 2013, 00:59 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.733
  • Helpdesk do sitio
Re: Projecto - Introdução à Robotica
« Responder #31 em: 22 de Janeiro de 2013, 02:41 »
Sim, deve ser isso, se não for, nada como testar, e tens ai exemplos de código, devia ver se acabava a série de tutoriais para começar com outra familia de micros e fazer mais tutoriais, mas o tempo é pouco, e a tralha toda está por casa e não por Aveiro..
Avr fanboy

Offline c3dr1c

  • Mini Robot
  • *
  • Mensagens: 854
Re: Projecto - Introdução à Robotica
« Responder #32 em: 22 de Janeiro de 2013, 22:35 »
Eu ca tambem acho que devias de acabar os tuts :P  ;D Têm sido bastante úteis!

Bem tive a ler a datasheet e nao posso usar este pino para o PWM. So ha Phase Correct PWM nos pinos OC2*. Portanto vou usar o pino OC2A. O register será o OCR2A. Mas nao sei se será bem assim.

Tambem nao percebo se basta configurar o PWM e ta feito, ou se é preciso usar interrupts para incrementar o contador e inverter a contagem (parece-me que sim). E se sim, preciso de usar interrupts externos (INT0,1,) ou se posso usar outros interrupts.

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 senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Projecto - Introdução à Robotica
« Responder #33 em: 22 de Janeiro de 2013, 22:44 »
É só isto, e definir os pinos como saidas.

Código: [Seleccione]
//Pwm init and config
TCCR0A = ((1<<COM0A1)|(1<<COM0B1)|(1<<WGM00));   //Enable pwm in both timer 0 pins with phase correct pwm
TCCR0B = (1<<CS00);          //No prescaled clock, feed 16Mhz to the timer
OCR0A = 0;                //Fpwm = (Fio/(N*510)), with N=1, Fpwm = 31Khz
OCR0B = 0;                //This is to avoid stupid noises from the motors, and init the values to 0
Avr fanboy

Offline c3dr1c

  • Mini Robot
  • *
  • Mensagens: 854
Re: Projecto - Introdução à Robotica
« Responder #34 em: 22 de Janeiro de 2013, 23:16 »
Só isso? Pelos vistos funciona :D Thanks

Código: [Seleccione]
// Iniciar o programa
#include <avr/io.h>

int main(void) {
DDRD |= (1<<PD6); // Definir o pino digital 6 como OUTPUT
//Pwm init and config
TCCR0A = ((1<<COM0A1)|(1<<COM0B1)|(1<<WGM00));   //Enable pwm in both timer 0 pins with phase correct pwm
TCCR0B = (1<<CS00);          //No prescaled clock, feed 16Mhz to the timer
OCR0A = 1;                //Fpwm = (Fio/(N*510)), with N=1, Fpwm = 31Khz
OCR0B = 0;                //This is to avoid stupid noises from the motors, and init the values to 0
}
"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.733
  • Helpdesk do sitio
Re: Projecto - Introdução à Robotica
« Responder #35 em: 22 de Janeiro de 2013, 23:35 »
OCR0A/B é onde metes o valor de 0 a 255 que define o duty cycle, sim é tão simples como isso.
Avr fanboy

Offline c3dr1c

  • Mini Robot
  • *
  • Mensagens: 854
Re: Projecto - Introdução à Robotica
« Responder #36 em: 22 de Janeiro de 2013, 23:47 »
É so nao sei o que é o Fpwm, o fio e o que evita o ruido dos motores... Mas ja testei com leds e ta a funcionar. E fica resolvido para os dois motores, visto ter dois pinos :D Muito obrigado

Agora tenho de ler os tuts sobre adc's e depois fazer o codigo para ler os tcrt5000. Vou estudar isso

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 #37 em: 23 de Janeiro de 2013, 00:21 »
Nao entendo uma coisa em ADC's

Devo ou nao usar flags? Segundo me parece, elas interrompem o programa para ler o valor convertido e fazer o que quisermos com ele. Se nao usar flags nao vou conseguir ler o valor em cada ciclo, pois a operação de conversão demora mais que um ciclo. Isto ta correcto?
"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 #38 em: 23 de Janeiro de 2013, 23:57 »
Boas. Ja consigo brincar com o adc e alterar o valor do pwm consoante um valor, graças a um dos tutoriais. Thanks

Adc's parece simples, mas continuo sem entender as perguntas no post acima. Agora é so pensar e criar o codigo de interacção dos valores do adc com os motores para seguir a linha.

O codigo utilizado (http://netexplorers.org/AVR/AVR_C.pdf)
Código: [Seleccione]
#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned char adc;

int main(void) {
DDRD |= (1<<PD6); // Definir o pino digital 6 como OUTPUT

// Configurar o ADC:
ADMUX |= (1<<ADLAR); // Resolução de 8 bits
ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //Prescaling de 128
ADMUX |= (1<<REFS0); // Referência: AVcc
ADCSRA |= (1<<ADATE); // Gatilho automático: Freerunning mode

// Input: ADC0 seleccionado por defeito
ADCSRA |= (1<<ADEN); // Ligar o ADC
ADCSRA |= (1<<ADIE); // Ligar a interrupção particular do ADC
sei(); // Ligar as interrupções globais
ADCSRA |= (1<<ADSC); // Iniciar as conversões no ADC
//Pwm init and config
TCCR0A = ((1<<COM0A1)|(1<<COM0B1)|(1<<WGM00)); // Enable pwm in both timer 0 pins with phase correct pwm
TCCR0B = (1<<CS00); // No prescaled clock, feed 16Mhz to the timer
OCR0B = 0;// This is to avoid stupid noises from the motors, and init the values

for(;;) {// Ciclo eterno
if(adc_distance > 128) // Testar o valor da distância, e ligar o pino caso seja maior que 128 e vice versa.
OCR0A = 100; // Fpwm = (Fio/(N*510)), with N=1, Fpwm = 31Khz
else
OCR0A = 0;
}
}

ISR(ADC_vect) {// Definir uma interrupção que ocorre a cada ocorrência de uma conversão
adc_distance = ADCH; // Ler o valor do ADC, e guardá-lo numa variável

}

EDIT:

Bem adicionei algumas condições (if) e ja consigo variar o PWM com o valor do ADC. Usei um LDR para experimentar e funciona. Mas deve haver melhores maneiras para fazer isto ou nao?

Código: [Seleccione]
// Iniciar programa
#include <avr/io.h>
#include <avr/interrupt.h>

// Criar uma variável com o valor do sensor de distância do ADC
volatile unsigned char adc; // char porque só precisamos de 8 bits

int main(void) {
DDRD |= (1<<PD6); // Definir o pino digital 6 como OUTPUT



// Configurar o ADC:
ADMUX |= (1<<ADLAR); // Resolução de 8 bits
ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //Prescaler de 128
ADMUX |= (1<<REFS0); // Referência: AVcc
ADCSRA |= (1<<ADATE); // Gatilho automático: Freerunning mode

// Input: ADC0 seleccionado por defeito
ADCSRA |= (1<<ADEN); // Ligar o ADC
ADCSRA |= (1<<ADIE); // Ligar a interrupção particular do ADC
sei(); // Ligar as interrupções globais
ADCSRA |= (1<<ADSC); // Iniciar as conversões no ADC
//Pwm init and config
TCCR0A = ((1<<COM0A1)|(1<<COM0B1)|(1<<WGM00)); // Enable pwm in both timer 0 pins with phase correct pwm
TCCR0B = (1<<CS00); // No prescaled clock, feed 16Mhz to the timer
OCR0B = 0;// This is to avoid stupid noises from the motors, and init the values

for(;;) {// Ciclo eterno
if(adc > 50) // Testar o valor da distância, e ligar o pino caso seja maior que 128 e vice versa.
OCR0A = 10; // Fpwm = (Fio/(N*510)), with N=1, Fpwm = 31Khz
if(adc > 100) // Testar o valor da distância, e ligar o pino caso seja maior que 128 e vice versa.
OCR0A = 100;
if(adc > 200) // Testar o valor da distância, e ligar o pino caso seja maior que 128 e vice versa.
OCR0A = 200;
else
OCR0A = 0;
}
}

ISR(ADC_vect) {// Definir uma interrupção que ocorre a cada ocorrência de uma conversão
adc = ADCH; // Ler o valor do ADC, e guardá-lo numa variável

}

O meu primeiro objectivo vai ser meter o robot a andar para a frente, a seguir uma linha e caso algum dos sensores atinja a linha preta reduz-se um pouco a velocidade de um dos motores (ou o da direita, ou o da esquerda, conforme necessário). No fundo o ADC funciona como um detector digital (0 ou 1).

O meu segundo objectivo é criar uma linha em tons de cinza, a escurecer desde os lados até ao centro. Depois controla-se o valor do PWM conforme o valor do ADC.

O terceiro objectivo é criar um PID.
« Última modificação: 24 de Janeiro de 2013, 20:18 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 c3dr1c

  • Mini Robot
  • *
  • Mensagens: 854
Re: Projecto - Introdução à Robotica
« Responder #39 em: 20 de Fevereiro de 2013, 00:31 »
Ja montei um pouco do robot. Cometi alguns erros e imperfeições devido a não estar habituado a trabalhar com uma dremel.

Um dos primeiros erros foi usar parafusos no acrilico com rosca metrica em vez de auto-roscante. A rosca fica fragil e nao permite aperto. Mas depois troco os parafusos.

Outro era a cortar o acrilico, o raio do material derrete sempre e fica pastoso. As vezes agarra-se ao disco de corte. Devo usar velocidades baixas ou altas? E que disco usar (usei um cinza de diamante acho eu)?





Cumps


« Última modificação: 20 de Fevereiro de 2013, 00:42 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.733
  • Helpdesk do sitio
Re: Projecto - Introdução à Robotica
« Responder #40 em: 20 de Fevereiro de 2013, 00:53 »
Não se mete parafusos em acrilico..
Furas de um lado ao outro e montas com porcas, se ai metes parafusos auto-roscantes estalas isso tudo.
O acrilico, tem de ser cortado com água para ajudar a arrefecer.
Avr fanboy

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
Re: Projecto - Introdução à Robotica
« Responder #41 em: 20 de Fevereiro de 2013, 01:55 »
Não se mete parafusos em acrilico..
Furas de um lado ao outro e montas com porcas, se ai metes parafusos auto-roscantes estalas isso tudo.
O acrilico, tem de ser cortado com água para ajudar a arrefecer.

Tens um disco de "Diamante" no dremel que corta o acrilico e não derrete...Também se usam discos de cortar pedra em rebarbadoras para cortar acrilico sem que ele derreta.

Disco que falo:


Em relação ao parafuso se for com rosca de chapa pouco profunda e o buraco quase da largura do parafuso podes meter esses parafusos de chapa na boa que não estala, desde que deixes uma margem de 1mm para cada lado nas extremidades do furo, estou farto de fazer disso....

Já fiz furos de 2,5mm em Standoffs de 4x4mm e depois meti-lhe parafusos de rosca de chapa para dentro e ainda ali andam... ;)
Ah, ao meter os parafusos molha-os em oleo que ajuda. ;)
« Última modificação: 20 de Fevereiro de 2013, 01:57 por zordlyon »
Cumprimentos,
André Carvalho.

Offline elfo106

  • Mini Robot
  • *
  • Mensagens: 120
Re: Projecto - Introdução à Robotica
« Responder #42 em: 20 de Fevereiro de 2013, 01:57 »
Eu, em acrilico para por parafusos abro com uma broca mais pequena primeiro. Por exemplo, se quero um parafuso de 3mm, abro com uma broca de 2.5mm e depois com a aparafusadora coloco o parafuso de 3mm, fica logo a rosca feita e tudo. Só é preciso um pouco de cuidado para não forçar demasiado senão estala nem fazer isso demasiado próximo das bordas.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Projecto - Introdução à Robotica
« Responder #43 em: 20 de Fevereiro de 2013, 02:22 »
E ficar com meio mm de rosca?
Não gosto dessas coisas, demasiado nas peles..
Avr fanboy

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
Re: Projecto - Introdução à Robotica
« Responder #44 em: 20 de Fevereiro de 2013, 10:24 »
E ficar com meio mm de rosca?
Não gosto dessas coisas, demasiado nas peles..

É verdade, mas por vezes para desenrrascar serve perfeitamente. ja me aconteceu não ter standoffs e remediei assim.
Cumprimentos,
André Carvalho.