'************************************************* '* Programa Lixobô.bas '* Desenvolvido por Márcio José Soares '* Revista Mecatrônica Fácil '************************************************* ' '************************************************* '* Controla robô Lixobô '* 3 servos: 1 de rotação e 2 de posição '* servos para posicionamento de antena parabólica '************************************************* ' '************************************************* '* Presente display serial Symphony '* operando a 9600,N,8,1 '* ligado diretamente a PD1 '************************************************* ' '************************************************* '* Para usar display serial Tato '* operando a 4800,N,8,1 '* ligado diretamente a PD1 '* alterar valor em $baud para 4800 '* As funções de controle do display '* também deverão ser alteradas, de acordo '* com os comandos presentes no manual do '* LCD da Tato Equipamentos Eletrônicos '* '* Obs: Lcd's seriais que com velocidade de 2400 '* não podem ser utilizados neste projeto '************************************************* ' ' '************************************************* '* cristal presente no Fast Basic e Step 2K - 10MHz '************************************************* $baud = 9600 $crystal = 10000000 $noramclear '************************************************* '* declaração de subrotinas e variáveis '************************************************* '* subrotinas '************************************************* ' ' Declare Sub Apaga_disp() Declare Sub Atampa() Declare Sub Centro() Declare Sub Desvia_robo(byval Dir As Byte) Declare Sub Ftampa() Declare Sub Imp_comando(byval C As Byte) Declare Sub Msg_lixo() Declare Sub Msg_obst() Declare Sub Msg_pronto() Declare Sub Para() Declare Sub Pfrente() '************************************************* '* variáveis '************************************************* Dim I As Byte Dim J As Integer Dim K As Byte '************************************************* '************************************************* '* configura servos '* servo1 -> rotação -> movimento do robô '* servo2 -> posição -> direção do robô '* servo3 -> posição -> abre a tampa da lixeira '************************************************* Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10 '************************************************* '* configura portas '* porta B '* PB0 - servo de rotacao '* PB1 - servo de posicao - direcao '* PB2 - servo de posicao - tampa '* PB3 - disparo do sensor IR '* PB4 - sinal de entrada do sensor IR '* PB5 - sinal de entrada do sensor de som '* PB6 - led 1 '* PB7 - led 2 '* '* porta D '* PD0 - nao utilizado '* PD1 - saida para display serial '* PD2 - saida para beep '* PD3 - bumper de colisão direito '* PD4 - bumper de colisão esquerdo '* PD5 - nao utilizado '* PD6 - nao utilizado '************************************************* Config Portb = &B11001111 Config Portd = &B11100110 '************************************************* '* habilta interrupção. Necessário devido ao uso do '* Timer0 para o comando Servo '************************************************* Enable Interrupts 'habilita int's Servo(1) = 45 'robô parado Servo(2) = 100 'direção a frente Servo(3) = 145 'tampa fechada Wait 2 'aguarda Display Symphony Waitms 200 'espera um tempo e inicializa servos Set Portb.6 'liga led's Set Portb.7 '************************************************* '* programa principal '************************************************* '* loop infinito '************************************************* Do Do Waitms 250 Call Msg_pronto() 'insere mensagem no display Call Para() 'robo parado Call Centro() 'direção a frente Call Ftampa() 'tampa fechada Toggle Portb.6 'inverte led's Toggle Portb.7 If Pinb.5 = 0 Then 'som detectado, hora da coleta!!! Exit Do 'sai do loop End If Loop Set Portb.6 'liga led 1 Reset Portb.7 'desliga led 2 For I = 5 To 10 Step 1 'emite beep`s J = I * 20 Sound Portd.2 , 300 , J Waitms 100 Next I K = 0 While K <= 60 'faz 60 vezes Set Portb.3 'liga sensor IR Call Msg_lixo() 'insere mensagem no display Call Pfrente() 'move para frente Call Centro() 'sempre a frente Call Atampa() 'com tampa aberta Toggle Portb.6 'inverte led's Toggle Portb.7 If Pinb.4 = 0 Then 'obstáulo detectado com IR Call Desvia_robo(1) End If If Pind.3 = 0 Then 'obstáculo detectado com bumper direito Call Desvia_robo(2) End If If Pind.4 = 0 Then 'obstáculo detectado com bumper esquerdo Call Desvia_robo(1) End If Waitms 250 'espera 60 x 250ms = 15 segundos K = K + 1 'soma mais um Wend Loop '************************************************* '* subrotinas do programa '************************************************* '************************************************* '* subrotinas de controle do robô '************************************************* 'desvia robô Sub Desvia_robo(dir As Byte) Set Portb.6 'liga leds Set Portb.7 Reset Portb.3 'desliga sinal IR. Desliga emissor Call Para() 'pára o robô Call Msg_obst() 'insere mensagem no display For I = 15 To 1 Step -1 'emite beep`s J = I * 10 Sound Portd.2 , 200 , J Waitms 60 Next 'demonstra como mover servo sem uso da INT Disable Interrupts 'desabilita int For I = 1 To 100 'desvia para direita ou esquerda Set Portb.1 'levanta pulso If Dir = 1 Then 'testa direção Waitus 2000 'duração do pulso Else Waitus 1000 'duração do pulso End If Reset Portb.1 'abaixa pulso Waitms 5 'aguarda para fazer novamente Next For J = 1 To 10 'move para tras For I = 1 To 100 Set Portb.0 'levanta pulso Waitus 2500 'aguarda Reset Portb.0 'abaixa pulso Waitms 5 'aguarda para fazer novamente Next Next Enable Interrupts 'habilita int novamente Call Para() 'pára robô Waitms 100 Set Portb.6 'liga leds Reset Portb.7 End Sub '************************************************* '* subrotinas de controle do display Symphony '************************************************* 'imprime mensagens no display Sub Msg_obst() Call Apaga_disp() 'apaga display Print " Obstaculo"; Call Imp_comando(&H0d) 'muda de linha Print " Detectado"; End Sub Sub Msg_lixo() Call Apaga_disp() 'apaga display Print "Jogue o lixo na"; 'envia dados Call Imp_comando(&H0d) 'muda de linha Print " Lixeira!"; End Sub Sub Msg_pronto() Call Apaga_disp() 'apaga display Print " Robo Lixobo"; 'envia dados Call Imp_comando(&H0d) 'muda de linha Print " Pronto!"; End Sub 'envia comando para display Sub Imp_comando(byval C As Byte) Printbin &HFE ; C; 'envia comando ao display Waitms 10 'aguarda p/ display tratar End Sub 'apaga display Sub Apaga_disp() Call Imp_comando(&H01) 'chama subrotina para enviar End Sub '************************************************* '* subrotinas de controle dos servos '************************************************* 'move robô a frente Sub Pfrente() Servo(1) = 10 End Sub 'pára o robô Sub Para() Servo(1) = 45 End Sub 'desvia robô para o centro Sub Centro() Servo(2) = 100 End Sub 'abre a tampa da lixeira Sub Atampa() Servo(3) = 50 End Sub 'fecha a tampa da lixeira Sub Ftampa() Servo(3) = 145 End Sub End 'fim do programa