Mostrando postagens com marcador Arduino. Mostrar todas as postagens
Mostrando postagens com marcador Arduino. Mostrar todas as postagens

terça-feira, 15 de abril de 2025

Projeto: Braço Robótico (IV)

 Programa Arduino para acionar o L298N:

// Defina os pinos conforme as ligações entre Arduino e L298N

#define IN1 8    // Input 1 (L298N - Out1)

#define IN2 9    // Input 2 (L298N - Out2)

#define IN3 10   // Input 3 (L298N - Out3)

#define IN4 11   // Input 4 (L298N - Out4)

#define ENA 5    // Enable A (para as saídas 1/2)

#define ENB 6    // Enable B (para as saídas 3/4)

int delayPasso = 5; // tempo entre passos em ms (ajuste conforme necessário)

void setup() {

  // Configurar pinos como saída

  pinMode(IN1, OUTPUT);

  pinMode(IN2, OUTPUT);

  pinMode(IN3, OUTPUT);

  pinMode(IN4, OUTPUT);

  pinMode(ENA, OUTPUT);

  pinMode(ENB, OUTPUT);

  // Habilita ambos canais do L298N

  digitalWrite(ENA, HIGH);

  digitalWrite(ENB, HIGH);

}


void loop() {

  // Gira para um sentido (horário)

  for (int i = 0; i < 200; i++) { // 200 passos = 1 volta em motores 1.8º/passo

    passoHorario();

  }

  delay(1000);


  // Gira para o sentido oposto (anti-horário)

  for (int i = 0; i < 200; i++) {

    passoAntihorario();

  }

  delay(1000);

}


// Sequência para um passo no sentido horário

void passoHorario() {

  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);

  digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);

  delay(delayPasso);

  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);

  digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);

  delay(delayPasso);

  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);

  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);

  delay(delayPasso);

  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);

  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);

  delay(delayPasso);

}


// Sequência para um passo no sentido anti-horário

void passoAntihorario() {

  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);

  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);

  delay(delayPasso);

  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);

  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);

  delay(delayPasso);

  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);

  digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);

  delay(delayPasso);

  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);

  digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);

  delay(delayPasso);

}

segunda-feira, 14 de abril de 2025

Projeto: Braço Robótico (III)

Para movimentação do braço, estou utilizando 3 motores NEMA 23 (Motion WS2301530820), com torque aproximado de 13 kgf.cm.


Cada motor é acionado por uma Ponte H 2 Canais L298N. 



https://newscrewdriver.com/2021/01/28/circuit-schematic-of-generic-l298n-driver-board/


O que é o Driver de Motor L298N
O L298N é um driver de motor amplamente utilizado para controlar dois motores DC de maneira econômica e eficiente. Suporta a manipulação de velocidade e direção de dois motores DC, incluindo motores de passo bipolares como o NEMA 17. O controle é realizado utilizando a técnica de modulação por largura de pulso (PWM), enviando pulsos de liga/desliga aos motores para ajustar a tensão de entrada. Em aplicações de prototipagem, o uso de placas breakout pode ser mais prático que circuitos integrados isolados.

O driver L298N possui dois canais independentes, denominados canal A e canal B. Para operar um motor no canal A, é necessário conectar os pinos Out 1 e Out 2, bem como os pinos Enable A e Enable B ao motor. O pino Enable A deve ser mantido em nível lógico alto para ativar o motor. Para operar o motor no sentido anti-horário, o pino Input 1 deve ser mantido em nível lógico baixo. Para melhor desempenho, recomenda-se utilizar uma fonte de alimentação de 5V.

O módulo L298N integra dois blocos terminais de parafuso: um destinado à conexão dos motores e outro ao terminal de aterramento (GND). Adicionalmente, o módulo dispõe de um pino 5V, que pode atuar tanto como entrada quanto como saída. O sinal PWM gerado pelo controlador determina a velocidade do motor. O circuito foi projetado para operar de forma integrada com outros componentes eletrônicos e mecânicos, como sensores, chaves e detectores.


O que é o Módulo L298N
O L298N é um circuito integrado (CI) cuja folha de dados (datasheet) detalha características técnicas, especificações, diagramas em blocos e circuitos recomendados, inclusive para uso com plataformas como Arduino Uno R3. O CI dispõe de dois pinos de controle: um para o sentido de rotação e outro para o ajuste de velocidade.

Este driver utiliza uma arquitetura de ponte H dupla (double H-bridge), que reduz significativamente a dissipação térmica e as interferências eletromagnéticas. Suporta correntes de até 2A com potência máxima de 25W. O módulo é capaz de acionar dois motores DC, um motor de passo de 2 fases ou um de 4 fases. O funcionamento requer uma tensão de alimentação dedicada ao driver e uma fonte externa de 5V para alimentação lógica. Após a instalação dos componentes, o módulo está pronto para operação.

O módulo L298N aceita sinais de nível TTL padrão, sendo amplamente utilizado em projetos de robótica móvel e automação, incluindo controle de motores com rodas e ajuste de intensidade luminosa via modulação (PWM), aceitando tanto variações de polaridade quanto de ciclo de trabalho.


Funcionamento do Driver de Motor L298N
O circuito integrado L298N possui dois pinos de alimentação: Vs, responsável pela alimentação do motor, e Vss, dedicado à alimentação dos circuitos lógicos internos. Ambos devem compartilhar um ponto comum de terra (GND). O módulo inclui um regulador 78M05 para fornecer 5V, que pode ser habilitado ou desabilitado conforme necessidade. O L298N é compatível com plataformas como Arduino Uno e Raspberry Pi.

A principal função do L298N é controlar a velocidade e o sentido de rotação dos motores DC através de modulação por largura de pulso (PWM). A largura do pulso determina a velocidade de rotação; quanto mais largo o pulso, maior a velocidade. O valor ótimo para o ciclo de trabalho do PWM depende das características do motor utilizado, sendo necessário ajustar na prática.

O funcionamento do driver L298N é definido por uma Tabela-Verdade, que relaciona os níveis lógicos dos pinos de entrada e saída, baseando-se em funções booleanas. Para operar corretamente o módulo, é necessário configurar os pinos de entrada e saída (TTL) de acordo com a lógica especificada na tabela.

Tabela-Verdade do L298N
O CI L298N utiliza o conceito de ponte H para comandar motores DC e motores de passo, determinando a direção de rotação e o acionamento da carga. A lógica de controle é baseada em dois sinais de entrada por canal (Input 1/2 para canal A e Input 3/4 para canal B) e um sinal de habilitação (Enable A/B para cada canal).

A seguir, está a Tabela-Verdade para um canal típico (canal A), sendo aplicável de forma similar ao canal B:



Enable: Se estiver em nível alto (1), a ponte H está habilitada para funcionar. Em nível baixo (0), o canal correspondente está desativado.
Input 1 / Input 2: Definem o sentido de rotação do motor ou o estado das bobinas no caso de motor de passo.
X: Pode ser 0 ou 1 (não interfere pois o canal está desabilitado).

Aplicação para Motor de Passo
No controle de motores de passo bipolares com L298N, utiliza-se a sequência correta de ativação/desativação dessas entradas para gerar o avanço nas fases do motor. Normalmente, cada bobina do motor é conectada a um canal, e a lógica acima se repete para cada uma.

L298N com Motor de Passo
O módulo L298N, quando utilizado com motores de passo, atua como um controlador avançado baseado em dois drivers de ponte H completos (full-bridge), permitindo o acionamento de motores DC, motores de passo e, adicionalmente, cargas indutivas como solenóides. O módulo L298N dispõe de dois canais independentes e integra o regulador de tensão 78M05 para fornecimento de 5V. Sua arquitetura é simples, facilitando a programação e integração em projetos eletrônicos, especialmente com plataformas Arduino.

Conexão de Motor de Passo ao Módulo L298N
Para realizar a conexão de um motor de passo ao módulo L298N, é fundamental identificar corretamente os fios do motor. Motores de passo requerem que os terminais de entrada possuam polarização idêntica em cada fase ou bobina. O procedimento básico para conexão envolve:

Identificação dos fios de cada fase do motor de passo.
Conexão dos fios das bobinas do motor aos terminais de saída do módulo L298N (Out 1, Out 2, Out 3 e Out 4).
Utilização de um microcontrolador, como o Arduino Uno ou Raspberry Pi, preferencialmente alimentados com tensão mínima de 5V para garantir operação estável.
Configuração dos sinais de controle nos pinos de entrada do módulo L298N para operar o motor na sequência desejada.

Características Técnicas e Aplicação
O módulo L298N é capaz de fornecer até 2A por bobina, o que é suficiente para aplicações básicas e prototipagem de sistemas com motores de passo. Para projetos mais exigentes, outra solução pode ser necessária devido ao limite de corrente. O CI apresenta alta robustez e durabilidade, sendo os componentes projetados para suportar longos períodos de funcionamento.

Projeto: Braço Robótico (II)

Instalei 2 motores NEMA 17 acoplados a eixos rosqueados, comandados pelo Arduino. Estes 2 motores comandam uma base giratória, que é apoiada em uma guia linear com mesa.



quarta-feira, 9 de abril de 2025

Projeto: Braço Robótico (I)

Estou elaborando um novo projeto, um braço robótico. À medida que ele for evoluindo, vou colocando aqui fotos e informações. Toda a infra estrutura será modelada em CAD e impressa numa impressora 3D.


Para leitura de sensores e acionamento de motores, estou usando um Arduino Mega.


Inicialmente o braço será controlado por atuadores como joystick ou potenciômetros. No futuro, a ideia é acoplar um Raspberry para processamento inteligente.


terça-feira, 11 de março de 2025

Brincando com Ideias

 


Canal do Flávio Guimarães

Pensou em Arduino ? Internet das Coisas ? Está no lugar certo!

Aqui você vai aprender sobre Arduino e tudo o que esta relacionado. Desde a base, passando pelos conceitos básicos da eletrônica e lógica de programação até módulos para usar com o Arduino e conceitos avançados e complexos. Também exploramos tudo o que esta relacionado ao Arduino. Como RaspberryPi, ESP8266, aplicativos para smartphone e muito mais. E como queremos que nossa comunidade cresça e seja referência no mercado de Arduino e Internet das Coisas, tratamos até temas profissionalizantes como Automação Industrial e Residencial. Neste canal, queremos democratizar a tecnologia deixando tudo explicado de uma forma simples para que todos possam entender e aprender. Neste canal, não existe pré-requisitos! Seja muito bem vindo!

https://www.youtube.com/@BrincandocomIdeias/featured

https://brincandocomideias.com.br/

segunda-feira, 22 de abril de 2013

Arduino Robot Bonanza

O livro Arduino Robot Bonanza, de Gordon McComb (mesmo autor do livro Robot Builder’s Bonanza) e editado p/ McGraw-Hill, explica com montar uma série de robôs que rolam, caminham, rastejam, falam, esbravejam e assim por diante, usando a plataforma Arduino e toda sorte de sensores, motores, controle remoto e assemelhados.

Claro, não poderia faltar um braço robótico, uma cobra robótica controlada remotamente, sempre com todos os sketches Arduino e também com instruções detalhadas quanto à montagem da parte mecânica.

Livro essencial para quem já conhece alguma coisa do Arduino e deseja ver algum resultado prático.

Disponível em formato eletrônico (compatível com Kindle).


terça-feira, 16 de abril de 2013

Arduino Shield List (atualizado)

Você já se perguntou sobre os Shields (no meu tempo de técnico eletrônico, a gente chamava de piggy-back, agora virou shield) do Arduino, se existe algum controle, algum índice, algo ou alguém a quem recorrer? Pois existe: a Arduino Shield List, que atualmente conta com 288 shields de 110 fabricantes. Vale a pena dar uma vasculhada.

Mas cuidado para o seu Arduino não ficar assim:



sábado, 13 de abril de 2013

A extensa linha de produtos Arduino

Estou retomando o Blog (por estar com mais tempo disponível), então é hora de dar uma atualizada na linha Arduino.

A versão mais recente do software é 1.0.4, disponível para download no site.

Arduino Boards
Arduino Uno Arduino Leonardo Arduino Due
Arduino Esplora Arduino Mega 2560 Arduino Mega ADK
Arduino Ethernet Arduino Mini LilyPad Arduino
LilyPad Arduino USB LilyPad Arduino Simple LilyPad Arduino SimpleSnap
Arduino Micro Arduino Nano Arduino Pro Mini
Arduino Fio Arduino Pro
Arduino Shields
Arduino GSM Shield Arduino Ethernet Shield Arduino WiFi Shield
Arduino Wireless SD Shield Arduino Motor Shield Arduino Wireless Proto Shield
Arduino Proto Shield
Arduino Kits
The Arduino Starter Kit
Accessories
USB/Serial Light Adapter Mini USB/Serial Adapter

quarta-feira, 4 de abril de 2012

O protocolo I2C no Arduino

O protocolo I2C é implementado no Arduino, embora receba outro nome: TWI (Two-Wire Interface), por questões de direitos autorais. No Arduino Diecimila/Duemilanove/Uno, são utilizados os pinos A4 para o sinal SDA (dados) e A5 para o sinal SCL (clock); no Arduino Mega, são utilizados os pinos 20 para o sinal SDA (dados) e 21 para o sinal SCL (clock). Note-se que estes pinos não estão na mesma posição que os pinos I2C no Diecimila/Duemilanove/Uno, o que provoca incompatibilidade entre shields que utilizam o protocolo I2C e que tenham sido desenvolvidos para uma ou outra placa. A biblioteca que implementa o protocolo I2C no ambiente Arduino é denominada Wire.

O microcontrolador do Arduino implementa internamente os resistores pull-up requeridos pelo protocolo I2C (normalmente de 1,5 Kohms); no entanto, é interessante colocar 2 resistores de 10 Kohms; o comprimento máximo dos cabos que levam os sinais I2C para as placas periféricas é de 1 metro, em função da capacitância (embora existam chips reforçadores de sinal I2C, como o Philips P82B715, que permite uma distância de até 50 metros).

A idéia básica é um Arduino funcionando como mestre, e um ou mais slaves.


Conforme o site Arduino.cc, pode ser utilizado o código abaixo para o Master:

Code for Master Reader - Program for Arduino 1
// Wire Master Reader
// by Nicholas Zambetti

// Demonstrates use of the Wire library
// Reads data from an I2C/TWI slave device
// Refer to the "Wire Slave Sender" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include

void setup()
{
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop()
{
  Wire.requestFrom(2, 6);    // request 6 bytes from slave device #2

  while(Wire.available())    // slave may send less than requested
  {
    char c = Wire.read(); // receive a byte as character
    Serial.print(c);         // print the character
  }

  delay(500);
}
O Slave deve ter o seguinte código:
Code for Slave Sender - Program for Arduino 2
// Wire Slave Sender
// by Nicholas Zambetti

// Demonstrates use of the Wire library
// Sends data as an I2C/TWI slave device
// Refer to the "Wire Master Reader" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include

void setup()
{
  Wire.begin(2);                // join i2c bus with address #2
  Wire.onRequest(requestEvent); // register event
}

void loop()
{
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent()
{
  Wire.write("hello "); // respond with message of 6 bytes
                       // as expected by master
}
No caso, o dispositivo slave se identifica como periférico 2 (Wire.begin(2);).

quarta-feira, 7 de março de 2012

Electronics Projects for Students and Hobbyists (by Lewis Loflin)

Mais um site interessantíssimo para o estudante e o hobbysta, com alguma teoria e dezenas de projetos, envolvendo Arduino, PICAXE e assim por diante.

Copio a introdução: "The purpose of these pages is to introduce the student and hobbyist to electronics projects. My hope is generate interest for those thinking about entering a high tech field, or simply to have fun. I've done this since the 1960s and having to overcome a low income household means we have to work smart and use what is available."

sexta-feira, 3 de fevereiro de 2012

O hardware em 'código aberto'

Entrevista de David Mellis à INFO Online (9 de março de 2009)

Imagine se a Coca-Cola publicasse a fórmula do refrigerante na web e desse permissão a qualquer empresa para fabricá-lo. Foi mais ou menos isso o que fez a Arduino, companhia com sede na Itália e fãs em muitos países. Inspirada na turma do software livre, a empresa liberou todos os seus projetos de engenharia na web. Em 2008, vendeu dezenas de milhares de placas de controle a estudantes e projetistas do mundo inteiro. Elas vêm sendo usadas para construir desde luminárias inteligentes até aviões que se autopilotam. David Mellis, um dos fundadores da Arduino, fala sobre a nova onda do hardware livre.

INFO - Por que vocês decidiram projetar hardware de código aberto?
Mellis - Nós queríamos que outras pessoas estendessem a plataforma para adequá-la às suas necessidades. Para isso, elas deveriam ter acesso ao código-fonte do software e ao projeto do hardware. Além disso, como era uma plataforma nova, ser de código aberto deu confiança às pessoas. Elas sabiam que poderiam continuar expandindo a plataforma mesmo que o desenvolvedor original desistisse dela.

Que outras vantagens o código aberto traz ao hardware?
Uma vantagem é a possibilidade de adaptar o modelo de negócios e o fornecimento a diferentes situações. Outras empresas podem vender kits para a montagem de dispositivos compatíveis com Arduino, por exemplo. Também podem redesenhar os produtos para trabalhar com componentes que são mais baratos e fáceis de conseguir em seus países. Um exemplo de produto derivado das placas Arduino que atende a um uso específico é a ArduPilot, placa de código aberto para navegação autônoma em aeronaves.

Que tipo de contribuição ao projeto vocês receberam de outras pessoas?
Muitas pessoas têm desenhado novas placas com base nos projetos anteriores. A LilyPad, criada pela pesquisadora Leah Buechley e pela empresa SparkFun, por exemplo, foi projetada para uso em roupas e acessórios de vestuário. É uma ótima adaptação da Arduino original, e uma que nós provavelmente nunca teríamos desenvolvido.

O software vem sendo aperfeiçoado por voluntários?
Sim. Voluntários têm contribuído muito. Eles escreveram bibliotecas de programas que permitem às placas trabalhar com diferentes tipos de hardware e de lógica. Também ajudaram a reescrever funções básicas do sistema e atualizaram o ambiente de desenvolvimento, entre outras coisas.

Como vocês competem com outras empresas que fabricam as placas Arduino?
Nem sempre é uma competição. Procuramos trabalhar com pessoas e empresas que têm ideias para novas placas, como a SparkFun, que criou a LilyPad, e a Gravitech, criadora da Arduino Nano. Também tentamos cobrar um preço justo pelos produtos. Assim, não é fácil torná-los ainda mais baratos. Além disso, as pessoas gostam da Arduino. Elas procuram nos apoiar comprando produtos oficiais.

O hardware de código aberto vai se sustentar no longo prazo?
Acho que sim. De certa forma, não é diferente de outros negócios. Temos de fazer um produto que as pessoas queiram e vendê-lo por um preço justo. Trabalhar com o código aberto nos mantém honestos, já que sempre haverá alguém para nos substituir se tentarmos explorar os clientes. Se fizermos um bom trabalho, não vamos deixar de ser bem- sucedidos só porque os concorrentes têm nossos arquivos de projetos.

O modelo de negócio de vocês vem sendo imitado por outras empresas?
Sim. A Adafruit, da artista e engenheira Limor Fried, é um exemplo. Ela desenha produtos interessantes de código aberto, incluindo alguns compatíveis com dispositivos Arduino. Limor trabalha em parceria com outras empresas, que fabricam e vendem esses projetos.

Produtos de consumo, como televisores, poderão ter código aberto no futuro?
É possível que sim. Já existe um celular de código aberto, o OpenMoko. À medida que os componentes eletrônicos e o processo de fabricação se tornarem baratos, mais e mais equipamentos complexos vão, provavelmente, se tornar open-source.

Fonte: Maurício Grego, de INFO Online

quarta-feira, 14 de setembro de 2011

LDR e Arduino (I)

O leitor Luiz Oliveira solicita: "o potenciometro controla o brilho do led que esta dentro do tubo com o ldr e este ldr vai ser conectado em qualquer entrada do duemilanove controlando assim o microservo". Em suma, a idéia é que a luminosidade incidente sobre o LDR posicione o servo de -90 a +90 graus.

O diagrama é o seguinte:
Na segunda parte postarei o programa, que ainda está sendo "gerado".

quarta-feira, 17 de agosto de 2011

Arduino: Timers and Interrupts

Para quem, como eu, sempre evitou temporizadores e interrupções ao trabalhar com o Arduino, este artigo é um achado: Arduino 101: Timers and Interrupts, de RobotFreak.



sábado, 25 de dezembro de 2010

Comunicação entre 2 Arduinos por Rádio (Final)

Software de Recepção para Comunicação entre 2 Arduinos por Rádio

Este é o software de recepção, que utiliza em parte as rotinas desenvolvidas por Maurice Ribble (30/08/2009), disponíveis em http://www.glacialwanderer.com/hobbyrobotics.

/*
Projeto:
   Transmissão de dados por RF entre duas placas Arduino

Objetivos:
   Experimentar a transmissão de dados por RF entre duas placas Arduino
   Experimentar os módulos de transmissão e recepção de RF
   Estabelecer os fundamentos para futuras experiências envolvendo controle remoto
  
Componentes:
   2 Placas Arduino Duemilanove com ATmega328
   1 módulo transmissor de RF de 315 MHz
   1 módulo receptor de RF de 315 MHz

Autor: Karl Heinz Benz
Data: 23/12/2010
Correções, sugestões e nova documentação devem ser enviadas a karlbenz@terra.com.br
Licenciamento: Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil
http://creativecommons.org/licenses/by-nc-sa/3.0/br/

Utilização do pacote de software desenvolvido por:
   Maurice Ribble
   30/08/2009
   http://www.glacialwanderer.com/hobbyrobotics
*/

// Módulo de RECEPÇÃO

#define LED_PIN     13

void setup()
{
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  Serial.begin(1200);  // Hardware suporta até 2400, mas 1200 fornece maior alcance.
}

void loop()
{
  Serial.println(readUInt(true));
  digitalWrite(LED_PIN, HIGH);
  delay(50);
  digitalWrite(LED_PIN, LOW);
}

// Maurice Ribble
// 30/08/2009
// http://www.glacialwanderer.com/hobbyrobotics
// This does some error checking to try to make sure the receiver on this one way RF
//  serial link doesn't repond to garbage

#define NETWORK_SIG_SIZE 3

#define VAL_SIZE         2
#define CHECKSUM_SIZE    1
#define PACKET_SIZE      (NETWORK_SIG_SIZE + VAL_SIZE + CHECKSUM_SIZE)

// The network address byte and can be change if you want to run different devices in proximity to each other without interfearance
#define NET_ADDR 5

const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};  // Few bytes used to initiate a transfer

// Receives an word over the RF network
word readUInt(bool wait)
{
  int pos = 0;          // Position in the network signature
  word val;             // Value of the unsigned int
  byte c = 0;           // Current byte
 
  if((Serial.available() < PACKET_SIZE) && (wait == false))
  {
    return 0xFFFF;
  }
 
  while(pos < NETWORK_SIG_SIZE)
  {
    while(Serial.available() == 0); // Wait until something is avalible
    c = Serial.read();

    if (c == g_network_sig[pos])
    {
      if (pos == NETWORK_SIG_SIZE-1)
      {
        byte checksum;

        while(Serial.available() < VAL_SIZE + CHECKSUM_SIZE); // Wait until something is avalible
        val      =  Serial.read();
        val      += ((unsigned int)Serial.read())*256;
        checksum =  Serial.read();
       
        if (checksum != ((val/256) ^ (val&0xFF)))
        {
          // Checksum failed
          pos = -1;
        }
      }
      ++pos;
    }
    else if (c == g_network_sig[0])
    {
      pos = 1;
    }
    else
    {
      pos = 0;
      if (!wait)
      {
        return 0xFFFF;
      }
    }
  }
  return val;
}

Comunicação entre 2 Arduinos por Rádio (II)

Software de Transmissão para Comunicação entre 2 Arduinos por Rádio

Este é o software de transmissão, que utiliza em parte as rotinas desenvolvidas por Maurice Ribble (30/08/2009), disponíveis em http://www.glacialwanderer.com/hobbyrobotics.

/*
Projeto:
   Transmissão de dados por RF entre duas placas Arduino

Objetivos:
   Experimentar a transmissão de dados por RF entre duas placas Arduino
   Experimentar os módulos de transmissão e recepção de RF
   Estabelecer os fundamentos para futuras experiências envolvendo controle remoto
  
Componentes:
   2 Placas Arduino Duemilanove com ATmega328
   1 módulo transmissor de RF de 315 MHz
   1 módulo receptor de RF de 315 MHz

Autor: Karl Heinz Benz
Data: 23/12/2010
Correções, sugestões e nova documentação devem ser enviadas a karlbenz@terra.com.br
Licenciamento: Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil
http://creativecommons.org/licenses/by-nc-sa/3.0/br/

Utilização do pacote de software desenvolvido por:
   Maurice Ribble
   30/08/2009
   http://www.glacialwanderer.com/hobbyrobotics
*/

// Módulo de TRANSMISSÃO

#define NETWORK_SIG_SIZE 3

#define VAL_SIZE         2
#define CHECKSUM_SIZE    1
#define PACKET_SIZE      (NETWORK_SIG_SIZE + VAL_SIZE + CHECKSUM_SIZE)

// The network address byte and can be change if you want to run different devices in proximity to each other without interfearance
#define NET_ADDR 5

void setup()
{
  Serial.begin(1200);  // Hardware suporta até 2400, mas 1200 fornece maior alcance.
}

int sensorPin = A0;    // Entrada conectada ao pino central do potenciômetro
int sensorValue = 0;

void loop()
{

  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);   
  writeUInt(sensorValue); // Put any number you want to send here
  delay(100); // Debounce button
}

const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};  // Few bytes used to initiate a transfer

// Sends a word over the RF network
void writeUInt(word val)
{
  byte checksum = (val/256) ^ (val&0xFF);
  Serial.write(0xF0);  // This gets reciever in sync with transmitter
  Serial.write(g_network_sig, NETWORK_SIG_SIZE);
  Serial.write((byte*)&val, VAL_SIZE);
  Serial.write(checksum); //CHECKSUM_SIZE
}

sexta-feira, 17 de dezembro de 2010

Comunicação entre 2 Arduinos por Rádio (I)

Você construiu aquele carrinho com dois motores controlados por um Arduino (ou por qualquer outro controlador, não vamos limitar o mundo ao Arduino) acoplado a um joystick. Tudo funciona bem, os motores aceleram e desaceleram, virando a haste do joystick para a esquerda o motor esquerdo diminui a rotação, e assim por diante. Aí você faz o carrinho andar sobre a mesa, prá frente e prá trás, e se dá conta do óbvio: a abominável fiapeira que une o carrinho ao Arduino, à fonte de alimentação, ao joystick. Qual a solução? Claro, dois Arduinos - um servindo como interface com o mundo externo (joystick, potenciômetros, chaves e outros dispositivos de controle) e o outro com a função de controlar os motores e outros atuadores do tal carrinho - e os dois Arduinos, claro, conectados por alguma comunicação sem fio.

Complicado? Não, muito simples e barato. Pode-se utilizar dois módulos XBee, mas o preço seria inconveniente e não há necessidade de uma tecnologia tão sofisticada. A alternativa (disponível no mercado nacional) é o uso de Módulos de RF de 315 MHz - um módulo é transmissor e o outro é receptor. A comunicação é unidirecional, não havendo, portanto, a possibilidade de envio da informação de eventuais sensores localizados no carro robótico para a placa de interface com o mundo externo. Futuramente abordarei a transmissão bidirecional.

Na foto, o módulo pequeno é o transmissor e o módulo maior é o receptor. Mais dados técnicos no site da Sparkfun. Existem diversos fabricantes e diversos revendedores no Brasil. Também exitem módulos que operam em outras freqüências, como 299, 418 e 433.92 MHz. O preço? Quase todos os módulos custam cerca de R$ 8,00 cada.

As características principais desta solução são:
  • Comunicação em um único sentido;
  • Alcance máximo de cerca de 150 metros;
  • Preço baixíssimo;
  • Grande geração de ruído, que necessita de um filtro (de software) para funcionar de forma conveniente;
  • Velocidade de transmissão: 2400 bps (embora alguns módulos funcionem a 4800 bps).
Há diversos artigos abordando esta solução:
Projeto
A proposta deste projeto é simples: um Arduino deve transmitir a outro o valor obtido a partir da leitura de um potenciômetro (de 0 a 1023).

O diagrama esquemático do transmissor é:

Já o receptor está abaixo representado:

    quarta-feira, 15 de dezembro de 2010

    Mais portas para o Arduino

    À primeira vista, um Arduino Duemilanove ou Uno (chip ATmega328) tem uma infinidade de portas: 6 entradas analógicas e 14 entradas/saídas digitais, das quais 6 podem ser saídas PWM, o que parece suficiente para a maioria das aplicações imagináveis. Muitas vezes, no entanto, sentiremos falta de alguma entrada analógica a mais - como no caso de haver necessidade de conectar 8 potenciômetros ou sinais analógicos quaisquer - ou de alguma entrada digital - por exemplo, se precisarmos conectar um LCD (que utiliza 6 pinos digitais) e mais um monte de chaves liga-desliga; por fim, haverá situações em que necessitaremos de alguma(s) entrada(s) analógica(s) e de alguma(s) entrada(s)/saída(s) digital(is) a mais.

    Existem 2 soluções: o uso de outro processador, como o Arduino Mega, que utiliza o chip ATmega2560, com 16 pinos de entrada analógica e 54 entradas/saídas digitais (dos quais 14 podem ser saídas PWM). É uma alternativa tecnicamente correta, mas bastante mais cara.

    E existe a alternativa mais barata, mas que envolve um pouco mais de esforço no projeto: o uso de multiplexadores. Um multiplexador é um circuito combinacional com várias entradas e uma única saída, mais um conjunto de entradas de controle que permitem selecionar qual entrada é conectada diretamente à saída. Um multiplexador pode ser digital (lida somente com sinais digitais, como o 74LS151) e analógico (os sinais de entrada e o de saída possuem níveis analógicos, mas os pinos de seleção são digitais), como o CD4051.

    Por exemplo, no multiplexador digital de 8 bits citado - o 74LS151, temos 8 entradas digitais (valores binários 0 ou 1) e somente uma saída digital; exitem 3 pinos de seleção (porque 2 na potência 3 = 8).

    Assim como existem multiplexadores, também existem os demultiplexadores (digitais e analógicos), com uma entrada única e diversas saídas, e que igualmente contam com um circuito de controle que seleciona qual entrada é conectada à saída. Para maiores esclarecimentos, consulte a Wikipedia.

    O Playground do Arduino possui uma solução interessante para conectar 8 sinais analógicos (no caso, potenciômetros) a uma única entrada analógica do Arduino, com a utilização de um chip 4051 (multiplexador analógico de 8 canais). No caso, são utilizados 3 pinos digitais do ATmega328 para selecionar qual das 8 entradas será conectada à saída do multiplexador, e portanto a uma entrada analógica do próprio microcontrolador. Também há um circuito que ilustra a utilização de um multiplexador digital, no caso o 74LS151.

    Em todos os casos, o microcontrolador deve fazer uma varredura (normalmente seqüencial) em todas as portas, lendo o valor que consta na saída do multiplexador e, obviamente, "sabendo" qual circuito está sendo lido naquele instante.

    À medida que mais e mais portas vão sendo conectadas aos multiplexadores, também necessitaremos de mais saídas lógicas para selecionar cada porta individualmente, o que poderá trazer novo problema - a falta de disponibilidade de portas digitais.

    Uma alternativa é a utilização de um contador hexadecimal (por exemplo, o 74LS93) para selecionar uma porta do multiplexador. Neste caso, bastará 1 (uma) saída digital para incrementar o contador.


    Se quisermos sofisticar um pouco, poderemos acrescentar mais uma saída para ressetar o contador, e eventualmente uma terceira para decrementar (neste caso, teríamos de utilizar um contador bidirecional, como o 74LS193, que ainda possui outros recursos - por exemplo, pode ser carregado com um valor inicial).

    quarta-feira, 20 de outubro de 2010

    Arduino UNO e Arduino Mega 2560

    Foi lançado o Arduino Uno, nova versão do Arduino. É uma placa de microcontrolador baseado no ATmega328, possuindo 14 pinos de entrada/saída digital (dos quais 6 podem ser usados como saídas PWM), 6 entradas analógicas, um cristal oscilador de 16MHz, uma conexão USB, uma entrada de alimentação, uma conexão ICSP e um botão de reset.
    Arduino Uno (fonte: http://arduino.cc/en/uploads/Main/ArduinoUnoFront.jpg) 

    Da mesma forma que seus antecessores, o Arduino Uno contém todos os componentes necessários para suportar o microcontrolador. A diferença está na substituição do chip FTDI, antes utilizado para conversão do sinal serial, por um ATmega8U2, programado como conversor de USB para serial.

    Este novo chip USB poderá ser reprogramado para interfacear com outros dispositivos, como Teclado, Mouse, MIDI e Joysticks. A placa possui a certificação CE mark e o processo de homologação para a FCC está em andamento.

    Arduino Mega 2560
    Foi feita também uma atualização no modelo Arduino Mega. Com a substituição do chip, houve aumento significativo de memória para armazenamento de programas

    Para uma comparação com as outras versões, veja o índice de placas Arduino. Também foi lançada versão da IDE compatível com o Uno e o Mega 2560, a versão 0021.

    quarta-feira, 1 de setembro de 2010

    Site oficial do Arduino

    Este é o site oficial do Arduino. Visita obrigatória para todo aquele que se aventurar pelos árduos (desculpe...) caminhos do Arduino, fonte do conhecimento, da versão oficial da linguagem Arduino, e assim por diante.

    As principais seções do site são: Buy, Download, Getting Started, Learning, Reference, Hardware & FAQ. Destacam-se ainda o Blog, o Forum multilíngüe (inclusive em português) e o Playground, com diversas seções interessantíssimas, como Manuais, Configuração da Placa Arduino, Ferramentas de desenvolvimento, Aplicações completas, Interfaceamento com hardware (gaste algumas noites navegando nesta seção, vale a pena), Interfaceamento com software, Bibliotecas de código e tutoriais, Sugestões e bugs, Técnicas de eletrônica, Grupos, Fornecedores de software e hardware & Idéias de projetos.

    A equipe do Arduino é composta por Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino e David Mellis.

    domingo, 27 de junho de 2010

    ArduinoLcdSensorIR


    Projeto: ArduinoLcdSensorIR

    Objetivo: Construir um protótipo em protoboard que meça a distância utilizando um sensor InfraVermelho e a informe em um LCD.

    Componentes: Placa Arduino Duemilanove com ATmega328

    Sensor IR GP2Y0A02 (Sharp)

    Display LCD 2x16 LCM1602B

    Veja o projeto em ArduinoLcdSensorIR