Advertisement
Guest User

URA L-BOT

a guest
Jul 22nd, 2015
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.15 KB | None | 0 0
  1. #include <Servo.h>
  2.  
  3. #define TAM 50
  4. #define TRIG 3
  5. #define ECHO 4
  6. #define BOTAO A5
  7. #define BIP 5
  8. #define SERVO1 13
  9. #define SERVO4 2
  10. #define DMOTOR 500
  11. #define LINHA1 6
  12. #define LINHA2 A3
  13.  
  14. //Inicialização das variaveis de controle.
  15.   //Motor:
  16.   Servo motor1,motor2;
  17.   //Geral:
  18.   char option , comando;
  19.   int flag = 0;
  20.   bool bipgeral=false;
  21.   //Variaveis do modo remoto:
  22.   int seg=0,but=0;
  23.   bool fast;
  24.   char aux;
  25.   bool flag4;
  26.   //Variaveis do modo ultrassom
  27.   int te=0,td=0,t;
  28.  
  29. //Função de Espera (aprimorada para se receber comando de parada durante a espera).
  30. void delay2(int tempo){
  31.   for(int i=0;i<tempo;i++){
  32.     if(Serial.available() && flag4==0){
  33.       if (option == 'c'){
  34.         comando = Serial.read();
  35.         if(comando == 'p' || comando == 's'){
  36.           break;
  37.         }
  38.       }else{
  39.         if(Serial.read() == 's'){
  40.           flag++;
  41.           break;
  42.         }
  43.       }
  44.     }
  45.     delay(1);
  46.   }
  47. }
  48.  
  49. //Função de cálculo da sistância.
  50. int dist(){
  51.   long distance,duration;
  52.   digitalWrite(TRIG, LOW);
  53.   delayMicroseconds(2);
  54.   digitalWrite(TRIG, HIGH);
  55.   delayMicroseconds(10);
  56.   digitalWrite(TRIG, LOW);
  57.   duration = pulseIn(ECHO, HIGH);
  58.   distance = duration/29/2;
  59.   return distance ;  
  60. }
  61.  
  62. //Função de Configuração do Arduino.
  63. void setup(){
  64.   Serial.begin(9600);
  65.   pinMode(TRIG, OUTPUT);
  66.   pinMode(ECHO, INPUT);
  67.   pinMode(BOTAO,INPUT);
  68.   pinMode(BIP,OUTPUT);
  69.   pinMode(LINHA1,INPUT);
  70.   pinMode(LINHA2,INPUT);
  71.   digitalWrite(BOTAO,HIGH);
  72.   for(int i=0;i<TAM;i++){
  73.     v[i]='p'; n[i]='p';
  74.   }
  75.   while(!Serial.available());
  76. }
  77.  
  78. //Função de Repetição do Arduino.
  79. void loop(){
  80.  
  81.   //Inicialização da variaveis de controle.
  82.   option = 'p'; comando='p'; flag = 0; flag4 = 0;
  83.   if(bipgeral==false){
  84.     digitalWrite(BIP,HIGH);
  85.     delay(200);
  86.     digitalWrite(BIP,LOW);
  87.     bipgeral=true;
  88.   }
  89.   //Leitura do comando (Pagina Escolha do Modo) vindo do bluetooth.
  90.   if(Serial.available()){
  91.     option = Serial.read();  
  92.   }
  93.  
  94.   //                                                                                               Modo Remoto  
  95.   if(option=='c'){
  96.     digitalWrite(BIP,HIGH);
  97.     delay2(200);
  98.     digitalWrite(BIP,LOW);
  99.     //Inicializando variaveis
  100.     fast=false;
  101.    
  102.     //Laço de repetição do Modo Remoto:
  103.     while(comando!='s'){
  104.       //Recebe Comando do bluetooth (Verificando se o comando for o mesmo do anterior) (Pagina do Modo Remoto)
  105.       if(Serial.available()){
  106.         comando = Serial.read();
  107.         if(aux!=comando && fast){
  108.           motor1.detach();  
  109.           motor2.detach();
  110.           delay2(DMOTOR);
  111.           if(comando=='s'){
  112.             break;
  113.           }
  114.         }
  115.         aux= comando;
  116.         flag4=0;
  117.       }
  118.    
  119.       //Para frente sem segurança    
  120.       if(comando=='y'){
  121.         fast=true;            
  122.         motor1.attach(SERVO1);
  123.         motor2.attach(SERVO4);
  124.         motor1.write(180);
  125.         motor2.write(0);
  126.       }
  127.      
  128.       //Para frente com segurança:
  129.       seg=11;
  130.       if(comando=='f' && seg>10){
  131.         fast=true;
  132.         seg=dist();
  133.         delay2(50);
  134.         if(comando=='s') break;
  135.         seg=seg+dist();
  136.         seg = seg/2;
  137.         if(seg>0 && seg<=10 ){
  138.           motor1.detach();
  139.           motor2.detach();
  140.           fast=false;
  141.           flag4 = 1;
  142.         }else{
  143.           motor1.attach(SERVO1);
  144.           motor2.attach(SERVO4);
  145.           motor1.write(180);
  146.           motor2.write(0);
  147.           flag4 = 0;
  148.           fast=true;
  149.         }
  150.       }
  151.      
  152.       //Para tras com segurança:
  153.       but=0;
  154.       if(comando=='t' && but==0 ){
  155.         fast=true;
  156.         but=digitalRead(BOTAO);
  157.         if(but==0){
  158.           fast = false;
  159.           motor1.detach();
  160.           motor2.detach();
  161.           flag4 = 1;
  162.         }
  163.         else{
  164.           motor1.attach(SERVO1);
  165.           motor2.attach(SERVO4);
  166.           motor1.write(0);
  167.           motor2.write(180);
  168.           flag4 = 0;
  169.           fast=true;
  170.         }
  171.       }
  172.      
  173.       //Para tras sem segurança:
  174.       if(comando=='b'){
  175.         fast=true;          
  176.         motor1.attach(SERVO1);
  177.         motor2.attach(SERVO4);
  178.         motor1.write(0);
  179.         motor2.write(180);
  180.       }
  181.      
  182.       // Para esquerda:
  183.       if(comando=='e'){
  184.         fast=true;
  185.         motor1.attach(SERVO1);
  186.         motor2.attach(SERVO4);
  187.         motor1.write(120);
  188.         motor2.write(120);
  189.       }
  190.      
  191.       //Para direita:
  192.       if(comando=='d'){
  193.         fast=true;
  194.         motor1.attach(SERVO1);
  195.         motor2.attach(SERVO4);
  196.         motor1.write(50);
  197.         motor2.write(50);
  198.       }
  199.      
  200.       //Pára:
  201.       if(comando=='p'){
  202.         fast=false;
  203.         motor1.detach();
  204.         motor2.detach();
  205.       }
  206.     }
  207.     bipgeral=false;
  208.   }
  209.  
  210.   flag4 = 0;
  211.   motor1.detach();
  212.   motor2.detach();
  213.  
  214.   //                                                                                            Modo Ultrassom:
  215.   if(option=='u'){
  216.     digitalWrite(BIP,HIGH);
  217.     delay2(200);
  218.     digitalWrite(BIP,LOW);
  219.     flag=0;
  220.    
  221.     //Laço de repetição do Modo Ultrassom
  222.     while(comando!='s'){
  223.       //Ler comando vindo por bluetooth ( neste modo, so receberemos comando se for para sair):
  224.       if(Serial.available()){
  225.         comando = Serial.read();
  226.       }
  227.       if(comando == 's'){
  228.         break;
  229.       }
  230.      
  231.       //Liga para frente:
  232.       t=30;  
  233.       motor1.attach(SERVO1);
  234.       motor2.attach(SERVO4);
  235.       motor1.write(180);
  236.       motor2.write(0);
  237.       delay2(DMOTOR);
  238.       //OBS: sempre que houver este if, estamos checando se o usuário pediu para parar o processo:
  239.       if(flag!=0){
  240.         comando='s';
  241.         break;
  242.       }
  243.      
  244.       //Checa se está a uma distancia menor que 23cm de algum objeto (caso verdadeiro: ele irá calcular a distancias para os dois lados para depois decidir para que lado irá.)
  245.       //                                                             (caso falso: continua indo para frente.)
  246.       t=dist();
  247.       if(t>0 && t<20){
  248.         //Gira para esquerda (aproximadamente 90 graus)
  249.         motor1.write(40);
  250.         motor2.write(40);
  251.         delay2(600);
  252.         if(flag!=0){
  253.           comando='s';
  254.           break;
  255.         }
  256.         //Delay Motor
  257.         motor1.detach();
  258.         motor2.detach();
  259.         delay2(DMOTOR);
  260.         if(flag!=0){
  261.           comando='s';
  262.           break;
  263.         }
  264.         //Calcula a distancia para a esquerda:
  265.         do{
  266.           te=dist();
  267.           delay2(2);
  268.           if(flag!=0){
  269.             comando='s';
  270.             break;
  271.           }
  272.         }while(te<0);
  273.         if(flag!=0){
  274.           comando='s';
  275.           break;
  276.         }
  277.        
  278.         //Gira para direita (aproximadamente 180 graus):
  279.         motor1.attach(SERVO1);
  280.         motor2.attach(SERVO4);
  281.         motor1.write(140);
  282.         motor2.write(140);
  283.         delay2(1000);
  284.         if(flag!=0){
  285.           comando='s';
  286.           break;
  287.         }
  288.         //Delay Motor
  289.         motor1.detach();
  290.         motor2.detach();
  291.         delay2(DMOTOR);
  292.         if(flag!=0){
  293.           comando='s';
  294.           break;
  295.         }
  296.        
  297.         //Calcula a distancia para a direita:
  298.         do{
  299.           td=dist();
  300.           delay2(3);
  301.           if(flag!=0){
  302.             comando='s';
  303.             break;
  304.           }
  305.         }while(td<0);
  306.         if(flag!=0){
  307.           comando=='s';
  308.           break;
  309.         }
  310.        
  311.        
  312.         //Checa se a distancia para esquerda é maior que a distancia para direita (Caso verdadeiro: ele deve girar 180 graus para a esquerda para depois seguir em frente, já que ele esta virado para a esquerda do ponto 'inicial'.
  313.         //                                                                        (Caso falso: ele simplismente segue em frente , já que ele já está virado para a direita do ponto 'inicial'.
  314.         if(te>td){
  315.           //Caso verdadeiro:
  316.           //Gira para a esquerda (aproximadamente 180 graus)
  317.           motor1.attach(SERVO1);
  318.           motor2.attach(SERVO4);
  319.           motor1.write(40);
  320.           motor2.write(40);
  321.           delay2(1000);
  322.           if(flag!=0){
  323.             comando='s';
  324.             break;
  325.           }
  326.           //Delay Motor
  327.           motor1.detach();
  328.           motor2.detach();
  329.           delay2(DMOTOR);
  330.           if(flag!=0){
  331.             comando='s';
  332.             break;
  333.           }
  334.         }
  335.         //OBS: O caso contrário será executado no começo do laço de repetição do Modo Ultrassom, já que no inicio ele sempre 'liga' pra frente.        
  336.       }
  337.     }
  338.     bipgeral=false;
  339.   }
  340.  
  341.   motor1.detach();
  342.   motor2.detach();  
  343.    
  344.   //                                                                                  Modo de Calibração
  345.   if(option=='r'){
  346.     digitalWrite(BIP,HIGH);
  347.     delay2(200);
  348.     digitalWrite(BIP,LOW);
  349.    
  350.     motor1.attach(SERVO1);
  351.     motor2.attach(SERVO4);
  352.     motor1.write(90);
  353.     motor2.write(90);
  354.     while(comando!='s'){
  355.       if(Serial.available()){
  356.         comando = Serial.read();  
  357.       }  
  358.     }
  359.     bipgeral=false;
  360.   }
  361.  
  362.   motor1.detach();
  363.   motor2.detach();
  364.  
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement