LusoRobótica - Robótica em Português

Robótica => Discussão geral sobre robótica => Tópico iniciado por: joaorobotica em 06 de Maio de 2015, 14:05

Título: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 14:05
Boas, estou a realizar um trabalho de final de curso e precisava de umas ajudas.
Estou a utilizar um kit da bot'n'roll e consegui por o robô a andar em linhas pretas com fundo branco mas preciso de ir mais além disso. Estou a usar o código exemplo que me foi fornecido mas precisava de o colocar a detectar outras cores no chão, e ao fazê-lo preciso que pare e que utilize o buzzer.

Código: [Seleccione]
'Programa de Teste ao Sensor de linha - Abordagem Lógica

'Configuração do PICAXE
setfreq em32 'Frequência de processamento de 32Mhz

'Declaração de variáveis
symbol sensor1=b0
symbol sensor2=b1
symbol sensor3=b2
symbol sensor4=b3
symbol sensor5=b4
symbol sensor6=b5
symbol sensor=b6
symbol direcao = b10 'Direccao actual do robô
symbol direcao_a=b11 'Direcção anterior do robô
symbol duty_d=w8
symbol duty_e=w9

'Definição de constantes
symbol MOTOR_DIR=C.2
symbol MOTOR_ESQ=C.1
symbol SENSOR_LIM=90 'Valor do limiar para atribuição de linha preta
symbol M_TRAS=0
symbol M_ESQUERDA=1
symbol M_FRENTE=2
symbol M_DIREITA=3
'Dispositivos I2C
symbol LCD=$50

setup:
let adcsetup=8 'Selecciona como entradas analógicas os canais ADC0,1,2,3,5,6,7,8
hintsetup %00000000 'Desactiva as 3 interrupções externas
pullup off 'Desativa os "pullups" associados á porta B
pause 1000 'Pausa de 1/4 de segundo

lcd_print:
hi2csetup i2cmaster,LCD,i2cslow_32,i2cbyte 'Configuração do I2Cslave para o LCD
hi2cout [LCD], ("Bot`n Roll ONE C") 'Impressao no LCD
hi2cout [LCD], ($FE,$45,$40)        'Coloca o cusor no início da segunda linha
hi2cout [LCD], (" Seguir a linha ") 'Impressao no LCD
pause 4000 'Pausa de 1s
goto main

main:
gosub le_linha

select sensor
case 1
duty_e=400
duty_d=700
gosub esquerda
case 2
duty_e=450
duty_d=650
gosub frente
case 3
duty_e=650
duty_d=650
gosub frente
case 4
duty_e=650
duty_d=650
gosub frente
case 5
duty_e=650
duty_d=400
gosub frente
case 6
duty_e=700
duty_d=450
gosub direita
endselect

goto  main

dir_test:
if direcao != direcao_a then 'Se direcção actual diferente da direcção anterior
pwmout pwmdiv4, MOTOR_DIR, 199, 0 'MotorD,Frequência_PWM,Potência(0%)->Necessário retirar potência antes de atribuir sentido
pwmout pwmdiv4, MOTOR_ESQ, 199, 0 'MotorE,Frequência_PWM,Potência(0%)->Necessário retirar potência antes de atribuir sentido
let direcao_a=direcao
endif
return

parado:
let direcao=0
pwmout pwmdiv4, MOTOR_DIR, 199, 0 'MotorD,Frequência_PWM,Potência(0%)
pwmout pwmdiv4, MOTOR_ESQ, 199, 0 'MotorE,Frequência_PWM,Potência(0%)
return

frente:
let direcao=1
gosub dir_test '->Necessário retirar potência antes de atribuir novo sentido
low  D.4 'Atribui o sentido ao MotorD
high D.5 'Atribui o sentido ao MotorD
high D.6 'Atribui o sentido ao MotorE
low  D.7 'Atribui o sentido ao MotorE
pwmout pwmdiv4, MOTOR_DIR, 199, duty_d 'MotorD,Frequência_PWM,Potência
pwmout pwmdiv4, MOTOR_ESQ, 199, duty_e 'MotorE,Frequência_PWM,Potência
return

tras:
let direcao=2
gosub dir_test '->Necessário retirar potência antes de atribuir novo sentido
high D.4 'Atribui o sentido ao MotorD
low  D.5 'Atribui o sentido ao MotorD
low  D.6 'Atribui o sentido ao MotorE
high D.7 'Atribui o sentido ao MotorE
pwmout pwmdiv4, MOTOR_DIR, 199, duty_d 'MotorD,Frequência_PWM,Potência
pwmout pwmdiv4, MOTOR_ESQ, 199, duty_e 'MotorE,Frequência_PWM,Potência
return

direita:
let direcao=3
gosub dir_test '->Necessário retirar potência antes de atribuir novo sentido
high D.4 'Atribui o sentido ao MotorD
low  D.5 'Atribui o sentido ao MotorD
high D.6 'Atribui o sentido ao MotorE
low  D.7 'Atribui o sentido ao MotorE
pwmout pwmdiv4, MOTOR_DIR, 199, duty_d 'MotorD,Frequência_PWM,Potência
pwmout pwmdiv4, MOTOR_ESQ, 199, duty_e 'MotorE,Frequência_PWM,Potência
return

esquerda:
let direcao=4
gosub dir_test '->Necessário retirar potência antes de atribuir novo sentido
low  D.4 'Atribui o sentido ao MotorD
high D.5 'Atribui o sentido ao MotorD
low  D.6 'Atribui o sentido ao MotorE
high D.7 'Atribui o sentido ao MotorE
pwmout pwmdiv4, MOTOR_DIR, 199, duty_d 'MotorD,Frequência_PWM,Potência
pwmout pwmdiv4, MOTOR_ESQ, 199, duty_e 'MotorE,Frequência_PWM,Potência
return

le_linha:
readadc 1,sensor1
readadc 2,sensor2
readadc 3,sensor3
readadc 5,sensor4
readadc 6,sensor5
readadc 7,sensor6

if sensor1>SENSOR_LIM then
sensor=1
elseif sensor6>SENSOR_LIM then
sensor=6
elseif sensor2>SENSOR_LIM then
sensor=2
elseif sensor5>SENSOR_LIM then
sensor=5
elseif sensor3>SENSOR_LIM then
sensor=3
elseif sensor4>SENSOR_LIM then
sensor=4
else
sensor=0
endif
return

end

Obrigado!
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: dropes em 06 de Maio de 2015, 14:22
Peço desculpa se entendi mal.

Então estás a fazer um trabalho de fim de curso, compraste um "kit bot'n'roll" e colocaste um "código exemplo"?!

Apareces aqui a pedir ajuda para fazer alterações no código, só deves estar a gozar connosco.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 14:26
Peço desculpa se entendi mal.

Então estás a fazer um trabalho de fim de curso, compraste um "kit bot'n'roll" e colocaste um "código exemplo"?!

Apareces aqui a pedir ajuda para fazer alterações no código, só deves estar a gozar connosco.

Então entendes-te mal, não comprei o kit, a escola forneceu-o, quanto ao código de exemplo é a base com que comecei, não estou a pedir que me façam as alterações apenas estou a solicitar ajuda em como fazê-lo.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: Njay em 06 de Maio de 2015, 14:36
Podes colocar aqui também o código base?
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 14:41
Meh, não tem especificações nenhumas no site  ::)
Que sensores usa isso para seguir linhas?
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 15:05
Como conseguem entender sou muito novato nisto, não vim aqui abusar de ninguém, pesquisei em muitos tópicos e tudo, mas continuo com dificuldades, decidi juntar me para poder falar diretamente e colocar as minhas dúvidas.

Meh, não tem especificações nenhumas no site  ::)
Que sensores usa isso para seguir linhas?

O sensor que utiliza é o seguinte : Pololu QTR-8A
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 15:08
Podes tentar usar valores intermédios, tipo escala de cinzentos, mas esse sensor não sabe o que é cor, é basicamente um led IR e um foto-transistor.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 15:10
Podes tentar usar valores intermédios, tipo escala de cinzentos, mas esse sensor não sabe o que é cor, é basicamente um led IR e um foto-transistor.

Sim , mas ele consegue seguir perfeitamente uma pista com fundo branco e linhas pretas, o que me foi proposto foi continuar com esse plano mas meter uma espécie de peões de cor verde também na pista colado ao chão e parar em cima dele. Não sei se tenho de acrescentar algo ao robô ou se dá com esse mesmo sensor.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 15:15
Já que tens uma barra de 8 sensores, porque não implementar um simples código de barras, se vai a seguir uma linha e lhe aparece outra "linha" 2 sensores ao lado(á direita vamos supor) do que vai a seguir a linha interpreta como para parar, se for do outro lado(á esquerda), interpreta como para voltar para trás.

Tens 8 sensores e dado que quando é uma curva a 90º os sensores todos de um dos lados vão ficar a ver preto, dá para implementar umas dezenas de códigos de barras sem causar confusão no seguimento de uma linha.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 15:20
Por exemplo deixar os 4 sensores centrais a seguir a linha preta tendo os dois sensores laterais desses 4 a registar o fundo de cor branca, e se registar algo uma cor atravessada preta nos 4 outros sensores ele deve parar e retomar a marcha ?
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: Njay em 06 de Maio de 2015, 15:22
Verde é um tom de cinzento, desde que não tenhas que distinguir outras cores deve dar.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 15:28
Verde é um tom de cinzento, desde que não tenhas que distinguir outras cores deve dar.

Eu só preciso de utilizar 3 cores, sendo elas o preto e o branco que são fáceis de distinguir e não há confusão no sensor, e uma auxiliar para o fazer parar e buzinar. Após isso continuar a marcha, mas tenho uma questão, supostamente ele detecta a cor branca/preta como 0/1 ou vice-versa certo ? É possível detectar outra cor para além dessas ? Eu pensei em fazer algo com a seguinte lógica, se o sensor detecta-se uma cor diferente de 0/1 parava. Não sei se é possivel
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 15:41
Código: [Seleccione]
le_linha:
 readadc 1,sensor1
 readadc 2,sensor2
 readadc 3,sensor3
 readadc 5,sensor4
 readadc 6,sensor5
 readadc 7,sensor6

O que é que isto faz?
Quero que me expliques.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 15:44
o readadc lê o valor analógico dos pinos de entrada do microcontrolador, associando aos "sensores" que estão no sensor do seguidor de linha
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 15:51
Então, o valor de cada sensor é só 0/1, ou será algo mais?
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 15:56
Então, o valor de cada sensor é só 0/1, ou será algo mais?

Pois lá está, como já referi entrei neste "mundo" recentemente, ele aqui:
Código: [Seleccione]
readadc 1,sensor1
readadc 2,sensor2
readadc 3,sensor3
readadc 5,sensor4
readadc 6,sensor5
readadc 7,sensor6

Tem o sensor1, sensor2 (etc), mas será que cada um desses lê 0/1's ?

E também não consegui encontrar nada sobre isto "SENSOR_LIM=90" que se encontra na parte de cima do programa na definição das constantes, 'Valor do limiar para atribuição de linha preta' tinha essa definição, mas não sei quais os máximo ou minimos. Se tivesse essa noção depois poderia alterar neste:
Código: [Seleccione]
if sensor1>SENSOR_LIM then
sensor=1
elseif sensor6>SENSOR_LIM then
sensor=6
elseif sensor2>SENSOR_LIM then
sensor=2
elseif sensor5>SENSOR_LIM then
sensor=5
elseif sensor3>SENSOR_LIM then
sensor=3
elseif sensor4>SENSOR_LIM then
sensor=4
else
sensor=0
Fazendo parar o robo quando encontra-se uma linha preta mais longa e os sensores laterais a detectassem.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 16:00
Aconselho-te a ir ler a documentação fornecida no site da Picaxe, e/ou no IDE do mesmo.
readadc faz uma conversão de analógico para digital usar como o nome indica o ADC que se encontra dentro do PIC que estás a usar, esse ADC tem uma resolução de 10 bits(á partida, não faço ideia o modelo do pic, pode ser mais, ou menos, o Picaxe pode passar esse valor para 8 bits, enfim, RTFM).
10 bits representam um valor decimal que pode variar entre 0 e 1023.

O que isso depois faz é comparar o valor lido do respectivo canal do ADC e comparar com outro valor, se a comparação for verdadeira dá um valor á variavel correspondente ao sensor que leu.
Esse 90 é um valor de calibração, ou seja, abaixo de 90 considera preto, acima considera branco.

Ou seja tudo entre 90 e 1023 ele considera branco, estás a ver a ligeira margem para "escala de cinza" que ai tens?
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 16:10
Aconselho-te a ir ler a documentação fornecida no site da Picaxe, e/ou no IDE do mesmo.
readadc faz uma conversão de analógico para digital usar como o nome indica o ADC que se encontra dentro do PIC que estás a usar, esse ADC tem uma resolução de 10 bits(á partida, não faço ideia o modelo do pic, pode ser mais, ou menos, o Picaxe pode passar esse valor para 8 bits, enfim, RTFM).
10 bits representam um valor decimal que pode variar entre 0 e 1023.

O que isso depois faz é comparar o valor lido do respectivo canal do ADC e comparar com outro valor, se a comparação for verdadeira dá um valor á variavel correspondente ao sensor que leu.
Esse 90 é um valor de calibração, ou seja, abaixo de 90 considera preto, acima considera branco.

Ou seja tudo entre 90 e 1023 ele considera branco, estás a ver a ligeira margem para "escala de cinza" que ai tens?

Deixa me ver se entendi direito, Acima de 90 ele considera branco, abaixo de 90 preto, então o 90 vai ser a margem ?

Código: [Seleccione]
if sensor1>SENSOR_LIM then
sensor=1
elseif sensor6>SENSOR_LIM then
sensor=6
elseif sensor2>SENSOR_LIM then
sensor=2
elseif sensor5>SENSOR_LIM then
sensor=5
elseif sensor3>SENSOR_LIM then
sensor=3
elseif sensor4>SENSOR_LIM then
sensor=4
else
sensor=0

Nesse código se eu meter (por exempl)
Código: [Seleccione]
sensor4=SENSOR_LIM then
pause(2000)


Ele quando detecta a cor cinza pára ?
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: StarRider em 06 de Maio de 2015, 16:11
[...]
Estou a usar o código exemplo
[...]

LOL ... tens uma piadas muito giras :) 

Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: joaorobotica em 06 de Maio de 2015, 16:12
[...]
Estou a usar o código exemplo
[...]

LOL ... tens uma piadas muito giras :)

Vir para aqui gozar também é muito giro, podes voltar para onde vieste se nao tens intenção de ajudar.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 16:15
Acho que é ao contrário do que disse, acima de 90 considera de preto, abaixo considera branco, mas de 90 para cima ser preto é estranho.

Só com um = estás a atribuir o valor á variavel e não a comparar, e não estás a usar um if.
E o pause é uma pausa no programa, não aos motores do robot.


E não pescas mesmo nada de programação, pois não?..

Começar por algo muito simples, agarra nisso, e começa de novo.
Começa por imprimir um hello world para um terminal serial, depois lê os sensores e despeja os valores para a porta serial, aproveita e assim vês como é que o sensor reage ás cores.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: StarRider em 06 de Maio de 2015, 16:49

Isto até tinha piada e dava para gozar não fosse o facto de alguém que supostamente está
a fazer um trabalho de FINAL DE CURSO não perceber realmente a ponta de um corno do
que está a fazer ... assim só dá mesmo vontade de CHORAR.  Como é que é possível alguém
chegar ao fim de um curso e nem sequer saber o que é um "if" ????

Não admira que tenha que copiar o código de outros e vir para aqui pedir que lhe façam o
trabalho, isto realmente vai de mal a pior, falta de educação e falta de formação ... enfim
uns tristes.

Boa sorte na vida, bem vais precisar dela...

 
 
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: dropes em 06 de Maio de 2015, 17:12
Verde é um tom de cinzento, desde que não tenhas que distinguir outras cores deve dar.
Sei que o verde anda um bocado cinzento neste campeonato mas daí a ser daltónico é uma grande distância  :P
Sim, podem-se usar sensores LDR para se medirem cores, basta colocar um filtro para que passe a cor desejada (as restantes terão uma tonalidade mais escura, tirando o branco que é a soma delas todas).

Esta leitura tem de ser via analógica com as respectivas tolerâncias!!!
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 17:14
Verde é um tom de cinzento, desde que não tenhas que distinguir outras cores deve dar.
Sei que o verde anda um bocado cinzento neste campeonato mas daí a ser daltónico é uma grande distância  :P
Sim, podem-se usar sensores LDR para se medirem cores, basta colocar um filtro para que passe a cor desejada (as restantes terão uma tonalidade mais escura, tirando o branco que é a soma delas todas).

Esta leitura tem de ser via analógica com as respectivas tolerâncias!!!

Podes sempre fazem uma conversão analógico para digital com uma malha RC e algum código, á lá BasicStamp, basicamente é uma aplicação rudimentar das ADC's MultiSlope dos multimetros de bancada de precisão.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: dropes em 06 de Maio de 2015, 17:31
Sim é possível medir sinais analógicos com uma porta digital, mas não compliques muito que isso ainda tem algum código jeitoso  ;)
Pelo andar deste tópico não ia por aí...
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: Njay em 06 de Maio de 2015, 17:35
Segundo um amigo do google o sensor que ele está a usar tem saídas analógicas.
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: dropes em 06 de Maio de 2015, 17:58
Segundo um amigo do google o sensor que ele está a usar tem saídas analógicas.
Esse amigo também te deve ter dito que o sensor é apenas de proximidade IR, logo detectar cores ou tonalidades de cinzento não creio que funcione...
Lembrei-me à pouco, se a iluminação for com LEDs de cores resulta melhor sem os tais filtros (com calibração de leituras por causa da intensidade reflectida, brilho, etc...)
Título: Re: Bot'n'roll One C - Seguidor de linha - Busca e Salvamento - Picaxe 40x2
Enviado por: senso em 06 de Maio de 2015, 18:00
Segundo um amigo do google o sensor que ele está a usar tem saídas analógicas.

E está a usar readadc, logo está tudo no mundo analógico.

Aliás o sensor digital da Pololu usa uma malha RC e a biblioteca deles(para Arduino) implementa precisamente o que descrevi, carregar condensador, medir tempo de descarga, e temos um valor "analógico" usando simplesmente pinos digitais sem recorrer a um ADC.