quinta-feira, 19 de março de 2015

Controlando servo motores com Scratch

Esta não é uma aula propriamente dita. Logo à partida porque não tenho servos suficientes para usar numa turma de 20 alunos. Como pretendo, no entanto, começar a trabalhar em projeto, é natural que o controlo de servos surja inevitavelmente. Por essa razão, justifica-se a exploração deste componente.

O servo motor é um tipo de motor que não roda em círculo, mas que se move para determinadas posições e aí permanece até nova ordem, mesmo que esteja a sujeito a uma força com direção contrária. A capacidade do servo motor manter a sua posição em função da força externa aplicada, é medida através do torque.

Há servo motores que têm um grau de liberdade de 360º, outros têm de 180º e há ainda os que giram apenas com um ângulo máximo de 90º. Os de 180º são os mais vulgares e será com um desses que farei as minhas experiências (na verdade, o meu motor chega perto dos 180º sem fazer exatamente este ângulo).

Os fios de conexão dos servo motores são três e a sua identificação depende dos fabricantes. O mais vulgar é ter um fio vermelho que se liga à alimentação +5V, um preto que se liga ao GND (0V) e um terceiro amarelo ou branco que ligará ao pino de controlo.

E como se controla um servo motor? Através de um sinal no formato PWM (Pulse Width Modulation). Este sinal é formado por uma série de impulsos 0 V ou 5 V com um determinado padrão temporal. Uma alteração do sinal na largura deste sinal, será responsável por alterar a posição do eixo.

Em Scratch temos a vida facilitada porque o controlo do motor pode ser feita através das saídas 4, 7 e 8 que estão preparadas para controlar este tipo de dispositivos.

Para isso, temos disponíveis os seguintes comandos:

O primeiro comando é claro; o segundo faz girar o motor para a posição especificada pelo ângulo  (e não o faz girar de acordo com o ângulo indicado, são coisas diferentes); o terceiro suponho que só faça sentido se estivermos a trabalhar com servo motores que girem segundo 360º - no meu caso, que trabalhei com um motor de 180º, este comando não alterava em nada o seu funcionamento.

A apresentação que se segue foi mais um exercício pessoal. O último exercício proposto seria demasiado complexo para apresentar aos alunos com que trabalho. Partilho também que por vezes, de forma aleatória e sem que eu perceba qual a origem, o programa pára nos 90º ou o LED mantém-se a piscar de forma irregular depois da função terminada. Nestas situações, tenho de reiniciar o programa (clicando na bandeirinha) para que tudo volte ao normal.

Deixo então a minha proposta de trabalho para controlo de servo motores recorrendo ao Scratch...


...o circuito esquemático do último exercício proposto...





...e um pequeno vídeo com o "circuito de controlo de um cancela" em funcionamento:




3 comentários:

  1. Olá. Primeiramente, parabéns pelo blog! Está ótimo!
    Gostaria de perguntar para que serve o capacitor que você ligou no servo. Seria para amenizar o ruído na alimentação e impedir que o Arduíno reinicie? Pois estou com este problema... Liguei meu servo diretamente na alimentação do arduino e, quando movimento o mesmo rapidamente, o Arduíno sofre uma espécie de "pane" e reinicia. Estou procurando uma solução para isto. Creio que ligando o servo a uma alimentação externa resolveria o problema. Mas queria uma solução que me permitisse ligar o servo diretamente no Arduíno.
    Se puder me explicar, ficarei grato!
    Obrigado e parabéns novamente!

    ResponderEliminar
  2. Olá. Primeiramente, parabéns pelo blog! Está ótimo!
    Gostaria de perguntar para que serve o capacitor que você ligou no servo. Seria para amenizar o ruído na alimentação e impedir que o Arduíno reinicie? Pois estou com este problema... Liguei meu servo diretamente na alimentação do arduino e, quando movimento o mesmo rapidamente, o Arduíno sofre uma espécie de "pane" e reinicia. Estou procurando uma solução para isto. Creio que ligando o servo a uma alimentação externa resolveria o problema. Mas queria uma solução que me permitisse ligar o servo diretamente no Arduíno.
    Se puder me explicar, ficarei grato!
    Obrigado e parabéns novamente!

    ResponderEliminar
    Respostas
    1. Olá Charles, obrigada pelo feedback!
      O condensador que uso na alimentação é de facto para a estabilizar, mas já montei vários servos sem o condensador, e funcionam à mesma. O problema que descreve, aconteceu-me pela primeira vez quando quis montar dois servos à mesma placa ( http://arduinoescola.blogspot.pt/2015/06/projeto-barco-do-sado1.html ). A solução passou por fazer a alimentação do servo separada do arduino. Não sei que motivos terá para não querer uma fonte externa. Nestas situações, eu uso outra porta USB do computador e resolvo o problema sem andar com mais equipamento atrás - cortei para estas situações um cabo USB - uma extremidade liga ao USB do computador, na outra descarno os dois fios e ligo-os como alimentação + e - da breaboard. Qualquer dúvida, disponha!

      Eliminar