portb.0 = 0 ' coloca nivel logico 0 na porta B.0
freq = 13 ' define a velocidade de giro do servo
servo = 140 ' Nr. de pulsos para o servo
servodir = 170 ' 170 angulo de 60 graus -> 185 angulo de 50 graus
servoesq = 110 ' 110 angulo de 60 graus -> 100 angulo de 50 graus
calibrar: ' Rotina de centralização do Servo
if porta.1 = 0 then direita 'repete ' Verifica se o interruptor foi precionado
if porta.0 = 0 then esquerda
servo = 140
gosub central ' Desvia para a rotina CENTRAL
goto calibrar ' volta para a rotina CALIBRAR apos o RETURN
central: ' Centraliza o servo
for temp = 1 to 10 ' efetua um laço de tempo para fixar o servo
pulsout portb.0,servo ' envia um pulso para a portb.0 contido em SERVO
pause freq ' efetua atraso no programa - define vel. do servo
next temp ' incremente o laço for next
return ' RETURN da instrução GOSUB
' ------------- Inicio da Rotina de vai e vem
' A variação de posição se da alterando os pulsos na linhas
' IF servo < XX then repete da rotina repete: e na linha
' IF servo > XX then volta da rotina volta
' Alterando essas duas linha podemos limitar o angulo
' de rotação do servo
direita: ' Inicio da rotina de repetição dos movimentos
pulsout 0, servodir ' envia um pulso para a portb.0 contido em Servo
pause freq ' efetua um atraso no programa
'servo = servo + 1 ' faz um incremento na contagem de pulsos
'if servo > 250 then volta ' checa se o incremento de pulsos chegou a 200
if porta.3 = 0 then calibrar ' Verifica se o botão foi precionado, caso seja
'if porta.1 = 0 then direita
if porta.0 = 0 then esquerda
goto direita ' vai para a rotina calibra
esquerda:
'servo = servo - 1
pulsout 0, servoesq
pause freq
'if servo < 50 then repete
'if PortA.3 = 0 then parar
if porta.3 = 0 then calibrar
if porta.1 = 0 then direita
goto esquerda
parar: ' Rotina de parada do moviemto
pause 300 ' efetua uma pausa no programa mais demorada
pulsout 0,0 ' envia pulso 0 na porta 0
goto calibrar ' volta a rotina calibrar
Como podemos observar o codigo fonte para executar o nosso propostio possui 44 linhas de comando, a diferença esta somente em 9 linhas com relação ao exemplo anterior, onde setamos o microcontrolador e suas variaveis e toda a rotina de leitura da tecla de incio do progrma. No quadro 1 temos a definição das variaveis do programa.
temp var byte ' inicializa as variaveis freq var byte servo var byte servodir var byte servoesq var byte
portb.0 = 0 ' coloca nivel logico 0 na porta B.0 freq = 13 ' define a velocidade de giro do servo servo = 140 ' Nr. de pulsos para o servo servodir = 170 ' 170 angulo de 60 graus -> 185 angulo de 50 graus servoesq = 110 ' 110 angulo de 60 graus -> 100 angulo de 50 graus
|
Quadro 1
Comandos do PICBasic Utilizados:
Var Byte - utilizado para definir uma variavel tipo Byte
portb.0 - define o estado logico de saida de uma determinada porta do microcontrolador
No quadro 1 temos a inicializaçã das variaveis utilizadas no programa, são elas [ temp, freq, servo, servodir, servoesq ], atraves das definições da variaveis podemos continuar o estudo sobre o programa exemplo. Passemos ao quadro 2.
|
calibrar: ' Rotina de centralização do Servo if porta.1 = 0 then direita 'repete ' Verifica se o interruptor foi precionado if porta.0 = 0 then esquerda servo = 140 gosub central ' Desvia para a rotina CENTRAL goto calibrar ' volta para a rotina CALIBRAR apos o RETURN
central: ' Centraliza o servo for temp = 1 to 10 ' efetua um laço de tempo para fixar o servo pulsout portb.0,servo ' envia um pulso para a portb.0 contido em SERVO pause freq ' efetua atraso no programa - define vel. do servo
next temp ' incremente o laço for next return ' RETURN da instrução GOSUB |
Quadro 2
Comandos do PICBasic Utilizados:
If... - testa uma condição
gosub - desvia para uma rotina , executa a rotina e volta
goto - desvia para uma rotina, executa e presegue
for , next - executa um laço de contagem tipo for next
pause - faz uma pausa no programa
pulsout - envia um pulso para a saida
No quadro 2 é mostrado duas rotinas especificas em nosso programa sendo que a rotina "calibra" é responsavel por manter o servo na posição central enaunto que a rotina "central" posiciona o servo no meio independente da posição que o mesmo estiver parado inicialmente. Para finalizar no quadro 3 temos a parte final de nosso programa inicial. Perceba que nada muda neste programa em relação ao programa do exemplo da pagina anterior.
|
direita: ' Inicio da rotina de repetição dos movimentos pulsout 0, servodir ' envia um pulso para a portb.0 contido em Servo pause freq ' efetua um atraso no programa 'servo = servo + 1 ' faz um incremento na contagem de pulsos 'if servo > 250 then volta ' checa se o incremento de pulsos chegou a 200 if porta.3 = 0 then calibrar ' Verifica se o botão foi precionado, caso seja 'if porta.1 = 0 then direita if porta.0 = 0 then esquerda goto direita ' vai para a rotina calibra
esquerda: 'servo = servo - 1 pulsout 0, servoesq pause freq 'if servo < 50 then repete 'if PortA.3 = 0 then parar if porta.3 = 0 then calibrar if porta.1 = 0 then direita goto esquerda parar: ' Rotina de parada do moviemto pause 300 ' efetua uma pausa no programa mais demorada pulsout 0,0 ' envia pulso 0 na porta 0 goto calibrar ' volta a rotina calibrar
|
Quadro 3
No quadro 3 temos a finalização do programa dividido em tres (3) rotinas, sendo elas a rotina [direita], a rotina [esquerda] e rotina [parar]. Observe os comentarios de cada linha para um perfeito entendimento do codigo fonte.
Na sequencia temos o codigo fonte ja compilado e no formato .HEX, o qual devera ser programado dentro do microcontrolador, figura 3.

Figura 3
Terminamos o nosso segundo projeto com caracteristica puramente educacional, para os iniciantes ter uma pequena amostra de como utilizar as ferramentas disponiveis no mercado. Nosso proximo passo é descrever o projeto de um ROBO de seis patas, o qual batizamos ele de ROBO FORMIGA.
PicBasic PRO-1 Robo de 6 Patas