sábado, 15 de dezembro de 2012


Como fazer o seu cubo de leds 5x5x5
Já faz algum tempo que venho planejando construir um cubo de leds e mesmo com diversos projetos na internet não encontrei nenhum bem detalhado e com componentes fáceis de encontrar. Tive a ideia de utilizar o shift register 74HCC595 que é exemplo no tutorial do Arduino.cc.   http://www.arduino.cc/en/Tutorial/ShiftOut

O chip 74HC595 recebe do microcontrolador através de comandos ShiftOut um número decimal que é convertido em binário, este número binário representa os pinos que devem ser ligados e desligados para acender ou apagar os leds que formam os desenhos no cubo de leds.


O  Cube de Leds é um cubo composto por LEDs interligados capaz de proporcionar imagens holográficas, em movimento.

A ideia foi de um estudante norueguês, que queria expressar a arte visual de uma forma bem diferente, através do conjunto de LEDs interligados, de forma a criar um cubo.

O cubo está ligado a um conjunto de registradores que são controlados por um microcontrolador com instruções que controlam cada um dos LEDs que  deve acender e apagar

Apesar de ainda não ser um holograma perfeito em alta definição consegue apresentar a ideia que imaginamos. Esta forma envolve uma tecnologia bem avançada e criativa pela sua engenhosa construção. O efeito final é a ilusão de imagens 3D em movimento, dentro dos limites do Cube de Leds.  


O projeto foi montado, experimentalmente, em duas  Protoboards de 850 pontos, utilizei alguns jumpers para as ligações entre os componentes eletrônicos, 4 registradores 74HC595, um Atmega328 com Bootloader Arduino Duemilanove, resistores, 125 leds e outros componentes, a lista completa de todo o material será exibida mais a frente. O Acesso ao computador foi feito com um conversor USB-TTL.






Diagrama do 74hc595 Registrador de deslocamento Binário (shift register)










Em breve publicarei todo o circuito eletrônico e código fonte que desenvolvi.









terça-feira, 28 de fevereiro de 2012

Comunicação entre dois Arduinos com auxílio do PC, através de Rádio Frequência, utilizando os módulos de RF 433Mhz

Há algum tempo venho pensando em desenvolver um link de comunicação serial entre o PC e o arduino com um display digital. Algo onde fosse possível escrever no PC e transmitir para o LCD. Conversando com meu filho sobre esse assunto tivemos a idéia de desenvolver um módulo transmissor e um receptor sem fio, onde fosse possível escrever uma mensagem na tela do PC e esta mesnagem ser transmitida para o LCD remotamente. Pensamos em algumas possibilidade e após verificar o que tinhamos disponível em nossa bancada resolvemos utilizar os Módulo RF Transmissor+receptor 433mhz, um LCD de fundo azul e letras brancas, uma placa protoshield, baterias para o módulo remoto, fios e conectores.


Começamos pela montagem da base do LCD que deve ser compacta e por este motivo optamos por montar em uma ProtoShield que são placas de circuito impresso normalmente projetadas para acoplar em cima do Arduino.e utilizar as mesmas conexões.

A ligação do LCD ao arduino é muito simples, utilizamos os pinos digitais 2, 3, 4, 5, 6, 7 que estão livres e não são utilizados internamente pela VirtualWire, que falaremos mais adiante.

Na ProtoShield soldamos os pinos refrente as conexões do Arduino para que a placa se encaixe perfeitamente. Também soldamos as barras de conexão que serão usadas para encaixar os pinos de 1 a 16 do LCD e todas as ligações referente aos pinos de contraste, backlight e alimentação do módulo.





Em seguida construímos os conectores que ligam os componentes de RF a placa do Arduino. São necessários apenas quatro fios para ligar, que podem ser da seguinte forma: Um fio vermelho para os 5  ou 3,3 Volts dependendo do módulo transmissor. Um fio preto para o GND (negativo), um fio branco para a comunicação de dados e outro para a antena que deve ter 30 centímetros.

No módulo receptor é comum ter mais do que quatro terminais, mas alguns são interligados internamente, você deve consultar o Datasheet do fabricante para ter certesa de como fazer as ligações.












No Arduíno que será usado como transmissor utilizamos o pino digital 12 para a transmissão de dados, que é o default no VirtualWire.h. Os fios positivo e GND foram ligados nos pinos 3V3 e GND.

No módulo receptor, utilizamos o pino digital 13 para a transmissão de dados, que é o default no VirtualWire.h. Os fios positivo e GND foram ligados nos pinos 5V e GND.

A pós a montagem da ProtoShield, soldagem da barra de terminais no módulo LCD e os conectores dos módulos RF, encaixamos todos os módulos e concluímos a parte referente ao hardware do nosso projeto.



















O VirtualWire é uma biblioteca que fornece recursos para enviar mensagens curtas. Pode ser utilizado com diversos modelos de transmissores e receptores de rádio de baixo custo. Tem tudo o que é necessário para transmitir e receber dados através dos módulos Arduíno. Pode ser baixado de vários sites conhecidos que falam sobre Arduino.


O código fonte foi retirado de alguns exemplos e adaptado para exibir mensagens em uma tela de LCD.

O  “VirtualWirw.h”  deve ser descompactado para dentro da pasta  “/libraries”


//TRANSMISSOR

#include <VirtualWire.h> // you must download and install the VirtualWire.h to your hardware/libraries folder

char myCmd[16];
int inputSize=0;

void setup()
{
Serial.begin(9600);
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for RF Link module
vw_setup(2000); // Bits per sec

vw_set_tx_pin(12); // Set the digital IO pin to use for transmit data. Defaults to 12.

}
void loop()
{
   inputSize=0;
   if (Serial.available() > 0) {
   delay(300);
   inputSize = Serial.available();
   Serial.print("inputSize=");
   Serial.println(inputSize);

   for (int i = 0; i < inputSize; i++){
     myCmd[i] = Serial.read();
   }
  
   // say what you got:
   Serial.print("I received: ");
   Serial.println(myCmd);

 

vw_send((uint8_t *)myCmd, strlen(myCmd));
vw_wait_tx(); // Wait for message to finish
delay(200);
}


//RECEPTOR LCD

#include <VirtualWire.h>

#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int i;
int cont;
int message_ok;

void setup()
{

    Serial.begin(9600); // Debugging only
    Serial.println("setup");

    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);
    // Print a message to the LCD.
    lcd.print("Setup LCD");

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);     // Bits per sec

    vw_rx_start();       // Start the receiver PLL running

    lcd.clear();
    lcd.print("VirtualWire     ");

}

void loop()
{
    // set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0)
    lcd.setCursor(0, 1);
 
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    //reception to stabilize
    message_ok = 0;
    cont = 0;
    for (cont = 0; cont < 12 ; cont++)
    {
      delay(50);          // wait for reception to stabilize
    
      message_ok = vw_get_message(buf, &buflen);  // check the reception
      if (message_ok > 0){cont = 12;} //force the output
             
     
      Serial.print(message_ok);
      Serial.print(" ");



    }
   
    //if (vw_get_message(buf, &buflen)) // Non-blocking
    if (message_ok > 0)
    {
        digitalWrite(13, true); // Flash a light to show received good message
      // Message with a good checksum received, dump it.
      Serial.print("Got: ");
     
      for (i = 0; i < buflen; i++)
      {
          Serial.print(buf[i], HEX);
          Serial.print(" ");

            lcd.print(buf[i]);
      }
      Serial.println("");
        digitalWrite(13, false);
    }else
    { lcd.print("No message.....");}
     
}



[]'s Marcelo Victorio de A. Costa.



















sexta-feira, 8 de julho de 2011

Robótica

Robô é um termo com o qual quase todos nós estamos bastante familiarizados. Mas a maioria de nós, não têm conhecimento técnicos sobre essas maravilhas do mundo eletrônico.
Atualmente existem vários usos para essa tecnologia, como automação de vitrines, sistemas de segurança, casa inteligente, computador de bordo, animatrônicos (boneco-robôs usados para dar maior realismo a filmes) e muitas outras aplicações.
 
Um robô é definido como "reprogramável, manipulador multifuncional", projetado para mover materiais, peças, ferramentas ou dispositivos especializados através de vários movimentos programados para o desempenho de uma variedade de tarefas.
 
Abs, Marcelo Victorio de A. Costa.
 
 
 
 
 
 
 
 
 
 

terça-feira, 5 de julho de 2011

Leonardo da Vinci

Leonardo di Ser Piero da Vinci, ou simplesmente Leonardo da Vinci, Anchiano, 15 de abril de 1452 – Amboise, 2 de maio de 1519, foi um polímata italiano, uma das figuras mais importantes do Alto Renascimento, que se destacou como cientista, matemático, engenheiro, inventor, anatomista, pintor, escultor, arquiteto, botânico, poeta e músico. É ainda conhecido como o precursor da aviação e da balística. Leonardo frequentemente foi descrito como o arquétipo do homem do Renascimento, alguém cuja curiosidade insaciável era igualada apenas pela sua capacidade de invenção. É considerado um dos maiores pintores de todos os tempos e como possivelmente a pessoa dotada de talentos mais diversos a ter vivido. Segundo a historiadora de arte Helen Gardner, a profundidade e o alcance de seus interesses não tiveram precedentes e sua mente e personalidade parecem sobre-humanos para nós, e o homem em si [nos parece] misterioso e distante.

Nascido como filho ilegítimo de um notário, Piero da Vinci, e de uma camponesa, Caterina, em Vinci, na região da Florença, foi educado no ateliê do renomado pintor florentino, Verrocchio. Passou a maior parte do início de sua vida profissional a serviço de Ludovico Sforza (Ludovico il Moro), em Milão; trabalhou posteriormente em Veneza, Roma e Bolonha, e passou seus últimos dias na França, numa casa que lhe foi presenteada pelo rei Francisco I.

Leonardo era, como até hoje, conhecido principalmente como pintor. Duas de suas obras, a Mona Lisa e A Última Ceia, estão entre as pinturas mais famosas, mais reproduzidas e mais parodiadas de todos os tempos, e sua fama se compara apenas à Criação de Adão, de Michelângelo. O desenho do Homem Vitruviano, feito por Leonardo, também é tido como um ícone cultural, e foi reproduzido por todas as partes, desde o euro até camisetas. Cerca de quinze de suas pinturas sobreviveram até os dias de hoje; o número pequeno se deve às suas experiências constantes - e frequentemente desastrosas - com novas técnicas, além de sua procrastinação crônica. Ainda assim, estas poucas obras, juntamente com seus cadernos de anotações - que contêm desenhos, diagramas científicos, e seus pensamentos sobre a natureza da pintura - formam uma contribuição às futuras gerações de artistas que só pode ser rivalizada à de seu contemporâneo, Michelângelo.

Leonardo é reverenciado por sua engenhosidade tecnológica; concebeu idéias muito à frente de seu tempo, como um protótipo de helicóptero, um tanque de guerra, o uso da energia solar, uma calculadora, o casco duplo nas embarcações, e uma teoria rudimentar das placas tectônicas. Um número relativamente pequeno de seus projetos chegou a ser construído durante sua vida (muitos nem mesmo eram factíveis), mas algumas de suas invenções menores, como uma bobina automática, e um aparelho que testa a resistência à tração de um fio, entraram sem crédito algum para o mundo da indústria. Como cientista, foi responsável por grande avanço do conhecimento nos campos da anatomia, da engenharia civil, da óptica e da hidrodinâmica.

Leonardo da Vinci é considerado por vários o maior gênio da história, devido a sua multiplicidade de talentos para ciências e artes, sua engenhosidade e criatividade, além de suas obras polêmicas. Num estudo realizado em 1926 seu QI foi estimado em cerca de 180.

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

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);  
    }


}