quarta-feira, 1 de junho de 2011

Atmega328 - Pulse-width modulation (PWM)

Processing – Controlando o Atmega328 com PWM no Standard Firmata

Este pequeno tutorial descreve os passos que fiz para construir a interface de controle do motor e um led pelo computador. O primeiro passo é fazer o upload do código “Standard Firmata” para o Atmega Arduino. Este código está na sessão da biblioteca Firmata da IDE Arduino, é uma versão do firmware específico para controle pelo Processing. Após o upload, nenhum comando funcionará direto no Arduino, os comandos deverão ser passados através da codificação no Processing pela porta serial.

O Arduino foi montado em uma Protoboard seguindo o esquema descrito a seguir, para acesso ao computador utilizei um conversor USB-TTL, este conversor possibilita o acesso pela porta USB com o Arduino e pode ser encontrado facilmente na Internet. Comprei o meu por R$ 26,00.




Pulse-width modulation (PWM) pode ser desenvolvido no Arduino de vários modos. O texto a seguir mostra de forma simples de como usar essa técnica para controlar a velocidade de um pequeno motor e um led através do computador. O código no Processing utiliza a mesma estrutura do exemplo proposto no exemplo “Fade” do Arduino.

/*
 Fade

 This example shows how to fade an LED on pin 9
 using the analogWrite() function.

 This example code is in the public domain.

 */
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

void setup()  {
  // declare pin 9 to be an output:
  pinMode(9, OUTPUT);
}

void loop()  {
  // set the brightness of pin 9:
  analogWrite(9, brightness);   

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }    
  // wait for 30 milliseconds to see the dimming effect   
  delay(30);                           
}


O que é PWM?

A Modulação por largura de pulso (MLP) - mais conhecida pela sigla em inglês "PWM" (Pulse-Width Modulation). Também é utilizada para variar o valor da transferência de potência entregue a uma carga sem as perdas ocorridas normalmente devido à queda de tensão por recursos resistivos. Em um sistema PWM, a chave de estado sólido (normalmente IGBT, MOSFET ou transistor bipolar) usada para controlar o fluxo de corrente: ora não conduzindo corrente, ora conduzindo, mas provocando uma queda de tensão muito baixa; como a potência instantânea dissipada pela chave é o produto da corrente pela tensão elétrica a um dado instante, isso significa que nenhuma potência é dissipada se a chave fosse uma chave "ideal". Com uma taxa de modulação suficientemente elevada, simples filtros RC são freqüentemente utilizados para suavizar o trem de pulsos em uma tensão analógica estável. Esse método é normalmente empregado no controle de velocidade de motores de corrente contínua.

Origem: Wikipédia, a enciclopédia livre.


Neste projeto, eu controlo um pequeno motor de corrente contínua de 6 Volts através de um MOSFET utilizando o PWM do arduino e também exibo o valor referente à velocidade na tela do computador. O controle da velocidade é feito por um programa no Processing, que se comunica com o arduino através da porta serial e envia valores para a mudança da velocidade. Esses valores variam de 0 a 255.


A seguir, veja o desenho na Protoboard de todos os componentes eletrônicos para o projeto.


=============================================================================


Na programação, criei dois módulos, o primeiro com os comandos para o controle no Arduino e o segundo com a classe de controle dos botões.

ArduinoControlPotMotors.pde
ClassButtons.pde

A codificação é auto descritiva para quem já conhece a linguagem, quem ainda não está familiarizado pode acessar os Sites para mais informações.


Abs, Marcelo Victorio A. Costa.

ArduinoControlPotMotors.pde

// By Marcelo Victorio A. Costa
// 23/06/2011

import processing.serial.*;
import cc.arduino.*;

Porta serial para a comunicação com o arduino;
    //[0] "COM1"
    //[1] "COM3"
int pCOM = 1;
int pino_led = 7;
int pino_sensor_Pot = 3;
int valor_capturado_Pot = 0;
PFont arial;

int w = width;
int h = height;

Cbutton CB1 = new Cbutton(600, 450, 80, 30,"Led1");
Cbutton CB2 = new Cbutton(700, 450, 80, 30,"Exit");

void setup()
{
    size(screen.width / 2, screen.height / 2);

    background(0);
    ellipseMode(CENTER);
    println(Arduino.list());

    arduino = new Arduino(this, Arduino.list()[pCOM], 57600);
    arduino.pinMode(pino_sensor_Pot, Arduino.INPUT);
    arduino.pinMode(pino_led, Arduino.OUTPUT);
    arial = createFont("Arial",50);

    println(width); 
}

void draw()
{
   // captura o valor do potenciômetro
    valor_capturado_Pot = arduino.analogRead(pino_sensor_Pot);

    background(200);
    // usa o valor capturado para alterar o diâmetro do círculo

    fill(255,80,80);
    ellipse(width / 2, height / 2,  valor_capturado_Pot/2,  valor_capturado_Pot/2);
     
    //println(valor_capturado_Pot);
    //println(height);

    textFont(arial);
    fill(0,0,0);    
    text(valor_capturado_Pot/4,50,80);
   
    delay(100);
   
    arduino.analogWrite(9,valor_capturado_Pot / 4);
   
    //Buttons Control
   
    if (CB1.button()) {
       arduino.digitalWrite(pino_led, Arduino.HIGH);   // set the LED on
    }
    else{
      arduino.digitalWrite(pino_led, Arduino.LOW);    // set the LED off     
    }

    if (CB2.button()) {
      exit();
    }

}

ClassButtons.pde
// By Marcelo Victorio A. Costa
// 23/06/2011

class Cbutton {
  int bx, by, bs, bt;
  String sNome;
  boolean locked = false;
  PFont arialButtons;

  Cbutton (int pbx, int pby, int pbs, int pbt, String psNome) {
   
      bx = pbx;
      by = pby;
      bs = pbs;
      bt = pbt;  
      sNome = psNome;
    }
      
    boolean button() {

      arialButtons = createFont("Arial",15);
      textFont(arialButtons);

      // Test if the cursor is over the box
       if (mouseX > bx && mouseX < bx+bs && mouseY > by && mouseY < by+bt) {
        
           drawbutton(255);
   
           if (mousePressed && (mouseButton == LEFT)) {
               drawbutton(225);
               locked = true;
           }else{
               locked = false;
           }
       }else{ 
        drawbutton(150);
        locked = false;
       }
     return locked;
    }

    void drawbutton(int pCollor) {
     
      stroke(100);
      fill(pCollor);
      rect(bx, by, bs, bt);
      fill(0);
      text(sNome,bx+25,by+20);  
    }


}

quarta-feira, 1 de setembro de 2010

Como modificar Servos-Motores para movimentos giratórios contínuos

Adaptação de servos-motores para que sejam capazes de realizar movimentos giratórios contínuos para ambos os lados.

Esses mecanismos geralmente possuem sua rotação limitada a 180 graus, o que faz dele um mecanismo um pouco limitado, pois com seu alto torque que facilmente pode ultrapassar os 5 Kg.cm, também são capazes de oferecer muito mais.

Uma das aplicações que poderiam oferecer, por sua capacidade de alto torque, seria o tracionamento de plataformas robóticas controladas por microcontroladores, sem a necessidade de pontes H para controlar os motores além de maior facilidade na elaboração do algoritmo de controle.

Esse documento irá mostrar como adaptar servos comuns que são utilizados normalmente em aplicação de controle por radio freqüência para que também possam ser utilizados como base em aplicações robóticas.

Com algumas modificações poderemos adaptá-los para realizar giros contínuos facilmente controlados por microcontroladores.

O primeiro procedimento a ser realizado é a abertura do servo-motor. Com o auxílio de uma chave de fenda, devem ser retirados todos os quatro parafusos localizados na parte de traz e forçá-lo cuidadosamente nas extremidades do encaixe na parte de cima e em baixo para abri-lo. (Imagens 01 e 02)

Especificações
Dimensões: 40x20x38mmPeso: 40gVoltagem: 4.8v ou 6.0vVelocidade: 0.20sec/60° 4.8V - 0.16sec/60° 6.0VTorque máximo: 5.2kg-cm 4.8V - 6.5Kg-cm 6.0VConector: Padrão Futaba - JR - HITEC
Cabo com 30cm de extensão.


Na placa de controle existem três pontos e solda que são usados para fixar o potenciômetro e devem ser retirados para a liberação da placa. (Imagem 03)



Após a liberação da placa e a retirada do potenciômetro, fixado por um pequeno parafuso dentro do invólucro do servo. Vamos iniciar o procedimento de soldagem dos resistores na placa para substituir o serviço do potenciômetro.(Imagem 04 e 05)



Material
Dois Resistores de 2k2 Ohm, 1 Watt (vermelho, vermelho, vermelho e dourado).
Ferro de soldar de 40 W / 60 W
Solda fina 1mm

Soldagem
A soldagem dos dois resistores de 2,2 KOhm no módulo de controle.
Essa operação é necessária para que o módulo de controle pense que ainda exista o potenciômetro e atue como se o eixo do motor estivesse sempre no meio, e assim o motor poderá permanecer girando indefinidamente.(Imagem 06)
Os resistores de 2,2 KOhm são os mais recomendáveis, pois esse é o valor mais próximo para substituir um potenciômetro de 5 KOhm em meio curso. Observe que próximo ao local onde estavam soldados os terminais do potenciômetro existem três pequenos buracos.(Imagem 07)




Por último, devemos adaptar o eixo retirando uma pequena trava que impede o giro completo do eixo, basta cortar e raspar para que não fique nenhuma rebarba que possa impedir o giro.(Imagem 09)




Por último, devemos adaptar o eixo retirando uma pequena trava que impede o giro completo do eixo, basta cortar e raspar para que não fique nenhuma rebarba que possa impedir o giro.(Imagem 09)




Com este documento, foi possível fazer a adaptação de servos-motores para que exerçam o giro contínuo. Desse modo eles tornam-se mais versáteis, possibilitando o seu uso nas mais diversas situações, aproveitando todo seu torque disponível.
As vantagens na utilização desses motores em sistemas Robóticos são realmente práticos.


Abs, Marcelo Victorio de A. Costa.


quinta-feira, 8 de julho de 2010

Arduino, Motor drive shield-L298N

Plataforma robótica de baixo custo com Arduino

Como desenvolver uma plataforma robótica controlada por 'Infrared' (IR) de baixo custo e fácil construção e que possa ser utilizada em diversos outros projetos.


Com poucos componentes é possível integrar duas estruturas muito comuns hoje no mercado e reduzir o custo de forma significativa com excelente qualidade.


A primeira estrutura escolhida é bem conhecida e fácil de identificar pois sua idéia se baseia em partes que se encaixam permitindo inúmeras combinações e diversos tipos de projetos.


A segunda estrutura também é muito conhecida, e estão disponíveis no mercado através de várias empresas com qualidade excelente e com diversos acessórios (shields) que facilitam a maioria dos projetos autômatos. 


Essas duas estruturas já conhecidas no mundo mecatrônico, combinadas tornou possível a realização de projetos como o descrito a seguir.

Materiais:
Plataforma Arduino (Atmega 328);
Motor drive shield  - L298N;
Servos com rotação contínua;
Sensor de 'Infrared' (IR);
Duas baterias de Íon lítio, 3,6v;
Placas de plásticos, lacres plásticos, pequenos parafusos, fios e conector modu adaptado;
Controle remoto de televisão.
Caso não seja possível encontrar servos de rotação contínua, é possível adaptá-los para rotação contínua conforme descrito anteriormente sob o título de “Como modificar Servos-Motores para movimentos giratórios contínuos”.

De posse dos servos, o próximo passo é montar a estrutura que formará a base da nossa plataforma, utilizando pequenos parafusos para fixar as rodas no eixo dos servos e o servo na estrutura de plástico, imagens 01, 02 e 03.

A seguir, a adaptação do Arduino e Motor shield  em uma base  plástica recortada e perfurada para adaptar na estrutura da plataforma robótica, imagens 04, 05 e 06.

Após a montagem da estrutura com os servos, rodas, adaptação do Arduino e “shield”, vamos construir a fonte de alimentação que é composta de duas baterias de Íon lítio de 3,6v presas por dois , lacres plásticos e uma placa plástica entre elas para a fixação na plataforma robótica, imagens 07 e 08.

A próxima e última etapa é a fixação do sensor de “infrared” e a ligação de todos os componentes mecatrônicos conforme a seguir: Conectar os servos na porta 4 e 5 do “shield”, conectar o sensor de “infrared” na porta 7 do arduino também através do “shield”. Conectar as baterias em série para obter o dobro da voltagem (7,2v) e ligar através do conector modu ao arduino. Deve ser observada a polaridade do conector do Arduino com o modu, para que não ocorra inversão dos pólos, é conveniente colar uma guia no lado de cima do modu como garantia, imagens 09 e 10.


Com esse documento, foi possível mostrar com poucas adaptações e baixo custo que é possível desenvolver plataformas robóticas que poderão ser utilizadas em diversos projetos de fácil construção e resultados satisfatórios.




[]'s, Marcelo Victorio de A. Costa