Pan e tilt com Arduino e ESP8266 I

pan e tilt
pan e tilt

Pan e tilt

É muito divertido brincar com robótica, mas o difícil é encontrar uma razão ou projeto. Por exemplo, esse próprio pan e tilt. Qual a aplicação? – Eu pergunto, eu respondo. – É um ótimo brinquedo multifuncional! Você pode utilizá-lo para responder a comandos via WiFi, RF, IR, potenciômetros, joystick analógico e o mais legal – visão computacional!

Em sua aplicação mais simples ele é um cursor para câmeras de segurança e webcams, mas se por exemplo, você desejasse acompanhar a luz do sol para manter um painel solar sempre na direção correta, um pan tilt viria a calhar, bastando inserir um sensor de luminosidade digital ou um LDR mesmo. E esse pequeno pan tilt é excelente para testes de projetos maiores.




Em um projeto mais complexo, ele pode ser utilizado como sensor de presença, mas não com PIR e sim com visão computacional, utilizando um Raspberry ou um Onion Omega com OpenCV. Não sei em quanto tempo estarei apto a fazê-lo, mas o farei em algum momento, espero que você se inscreva em nosso newsletter e curta nossa fanpage.

Vou tentar me ater a apenas uma implementação simples por vez, para não sobrecarregar o artigo com texto e assim também motivar você a executá-lo tal como o farei.

Lista de materiais

Para essa primeira brincadeira você vai precisar de:

Proposta do artigo

Vamos atacar duas frentes nesse artigo sobre pan e tilt de forma separada. A primeira será o controle digital via comunicação serial. Dessa forma utilizaremos o mesmo código para as próximas implementações, apenas acrescendo funcionalidades.

A segunda será o controle analógico utilizando um dos dois meios para controlar o pan e tilt; potenciômetro ou joystick analógico. Eu utilizarei um joystick analógico que tenho aqui há anos e nunca utilizei (espero que ainda funcione).

Em outros artigos incluirei mais funcionalidades e novos meios de controle, conforme descrevi no começo do artigo.

Implementação digital do pan e tilt com Arduino





Essa implementação é a mais simples. Para iniciarmos o projeto, primeiro é necessário considerar as necessidades; os requisitos.

Requisitos

As necessidades aqui são triviais; montar o pan e tilt (veja como montar no video disponível com o produto, caso tenha dúvidas, eu montei sem olhar nada, é muito fácil), e controlar 2 servos motor pelo terminal serial do arduino. Como em outro artigo faremos o controle remoto desse dispositivo, já vou considerar um protocolo para garantir a integridade da mensagem e a reação sem erros do Arduino que controla os servos do pan e tilt.

 Servo motor

Caso você conheça servo motor, pule essa parte, senão, leia.

Um servo motor é um tipo de motor de resposta rápida, um torque considerável para seu tamanho e de posicionamento preciso. Ele possui um controlador interno e seu movimento máximo é 180 graus. Isso significa que ele não tem giro contínuo. Isso significa também que você precisa achar o ponto mínimo e máximo. Para tal, basta encaixar uma das aletas e forçá-lo manualmente para a esquerda ou direita, então posicionar a aleta à 90 graus do corpo do motor, de maneira que forme um ‘L’. Tendo identificado o posicionamento, será necessário posicioná-lo adequadamente de forma que o movimento seja ideal para cobrir a área desejada dentro dos 180 graus.

Para o servo da base superior, atente-se de que o máximo que você consegue movimentar é 90 graus, mais que isso já começa ficar de ‘cabeça pra baixo’ e se voltando a posição de assento, pode forçar o motor e quebrar, por isso identifique o limite antes de prendê-lo à base superior.

O servo SG90 é alimentado por 5V, mas (pode ser uma estupidez minha) no datasheet não tem o consumo. Aliás, no documento de outro servo também não encontrei referências. Enfim, o Arduino dá conta de alimentar os dois, mas se tiver a possibilidade, sempre prefira alimentação externa.

Pra finalizar, existem sim servos de giro contínuo onde a velocidade pode ser controlada, mas não faz parte do escopo, portanto encerro esse tópico por aqui.

Kgf

O kgf ou, kilogram-force é uma unidade de medida de força em relação à gravidade influente na massa. Ela representa a força exercida em um deslocamento para o caso do servo. Mas a unidade oficial de força é o Newton, então a relação entre elas é 1kgf = 9,8N. Em alguns livros, a proporção está disposta como 10/1, portanto 1N = 0,1kgf considerando essa afirmação.

Newton

Apenas para exclarecer, Newton é a força exercida sobre um corpo com massa igual a 1 kg com indução de aceleração de 1 m/s² no sentido em que a força é exercida.

Características do servo

Agor que tudo está claro (ou não), podemos levar em conta que o torque do servo SG90 de 9 gramas é igual a 1.8 kgf·cm.

A velocidade dele é de 0.3s/180º, ou seja, 1/3 de segundo para ir de 0 à 179.

A tensão de operação vai de 4.8V à 5V.

Trabalha em temperaturas de 0º à 55º.

Se você pretender utilizá-lo com PIC, é bom saber (apesar de ser um padrão na maioria, senão em todos) que o periodo de PWM dele é de 20ms. No Arduino é transparente, mas se você o utilizar com PIC deve saber também que as posições principais são -90,0,90, onde -90 recebe um pulso de 1ms, 90 recebe um pulso de 2ms e o centro (que é a posição 0) recebe um pulso de 1,5ms. Sabendo disso, as variações já podem ser calculadas. Se pretende “mesmo” utilizá-lo com PIC, escrevi esse outro tutorial, que recomendo fortemente.

pan e tilt - servo wire
pan e tilt – servo wire

Wiring

Quase não dá pra chamar de wiring. Se você tiver um shield com conexão para servo motor, é só um plug. De qualquer modo, disponibilizo o esquema com fritzing para que você sinta-se totalmente à vontade, caso seja iniciante. No caso, estou utilizando o Arduino UNO porque é o mais popular.

pan e tilt - wiring 01
pan e tilt – wiring 01

Código de controle do pan e tilt

Para esse primeiro exemplo, o código é muito simples, já escrevi algo parecido inclusive. Pode parecer até bobo movimentar os servos enviando comandos pelo monitor serial, mas é fundamental para as próximas implementações sem fio, onde enviaremos os mesmos comandos, mas por outro protocolo que não o serial. Para concluir, quero deixar claro que existem outros meios de codificar isso, quero escrever alguns códigos diferente para mostrar as variações, sem dizer qual é melhor ou pior.

Vou comentando no código e concluo logo após.

Como você pode ver no primeiro video (a seguir), funciona bem e o legal é que você pode enviar uma série de comandos como ‘lluuurrrdddd’ e toda a sequência será executada. Vou até fazer uma brincadeira com isso em outro artigo.

De ruim, ficam alguns pontos interessantes, que considero ‘efeitos colaterais’ do modo que foi programado, e explico.




O movimento de uma posição leva de 1ms à 2ms dentro de 20ms de comprimento de pulso. Quanto maior o deslocamento, obviamente maior o tempo para que o servo motor avance até a posição pretendida. No código acima, eu desconecto o servo após movimentá-lo para a posição; se isso ocorrer em um intervalo menor do que o suficiente para que o servo tenha atingido a posição pretendida, ele não chegará ao ponto-alvo. Nesse caso, pode-se gerar um loop para movimentar o servo em passos menores, de forma que também possam ser reduzidos os delays (maneira burra, mas simples), ou então pode-se verificar se o servo atingiu a posição antes de desconectá-lo. Isso funcionaria bem. Algo como:

Isso pode ser feito dentro de uma função utilizando também millis, de modo que não haja travamento do fluxo com o delay. Para pegar a posição atual do servo, simplesmente utiliza-se o método:

Em outros exemplos o código variará, porque pretendo escrever códigos diferentes pra mostrar mais recursos.

Fora a parte funcional, o código está ruim porque o mesmo valor é verificado em duas condicionais:

Não importa se está funcionando, a questão é que se você está gerando duas condicionais para validar um mesmo atributo, significa que está errado. Esse código está ruim nesse aspecto também, porém o escrevi ‘in flow’ para exemplificar esse artigo, entenda que isso é uma ‘prova de conceito’.

Implementação analógica do pan e tilt com joystick

Cada implementação tem suas fronteiras, mas não é necessário a eximia para funcionar a contento. Tanto que não escrevi nenhum código especialista nesse artigo, apenas imaginei o que queria e escrevi de qualquer jeito, sem considerar consumo, tempos, timers, etc.

A implementação com o joystick também é curiosa e a exibo em seguida. Utilizei o joystick shield para controlar o pan e tilt porque o tenho aqui há tempos, mas utilizei apenas o joystick, os botões não tem funcionalidade, apesar de que já deixei codificado, caso você também tenha um desses e deseje utilizar os botões. Vamos ao código:

Perceba que foi utilizado 2 pinos analógicos, sendo A0 e A1. Se você não estiver utilizando o shield, terá flexibilidade para escolher qualquer um dos analógicos.

Criei uma estrutura para organizar as variáveis pertencentes ao joystick, dessa forma fica mais fácil entender o código ao olhar. Dentro dessa estrutura, criei 2 variáveis para guardar o valor de leitura. No próximo loop, se o valor da leitura guardado for diferente do valor de leitura atual, ele religa o servo motor, muda a posição e desliga o servo. Esse tempo de da função controller() pode variar, fiz assim sem testar mas você pode experimentar valores menores ou maiores se desejar.



O video do joystick com pan e tilt:

Por fim, apelo aos leitores que na aquisição de produtos para execução dos artigos, que o façam nos links citados no post. A Fulltronic é nossa parceira e está patrocinando um “monte” de novidades pra gente e comprar com eles garantirá mais artigos e novos materiais. E se você desejar adquirir algum produto deles que não tiver tutorial, fiquem tranquilos, basta solicitar ao vendendor e eu escreverei o artigo. Além disso, você conta com suporte na fanpage Do bit Ao Byte, inbox também comigo no facebook e principalmente através dos nossos grupos.

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

Agregador de Links - Loucuras da Net

 

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.