IOTON Technology / ton-bot_seguidor_parede

Dependencies:   IOTON-API QEI USBDevice mbed-ton ton-bot

Fork of ton-bot_seguidor_linha by IOTON Technology

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

Go to the documentation of this file.
00001 /**
00002 ******************************************************************************
00003 * @file    main.cpp
00004 * @author  Kleber Lima da Silva (kleber@ioton.cc)
00005 * @version V0.0.1
00006 * @date    05-Julho-2017
00007 * @brief   Programa de exemplo do Robô TON-BOT no modo seguidor de parede.
00008 ******************************************************************************
00009 * @attention
00010 *
00011 * COPYRIGHT(c) 2017 IOTON Technology
00012 *
00013 * Licensed under the Apache License, Version 2.0 (the "License");
00014 * you may not use this file except in compliance with the License.
00015 * You may obtain a copy of the License at
00016 *
00017 *     http://www.apache.org/licenses/LICENSE-2.0
00018 *
00019 * Unless required by applicable law or agreed to in writing, software
00020 * distributed under the License is distributed on an "AS IS" BASIS,
00021 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00022 * See the License for the specific language governing permissions and
00023 * limitations under the License.
00024 ******************************************************************************
00025 */
00026 
00027 /* Includes ------------------------------------------------------------------*/
00028 #include "main.h"
00029 
00030 /** @addtogroup Seguidor de parede TON-BOT
00031  * @{
00032  */
00033 /* Constantes ----------------------------------------------------------------*/
00034 #define ESQUERDA 1
00035 #define DIREITA 2
00036 
00037 /* Variáveis privadas --------------------------------------------------------*/
00038 Ticker timer1;
00039 bool bRodarControle = false;
00040 uint8_t seguidor = 0;
00041 uint8_t paredes = 0;
00042 float lf = 0, l = 0, r = 0, rf = 0;
00043 
00044 /* Funções Privadas ----------------------------------------------------------*/
00045 /* Callback do Timer 1 - Controle de Velocidade */
00046 void callbackTimer1(void)
00047 {
00048   if (bRodarControle == true)
00049   {
00050     /* Realiza a leitura dos sensores */
00051     paredes = getSensoresParede(&lf, &l, &r, &rf);
00052 
00053     /* Realiza o controle de velocidade */
00054     controleVelocidade();
00055   }
00056 }
00057 
00058 /**
00059  * @brief  Programa Principal
00060  * @param  Nenhum
00061  * @retval Nenhum
00062  */
00063 int main(void)
00064 {
00065   /* Ligue o TON com o botão USER pressionado para indicar o estado da bateria */
00066   if (ton.USERisPressed())
00067   {
00068     /* Necessário pressionar o botão RESET voltar ao modo normal */
00069     ton.batteryStatus();
00070   }
00071 
00072   /* Inicialização do robô... */
00073   /* Calibrar os valores FRONTAL_TH e LATERAL_TH usando o ton-bot_teste,
00074     depois atualizar os valores no arquivo controlador.h */
00075   ton.setLED(GREEN);
00076   initTonBot(PRETA, FRONTAL_TH, LATERAL_TH);
00077 
00078   /* Inicio do programa ------------------------------------------------------*/
00079   /* Será habilitado seguidor de parede esquerda ou direita de acordo com o
00080    respectivo sensor frontal acionado */
00081   while ((getSensoresParede(&lf, &l, &r, &rf) & 0b010) == 0)
00082   {
00083     wait_ms(100);
00084     ton.toggleLED(RED);
00085   }
00086   seguidor = (lf > rf) ? ESQUERDA : DIREITA;
00087   wait(2);  // Aguarda um tempo para a partida do micromouse
00088   ton.setLED(BLUE);
00089   beeps(3, 100, 50);
00090 
00091   /* Inicia o Timer do controle de velocidade */
00092   timer1.attach(&callbackTimer1, (float)TS / 1000.0f);
00093   bRodarControle = true;
00094 
00095   /* Ao iniciar, o micromouse deve estar no centro da primeira célula...
00096    Com isso, deve se deslocar meia célula até a FRONTEIRA da próxima célula
00097    (local IDEAL para realizar a leitura dos sensores) */
00098   frente(CELULA / 2);
00099 
00100 
00101   /* LOOP principal ----------------------------------------------------------*/
00102   while (1)
00103   {
00104     /* Realiza a máquina de estados de acordo com o que foi selecionado */
00105     if (seguidor == DIREITA)
00106     {
00107       /* Máquina de Estados - Seguidor de Parede DIREITA */
00108       switch (paredes)
00109       {
00110         /* Sem paredes */
00111         case 0b000:
00112         curva(-90); // Vira para a direita
00113         break;
00114 
00115         /* Apenas parede da direita */
00116         case 0b001:
00117         frente(CELULA); // Anda uma célula para frente
00118         break;
00119 
00120         /* Apenas parede da esquerda */
00121         case 0b100:
00122         curva(-90); // Vira para a direita
00123         break;
00124 
00125         /* Ambas paredes laterais */
00126         case 0b101:
00127         frente(CELULA); // Anda uma célula para frente
00128         break;
00129 
00130         /* Apenas parede frontal */
00131         case 0b010:
00132         curva(-90); // Vira para a direita
00133         break;
00134 
00135         /* Parede frontal e direita */
00136         case 0b011:
00137         curva(90);  // Vira para a esquerda
00138         break;
00139 
00140         /* Parede frontal e esquerda */
00141         case 0b110:
00142         curva(-90); // Vira para a direita
00143         break;
00144 
00145         /* Todas as paredes */
00146         case 0b111:
00147         curva(180); // Meia volta
00148         break;
00149       }
00150     } // fim da maquina de estados para seguidor de parede direita
00151     else if (seguidor == ESQUERDA)
00152     {
00153       /* Máquina de Estados - Seguidor de Parede ESQUERDA */
00154       switch (paredes)
00155       {
00156         /* Sem paredes */
00157         case 0b000:
00158         curva(90);  // Vira para esquerda
00159         break;
00160 
00161         /* Apenas parede da direita */
00162         case 0b001:
00163         curva(90);  // Vira para esquerda
00164         break;
00165 
00166         /* Apenas parede da esquerda */
00167         case 0b100:
00168         frente(CELULA); // Anda uma célula para frente
00169         break;
00170 
00171         /* Ambas paredes laterais */
00172         case 0b101:
00173         frente(CELULA); // Anda uma célula para frente
00174         break;
00175 
00176         /* Apenas parede frontal */
00177         case 0b010:
00178         curva(90);  // Vira para esquerda
00179         break;
00180 
00181         /* Parede frontal e direita */
00182         case 0b011:
00183         curva(90);  // Vira para a esquerda
00184         break;
00185 
00186         /* Parede frontal e esquerda */
00187         case 0b110:
00188         curva(-90); // Vira para direita
00189         break;
00190 
00191         /* Todas as paredes */
00192         case 0b111:
00193         curva(-180);    // Meia volta
00194         break;
00195       }
00196     } // fim da maquina de estados para seguidor de parede esquerda
00197   } // fim do loop principal
00198 } // fim da função principal
00199 
00200 
00201 /**
00202  * @}
00203  */
00204 
00205 /************************ (C) COPYRIGHT IOTON Technology **********************/
00206 /***********************************END OF FILE********************************/