Biblioteca do Robô TON-BOT (https://ioton.cc/ton-bot)

Dependents:   ton-bot_teste ton-bot_seguidor_linha ton-bot_seguidor_parede

ton-bot.cpp

Committer:
krebyy
Date:
2017-06-29
Revision:
0:a79d499cd558

File content as of revision 0:a79d499cd558:

/**
******************************************************************************
* @file    ton-bot.cpp
* @author  Kleber Lima da Silva (kleber@ioton.cc)
* @version V0.0.1
* @date    19-Junho-2017
* @brief   Biblioteca do Robô TON-BOT (https://ioton.cc/ton-bot).
******************************************************************************
* @attention
*
* COPYRIGHT(c) 2017 IOTON Technology
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************
*/

/* Includes ------------------------------------------------------------------*/
#include "ton-bot.h"   /* Veja este arquivo com a documentação/protótipos das funções */


/******************************************************************************/
/** @addtogroup Biblioteca do Robô TON-BOT
* @{
*/

/* Variáveis privadas --------------------------------------------------------*/
PwmOut r_motor_in2(PIN0);
PwmOut r_motor_in1(PIN1);
PwmOut l_motor_in1(PIN2);
PwmOut l_motor_in2(PIN3);
DigitalOut buzzer(PIN4);
QEI l_encoder(PIN8, PIN7, NC, 360, QEI::X4_ENCODING);
QEI r_encoder(PIN5, PIN6, NC, 360, QEI::X4_ENCODING);
DigitalOut lf_emitter(PIN9);
DigitalOut side_emitter(PIN10);
DigitalOut rf_emitter(PIN11);
DigitalOut alternate_en(PIN12);
DigitalOut line_emitter(PIN13);
DigitalIn line1(PIN14);
DigitalIn line2(PIN15);
DigitalIn line3(PIN16);
DigitalIn line4(PIN17);
DigitalIn line5(PIN18);
DigitalIn line6(PIN19);
DigitalIn line7(PIN20);
DigitalIn line8(PIN21);
AnalogIn lf_receiver(PIN22);
AnalogIn rf_receiver(PIN23);
AnalogIn r_receiver(PIN24);
AnalogIn l_receiver(PIN25);

Timeout flipper;

int LINHA = DEFAULT_LINHA;
float FRONTAL_TH = DEFAULT_FRONTAL_TH;
float LATERAL_TH = DEFAULT_LATERAL_TH;

void initTonBot(int cor_linha, float frontal_th, float lateral_th)
{
  /* Configura os sensores */
  LINHA = cor_linha;
  FRONTAL_TH = frontal_th;
  LATERAL_TH = lateral_th;

  /* Inicializa os PWMs */
  l_motor_in1.period_us(50);
  l_motor_in2.period_us(50);
  r_motor_in1.period_us(50);
  r_motor_in2.period_us(50);

  /* Inicializa os Encoders */
  resetEncoderEsquerda();
  resetEncoderDireita();
}


/******************************************************************************/
/** @defgroup Buzzer
* @{
*/

void beeps(uint8_t vezes, uint16_t t_on, uint16_t t_off)
{
  for (uint8_t i = 0; i < vezes; i++)
  {
    buzzer = 1;
    wait_ms(t_on);
    buzzer = 0;
    wait_ms(t_off);
  }
}

void beepOff()
{
  buzzer = 0;
}

void beep(uint16_t duracao)
{
  buzzer = 1;
  flipper.attach(&beepOff, (float)duracao/1000.0f);
}

/**
* @}
*/


/******************************************************************************/
/** @defgroup Encoders
* @{
*/

int32_t getEncoderEsquerda(void)
{
  return l_encoder.getPulses();
}


void resetEncoderEsquerda(void)
{
  l_encoder.reset();
}


int32_t getEncoderDireita(void)
{
  return r_encoder.getPulses();
}


void resetEncoderDireita(void)
{
  r_encoder.reset();
}

/**
* @}
*/


/******************************************************************************/
/** @defgroup Motores
* @{
*/

void setMotores(float pwm_esquerda, float pwm_direita, bool fast_decay)
{
  /* Acionamento do motor da esquerda */
  if (pwm_esquerda < 0) /* Reverso */
  {
    pwm_esquerda *= -1;

    /* Slow decay (default) */
    if (fast_decay == false)
    {
      l_motor_in1 = 1 - pwm_esquerda;
      l_motor_in2 = 1;
    }
    else /* Fast decay */
    {
      l_motor_in1 = 0;
      l_motor_in2 = pwm_esquerda;
    }
  }
  else /* Direto */
  {
    /* Slow decay (default) */
    if (fast_decay == false)
    {
      l_motor_in1 = 1;
      l_motor_in2 = 1 - pwm_esquerda;
    }
    else /* Fast decay */
    {
      l_motor_in1 = pwm_esquerda;
      l_motor_in2 = 0;
    }
  }

  /* Acionamento do motor da direita */
  if (pwm_direita < 0) /* Reverso */
  {
    pwm_direita *= -1;

    /* Slow decay (default) */
    if (fast_decay == false)
    {
      r_motor_in1 = 1 - pwm_direita;
      r_motor_in2 = 1;
    }
    else /* Fast decay */
    {
      r_motor_in1 = 0;
      r_motor_in2 = pwm_direita;
    }
  }
  else /* Direto */
  {
    /* Slow decay (default) */
    if (fast_decay == false)
    {
      r_motor_in1 = 1;
      r_motor_in2 = 1 - pwm_direita;
    }
    else /* Fast decay */
    {
      r_motor_in1 = pwm_direita;
      r_motor_in2 = 0;
    }
  }
}

/**
* @}
*/


/******************************************************************************/
/** @defgroup Sensores
* @{
*/

uint8_t getSensoresParede(float* lf, float* l, float* r, float* rf)
{
  uint8_t paredes = 0;

  (*lf) = lf_receiver;
  (*l) = l_receiver;
  (*r) = r_receiver;
  (*rf) = rf_receiver;

  /* Sensor frontal esquerdo */
  lf_emitter = 1;
  wait_us(60);
  (*lf) = lf_receiver - (*lf);
  lf_emitter = 0;
  if ((*lf) < 0)
  {
    (*lf) = 0;
  }
  wait_us(80);

  /* Sensor frontal direito */
  rf_emitter = 1;
  wait_us(60);
  (*rf) = rf_receiver - (*rf);
  rf_emitter = 0;
  if ((*rf) < 0)
  {
    (*rf) = 0;
  }
  wait_us(80);

  /* Sensores laterais */
  side_emitter = 1;
  wait_us(60);
  (*l) = l_receiver - (*l);
  (*r) = r_receiver - (*r);
  side_emitter = 0;
  if ((*l) < 0)
  {
    (*l) = 0;
  }
  if ((*r) < 0)
  {
    (*r) = 0;
  }


  /* Realiza a máscara de bits */
  if ((*lf) > FRONTAL_TH || (*rf) > FRONTAL_TH)
  {
    paredes |= PAREDE_FRONTAL;
  }

  if ((*l) > LATERAL_TH)
  {
    paredes |= PAREDE_ESQUERDA;
  }

  if ((*r) > LATERAL_TH)
  {
    paredes |= PAREDE_DIREITA;
  }

  return paredes;
}


int32_t getSensoresLinha()
{
  int32_t erro = 0, soma = 0, n = 0;

  /* Habilita os emissores */
  line_emitter = 1;
  wait_us(100);

  /* Realiza a leitura de todos os sensores de linha, os sensores das
   extremidades pussuem peso maior, no final é realizada a média ponderada */
  if (line1 == LINHA)
  {
    soma += -40;
    n++;
  }
  if (line2 == LINHA)
  {
    soma += -30;
    n++;
  }
  if (line3 == LINHA)
  {
    soma += -20;
    n++;
  }
  if (line4 == LINHA)
  {
    soma += -10;
    n++;
  }
  if (line5 == LINHA)
  {
    soma += 10;
    n++;
  }
  if (line6 == LINHA)
  {
    soma += 20;
    n++;
  }
  if (line7 == LINHA)
  {
    soma += 30;
    n++;
  }
  if (line8 == LINHA)
  {
    soma += 40;
    n++;
  }

  /* Desabilita os emissores */
  line_emitter = 0;


  /* Retorna a média ou retorna a constante INFINITO indicando
   que nenhum sensor leu linha */
  if (n != 0)
  {
    erro = soma / n;
  }
  else
  {
    erro = INFINITO;
  }

  return erro;
}

/**
* @}
*/


/************************ (C) COPYRIGHT IOTON Technology **********************/
/***********************************END OF FILE********************************/