Pan tilt com Arduino e ESP8266 I

pan tilt
pan tilt

Pan tilt

É muito divertido brincar com robótica, mas o difícil é encontrar uma razão ou projeto. Por exemplo, esse próprio pan 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 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; 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 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 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 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.

servo wire
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.

wiring 01
wiring 01

Código

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 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 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 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.