LusoRobótica - Robótica em Português

Robótica => Projectos de robótica => Projectos em desenvolvimento => Tópico iniciado por: c3dr1c em 10 de Novembro de 2012, 14:46

Título: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 10 de Novembro de 2012, 14:46
Boas pessoal.

Como medida de me iniciar no mundo da robótica/programação decidi começar a construir um robot simples.


O robô irá ter duas rodas dianteiras com controlo independente e uma roda traseira livre.
Terá de ser todo construído com materiais que tenha por casa/sucata electrónica de modo a estimular a criatividade.

Também tentarei evitar integrados com circuitos simplificados de modo a tentar perceber ao máximo toda a electrónica analógica envolvida (excepto o microcontrolador, portas and, not...)

O microcontrolador será um Atmega 328P-PU e será programado em assembly (penso que se chama assembly ao tipo de programação que o Senso meteu ai num tutorial dele).


Bem e ontem como nao tinha nada para fazer comecei a montar alguns circuitos de controlo dos motores.

O circuito será composto por uma ponte H para definir o sentido de rotação do motor, uma latch D para comutar a ponte H com um único sinal digital e um circuito de potência controlado através de PWM.

Quanto ao circuito de potência pensei em duas alternativas, mas não sei qual delas usar:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi47.tinypic.com%2F118zj7n.png&hash=b76527cf7822a5eb79ce6a42ba75c9b6762dc160)

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi50.tinypic.com%2F25qrcdx.png&hash=95fed7675e1491284d886ffa985e172b158dc475)

Qual será o melhor método?


Abraços
Título: Re: Projecto - Introdução à Robotica
Enviado por: microbyte em 10 de Novembro de 2012, 16:10
Estás a pensar fazer isso com transistores bipolares? Ou os transistores do esquema são para ser substituidos por MOSFETS? Se não, cuidado com as polarizações dos transistores.

Eu apostava no controlo de potência por transistor na saída, porque acho que as portas lógicas não te dão tanta rapidez... Tudo depende, claro está das portas que usares.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 10 de Novembro de 2012, 16:37
Na saida ate da menos trabalho :P

Estava a pensar usar bipolares mas achas que devia usar mosfets? Assim podia controlar a potencia pela variação da tensão no mosfet (nao sei ganho alguma coisa com isso :P


Mas quanto às polarizações, pelo que percebo disto, os transistores T3 e T4 têm um funcionamento "normal" em que a corrente Ic depende do ganho e da corrente de base, funcionando assim em modo emissor comum. Agora basta certificar-me na datasheet que Vce e Ib correspondem à zona activa, certo?

T1 e T2 como têm a carga no emissor ja nao sei se o funcionamento será o mesmo. Penso que Ib ficará dependente do ganho e não Ic. Mas mais que isto não sei.
Título: Re: Projecto - Introdução à Robotica
Enviado por: microbyte em 10 de Novembro de 2012, 18:24
Tens aqui uma implementação com MOSFET's que te permite "esquecer" a questão das polarizações, uma vez que vais estar sempre a trabalhar no corte ou linear (LOW/HIGH):
http://3.bp.blogspot.com/_PFcqqI1wdqY/TJo-esl_1ZI/AAAAAAAAAJk/zQed6Tz_krU/Ponte%20H%20(via%20PWM).JPG (http://3.bp.blogspot.com/_PFcqqI1wdqY/TJo-esl_1ZI/AAAAAAAAAJk/zQed6Tz_krU/Ponte%20H%20(via%20PWM).JPG)

Esta implementação usa 2 sinais PWM, mas pode ser adaptada para usar o DIR, EN e PWM que tens nos esquemas anteriores. ;)
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 10 de Novembro de 2012, 19:12
Mas nao tenho ca disso em casa. Vou mesmo para os bipolares.
Ja andei a ler e pelo que percebi o objectivo da polarização é compensar a instabilidade criada pela variação de temperatura.


Bem posso utilizar os transistores como interruptores utilizando uma polarização com corrente de base constante. A variação da corrente em Ic nao apresenta problemas visto nao ser preciso limitar a corrente. Depois o PWM trata disso.

Mas por outro lado, se fizer uma polarização com corrente de emissor constante poderei fixar a corrente máxima do motor para quando ele entre em STALL nao se danificar. Alem disso permite que o transistor nao fuja do seu estado de operação.

É este o caminho? :P
Título: Re: Projecto - Introdução à Robotica
Enviado por: microbyte em 10 de Novembro de 2012, 19:43
Boas.

A polarização com BJTs é algo complexo e eu, para ser sincero, não domino o uso de BJTs em corte e saturação, só os estudei na zona activa.

Tens aqui um artigo muito bom que explica como criar uma H-bridge com BJTs
http://www.mcmanis.com/chuck/robotics/tutorial/h-bridge/bjt-bridge.html (http://www.mcmanis.com/chuck/robotics/tutorial/h-bridge/bjt-bridge.html)

Concretamente, na secção "4.0 The Complete BJT based H-Bridge", tens o esquema com FWD/REV/EN, em que o Enable pode ser usado como PWM (invertido).
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 11 de Novembro de 2012, 12:54
Bem eu montei o meu circuito e funciona, mas nao sei se será nas condições devidas. Para resolver o caso das polarizações do T1 e T2 vou troca-los por PNP e fica resolvido. Achei interessante nesse tutorial eles colocarem uma resistencia de pull-up entre a base e o emissor, acho que vou fazer o mesmo.

Edit: E o novo circuito fica assim:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi48.tinypic.com%2F30nb212.png&hash=2e5a306abca34409bc162f86d143bcc25e91b040)

Agora é so dimensionar o valor das resistencias para um bom funcionamento.
Ha e faltam condensadores de decoupling no circuito. No motor aconselham um condensador de quanto? 100nF?
Título: Re: Projecto - Introdução à Robotica
Enviado por: Njay em 11 de Novembro de 2012, 13:31
A polarização serve para escolher o ponto de funcionamento em repouso do transistor. O que é que isto quer dizer? Antes de mais, faz mais sentido falar em polarização noutro tipo de circuitos, em particular amplificadores. Se meteres um sinal AC (ou seja, que tem partes negativas e partes positivas) na base dum transistor (através de uma resistência), o sinal que sai no colector fica distorcido e perde as partes negativas (é uma forma de fazer pedais de distorção soft). A solução para isto é fazer com que o sinal no colector esteja "no meio" do valor possível de saída, e depois "adicionar" o sinal de entrada; o sinal de saída passa a ter "o zero" no meio e aí já pode ir para baixo e para cima mantendo fidelidade ao sinal de entrada. A polarização é meter na base a corrente necessária para colocar a saída "a meio", geralmente feito com resistências.

Para resolver os desvios causados pela temperatura só com realimentação. Dificilmente conseguirás controlar a corrente máxima no motor de forma fiável controlando a corrente de base, porque todos os transístores têm ganho diferente (mesmo os do mesmo modelo) e esse ganho varia um pouco com temperatura, tensão e corrente.

A resistência entre a base e o emissor serve para garantir que o transistor está desligado se as entradas (base) forem deixadas "no ar", ou seja, sem estarem a levar com uma tensão específica. Estes dispositivos têm amplificação e são sensíveis; se uma entrada ficar no ar, coisas estranhas podem acontecer. Assim, colocando uma resistência de alto valor (para não interferir com o funcionamento normal) garantimos que na verdade nunca está "no ar".
Título: Re: Projecto - Introdução à Robotica
Enviado por: microbyte em 11 de Novembro de 2012, 14:27
Boas.

Obrigado pela explicação NJay... É sempre bom aprender com alguém que saiba. :)

Cumps,
Ricardo
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 11 de Novembro de 2012, 18:47
Muito obrigado aos dois :D

Então como posso limitar a corrente dos motores de modo a que não se danifiquem em caso de estarem em esforço sem rodarem?

Os transístores então utilizo só como interruptores electrónicos.

Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 12 de Novembro de 2012, 19:26
Bem uma das funções que quero que o robot faça é seguir uma linha. Para tal vou utilizar o sensor optico tcrt5000.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fiteadstudio.com%2Fstore%2Fimages%2Fproduce%2FSensor%2FReflective_Optical_Sensor%2FReflective%2520Optical%2520Sensor%2520TCRT5000.JPG&hash=cd321f358f0529d1ee8880094db424bd3d44e310)

http://www.vishay.com/docs/83760/tcrt5000.pdf (http://www.vishay.com/docs/83760/tcrt5000.pdf)

O circuito é este:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi47.tinypic.com%2Fs30sax.png&hash=73cfdb49479ef36e6d3ef2989c1d0cbf2119d25e)

Mas gostaria que fosse possivel afina-lo.


O led penso que tenha uma queda de tensão tipica de 1.25V e uma corrente máxima de 60mA. Bem se utiliza-lo com 60mA penso que emita mais luz do que com 30mA.

Portanto com 60mA precisarei de uma resistência de:
(5-1.25)/0.06 = 62.5ohm

Com 10mA precisarei de uma resistência de:
(5-1.25)/0.01=370ohm

Que tal trocar a resistência por um potenciómetro? Ou depois o potenciómetro varia muito com o aquecimento? Mas sao correntes pequena, penso que nao.

------------------------

O transístor é que não percebo o funcionamento. Portanto vou ter um no entre o transístor e a resistência que está ligado a uma entrada analógica do arduino. Esta tem uma impedância infinita resultando numa corrente perto de 0, medindo assim a diferença de potencial entre o colector e o ground.

Ic máximo é de 100mA. A queda de tensão Vce é que não sei o valor, será 0?

Portanto R = 5/0.1 = 50ohm. (mas tipicamente custuma-se usar resistências de 10kohm = 0.5mA)

Se aumentar o valor da resistência resultando na diminuição de Ic a medição será diferente?


Supostamente o arduino medirá 5V menos a queda de tensão na resistência certo?
5-R*Ic = 5-50*0.1 = 0V (como é óbvio)

Se nao existir reflexão da luz aproxima-se de 5V. Exemplificando com 10mA:
5-R*Ic = 5-50*0.01 = 4.5V


Agora posso optar por duas gamas de correntes. Uma que vai de 0mA a 100mA (R=50ohm) e outra que vai de 0mA a 0.5mA (R=10kohm). Qual das duas usar?

Aqui tambem posso trocar a resistencia por um potenciometro?


Nao sei se nao estou a baralhar um bocado as coisas :P
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 12 de Novembro de 2012, 19:39
Porque é que queres ter esses valores a variar?
O transistor tem a saida em coletor aberto, e leva uma resistência para fazer de pull-up.
Usar o led com a corrente máxima, provavelmente só lhe vai retirar tempo de vida e não tens ganhos nenhuns com isso, e para seguir uma linha basta usar o sensor com uma entrada digital, ou está na linha, ou não está, valores tipicos será uns 270ohms no led, e 10k para o pull-up.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 12 de Novembro de 2012, 22:46
Realmente foi mal pensando. Eu so preciso de saber se está na linha ou não :P A não ser que faça uma linha em degradê que por acaso não era nada má ideia :P Poderia escurecer a linha das extremidades ate ao centro.

Mas pronto, a ideia está correcta na mesma?

Mais tarde vou ldr's para seguir a luz. Se calhar ai é que já se aplica esta analogia.
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 13 de Novembro de 2012, 09:37
A saida do TCRT5000 podes ligar a um pino que tenha ADC e ele tem uma saida mais ou menos proporcional á intensidade do preto que a linha tiver, mas continuas a ter de meter a resistência de 10k a fazer de pull-up, depois é testares.
E outra coisa, a impedância de entrada do ADC dos atmegas é de +/- 10K ohms, muito longe de infinito.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 11 de Janeiro de 2013, 20:39
Boas.

Ontem voltei a este projecto. E o primeiro erro que vi logo... Pra que raio uso uma latch D que só me serve para adicionar um sinal invertido???  Para isso uso uma porta NOT  ;D :P

E o novo circuito fica assim:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi50.tinypic.com%2Fv8fyh3.jpg&hash=1572dcdb79396f5c97d57a1a93d14548ce162add)

Decidi desenhar a board. É basicamente o circuito 2x.
Tem entradas para controlo de potencia, direcção e para desligar o controlo de potencia. Tem vários pin headers porque vou colocar jumper's caso queira testar o circuito sem o microcontrolador.
Mede 5 x 8 cm.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi46.tinypic.com%2F20hpjk8.jpg&hash=346eeea1842d9497b3498756cc50fe7f174cc424)

Ainda nao sei se me apetece retirar um 74LS04N, visto que so preciso no total de 6 portas NOT. O 74LS04N inferior está mal ligado. Depois corrijo e coloco aqui o file para quem quiser.

Aceitam-se criticas  :D

Abraço
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 11 de Janeiro de 2013, 21:12
Com duas resistências e um transistor fazes uma porta NOT, mas vais mesmo fazer uma placa com isso tudo e usar transistores tão pequeninos para controlar o motor?
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 11 de Janeiro de 2013, 21:36
Pois se calhar é boa ideia usar umas tip's... Vou alterar...
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 11 de Janeiro de 2013, 21:42
Mas qual é a voltagem e corrente que tens em mente?
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 11 de Janeiro de 2013, 22:39
5V, 1.5A - Se calhar vou ter de engrossar o traço... Existem bjt's que suportam 1.5A?

Agora que perguntas isso deveria ter colocado a alimentação dos motores separada do resto do circuito, caso queira aumentar a tensão.

Ja alterei as ligações para trabalhar com TIP's. A ligação da NOT tambem ja está corrigida. Só falta checkar as ligações todas, que deve haver uma falha ou outra algures...

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi45.tinypic.com%2F33w16x2.png&hash=7b19ea21ebbd8cd378dab0572cc80ff467a7f49b)


EDIT:

Um update com alimentação dos motores separada do restante circuito.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi46.tinypic.com%2F28hh46b.png&hash=ec9dc45bd1274a7b969606483e59b7099816a33e)

Acham que chega dois condensadores de decoupling por ponte? (um electrolitico e um de ceramica)
Os motores também levarão 3 condensadores soldados no corpo. Um entre o terminal + e terminal -; Outro entre o terminal + e o corpo do motor; E outro entre o terminal - e o corpo do motor.
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 12 de Janeiro de 2013, 04:12
Para isso porque não usas um L298?
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 15 de Janeiro de 2013, 00:35
Porque nao quero simplifica muito os circuitos. Quero tentar, por exemplo, calcular as resistencias agora que preciso, etc... para aprender e ir treinando :D

Ja engrossei as linhas da board :P



Título: Re: Projecto - Introdução à Robotica
Enviado por: dio123 em 15 de Janeiro de 2013, 09:40
a pcb não fica mais simples e melhor usando plane ground?
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 15 de Janeiro de 2013, 21:16
Fica mais simples, melhor, mais bonita, etc. Thanks

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi49.tinypic.com%2F11vnwua.png&hash=9a1138dc67dbce0bb076d8a3d0fc7d658a0c2ff3)

E qual utilizar? Existem vantagens em nao tirar o cobre que nao está ligado a lado nenhum?
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 15 de Janeiro de 2013, 21:37
Sim, cobre sem estar ligado a nada, só vai funcionar como antena para acoplar ruido ao circuito..
Eu percebo que a ideia seja aprender, mas isso é tão, mas tão maior que um L293D, que podes usar um chip por motor com as pontes ligadas em paralelo.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 15 de Janeiro de 2013, 21:53
Senso, querias dizer que nao certo? Ou isso é uma vantagem acoplar ruido? O cobre capta o ruido e o reduz do circuito principal?

Fica maior, sai mais caro, mas é mais divertido :P :D
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 15 de Janeiro de 2013, 22:08
Mas cheira-me que a performance não seja a melhor, e mais fazer placas..
Eu ando sempre á procura de bichos novos para brincar, mas á coisas que considero como blocos básicos, e não faço com componentes discretos, quer dizer, eu tenho uma ponte H desenhada com mosfets á solta, mas é para 30A..
Não acopla ruido de todo o lado, nunca se deixam orfãos num poligono de uma pcb, podes deixar, mas não o deves fazer.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 15 de Janeiro de 2013, 22:17
Pois nao deve ser, os circuitos integrados já vêm optimizados para a melhor performance penso eu.

Apesar disto ser simples ha sempre alguma coisa que escapa... Eu tambem sou novo na electronica  ;D
Alem disso treino (no eagle tambem :P) e deixo as cenas mais vivas na memoria.

Por isso é que o topico se chama introdução à robotica :P

Ok nao vou deixar o orfãos. Thanks


EDIT: Ja agora existe alguma vantagem em usar thermals nas ligações ao plano de ground?
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 15 de Janeiro de 2013, 22:26
Tens de ter ops thermals, se não para soldar um componente vai ser dificil, porque tens de aquecer mais o plano de massa do que com os thermals, que funcionam como uma zona em que tens menos cobre á volta do pad para aquecer.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 15 de Janeiro de 2013, 22:36
Olha boa dica, faz sentido. Muito obrigado.

Bem a board ta pronta, as ligações estão 99% confirmadas e so falta mandar fazer.
Acho que nao preciso de acrescentar nada para controlar dois motores DC. Se lembrarem-se de alguma coisa util avisem.

A board ta em anexo para quem quiser.

Abraços
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 16 de Janeiro de 2013, 19:52
E aqui vai a board para os tcrt5000, para seguir a linha...
Esta serve para linha com cerca de 2cm de largura.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi50.tinypic.com%2F30igzcx.png&hash=14f360f1b5fa64123cad18e7debdb0e3e154b5f1)

Tinha pensado nesta onde colocaria "pin headers femea" que me permitiria variar a largura da linha, colocando os tcrt onde queria. Mas acho que nao me vai servir de muito :P
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi49.tinypic.com%2F2zsd7pd.png&hash=8d1021495d8de2619f77b342153366e4932a5944)

Ah e vou mesmo experimentar fazer uma linha com diferentes tons de cinza :P

Cumps
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso 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..
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso 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
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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
}
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso 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.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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

Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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?
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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 (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.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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)?

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi50.tinypic.com%2F309h9pu.jpg&hash=d4c725207cf48c476ca41d188696baa47905c04d)

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi50.tinypic.com%2F2wfl45d.jpg&hash=f1a7ba4a615408a0b5e60928d542367c56c13ee5)

Cumps


Título: Re: Projecto - Introdução à Robotica
Enviado por: senso 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.
Título: Re: Projecto - Introdução à Robotica
Enviado por: zordlyon 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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg2.mlstatic.com%2Fdisco-diamantado-corta-vidro-p-micro-retifica-dremel_MLB-O-141002281_4450.jpg&hash=6ba99ede7a957213bc40f48c34d2fb84b173f2af)

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. ;)
Título: Re: Projecto - Introdução à Robotica
Enviado por: elfo106 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.
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 20 de Fevereiro de 2013, 02:22
E ficar com meio mm de rosca?
Não gosto dessas coisas, demasiado nas peles..
Título: Re: Projecto - Introdução à Robotica
Enviado por: zordlyon 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.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 20 de Fevereiro de 2013, 22:14
Boas.

Foi mesmo esse o disco que usei mas à medida que vai cortando o acrilico vai derretendo e fechado o corte que vai ficando para traz, deve ser falta de pratica e jeito ;D Se calhar tenho de ter mais calma a cortar, eu sinto um grande handicap a manusear a dremel... com o tempo vai ao sitio. :P

Quanto aos furos senso ja fiz o mesmo que falam e sem problemas com polipropileno (não sei se é exactamente o mesmo que acrilico ou se é mais "mole"). A ideia das porcas também não é nada má, tenho de ver o que vou fazer.

Agora vou fazer uma roda livre com algum lixo que tenho ca para casa... Ja meto umas fotos.


Obrigado pelas dicas,
Abraços
Título: Re: Projecto - Introdução à Robotica
Enviado por: dropes em 21 de Fevereiro de 2013, 01:34
Já cortei acrílico com dremel, ao principio também tinha o problema em que ia derretendo à medida que cortava, depois com a prática lá descobri uma forma de isso não acontecer, então tem de se colocar o disco bem rápido e dar uns toques sem manter em contacto permanente com o acrílico, assim ele não tem tempo de aquecer, para sair direito basta colocar uma tábua em cima do acrílico, ao cortar encosta-se o parafuso do disco à tábua com descidas breves.

Colocar roscas é mais tramado e qualquer pressão lateral acaba por rachar, por isso o veio não pode ser muito profundo.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 21 de Fevereiro de 2013, 01:41
Uma roda de impressora, rolamento flangeado de motor dc daqueles com bobinas presas na pcb, varao de impressora e acrilico do lixo :P

Feito à carga por hoje... amanha acabo melhor

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi47.tinypic.com%2F18cc29.jpg&hash=04c242e690aaf11527c7d2d926e87c3649911842)

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi50.tinypic.com%2F155gmr5.jpg&hash=3de0e8e25368db2e98830e15f041215b1423cf1f)

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi46.tinypic.com%2F1tk76h.jpg&hash=ff4e92c29e9428b55b7e237e8dac6327509ec0f3)

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi46.tinypic.com%2F2yl7lon.jpg&hash=60e5bf729befbe9a7084bc1e7f479cba026202ad)
Título: Re: Projecto - Introdução à Robotica
Enviado por: andnobre em 21 de Fevereiro de 2013, 11:52
tens ai um bom trabalho.
força ai.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 21 de Fevereiro de 2013, 23:06
Ja anda... agora so falta ligar a uma ponte h e a um micro e começar a programar :D ah e falta os sensores.

Afinal por preguiça vou usar um L298, ja dimensionei e desenhei o circuito da ponte h com transistores, ja aprendi o que precisava :P

Soldei 3 condensadores de 100nF em cada motor para reduzir o ruido.
Um dos motores anda mais que o outro como podem ver no video.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi49.tinypic.com%2F8x6bcz.jpg&hash=8fbbd02b02a9587a37a2712da30e4f8fa3f852c4)

MOV05759 (http://www.youtube.com/watch?v=eLTUYrNglhY#)

Tenho uma duvida, será que estes motores aguentam com 7.5V muito tempo? La nos chines faz so referencia a trabalhar com 4, 5 e 6V, mas como o L298 precisa de no minimo 7.5V na alimentação da ponte H (de acordo com a tensão que utilizo nos pinos INPUT)...
E com 9V será que aguenta?

Se nao aguenta, depois com o PWM consigo controlar a potencia fornecida ou o facto de a onda quandrada ter como amplitude 9V pode fazer mal?
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 21 de Fevereiro de 2013, 23:21
O L298D é bi-polar, vais ter uma queda de tensão de 1.4, porque tens dois transistores a provocar queda de tensão em cada meia ponte, dai os 7.5v, eu com 12v no rato, tinha no máximo 10v á saida, ou 10.xv é uma queda ainda consideravel..
O que o pwm faz é que efectivamente ficas com uma voltagem mais reduzida, sim, a onda terá um valor fixo, mas a voltagem efectiva ao longo do tempo será uma percentagem da voltagem de alimentação.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 21 de Fevereiro de 2013, 23:27
Pois assim posso usar até 9V directos da pilha e depois limitar o duty cycle a um certo valor que resulte numa tensão máxima de 6V. Depois uso um 7805 para alimentar o micro e a logica do L298 e escuso de estar a usar divisores de tensão para reduzir o valor da tensão nos input's do L298
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 21 de Fevereiro de 2013, 23:35
Divisores resistivos?
Isso tem alimentação de lógica separada da alimentação de potência..
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 21 de Fevereiro de 2013, 23:40
Sim, mas segundo a data sheet o valor minimo de VS = ViH+2.5

Teria de baixar a tensão dos inputs pra baixo de 5V...
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 25 de Fevereiro de 2013, 00:36
Boas.

Montei um circuito simples para testar o robot com a programação, mas quando ligo so ouço um zumbido. Se aproximar uma luz do LDR ouço o zumbido intermitente. Acho que com duty cylce a 246 o zumbido é continuo, a cerca de 100 é intermitente.

Acho que o zumbido vem dos transistores.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi49.tinypic.com%2Fo0rv6a.png&hash=9ce12c1e025e62ebef8b40d5671c7dc6e846af2e)

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
DDRD |= (1<<PD5);


// 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
OCR0A = 0;
OCR0B = 0;// This is to avoid stupid noises from the motors, and init the values

for(;;) {// Ciclo eterno
if(adc > 50)
OCR0A = 50;
OCR0B = 50;
if(adc > 100)
OCR0A = 150;
OCR0B = 150;
if(adc > 200)
OCR0A = 240;
OCR0B = 240;
}
}

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

}



Será que a frequencia está muito baixa? Eu quando estive a testar ouve duas ou tres vezes que um motor trabalhou, mas pouco. Com um led ligado ao colector ve-se que ele pisca..

Alguem tem ideia do que pode ser?

CUmprimentos

Edit:
É verdade! Afinal um motor nao trabalha mais rapido que o outro. O robot no video tem um desvio porque a roda livre estava mal feita.
Fiz uma roda nova muito melhor acabada que a anterior mas nota-se que ao longo de uma grande distancia o robot vai tambem curvando. Mais vale comprar uma roda perfeita vinda da industria que sao baratas e tudo, mas vou compensar esse desvio com o PWM

Coloquei uma pilha de 9V no robot, mas pelo que andei a ver nao me parec ser boa ideia pois so tem cerca de 170mha...
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 25 de Fevereiro de 2013, 00:47
É normal, porque os motores rodam mais para um lado que para o outro, é assim porque as escovas não estão montadas a 0º mas sim avançadas, para o motor fazer mais rotação no sentido para que é suposto rodar, tambem tem menos binário a rodar no sentido contrário, é assim e não defeito de nada, tens de compensar com pwm, e 8 bits não chega, o meu rato tem esse problema:/
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 25 de Fevereiro de 2013, 01:05
Essa é que eu não sabia das escovas, que interessante :D
De qualquer maneira a roda tambem estava muito mal. Fiz outra mas quase no final de estar pronta dei cabo de tudo :P Fiz mais outra e esta está perfeita. Mas ya, terei sempre esse desvio.

Entao terei de usar o Timer 1 para poder ter PWM de 10 bits.

CUmps
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 26 de Fevereiro de 2013, 22:32
Uma pergunta, no codigo postado o facto de se haver uma interrupação cada vez que o adc faz uma conversão, nao diminui a frequencia de PWM?

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) {
DDRB |= (1<<PB1); // Definir o pino digital 6 como OUTPUT
DDRB |= (1<<PB2);


// 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
TCCR1A = ((1<<COM1A1)|(1<<COM1B1)|(1<<WGM11)|(1<<WGM10)); // Enable pwm in both timer 1 pins with phase correct pwm
TCCR1B = (1<<CS10); // No prescaled clock, feed 16Mhz to the timer
OCR1A = 0;
OCR1B = 0;// This is to avoid stupid noises from the motors, and init the values

for(;;) {// Ciclo eterno
if((adc > 0) & (adc < 100))
OCR1A = 100;
OCR1B = 100;
if(adc > 100)
OCR1A = 1000;
OCR1B = 1000;
}
}

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

}

Fogo ando aqui as voltas e não consigo meter um motor a rodar  >:(
So ouço zumbidos :P
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 26 de Fevereiro de 2013, 22:37
Não, são interrupções, não são delays em software nem nada do género.
Mas usar interrupções para o adc, não me parece necessário.
E isto:
Código: [Seleccione]

for(;;) {// Ciclo eterno
if((adc > 0) & (adc < 100))
OCR1A = 100;
OCR1B = 100;
if(adc > 100)
OCR1A = 1000;
OCR1B = 1000;
}

Devia ser:

Código: [Seleccione]

for(;;) {// Ciclo eterno
if((adc > 0) & (adc < 100)){
   OCR1A = 100;
   OCR1B = 100;}

if(adc > 100) {
   OCR1A = 1000;
   OCR1B = 1000;}
}
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 02 de Março de 2013, 21:34
Obrigado senso, ja corrigi.

Troquei a breadboard por outra e troquei os bc337 por tip122 e ja consegui meter os motores a rodar :D

EDIT:
Roda mas nao roda continuamente, as vezes tem falhas...
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 02 de Março de 2013, 22:09
Osciloscópio e vê o que se passa.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 02 de Março de 2013, 22:23
Ja sei o que era... maus contactos na breadboard. As breadboards às vezes tornam-se inimigas dos seus donos :P

Agora é hora de experimentar a ligar um L298...
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 03 de Março de 2013, 01:37
Ja montei o L298 e funciona bem com uma boa velocidade mesmo apenas com 5V em Vc.

Mas ao tentar fazer uma brincadeira com o codigo nao dá nada :P Queria que andasse pa frente, depois passado 5s virar, etc...

Código: [Seleccione]
#include <avr/io.h>
#define F_CPU 160000000UL
#include <util/delay.h>

int main(void) {

DDRB |= (1<<PB1);
DDRB |= (1<<PB2);
DDRB |= (1<<PB3);
DDRB |= (1<<PB4);

while(1){
_delay_ms(5000);
PORTB |= (1<<PB1);
PORTB |= (0<<PB2);
PORTB |= (1<<PB3);
PORTB |= (0<<PB4);

_delay_ms(5000);
PORTB |= (0<<PB1);
PORTB |= (1<<PB2);
PORTB |= (1<<PB3);
PORTB |= (0<<PB4);


_delay_ms(5000);
PORTB |= (0<<PB1);
PORTB |= (1<<PB2);
PORTB |= (0<<PB3);
PORTB |= (1<<PB4);
}
}

Provavelmente deve estar mal a manipulação dos bits para definir se os pinos de saida ficam a 1 ou a 0, nao?


EDIT:

Assim ja consigo mas pelo que andei a ler não é uma boa tecnica.

Código: [Seleccione]
#define F_CPU 16000000UL

#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>

int main(){           

    DDRB = 0b11111111;         

    while (1) {               

    PORTB = 0b00010100;     
    _delay_ms(3000); 
    PORTB = 0b00010010;     
    _delay_ms(1000); 
PORTB = 0b00001010;
    _delay_ms(3000);
PORTB = 0b00001100;
    _delay_ms(1000);
    }

}
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 03 de Março de 2013, 02:49
Para colocar um bit de um registo a um:
Código: [Seleccione]
PORTA |= (1<<PA1);

Colocar um bit de um registo a zero:
Código: [Seleccione]
PORTA &= ~(1<<PA1);

Vai ler a parte dos meus tutoriais sobre bitwise math ;)
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 03 de Março de 2013, 15:19
Ja devia era ter lido à mais tempo, muito util :D Ja consegui meter a rodar.

Agora queria fazer um filme para verem mas nao tenho uma alimentação "movel".

Para um robot destes aconselham usar o que? Estava a pensar comprar pilhas recarregaveis e usar 6 pilhas = 7.2V mas acho que talvez deva substituir o L298 por um L293 que deve ter uma queda de tensão mais baixa na alimentação dos motores ou nao? É que eu noto que quando os motores estao a rodar ao mesmo tempo, se parar um deles o outro roda mais rapido ou se colocar um multimetro entre os terminais do motor este reduz a sua velocidade e coisas do genero. Mas isto a funcionar com 5V (que na datasheet do L298 nao é aconselhado).

E ja agora conhecem alguma loja de pilhas/baterias a bom preço.


EDIT:
Encontrei isto na net: http://www.imaging-resource.com/ACCS/BATTS/BATTS.HTM (http://www.imaging-resource.com/ACCS/BATTS/BATTS.HTM)
É sobre pilhas recarregaveis, decidi partilhar que parece interessante.


Encontrei estas no ebay UK:
http://viewitem.eim.ebay.pt/8-x-Energizer-AA-EXTREME-Rechargeable-Batteries-2300-mAh-Pre-Charged-NiMH-LR6/290672310972/item (http://viewitem.eim.ebay.pt/8-x-Energizer-AA-EXTREME-Rechargeable-Batteries-2300-mAh-Pre-Charged-NiMH-LR6/290672310972/item)

20€ 8 pilhas Energizer de 2300mah. Acho que fico bem servido por um preço bem barato comparando com as que encontro por ca (19€ 4 pilhas iguais)...
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 03 de Março de 2013, 17:25
Eu para o meu, e para usar por casa comprei LiPos 3S de 1300mAh, pouco maiores que duas pilhas AA, mas com muito mais energia e capacidade, e um carregador, 3 baterias, um saco de fichas macho e fêmea para fazer cabos e o carregador, não gastas 40€.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 03 de Março de 2013, 17:38
Isso seria uma boa opção. Estive a ver no hobbyking e existem bons preços com essas características.

Essa de 1300mah comparadas com as 2300mah sao muito mais eficientes, apesar de terem menos mah's?

10C, 25C, etc... é a corrente capaz de debitar por hora certo?

Essas baterias depois precisam de um circuito que avise caso a carga esteja no final que nao devem descarregar totalmente, se nao podem-se tornar perigosas ou diminuir em muito o tempo de vida, ou não?

Sabes alguma loja barata onde possa comprar? QUanto se paga de portes na hobbyking?

--------

Ainda tenho de pensar quais comprar que estas recarregáveis "normais" depois servem para outro aparelhos que tenho ca por casa.
Título: Re: Projecto - Introdução à Robotica
Enviado por: Hugu em 03 de Março de 2013, 21:26
que pilhas pretendes? qual a capacidade minima?

eu tenho dakelas de 3.7V, as BRC ou 18650, sao de 4000mAh e ja so tenho 4 em stock...
A mauser.pt tb tem mtas pilhas recarregaveis, da nenergy e tb das 18650, se quiseres de lá posso-te poupar nos portes deles.
A sonigate tb tem, mas sao um pouco mais caras. (tb te arranjo de lá)
Título: Re: Projecto - Introdução à Robotica
Enviado por: LuísR.A. em 03 de Março de 2013, 21:34
Isso seria uma boa opção. Estive a ver no hobbyking e existem bons preços com essas características.

Essa de 1300mah comparadas com as 2300mah sao muito mais eficientes, apesar de terem menos mah's?

10C, 25C, etc... é a corrente capaz de debitar por hora certo?

Essas baterias depois precisam de um circuito que avise caso a carga esteja no final que nao devem descarregar totalmente, se nao podem-se tornar perigosas ou diminuir em muito o tempo de vida, ou não?

Sabes alguma loja barata onde possa comprar? QUanto se paga de portes na hobbyking?

--------

Ainda tenho de pensar quais comprar que estas recarregáveis "normais" depois servem para outro aparelhos que tenho ca por casa.

Para monitorizar as baterias podes usar um comparador. usas um diodo zener num dos comparadores e com um resistencia variavel configuras quando ligar um led que diz se a bateria ta fraca

se uma bateria de litio (que imagino que é a que estás a pensar comprar) descer abaixo de um certo valor então deixa de funcionar. acho que à um método para a arranjar mas mais parece que fica mais barato comprar uma nova. Penso que o valor é 3.2V (não tenho a certeza)
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 03 de Março de 2013, 21:54
Eu se calhar vou optar pelas lipo mas estou um pouco reticente porque tenho lido por foruns de modelismo varios casos de users em que as baterias se incendiaram.
Tambem li que nao devem ser guardadas com carga porque pode acontecer o mesmo.
Serão assim tao perigosas?

Fazer um sistema que avise quando a bateria estiver a ficar fraca penso que seja facil e ate posso construir algo para tambem cortar a alimentação dos motores (fica so o micro a trabalhar que consome muito pouco). Assim fica mais seguro...

Qual é a vossa experiencia com este tipo de baterias?

Título: Re: Projecto - Introdução à Robotica
Enviado por: LuísR.A. em 03 de Março de 2013, 22:00
Com carga explodir? tipo guardadas nunca ouvi nada sobre isso.

apenas não carregues as baterias em acima de 1C (não metas a carreguar acima de, por exemplo, 2Ah se a bateria for de 2000mAh), evita que elas sofram impactos, usa um carregador proprio e programavel com balanceador.

qual vai ser a descarga que vais precisar? se não passares de 1C não deves ter problemas. claro que as baterias boas da hobby aguentam muito mais que 1C

lê isto se tiveres duvidas:
http://www.rchelicopterfun.com/rc-lipo-batteries.html (http://www.rchelicopterfun.com/rc-lipo-batteries.html)
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 03 de Março de 2013, 23:33
Se calhar é apenas um mito :P

O robot terá um micro, dois motores DC e alguns sensores (infra, sonar, ldr, encoders)
Talvez terá um servo motor.

Penso que no total nao deve consumir mais de 1.5A
Neste momento o robot consome com as rodas bloqueadas 800mA.

Portanto uma bateria de 1300mah com 20C pode debitar 26A em 1/20 hora = 3 minutos.
1.5/1.3=1.15 - Portanto consumiria 1.15C em 52 minutos, certo?


http://www.hobbyking.com/hobbyking/store/__28740__Hobbyking_DC_4S_Balance_Charger_Cell_Checker_30w_2s_4s_DE_Warehouse_.html (http://www.hobbyking.com/hobbyking/store/__28740__Hobbyking_DC_4S_Balance_Charger_Cell_Checker_30w_2s_4s_DE_Warehouse_.html)

www.hobbyking.com/hobbyking/store/__16292__ZIPPY_Flightmax_1300mAh_3S1P_20C_DE_Warehouse_.html (http://www.hobbyking.com/hobbyking/store/__16292__ZIPPY_Flightmax_1300mAh_3S1P_20C_DE_Warehouse_.html)

Esse carregador da hobby posso alimenta-lo com uma fonte de ATX?
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 04 de Março de 2013, 10:17
O C é a capacidade que a bateria tem para debitar corrente, por exemplo uma bateria de 1000mAh e 20C pode dar-te 20x1000mAh, ou seja 20A.

Não deves guardar LiPos carregadas totalmente, mas sim a meia carga, os carregadores têm um modo próprio para isso, que se chama adequadamente storage charge.
Título: Re: Projecto - Introdução à Robotica
Enviado por: LuísR.A. em 04 de Março de 2013, 23:37
é melhor usar baterias separadas não? uma para o micro e os sensores e outra para motores e assim?

Para os motores usamos umas de 2Ah e duram bué mesmo. e tipo usamos as mesma para a logica porque os sonares a fazerem tantos disparos consomem bué!
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c em 05 de Março de 2013, 20:45
Nah, ate pode ser melhor mas nao quero usar mais que uma bateria.

E tens quantos sonares?

Pois nao devem ser guardadas com carga total. So espero que um dia nao chegue a casa e esteja tudo a arder :P Se calhar depois guardar a bateria numa caixa metalica num sitio sem materiais inflamáveis é a melhor solução.



 
Título: Re: Projecto - Introdução à Robotica
Enviado por: LuísR.A. 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.
Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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

Título: Re: Projecto - Introdução à Robotica
Enviado por: c3dr1c 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:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi39.tinypic.com%2Fws4m79.png&hash=448ffd083a40afc0544340d35b0c74bc25ea82eb)

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.
Título: Re: Projecto - Introdução à Robotica
Enviado por: senso em 01 de Outubro de 2013, 23:05
Sobre PID:
http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/ (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