collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


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


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


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]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Robô Bombeiro  (Lida 7968 vezes)

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

Offline daniela

  • Mini Robot
  • *
  • Mensagens: 6
Robô Bombeiro
« 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
 ;)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Robô Bombeiro
« Responder #1 em: 10 de Abril de 2010, 01:23 »
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.

Offline daniela

  • Mini Robot
  • *
  • Mensagens: 6
Re: Robô Bombeiro
« Responder #2 em: 10 de Abril de 2010, 11:24 »
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.

 
Código: [Seleccione]
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
« Última modificação: 10 de Abril de 2010, 12:10 por TigPT »

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Robô Bombeiro
« Responder #3 em: 10 de Abril de 2010, 12:27 »
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.

Offline daniela

  • Mini Robot
  • *
  • Mensagens: 6
Re: Robô Bombeiro
« Responder #4 em: 10 de Abril de 2010, 23:06 »
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.

Código: [Seleccione]
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
« Última modificação: 10 de Abril de 2010, 23:46 por TigPT »

Offline daniela

  • Mini Robot
  • *
  • Mensagens: 6
Re: Robô Bombeiro
« Responder #5 em: 12 de Abril de 2010, 22:30 »
Alguém aqui já fez o robô bombeiro?
Se alguém fez fale comigo PLEASE :'(

P.S. Urgente

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robô Bombeiro
« Responder #6 em: 12 de Abril de 2010, 22:41 »
http://robobombeiro.blogspot.com/

tens aqui um blog dum robot bombeiro, encontrei-o neste forum: 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

mas deve haver outros, basta procurares..
boa sorte com o projecto ;)
cumprimentos,
Fred

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: Robô Bombeiro
« Responder #7 em: 04 de Maio de 2010, 21:48 »
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!!!!  ;)
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline daniela

  • Mini Robot
  • *
  • Mensagens: 6
Re: Robô Bombeiro
« Responder #8 em: 05 de Maio de 2010, 09:25 »
:)
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.

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: Robô Bombeiro
« Responder #9 em: 05 de Maio de 2010, 14:12 »

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

que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline daniela

  • Mini Robot
  • *
  • Mensagens: 6
Re: Robô Bombeiro
« Responder #10 em: 05 de Maio de 2010, 22:05 »
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

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: Robô Bombeiro
« Responder #11 em: 05 de Maio de 2010, 22:37 »
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"


...

que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: Robô Bombeiro
« Responder #12 em: 05 de Maio de 2010, 22:44 »
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
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline tigas_20

  • Mini Robot
  • *
  • Mensagens: 7
Re: Robô Bombeiro
« Responder #13 em: 06 de Maio de 2010, 22:01 »
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