Classe+HcsrArray

Home > Robótica > Bibliotecas **Recursos** > RunTimer > Timer2 > CircularBuffer > SerialLog > ActionPlan **Dispositivos** > Ultrassom > **Array de sensores** > NRF24L01 > Wireless log > RF24Control **Movimento** > StepperMotor > StepperMotorTm > DoubleStepper > DoubleStepperTm

Esta classe dá suporte a um array de sensores HC-SR04. A ideia é que os sensores sejam distribuídos em volta do robô de modo que seja possível medir distâncias em várias direções sem precisar executar algum movimento. Como foi feita para ser usada com muitos sensores, a classe assume que os sensores serão controlados com apenas um pino, já que o uso de dois pinos por sensor tornaria o uso do array inviável no arduino. Sobre o uso de pinos de controle, veja a discussão da classe HcSr04. A classe implementa um sistema de patrulha automática que faz com que os sensores sejam lidos em sequência automaticamente em intervalos regulares de tempo. A cada leitura é gerado um evento que pode ser capturado por alguma classe descendente. Abaixo a declaração pública da classe:

code format="java5"
 * 1) define nHcs 10

class HcsrArray{ public: HcsrArray{} byte addHc(byte hcPin, int angle, int offset=0); void setPatrolTime(unsigned int milliseconds); int readNow(byte hcID); int readUntilOk(byte hcID, byte tries); boolean run; byte lastHcID; void patrolOn; void patrolOff; int getDist(byte hcID); int getAngle(byte hcID);

protected: virtual void onNewRead(byte hcID, HcFlags *flags){} };

code

O //#define nHcs// informa a quantidade de sensores que serão alocados no array. Ajuste esse valor para a quantidade desejada. Depois de criar a instância, adicione os sensores chamando o método //addHc// uma vez para cada sensor instalado, informando o pino de controle e o ângulo que o sensor aponta. O método retorna o ID do sensor adicionado, é aconselhável guardar esses valores para posterior acesso aos sensores. O angulo não é utilizado pela classe, mas com certeza será útil no programa principal. Portanto pode ser utilizado qualquer critério para estabelecer os ângulos. No robô que motivou a criação desta classe, estabeleci que zero graus é diretamente à frente e uso valores positivos à direita e negativos à esquerda.

Depois de adicionar todos os sensores configure o tempo entre as leituras chamando o método //setPatrolTime//, a patrulha, ou seja, a leitura sequencial automática de todos os sensores, é ativada pelo método //patrolOn// e desativada pelo método //patrolOff//. O valor default para o tempo entre leituras é de 50 ms. Independente da patrulha, a qualquer momento qualquer sensor pode ser lido chamando o método //readNow// e informando o ID do sensor. Também pode ser usado o método //readUntilOk// que faz várias tentativas de leitura para garantir uma leitura válida. Caso aconteça um erro de leitura serão feitas novas leituras até conseguir uma leitura válida ou até esgotar o número de tentativas informado no parâmetro //tries//. Além do número de tentativas, uma outra diferença entre os dois métodos é que //readNow// gera uma chamada ao evento //onNewRead// e //readUntilOk// não. As leituras automáticas da patrulha utilizam o método //readNow//.

É extremamente importante que o método //run// seja chamado pelo menos uma vez a cada iteração do //loop// principal. Sem isso não serão feitas leituras automáticas. O método //run// retorna //true// sempre que uma nova leitura foi feita. Finalmente, o método //lastHcID// retorna o ID do último sensor lido.