LusoRobótica - Robótica em Português
Sistemas específicos => Picaxe => Tópico iniciado por: daniela em 09 de Abril de 2010, 19:16
-
Olá, :)
Sou estudante do Curso Profissional de Electrónica, Automação e Computadores, e estou no último ano. Por isso estou a desenvolver a PAP, escolhi o robô bombeiro.
Estou a usar 3 sensores de ultra-som (SRF04), para o robô se desviar dos obstáculos, um sensor térmico (TPA81), para detectar a temperatura da vela e um sensor seguidor de pista (axe 121), para detectar uma linha branca. Isto tudo programado com o picaxe 28x1.
Mas ando com alguns problemas em desenvolver o programa do sensor de obstáculos. :-[ :'( Não consigo fazer o programa para o robô se desviar das paredes com os 3 sensores de ultra-som, um no lado esquerdo, outro no centro e outro no lado direito. Estou mesmo com muitas dificuldades e não estou a conseguir avançar no projecto por causa deste problema. Preciso muito que alguém me ajude com o programa do robô se desviar dentro das paredes, quem tiver alguma informação sobre este assunto me diga qualquer coisa.
Esta informação é mesmo urgente, quem me poder ajudar agradecia bastante. ;D
Obrigado
Daniela Fialho
;)
-
Bem-vinda :)
Tu tens a certeza que os sensores de ultra-som estão a funcionar bem?
Faz um teste simples que é sempre que passas com a mão à frente de um sensor acendes um led.
-
Sim os sensores funcionam bem.
Se eu usar o programa em baixo vejo se os sensores funcionam bem, diz-me a distancia de um obstáculo, o meu problema está mesmo na programação destes sensores para andarem dentro da maqueta não batendo em nada e irem percorrendo até encontrar a vela.
symbol in = 1
symbol out = 5
symbol comprimento = w1
Sonar:
pulsout in,2
pulsin out,1,comprimento
pause 10 '
let comprimento = comprimento * 10/62
debug
goto sonar
-
Normalmente o algoritmo usado é se encontrou algo então vira para o lado. Por exemplo se o sensor da direita detecta algo então vira para a esquerda, se o sensor da frente detecta algo então anda para trás e roda para um dos lados, etc.
-
Boa noite :D
Fiz um programa para o robô com a ajuda de outros e gostaria que alguém visse e disse-se alguma coisa. Se tiver bem ou mal ou se necessitar de modificações digam.
w1 = 0
w2 = 0
w3 = 0
symbol centro = w1
symbol direita = w2
symbol esquerda = w3
symbol trig = 2
symbol echo = 7
symbol in = 1
symbol out = 5
symbol envia =0
symbol recebe = 6
symbol num = b10
i2cslave $D0,i2cfast,i2cbyte ' Join i2c with TPA81
ligar:
pwmout 1,100,400
pwmout 2,100,400
goto inicio
inicio:
pulsout trig,2
pulsin echo,1,w1
pause 10
let centro = centro * 10/58
pulsout in,2
pulsin out,1,w2
pause 10
let direita = direita * 10/58
pulsout envia,2
pulsin recebe,1,w3
pause 10
let esquerdas= esquerdas * 10/58
goto condicao
condicao:
if pin2=1 or pin3=1 or pin4=1 then procurarvela
if centro>20 and direita <20 and esquerdas<20 then parede 'prosseguir parede
if centro<20 and direita <20 and esquerdas<20 then esquerda 'rodeado por parede
if centro<20 and direita >20 and esquerdas>20 then esquerda 'objecto a frente
if centro>20 and direita <20 and esquerdas>20 then trasesquerda 'objecto canto direito
if centro>20 and direita >20 and esquerdas<20 then parede 'correcção parede
if centro<20 and direita <20 and esquerdas>20 then tras 'canto
if centro<20 and direita >20 and esquerdas<20 then esquerda 'triangulo
if centro>20 and direita >20 and esquerdas>20 then frente 'prosseguir, sem objecto
goto inicio
frente:
low 6
high 7
high 4
low 5
goto inicio
tras:
high 6
low 7
low 4
high 5
pause 300
goto inicio
direita:
low 6
high 7
low 4
high 5
pause 500
goto inicio
esquerda:
high 6
low 7
high 4
low 5
pause 500
goto inicio
trasdireita:
high 6
low 7
low 4
high 5
pause 500
low 6
high 7
low 4
high 5
pause 300
goto inicio
trasesquerda:
high 6
low 7
low 4
high 5
pause 500
high 6
low 7
high 4
low 5
pause 300
goto inicio
parede:
low 6
high 7
high 4
low 5
if direita<10 and esquerdas<10 then esquerda
if direita>10 and esquerdas<10 then direitafrente
if direita<10 and esquerdas>10 then esquerda
if direita>10 and esquerdas>10 then frentedireita
goto inicio
frentedireita:
low 0
high 1
high 2
low 3
pause 500
low 0
high 1
low 2
high 3
pause 300
goto senses
senses:
pulsout trig,2
pulsin echo,1,centro
pause 10
let centro = centro * 10/58
pulsout in,2
pulsin out,1,direita
pause 10
let direita= direita* 10/58
goto parede
direitafrente:
low 0
high 1
low 2
high 3
pause 300
goto frente
procurarvela:
gosub vela
if b2 > 30 or b3 > 30 or b4 > 30 or b5 > 30 or b6 > 30 or b7 > 30 or b8 > 30 or b9 > 30 then acheiavela
if b2 < 30 or b3 < 30 or b4 < 30 or b5 < 30 or b6 < 30 or b7 < 30 or b8 < 30 or b9 < 30 then naoseidavela
goto procurarvela
naoencontrouvela:
high 6
low 7
low 4
high 5
pause 700
high 7
low 6
low 5
high 4
pause 100
goto inicio
encontrouvela:
high 7
low 6
low 5
high 4
pause 100
low 7
low 6
low 5
low 4
goto medirvalores
medirvalores:
if pin2=1 or pin3=1 or pin4=1 then extinguir
if centro>20 and direita <20 and esquerdas<20 then parede1 'prosseguir parede
if centro<20 and direita <20 and esquerdas<20 then esquerda1 'rodeado por parede
if centro<20 and direita >20 and esquerdas>20 then esquerda1 'objecto a frente
if centro>20 and direita <20 and esquerdas>20 then trasesquerda1 'objecto canto direito
if centro>20 and direita >20 and esquerdas<20 then parede1 'correcção parede
if centro<20 and direita <20 and esquerdas>20 then tras1 'canto
if centro<20 and direita >20 and esquerdas<20 then esquerda1 'triangulo
if centro>20 and direita >20 and esquerdas>20 then frente1 'prosseguir, sem objecto
stop
segundacondicao:
frente1:
low 6
high 7
high 4
low 5
goto medirvalores
tras1:
high 6
low 7
low 4
high 5
pause 300
goto medirvalores
direita1:
low 6
high 7
low 4
high 5
pause 500
goto medirvalores
esquerda1:
high 6
low 7
high 4
low 5
pause 500
goto medirvalores
trasdireita1:
high 6
low 7
low 4
high 5
pause 500
low 6
high 7
low 4
high 5
pause 300
goto medirvalores
trasesquerda1:
high 6
low 7
low 4
high 5
pause 500
high 6
low 7
high 4
low 5
pause 300
goto medirvalores
parede1:
low 6
high 7
high 4
low 5
if direita<10 and esquerdas<10 then esquerda
if direita>10 and esquerdas<10 then direitafrente
if direita<10 and esquerdas>10 then esquerda
if direita>10 and esquerdas>10 then frentedireita
goto medirvalores
frentedireita1:
low 0
high 1
high 2
low 3
pause 500
low 0
high 1
low 2
high 3
pause 300
goto senses1
senses1:
pulsout trig,2
pulsin echo,1,centro
pause 10
let centro = centro * 10/58
pulsout in,2
pulsin out,1,direita
pause 10
let direita= direita* 10/58
goto parede1
direitafrente1:
low 0
high 1
low 2
high 3
pause 300
goto frente1
vela:
for b0 = 0 to 10 ' Start a loop that increases value b0
i2cwrite 0,(b0) ' Write value of b0 to command register, this will move the servo
gosub getTemp ' Goes to a sub routine that gets the temperature
pause 200
next b0
for b0 = 11 to 1 step -1 ' Start loop that decreases value of b0
i2cwrite 0,(b0) ' Write value of b0 to command register, this moves the servo
gosub getTemp ' Get the temperature
pause 200
next b0
return
getTemp: i2cread 2,(b2,b3,b4,b5,b6,b7,b8,b9) ; Read the 8 temperature bytes starting at address 2
; print results to picaxe debug screen
return
extinguir:
high 5 'ligar ventoinha 10 segundos
for num=1 to 5
low 6
high 7
low 4
high 5
pause 1000 'tempo de rotação
high 6
low 7
high 4
low 5
pause 1000 'tempo rotação
next
low 5
high 6
low 7
low 4
high 5
pause 1000
high 6
low 7
high 4
low 5
pause 1000
goto inicio
-
Alguém aqui já fez o robô bombeiro?
Se alguém fez fale comigo PLEASE :'(
P.S. Urgente
-
http://robobombeiro.blogspot.com/ (http://robobombeiro.blogspot.com/)
tens aqui um blog dum robot bombeiro, encontrei-o neste forum: http://www.forum.electronicapt.com/ (http://www.forum.electronicapt.com/) , no entanto acho que ele não mensiona qualquer tipo de informação sobre a programação que utilizou.., mas vê o blog e talvez te ajude..
eu se estivesse no teu lugar procurava procurar informação( a nivel de programação mais expecialmente) sobre os componentes que não funcionam no teu projecto ( se bem percebi são os sensores para o robot se desviar de obstaculos), e depois de perceberes isso então tentas adaptar ao teu projecto..
o guibot ja fez alguns projectos desses por exemplo, lembro -me de ver ai no forum..
http://lusorobotica.com/index.php?topic=2009.0 (http://lusorobotica.com/index.php?topic=2009.0)
mas deve haver outros, basta procurares..
boa sorte com o projecto ;)
-
Boas pessoal!!!!
hoje decidi fazer uma pesquisa no google sobre o robot bombeiro e acabei por encontrar este forum.... sei que ja passou quase um mes desde que postaram as duvidas, mas se ainda necessitarem de auxilio seja de hardware ou software estarei pronto a ajudar... vejo que programam em picaxe que é mais facil para mim!!!
aguardo questões, espero poder vir a ajudar!!!! ;)
-
:)
Fico muito contente em alguém me tentar ajudar. O meu grande problema k está a ser resolvido aos poucos é o robô se mover dentro da maquete. A maquete não tem as mesmas medidas nas divisões se calhar por isso está a ser tão complicado. Mas também não há possibilidades de nesta altura ir fazer uma maquete com as mesmas medidas exactas. Agora não tenho possibilidades de mandar já o programa k tenho e k está a funcionar, mas quando estiver em casa posto aqui para dizeres-me o k axas e no k posso melhorar. Ele já se move +- dentro da maquete mas ainda tem pequenos problemas, por exemplo vira pouco e raspa um bocadito na parede ou anda muito em frente e não vira logo quando deve.
Também se me podesses mandar algum programa como exemplo para me guiar agradecia e só mais uma coisita eu queria k ele andasse sempre encostado à parede mais à direita sabes como se pode por ele a fazer isso?
Fico à espera de resposta.
Obrigada, Daniela Fialho :D
PS.: se poderes manda um programa já feito no picaxe de um robô que se desvie dentro de uma maquete, como por exemplo outro bombeiro ou o de labirinto.
-
Olá Daniela!!!
A respeito do problema em que te encontras pedia que fosses um pouco mais expecifica pois fico sem perceber quando é que surge essa falha, se é no simples percorrer do corredor, deslocar-se dentro dos compartimentos, e/ou na mudança de direcção...
Mesmo assim tento dar uma dica, pode ser derivado a vários motivos tais como compensações nos motores ao virar/rodar (quando insuficiente cria um enorme atraso como tu própria dizes "não vira logo quando deve", quando abusiva numa pequena compensação que seja ele acaba por se atravessar no corredor lendo os valores dos sonares com valores absurdos devido "reflexão" do ultra-som ), atraso de leitura nos sonares (uma vez que ainda demoram talvez quase meio segundo a ler os 3 ultra sons) , ou então o mais vulgar, problema que eu mesmo tive é a leitura dos sonares derivado as compensações em que na qual quando compensava ele chegava a um ponto que mesmo um pouco atravessado no corredor ele comparava os sonares laterais tendo o mesmo valor....
Quanto ao por o Robot a andar o mais a direita possível basta estipulares uma distancia da parede em que queiras que o robot ande (por exemplo circular a 8cm da parede, atenção que este valor deve-se ajustar ao tamanho da maquina) e quando esse valor for excedido comparando-o com a leitura actual nesse caso de se seguir pela direita compensa acelerando um pouco mais o lado esquerdo, quando esse valor de leitura for menor do que o estipulado acelera o lado direito...
Ex.:
segueparede:
gosub sonar_right ;lê o valor de distancia do ultra som da direita memorizando-o na variável “range_tight”
if range_right = distanciaparede then frente
if range_right > distanciaparede then compensaparadireita
if range_right < distanciaparede then compensaparaesquerda
goto segueparede
-
Olá! Mando o programa tal como tinha dito, este é o programa de se desviar. Eu vou ver se consigo arranjar uma maneira de te explicar melhor os meus problemas.
symbol in = 1
symbol out = 5
symbol envia =0
symbol recebe = 6
inicio:
pulsout trig,2
pulsin echo,1,centro
pause 10
let centro = centro * 10/58
pulsout in,2
pulsin out,1,direitas
pause 10
let direitas = direitas * 10/58
pulsout envia,2
pulsin recebe,1,esquerdas
pause 10
let esquerdas= esquerdas * 10/58
debug
goto condicao
condicao:
if porta pin0=1 or pin1=1 or pin2=1 then procurarvela
if centro <= 9 and direitas >5 and esquerdas >=10 then esquerdar
if centro <= 9 and direitas < 5 and esquerdas >=10 then direitar
if centro < 9 and direitas > 5 and esquerdas > 10 then esquerda
if centro < 9 and direitas < 5 and esquerdas > 10 then esquerda
if centro > 9 and direitas > 5 and esquerdas > 10 then direita
if centro > 9 and direitas < 5 and esquerdas > 10 then esquerda
if centro > 9 and direitas = 5 and esquerdas > 10 then frente
goto inicio
frente:
low 6
high 7
high 5
low 4
pwmout 1,100,250
pwmout 2,100,250
goto inicio
esquerda:
if direitas> 10then direitar
low 6
high 7
high 5
low 4
pwmout 1,100,310
pwmout 2,100,250
goto inicio
goto inicio
direita:
low 6
high 7
high 5
low 4
pwmout 1,100,250
pwmout 2,100,310
goto inicio
esquerdar:
high 7
low 6
low 5
high 4
pwmout 1,130,275
pwmout 2,130,275
goto inicio
direitar:
low 7
high 6
high 5
low 4
pwmout 1,100,275
pwmout 2,100,275
goto inicio
-
Boas!!!! encontro-me a "analisar" o teu programa e acontece que ate estou curioso o porque de certos "if´s" assim como muitos dos que tens nunca serao verdadeiros... por exemplo
if centro <= 9 and direitas >5 and esquerdas >=10 then esquerdar
(...)
if centro < 9 and direitas > 5 and esquerdas > 10 then esquerda
uma vez que por exemplo, centro = 8, direitas = 7, esquerdas = 15 obviamente a primeira é logo verdadeira fazendo-a, e uma vez que depois de feita a rotina no "goto" tu nadas logo para o inicio recomeçando, logo ela nunca fará esta condição.
quanto ao facto de querer seguir parede como obvio é o primeiro objectivo porque nao fazes comparar os lados ex:
if direitas > esquerdas then direita
if direitas < esquerdas then esquerda
if direitas = esquerdas then frente
if centro < 9 then
if direitas > 15 (valor a ajustar conforme a largura do robot) then viraesquerda
if esquerda > 15 (valor a ajustar conforme a largura do robot) then viradireita
endif
este "segue-parede" pode vir a originar um problema que eu tive deridavo as componcsações terem de ser "exactas"
...
-
uma outra opção de programação
if direitas = 9 then frente
if direiras > 9 then direita
if direitas < 9 then esquerda
(para saber se tem alguma divisão ao longo do corredor)
if direitas > 15 then viradireita
if esquerdas > 15 then vira esquerdas
endif
-
Boa Noite.
Agora como estou em estágio só consigo testar o programa no fim de semana.
No fim de semana dou novidades. ;)
Obrigado pela ajuda :D
Daniela Fialho