'******************************************************************************* '* Programa Lixobo_ab2k.bas '* Desenvolvido por Márcio José Soares '******************************************************************************* ' '******************************************************************************* '* Controla robô Lixobô '* 3 servos: 1 de rotação e 2 de posição '* servos para posicionamento de antena parabólica '******************************************************************************* ' '******************************************************************************* '* Presente display serial da Loja do Arne '* operando a 9600,N,8,1 '* ligado diretamente a PD1 '******************************************************************************* ' '******************************************************************************* '* Configura o Arne Basic 2k '******************************************************************************* $crystal = 10000000 $regfile = "attiny2313.dat" $baud = 9600 $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 Muda_linha(byval Ln 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 1 (direito) '* PD4 - bumper de colisão 2 (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 'laço externo Do 'laço interno 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 do Arne '******************************************************************************* '******************************************************************************* 'Subrotina para apagar LCD Sub Apaga_disp() Printbin &HFE 'coloca LCD em modo comando Waitms 10 'espera processar Printbin &H01 'envia comando Waitms 10 End Sub '******************************************************************************* 'Subrotina para muda de linha no LCD Sub Muda_linha(byval Ln As Byte) Printbin &HFE 'coloca LCD em modo comando Waitms 10 'espera processar If Ln = 1 Then 'se ln é 1 Printbin &H03 'comando HOME Elseif Ln = 2 Then 'mas se for 2 Printbin &H02 'muda para linha 2 End If Waitms 10 End Sub '******************************************************************************* 'imprime mensagens no display 'Obstáculo Detectado Sub Msg_obst() Call Apaga_disp() 'apaga display Print " Obstaculo"; Call Muda_linha(2) 'muda de linha Print " Detectado"; End Sub '******************************************************************************* 'Jogue o ]lixo na Lixeira! Sub Msg_lixo() Call Apaga_disp() 'apaga display Print "Jogue o lixo na"; 'envia dados Call Muda_linha(2) 'muda de linha Print " Lixeira!"; End Sub '******************************************************************************* 'Robo Lixobo Pronto! Sub Msg_pronto() Call Apaga_disp() 'apaga display Print " Robo Lixobo"; 'envia dados Call Muda_linha(2) 'muda de linha Print " Pronto!"; 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