quarta-feira, 24 de outubro de 2012

Review Arduino Mega2560 R3

Introdução:

O Arduino Mega 2560 é uma placa de microcontrolador baseada no ATmega2560 (datasheet). Ele possui 54 pinos de entradas/saídas digitais, 16 entradas analógicas,4 UARTs (portas seriais de hardware), um oscilador de cristal de 16 MHz, uma conexão USB, uma entrada de alimentação, uma conexão ICSP e um botão de reset. Ele contém tudo o que é necessário para dar suporte ao microconrolador; basta conectar a um computador com um cabo USB ou a uma fonte de alimentação e já está pronto para começar. O mega é compatível com a maioria dos shields desenhados para os Arduino Uno, Duemilanove e para o Diecimila. Possui ainda o dobro de memória do antigo Arduino Mega.


Características:

MicrocontroladorATmega2560
Voltagem de alimentação5V
Voltagem de entrada (recomendada)7-12V
Voltagem de entrada (limites)6-20V
Pinos digitais I/O54 (dos quais 14 podem ser saídas PWM)
Pinos de entrada analógica16
Corrente contínua por pino I/O40 mA
Corrente contínua para o pino 3.3V50 mA
Memória Flash256 KB of which 4 KB used by bootloader
SRAM8 KB
EEPROM4 KB
Velocidade de Clock16 MHz


Alimentação:



O Arduino Mega2560 pode ser alimentado pela conexão USB ou com uma fonte externa. A entrada de alimentação é selecionada automaticamente.
Alimentação externa (não USB) pode ser tanto de uma fonte como de baterias. A fonte pode ser conectada plugando um conector de 2,1mm, positivo no centro, na entrada de alimentação. Cabos vindos de uma bateria podem ser inseridos nos pinos terra (Gnd) e entrada de voltagem (Vin) do conector de energia.
A placa pode operar com alimentação externa entre 6 e 20 volts. No entanto, se menos de 7 volts forem fornecidos o pino de 5V pode fornecer menos de 5 volts e a placa pode ficar instável. Com mais de 12V o regulador de voltagem pode super-aquecer e danificar a placa. A faixa recomedável é de 7 a 12 volts.
O Mega2560 difere de todas as placas anteriores no sentido de que não utiliza o chip FTDI para fazer a conversão de serial para USB que foi substituído pelo ATmega8U2 programado para realizar esta mesma função.

Os pinos de alimentação são os seguintes:
  • VIN. A entrada de voltagem da placa Arduino quando se está usando alimentação externa (em oposição aos 5 volts fornecidos pela conexão USB ou outra fonte de alimentação regulada) É possível fornecer alimentação através deste pino ou acessá-la desde ai se etiver alimentando pelo conector de alimentação. 
  • 5V. Fornecimento de alimentação regulada para o microcontrolador e outros componentes da placa. 
  • 3V3. Uma alimentação de 3,3 vots gerada pelo chip FTDI. A corrente máxima é de 50 mA. 
  • GND. Pinos terra.

Memória:

O ATmega2560 tem 256 KB de memória flash para armazenamento de código(dos quais 8KB são usados pelo bootloader), 8 KB de SRAM e 4 KB de EEPROM (que poder ser lidos e escritos com a biblioteca EEPROM).

Entrada e Saída:

Cada um dos 54 pinos digitais do Mega2560 pode ser usado como entrada ou saída, usando as funções de pinMode()digitalWrite(), e digitalRead(). Eles operam a 5 volts. Cada pino pode fornecer ou receber um máximo de 40 mA e possui um resistor interno (desconectado por default) de 20-50KΩ. Em adição alguns pinos possuem funções especializadas:
  • Serial: 0 (RX) and 1 (TX); Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX). Usados para receber (RX) e transmitir (TX) dados seriais TTL. Pinos 0 e 1 são também conectados aos pinos correspondentes do chip serial FTDI USB-to-TTL. 
  • Interruptores externos: 2 (interruptor 0), 3 (interruptor 1), 18 (interruptor 5), 19 (interruptor 4), 20 (interruptor 3), and 21 (interruptor 2). Estes pinos podem ser configurados para disparar uma interrupção por um valor baixo, um limite diminuindo ou subindo, ou uma mudança em um valor. Para mais dealhes veja a função attachInterrupt()
  • PWM: 0 a 13. Fornecem saída analógica PWM de 8-bits com a função analogWrite()
  • SPI: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS). Estes pinos dão suporte à comunicação SPI que, embora suportada pelo hardware, ainda não está incluída na linguagem Arduino. 
  • LED: 13. Há um LED connectado ao pino digital 13. Quando o pino está em HIGH o led se acende. 
  • I2C: 20 (SDA) and 21 (SCL). Fornecem suporte à comunicação I2C (TWI) usando a bibliotecaWire(documentação no site do Wiring). Note que estes pinos não estão na mesma posição que os pinos I2C pins no Duemilanove ou no Diecimila.

O Mega2560 tem 16 entradas analógicas, cada uma das quais com 10 bits de resolução (i.e. 1024 valores diferentes). Por padrão elas medem de 0 a 5 volts, embora seja possível mudar o limite superior usando o pino AREF e a função analogReference().

Há um par de pinos diferentes na placa:
  • AREF. Voltagem de referência para as entradas analógicas. Usados com analogReference(). 
  • Reset. Marque este valor como LOW para resetar o microcontrolador. Tipicamente usado para adcionar um botão de reset em shields que bloqueiam o que há na placa.


Comunicação:



O Arduino Mega2560 possui várias facilidades para se comunicar com um computador, com outro Arduino ou outros microcontroladores. O ATmega2560 fornece quatro portas de comunicação serial UARTs para TTL (5V). Um chip FTDI FT232RL direciona uma destas portas para a conexão USB e os drivers FTDI (que acompanham o software do Arduino) fornecem uma porta com virtual para softwares no computador. O software do arduino inclui um monitor serial que permite que dados simples de texto sejam enviados de e para a placa Arduino. Os LEDs RX e RT piscarão enquanto dados estiverem sendo transmitidos pelo chip FTDI e pela conexão USB ao computador (mas não para comunicação serial nos pinos 0 e 1).

Uma biblioteca SoftwareSerial permite comunicação serial em qualquer um dos pinos digitais do Mega2560.

O ATmega2560 também fornece suporte para comunicação I2C (TWI) e SPI. O software Arduino inclui uma biblioteca Wire para simplificar o uso do bus I2C; veja a documentação no site do Wiring para mais detalhes. Para usar a comunicação SPI veja o datasheet do ATmega2560.



Programação:

O Arduino Mega2560 pode ser programado com o software do Arduino (download).
O ATmega2560 no Arduino Mega2560 vem com o bootloader pré gravado possibilita o envio de novos códigos sem o uso de um programador de hardware externo. Ele se comunica usando o protocolo original STK500 (reference, C header files).


Reset Automatico (Software):



Ao invés de necessitar o pressionamento físico do botão de reset antes de um upload, o Arduino Mega2560 é desenhado de moda a permitir que o reset seja feito pelo software executado em um computador conectado. Uma das linhas dos fluxos de controle de hardware (DTR) do FT232RL é conectada diretamente à linha de reset do ATmega2560 através de um capacitor de 100 nanofarads. Quando esta linha é acessada (rebaixada), a linha de reset decai por tempo suficiente para resetar o chip. O software Aduino utiliza esta capacidade para possibilitar que novos códigos sejam enviados simplesmente clicando no botão de upload do ambiente de programação do Arduino. Isto significa que o bootloader fica fora do ar por um tempo mais curto, uma vez que o rebaixamento do DTR pode ser bem coordenado com o início do upload.

Esta montagem tem outras implicações. Quando o Mega2560 é conectado a um computador rodando Mac OS X ou Linux ele é resetado cada vez uma conexão é feita com o software (via USB). Durante o próximo meio segundo (aproximadamente) o bootloader estará rodando no Mega2560. Uma vez que ele é programado para ignorar dados mal formados (i.e. qualquer coisa que não seja um upload de novo código), ele vai interceptar os primeiros bytes de informação enviado à placa depois que uma nova conexão seja aberta. Se um programa rodando na placa recebe uma pré configuração ou outros dados assim que ele começa, certifique-se de que o software com o qual ele se comunica espera meio segundo depois que a conexão seja estabelecida antes de começar a enviar os dados.

O Mega2560 tem uma trilha que pode ser cortada para desabilitar o auto-reset. Esta trilha pode depois ser unida novamente por solda para re-habiltar esta funcionalidade.Esta trilha tem a identificação "RESET-EN" Também é possível desabilitar o autoreset conectando um um resistor de 110Ω do 5V à linha de reset.


Proteção de sobre-corrente USB:

O Arduino Mega2560 possui um fusível resetável que protege as portas USB do computador contra curto-circuitos e sobre corrente. Apesar de muitos computadores possuírem sua própria proteção interna, o fusível resetável dá um grau extra de segurança . Se mais de 500 mA forem drenados ou aplicados na porta USB , o fusível automaticamente abrirá o circuito até que o curto ou a sobrecarga sejam removidos.


Características Físicas e Compatibilidade com Shields:



As dimensões máximas de comprimento e largura da placa Mega2560 são 4,0" (101,60 mm ) e 2,1" ( 53,34 mm ) respectivamente , com o conector USB e jack de alimentação ultrapassando um pouco as dimensões da placa em si . Três furos para montagem com parafusos permitem montar a placa numa superfície ou caixa . Note que a distância entre os pinos de entrada e saída digitais no. 7 e 8 é de 160 mil ( 0,16") , não é sequer múltiplo dos 100 mil ( 0,10") do espaçamento entre os outros pinos .


O Mega2560 é projetado para ser compatível com a maioria dos shiels feitos para o Diecimila ou Duemilanove. Os pinos de entrada e saída digitais 0 a 13 , os adjacentes AREF e GND, entradas analógicas 0 a 5, o conector power e o ICSP estão todas em posições equivalentes . Além do mais, a UART principal ( porta serial ) está localizada nos mesmos pinos (0 e 1), bem com as interrupções 0 e 1 ( pinos 2 e 3 respectivamente ). SPI está disponível através do conector ICSP em ambos ( Mega2560 e Uno/Duemilanove/Diecimila ). Note que o I2C não está localizado nos mesmos pinos no Mega2560 ( 20 E 21 ) e no Duemilanove ( entradas analógicas 4 e 5 ) .

Review Arduino GPS Module

Introdução:

Esse modulo de GPS do DX é composto pelo chipset SiRF Star III, de ótima qualidade, tem protocolos NMEA (google earth, VisualGPS). É muito pequeno, e tem antena interna com bom sinal de recepção e de rápido acesso. Deve ser controlado pela porta serial em níveis TTL.

datasheet: http://www.dpcav.com/data_sheets/EM411Product_Guide1_2.pdf


Caracteristicas:

  • SiRF Star III chipset GPS de alta performance 
  • Sensibilidade muito alta (Rastreamento Sensibilidade:-159dBm) 
  • TTFF extremamente rápido em níveis baixos de sinal 
  • Suporta o protocolo NMEA 0183 dados 
  • Built-in SuperCap para manter os dados do sistema de aquisição de satélites rápida 
  • Built-in antena 
  • Bloqueio para rastreamento de sinal fraco 
  • Tamanho compacto
  • Processamento paralelo de 20 canais 
  • WAAS / EGNOS 
  • RoHS compativel 

Especificações:


Recebedor:

  • Chipset: SiRF Star III 
  • Freqüência: L1, 1575.42 MHz 
  • Código C / A: 1,023 taxa de MHz 
  • Canais: 20 canais all-in-view de rastreamento 
  • Sensibilidade:-159dBm

Precisão:

  • Posição: 10 metros, 2D RMS 
  • 5 metros, 2D RMS, WAAS habilitado 
  • Velocidade: 0,1 ms 
  • 1ms sincronizado no tempo do GPS

Tempo de Aquisição:

  • Reaquisição: 0,1 segundos, em média 
  • Começo quente: 8 segundos, em média 
  • Começo morno: 38 seg, em média 
  • Partida a frio: 42 seg, em média

Tensão de Alimentação:

  • Entrada de alimentação principal: 4.5V ~ 6.5V DC Input 
  • Consumo: 60mA (35mA trickle mode) 
  • Tensão de backup: 2,5 V a 3,6 V 
  • Corrente Bacckup: típico 10uA

Protocol:

  • Nível tensão: nível TTL, 
  • Nível de saída Tensão: 0V ~ 2.85V 
  • Taxa de transmissão: 4800 bps 
  • Mensagem de saida: NMEA 0183 GGA, GSA,GSV,RRMC (VTG, GLL opcional)

Pinos:

  • VCC: (DC de entrada de energia): Esta é a fonte principal para um DC 6.5V ~ 4.5V placa do módulo de alimentação.
  • TX: Este é o principal canal de transmissão para enviar dados de navegação e medição para usuáriosoftware de navegação ou escrito pelo usuário do software. 
  • RX: Este é o canal de recepção principal para receber comandos de software.Normalmente este pino deve ser mantido em alto e se você nãousar este pino ligue um resistor de 3.5V para pull-down. 
  • GND: GND é o terra.
Programa de Teste:

Esse primeiro programa é bem simples so para conectar o EM-411 ao Arduino via softwareserial:

#include <SoftwareSerial.h>

SoftwareSerial portaGPS(2, 3);

void setup()
{
  Serial.begin(9600);
  portaGPS.begin(4800);
}


void loop()
{
  if(portaGPS.available())      
    Serial.write(portaGPS.read());
}

Essas são as informações colhidas:

$GPGGA,153724.449,4112.5585,N,00833.2070,W,1,04,2.1,26.3,M,51.4,M,,0000*77
$GPGSA,A,3,28,15,10,27,,,,,,,,,8.2,2.1,7.9*3F
$GPRMC,153724.449,A,4112.5585,N,00833.2070,W,0.45,4.55,080312,,,A*78

Para enviar apenas os comandos que você quer, o programa seria assim como exemplo para $GPRMC:

 #include <SoftwareSerial.h>

 SoftwareSerial portaGPS(2, 3);
 byte rcv;
 int match;
 char buffer[100];
 int ptr;

void setup() 
{
 Serial.begin(9600);
 portaGPS.begin(4800);
}

void loop() 
{
 buffer[0]='$';
 buffer[1]='G';
 buffer[2]='P';
 buffer[3]='R';
 buffer[4]='M';
 buffer[5]='C';
 buffer[6]=',';
 ptr=7;
 match=0;
 while (match<7) 
{
  while(!portaGPS.available()); 
  rcv=portaGPS.read();
  if (rcv=='$' && match==0) match=1;   
  if (rcv=='G' && match==1) match=2;
  if (rcv=='P' && match==2) match=3;
  if (rcv=='R' && match==3) match=4;
  if (rcv=='M' && match==4) match=5;
  if (rcv=='C' && match==5) match=6;
  if (rcv==',' && match==6) match=7;   
 }
 do 
{
  while(!portaGPS.available()); 
  rcv=portaGPS.read();
 buffer[ptr++]=rcv;
 }while (rcv!='\n');
Serial.print(buffer);
}

E essas seriam as informações lidas do Modulo GPS:


$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
Where:
     RMC            Recommended Minimum sentence C
     123519         Fix taken at 12:35:19 UTC
     A                 Status A=active or V=Void.
     4807.038,N   Latitude 48 deg 07.038' N
     01131.000,E  Longitude 11 deg 31.000' E
     022.4           Speed over the ground in knots
     084.4           Track angle in degrees True
     230394         Date - 23rd of March 1994
     003.1,W       Magnetic Variation
     *6A              The checksum data, always begins with *

Review 2.4" TFT LCD Screen Arduino

Introdução:

O módulo de LCD TFT TFT01 de 2.4'' tem interface de 40pins, e não apenas é um display LCD, mas incluem o toque, cartão SD. Portanto, é um módulo de extensão poderosa para o seu projeto.A tela possui um controlador S6D1121 que substitui o ILI9325, é um circuito de interface de dados 8/16bit, fácil de fazer interface com MCU STM32, AVR e 8051, etc.TFT01 é projetado com um controlador de toque nele. O IC toque é o ADS7843, e interface de toque está incluída nos 40 pinos.Outra extensão útil no TFT01 é saida de cartão SD.Para usar o cartão SD se utiliza a interface SPI.

Características:

  • Interface de barramento. 
  • Solução de chip único para um cristal líquido TFT LCD QVGA
  • 240RGBx320-dot resoluçãoreal de 262.144 cores. 
  • Suporte MVA (Multi-domain Vertical Alignment) display de visão ampla 
  • Oscilador interno e reset de hardware 
  • Função de movimento parcial, possibilitando parcialmente a condução de um painel LCD em locais especificados pelo usuário 
  • Funções de economia de energia 
  • 8 cores de modo;modo de espera;modo de suspensão 
  • Baixo consumo de energia 
  • Tamanho: 530 milímetros * 750mm

Idéias de aplicação:

  • Digital Photo Frame (DPF) 
  • terminais de vídeo 
  • instrumentação 
  • GPS 
  • Jogos 
  • Telefones de vídeo e portátil de VCD, DVD

Programando:

Esse exemplo para o TFT01, que apenas suportam modo 8 bits, por causa das portas limitadas de IO do Arduíno Você pode definir 10 PIN para o Touch CS ou para a função de cartão SD.




Review Arduino LCD TFT01 Shield

Introdução:

O módulo TFT01 LCD é trabalha em nível de tensão de 3.3V que não é compatível com os pinos do Arduino, então temos esse shield como conversor. Agora você pode ligar diretamente o TFT01 no seu arduino Arduino.


O shield TFT01 suporta tanto o modo de 16 bits e modo 8 bits, você pode usar de 2,4 "ou 3,2" com ele. Se você usar o modo de 8 bits, com o cartão SD ou toque no TFT01. Definindo o pino 10 (D_CS / SD_CS), quando você usa o modo 8 bits, você pode selecionar usando cartão SD (10 Pin como BAIXO ) ou função Touch (10 em ALTO).


Características:
  • Compatível com os pinos do Arduino 
  • Suporte para de 8 bits e modo de 16 bits 
  • Interrupção por software para cartão SD ou função Touch 
  • Tamanho: 550 mm x 550 mm 

Onde Usar?

  • Digital Photo Frame 
  • Terminais de vídeo 
  • GPS 
  • Jogos 

Cuidados:
Selecione o cartão SD ou função Touch no 10 Pin (D_CS / SD_CS), selecione cartão SD (D10 Pin em BAIXO) ou Touch (D10 Pin em ALTO)


Review DHT11 Arduino Digital Temperature Humidity Sensor

Introdução:

Esse review é sobre o sensor de temperatura e umidade DHT de baixo custo. Esses sensores são muito básicos, mas são ótimos para amadores que querem fazer algum registro de dados básicos. Os sensores de DHT são feitos de duas partes, um sensor de umidade capacitivo e um termistor. Há também um chip dentro muito básico que faz a mesma conversão de analógico para digital e coloca na saída um sinal digital com a temperatura e umidade. O sinal digital é bastante fácil de ler usando qualquer microcontrolador.

                             

Possui uma saída de sinal calibrado digital. Usando a técnica de aquisição de sinal digital e temperatura e umidade de sensoriamento, garante alta confiabilidade e estabilidade a longo prazo. Este sensor inclui um componente de medição de temperatura NTC, e se conecta a um microcontrolador de 8 bits, oferecendo excelente qualidade, resposta rápida, capacidade anti-interferência e de custo-eficácia.



Sobre o DHT11:

  • Custo muito baixo 
  • 3 a 5V e I / O 
  • 2.5mA uso corrente máxima durante a conversão (quando solicitar dados) 
  • Bom para leituras de umidade 20-80% com precisão de 5% 
  • Bom para 0-50 ° C de temperatura leituras ± 2 ° C de precisão 
  • Não mais do que uma taxa de amostragem de Hz (uma vez por segundo) 
  • Tamanho de 15,5 milímetros x 12mm x 5,5 milímetros 
  • 4 pinos com 0,1 de espaçamento "
                                    

Código de Exemplo:

#define DHT11_PIN 0      // ADC0

byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN)) 
      result |=(1<<(7-i));
    while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
    }
    return result;
}


void setup()
{
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);
  Serial.begin(9600);
  Serial.println("Ready");
}
void loop()
{
  byte dht11_dat[5];
  byte dht11_in;
  byte i;// start condition
// 1. pull-down i/o pin from 18ms
  PORTC &= ~_BV(DHT11_PIN);
  delay(18);
  PORTC |= _BV(DHT11_PIN);
  delayMicroseconds(40);
  DDRC &= ~_BV(DHT11_PIN);
  delayMicroseconds(40);
  
  dht11_in = PINC & _BV(DHT11_PIN);
  if(dht11_in)
  {
    Serial.println("dht11 start condition 1 not met");
    return;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN);
  if(!dht11_in)
  {
    Serial.println("dht11 start condition 2 not met");
    return;
  }
  
  delayMicroseconds(80);// now ready for data reception
  for (i=0; i<5; i++)
    dht11_dat[i] = read_dht11_dat();
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);
  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// check check_sum
  if(dht11_dat[4]!= dht11_check_sum)
  {
    Serial.println("DHT11 checksum error");
  }
  Serial.print("Current humdity = ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[1], DEC);
  Serial.print("%  ");
  Serial.print("temperature = ");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[3], DEC);
  Serial.println("C  ");
  delay(2000);
}

sábado, 20 de outubro de 2012

Review Accelerometer ADXL345

Introdução:

O ADXL345 é bem adequado para medidas de aceleração estática da gravidade em aplicações tilt-sensing, bem como aceleração dinâmica resultante do movimento ou choque. Sua alta resolução (4 mG/ LSB) permite a medição de mudanças de inclinação inferiores a 1,0 °.

Várias funções especiais de detecção são fornecidas. A detecção de atividade e inatividade detecta a presença ou ausência de movimento e se a aceleração em qualquer eixo excede um nível definido pelo usuário. Detecção de queda livre detecta se o dispositivo está caindo. Estas funções podem ser mapeados para um dos dois pinos de saída de interrupção.


Os acelerômetros são bastante comuns em eletrônicos, especialmente em projetos de hobby. Muitos de vocês já ouviu falar sobre acelerômetros, e alguns deles já usaram.
Este breve tutorial explica em primeiro lugar o que é um acelerômetro, e depois como ligar um para o seu Arduino usando a Biblioteca ADXL345. Estamos nos focando em um ADXL345 acelerômetro eixo triplo.



Este acelerômetro é ótimo para iniciantes, como ele tem boa variedade (até 16G), interface digital (I2C e SPI), e é bastante resistente a vibrações. É realmente fácil de usar, é necessário soldar os pinos para fazer as ligações, coisa bem simples. Ele já possui os capacitores adequados de filtragem e de afinação para você.

Um acelerômetro mede aceleração. Que pode parecer óbvio, no entanto, existem dois tipos de aceleração. 
  • Aceleração estática - como a gravidade - que é o que você vai usar o seu acelerômetro para medir com mais freqüência. 
  • Também aceleração dinâmica, que é basicamente o movimento, que normalmente fica no caminho da maioria da nossa inclinação aplicações em sensoriamento remoto.


O ADXL345 é um pequeno, fino, de 3 eixos com alta resolução (13-bit) de medição de até ± 16 g. Dados de saída digital é formatado como 16-bit e complemento de dois e é acessível através de qualquer um SPI (3 - ou 4 fios). Ou interface digital I2C O ADXL345 é bem adequado para medir a aceleração da gravidade estático em inclinação sensoriamento aplicações, bem como a aceleração dinâmica resultante de movimento ou de choque. A sua alta resolução (4 mg / LSB) permite a medição de alterações de inclinação inferior a 1,0 °. Várias funções especiais de detecção são fornecidos. Detecção de atividade e inatividade detectar a presença ou ausência de movimento e se a aceleração em qualquer eixo excede um nível definido pelo usuário. Queda livre sensoriamento detecta se o dispositivo está caindo. Estas funções podem ser mapeadas a um dos dois pinos de saída de interrupção.

Características:

  •      2.0-3.6VDC Tensão de alimentação
  •      Baixa Potência: 40uA no modo de medição, 0.1uA em standby@2.5V
  •      Toque de Detecção / Double Tap
  •      Queda livre de Detecção
  •      SPI e I2C
Como ligar:

Esta seção do guia ilustra como conectar um Arduino e ADXL345. A tabela descrevendo quais os pinos do Arduino devem ser ligados aos pinos do acelerômetro:



Arduino PinADXL345 Pin
10CS
11SDA
12SDO
13SCL
3V3VCC
Gnd
GND


Código de Exemplo:

//Add the SPI library so we can communicate with the ADXL345 sensor
#include <SPI.h>

//Assign the Chip Select signal to pin 10.
int CS=10;

//This is a list of some of the registers available on the ADXL345.
//To learn more about these and the rest of the registers on the ADXL345, read the datasheet!
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1

long tempo_anterior      = 0;
long intervalo           = 90; //milisegundos
unsigned long tempo_atual;

//This buffer will hold values read from the ADXL345 registers.
char values[10];
//These variables will be used to hold the x,y and z axis accelerometer values.
int x,y,z;

void setup(){ 
  //Initiate an SPI communication instance.
  SPI.begin();
  //Configure the SPI connection for the ADXL345.
  SPI.setDataMode(SPI_MODE3);
  //Create a serial connection to display the data on the terminal.
  Serial.begin(9600);
  
  //Set up the Chip Select pin to be an output from the Arduino.
  pinMode(CS, OUTPUT);
  //Before communication starts, the Chip Select pin needs to be set high.
  digitalWrite(CS, HIGH);
  
  //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
  writeRegister(DATA_FORMAT, 0x01);
  //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
  writeRegister(POWER_CTL, 0x08);  //Measurement mode  
}

void loop(){
  //Reading 6 bytes of data starting at register DATAX0 will retrieve the x,y and z acceleration values from the ADXL345.
  //The results of the read operation will get stored to the values[] buffer.
  readRegister(DATAX0, 6, values);

  //The ADXL345 gives 10-bit acceleration values, but they are stored as bytes (8-bits). To get the full value, two bytes must be combined for each axis.
  //The X value is stored in values[0] and values[1].
  x = ((int)values[1]<<8)|(int)values[0];
  //The Y value is stored in values[2] and values[3].
  y = ((int)values[3]<<8)|(int)values[2];
  //The Z value is stored in values[4] and values[5].
  z = ((int)values[5]<<8)|(int)values[4];
  
  tempo_atual = millis();// o tempo atual é igual ao tempo de funcionamento do uC   
  
if(tempo_atual - tempo_anterior > intervalo)// se o tempo atual menos o tempo anterior for maior que o intervalo com que eu quero fazer minha acao
  { 
    tempo_anterior = tempo_atual;//tempo anterior recebe o tempo atual 
    //Print the results to the terminal.
    Serial.print(x, DEC);
    Serial.print(',');
    Serial.print(y, DEC);
    Serial.print(',');
    Serial.println(z, DEC);      
    delay(10); 
  }
}

//This function will write a value to a register on the ADXL345.
//Parameters:
//  char registerAddress - The register to write a value to
//  char value - The value to be written to the specified register.
void writeRegister(char registerAddress, char value){
  //Set Chip Select pin low to signal the beginning of an SPI packet.
  digitalWrite(CS, LOW);
  //Transfer the register address over SPI.
  SPI.transfer(registerAddress);
  //Transfer the desired register value over SPI.
  SPI.transfer(value);
  //Set the Chip Select pin high to signal the end of an SPI packet.
  digitalWrite(CS, HIGH);
}

//This function will read a certain number of registers starting from a specified address and store their values in a buffer.
//Parameters:
//  char registerAddress - The register addresse to start the read sequence from.
//  int numBytes - The number of registers that should be read.
//  char * values - A pointer to a buffer where the results of the operation should be stored.
void readRegister(char registerAddress, int numBytes, char * values){
  //Since we're performing a read operation, the most significant bit of the register address should be set.
  char address = 0x80 | registerAddress;
  //If we're doing a multi-byte read, bit 6 needs to be set as well.
  if(numBytes > 1)address = address | 0x40;
  
  //Set the Chip select pin low to start an SPI packet.
  digitalWrite(CS, LOW);
  //Transfer the starting register address that needs to be read.
  SPI.transfer(address);
  //Continue to read registers until we've read the number specified, storing the results to the input buffer.
  for(int i=0; i<numBytes; i++){
    values[i] = SPI.transfer(0x00);
  }
  //Set the Chips Select pin high to end the SPI packet.
  digitalWrite(CS, HIGH);
}


quarta-feira, 10 de outubro de 2012

Review Modulo Bluetooth Wireless Serial Port DX

Hoje vamos falar do modulo Bluetooth Wireless Serial Port do dealextreme. Esse modulo é muito útil pois diminui a quantidade de fios na sua bancada, alem de elevar os níveis do seu projeto.
É extremamento facil de usar, pois basta apenas substituir suas saídas TX e RX do Arduino pelas entradas TX e RX do modulo:

Funciona assim, seu Arduino transfere com a porta TX, então ela tem que estar ligado no RX do Bluetooth que recebe as informações. Para receber seu Arduino utiliza o pino RX, então tem que estar ligado no pino TX do modulo Bluetooth. Tem que ser invertido no final das contas.

Quando o modulo estiver conectado, em seu computador você tem que adicionar uma porta serial sobre seu Bluetooth receptor do computador, assim ele vai fazer uma conexão serial comum entre o Bluetooth de seu computador e o modulo de Bluetooth do Arduino, que repete tudo que o Arduino fala pra ele, só quem sem fio.

A distancia de operação é muito boa e chega amais de 2 metros, pode ser alimentado por uma gama bem grande tensão alem de possuir leds indicadores, quando o led esta piscando ele não tem conexão, quando ele esta vermelho sem piscar esta conectado a um dispositivo Bluetooth.

É possível modificar algumas informações enviando os comandos AT:


AT+PIN1234 <cr>

AT+NAMEdongle <cr>

AT+BAUD4 <cr>

Onde o ultimo comando vai dizer qual baud rete sera usado para conectar.

É bem compacto e já vem com antena na placa do circuito, que pode ser modificada:

A parte traseira mostra todas suas entradas:


Fácil de se conectar a qualquer protoboard:

Esse modulo também vem com cabo extensor:





Review Multímetro 2.8''

Esse review é sobre o Multímetro de 2.8'' do dealextreme, o aparelho é bem rígido  compacto e tem protetor de plastico (sem cheiro!).
Partindo do básico  mede tensão AC e DC, corrente AC e DC, tem teste de diodos e continuidade com apito sonoro, faz leitura de resistência e capacitância. Alem de contar com teste de transistores.

Os diferenciais:

Vem com cabos de teste e bateria de 9V, possui proteção de plastico e um display muito grande e bonito. Tem um botão que fixa o valor medido.É muito bonito e tem aparência profissional.

Caixa protetora:



Muito bem embalado, com cabos de teste:


Algumas especificações:

- Capacitancia: 2nF até 200uF
- AC Tensão: 200mV até 700V
- DC Tensão: 200mV até 1,000V
- AC Corrente: 2mA até 10A
- DC Corrente: 200uA até 10A
- Resistencia: 200 ohm até 200M ohm

Foto do produto:

Display muito grande e com ótimo contraste, fazendo leitura de um capacitor de 15uF:


Ótima precisão na leitura de componentes eletrônicos:


Botão para salvar valor de ultima leitura ativo:


Podemos concluir que o produto é muito bom, feito para técnicos, engenheiros e hobbistas.
Ótima qualidade de material, o custo beneficio excelente, recomendo a compra no DX!








Review SRF05 Ultrasonic Distance Measuring Sensor Module

Como o sensor SRF05 funciona?

A operação do sensor ultra-sônico é baseada na emissão e reflexão de ondas acústicas, entre o objeto e um receptor. Normalmente o portador dessas ondas é o ar, mas pode também ser liquido. O tempo de propagação de um som é medido e avaliado.

A maior vantagem deste sensor reside no fato de que pode detectar larga escala de diferentes materiais. A detecção é independente da forma ou cor do material.

O sensor ultra-sônico transmite seus sons não audíveis na freqüência usual de 30 a 300Khz. Filtros implementados dentro do sensor ultra-sônico, verifica o som recebido e atualiza o eco emitido pela onda do sensor. A velocidade de operação do sensor é limitada por uma frequência, que em média de 1Hz a 125Hz.

Apesar de o sensor ultra-sônico detectar uma larga escala de diferentes materiais, existem alguns materiais que absorvem o som, e não são detectados, são eles: lã, tecido, espuma, borracha e outros materiais que absorvem som.



Pulso:

A excitação de pulso consiste em excitar o transdutor com pulsos que podem atingir uma tensão acima de 500V e com duração de alguns nanosegundos. A freqüência de repetição dos pulsos é da ordem de 300 a 1000 kHz.


O SRF05 é uma evolução do sensor SRF04, e foi concebido para aumentar a flexibilidade, e para reduzir os custos ainda mais. Como tal, o SRF05 é totalmente compatível com o sensor SRF04. Intervalo é aumentado de 3 metros a 4 metros. Um novo modo de operação (pino Mode conectado no GND) permite que o SRF05 use somente um pino para gatilho e eco, poupando assim os valiosos pinos do seu controlador. Quando o pinoMode é deixado desconectado, o SRF05 opera com gatilho e eco separados, como o sensor SRF04. O SRF05 do dealextreme inclui um pequeno atraso antes do pulso de eco para dar aos controladores mais lentos, como o Basic Stamp e Picaxe, o tempo para executar seus impulsos nos comandos.




Modo 1 – compatível sensor SRF04 – Trigger separado do Echo:

Este modo usa os pinos Trigger e Echo separados, e é o modo mais simples de usar. Todos os exemplos de código para o sensor SRF04 são compatíveis no SRF05. Para usar este modo, basta deixar o pino Modedesconectado – o SRF05 tem um resistor interno neste pino (pull up).



Calcular a distância:


O SRF05 diagramas de sincronismo são mostrados acima para cada modo. Você só precisa fornecer um pulso curto 10uS para a entrada de trigger para iniciar o alcance. O SRF05 irá disparar oito ciclos de ultrasons a 40khz e ativar o pino Echo (ou Trigger no modo 2). Em seguida, ele ouve um eco, e assim que detectado, ele desativa o Echo novamente. A linha de eco é, portanto, um pulso cuja largura é proporcional à distância do objeto. Cronometrando o pulso é possível calcular a distância em centímetros. Se nada for detectado, em seguida, o SRF05 irá desativar o Echo após 30mS.

O sensor SRF04 fornece um pulso de eco proporcional à distância. Se a largura do pulso é medido em uS, em seguida, dividindo por 58 vai dar-lhe a distância em cm, ou dividindo por 148 vai dar a distância em polegadas. uS/58 = cm ou uS/148 = polegadas.

O SRF05 do DX pode ser acionado mais rápido a cada 50ms, ou 20 vezes por segundo. Você deve esperar 50ms antes do gatilho seguinte, mesmo se o SRF05 detecta um objeto próximo e do pulso echo é mais curto. Isso é para garantir que o “beep” ultra-sônico desapareceu e não irá causar um eco falso na próxima medição.


Código de Exemplo:

int duration; //Stores duration of pulse in
int distance; // Stores distance
int sensorpin = 7; // Pin for SRF05

void setup()
{
Serial.begin(9600);
}

void loop()
{
pinMode(sensorpin, OUTPUT);
digitalWrite(sensorpin, LOW); // Make sure pin is low before sending a short high to trigger ranging
delayMicroseconds(2);
digitalWrite(sensorpin, HIGH); // Send a short 10 microsecond high burst on pin to start ranging
delayMicroseconds(10);
digitalWrite(sensorpin, LOW); // Send pin low again before waiting for pulse back in
pinMode(sensorpin, INPUT);
duration = pulseIn(sensorpin, HIGH); // Reads echo pulse in from SRF05 in micro seconds
distance = duration/58; // Dividing this by 58 gives us a distance in cm
Serial.println(distance); // Wait before looping to do it again
delay(100);
}


quinta-feira, 4 de outubro de 2012

Review Lithium Battery Charging Board

Descrição:


Esse modulo é muito útil para todos projetos que usam baterias, e tem que manter o controle de carga alem de carrega-las. Essa placa utiliza o circuito integrado TP4056, que serve para isso mesmo, carregar baterias, tem corrente máxima de 1A e possui sistema de regulação termal.
Pode ser comprando no dealextreme DX por um valor muito barato, e que tem grande funcionalidade, e não faz você perder tempo construindo um dispositivo para fazer isso. É incrivelmente pequeno, tem entrada mini USB assim como pinos na própria placa para soldar os fios de alimentação assim como fios para a bateria. Além disso possui LED's que mostram se a carga esta completa e se esta carregando.

Alguns dados:


- Corrente: 1A (ajustavel);
- Precisão de carga: 1.5%;
- Tensão de entrada: 4.5~5.5V;
- Tensão de entrada carga completa: 4.2V; 
- Indicador de carga: Vermelho carregando,azul carga completa; 
- Entradas: Mini USB;
- Temperatura de operação: -10'C to 85'C

Imagens:

A placa é muito pequena, e pode ser modificada adicionando fios:

Tem circuito muito simples:

Conectada usando porta mini USB:


Pode ser facilmente adicionada em seu projeto por ser pequena e muito fácil de controlar:


Recomendo a compra a todos!!



segunda-feira, 1 de outubro de 2012

Review Arduino Uno REV3

Descrição:

O Arduino Uno dealextreme é uma placa de microcontrolador baseado no ATmega328 (datasheet). Ele tem 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. Ele contém todos os componentes necessários para suportar o microcontrolador, simplesmente conecte a um computador pela porta USB ou alimentar com uma fonte ou com uma bateria e tudo pronto para começar.




O Uno difere de todas as placas antecessoras no sentido de não utilizar o chip FTDI cara conversão do sinal serial. Utiliza no seu lugar um Atmega8U2 programado como conversor de USB para serial.

Revisão 3 da placa com as novas características:
Pinos SDA e SCL adicionados próximos ao AREF.
Dois outros pinos adicionados próximos ao RESET, o IOREF que permite aos shields se adaptarem à voltagem fornecida pela placa. No futuro os shields serão compatíveis tanto com as placas que utilizam o AVR e operam a 5V, como com o Arduino Due que operará a 3,3V. O segundo pino não está conectado e é resrvado para propósitos futuros.
Circuíto de RESET mais robusto.
Atmega 16U2 em substituição ao 8U2.

"Uno" quer dizer um em italiano e é utilizado para marcar o lançamento do Arduino 1.0. O Uno e a versão 1.0 serão as versões de referência do Arduino, daqui para diante. O UNO é o mais recente de uma série de placas Arduino, e o modelo de referência para a plataforma Arduino. Para uma comparação com as versões prévias veja o índice de placas Arduino.
Características
Microcontrolador ATmega328
Voltagem Operacional 5V
Voltagem de entrada (recomendada) 7-12V
Voltagem de entrada (limites) 6-20V
Pinos E/S digitais
14 (dos quais 6 podems ser saídas PWM)
Pinos de entrada analógica 6
Corrente CC por pino E/S 40 mA
Corrente CC para o pino 3,3V 50 mA
Flash Memory 32 KB (ATmega328) dos quais 0,5KB são utilizados pelo bootloader
SRAM 2 KB (ATmega328)
EEPROM 1 KB (ATmega328)
Velocidade de Clock 16 MHz




Alimentação:


O Arduino Uno pode ser alimentado pela conexão USB ou com uma fonte de alimentação externa. A alimentação é selecionada automaticamente.

Alimentação externa (não USB) pode ser tanto de um adaptador CA para CC ou bateria. Há um conector para alimentação de 2,1mm com o positivo no centro. Cabos vindos de uma bateria podem ser inseridos diretamente nos pinos Gnd e Vin do conector de alimentação.

Esta placa pode funcionar com uma fonte de alimentação externa de 6 a 20 volts. No entanto se a alimentação for inferior a 7V, o pino 5V pode fornecer menos de cinco volts e a placa pode se mostrar instável. E se a aliementação for maior do que 12V o regulador de voltagem pode superaquecer e danificar a placa. A faixa recomendada é de 7 a 12 volts.

Os pinos de alimentação são os seguintes:
VIN. A entrada de alimentação para a placa Arduino quando se está utilizando uma fonte de alimentação externa. (em oposição à conexão USB ou outra fonte de aliemteção regulada). Você pode fornecer alimentação através deste pino, ou se estiver utilizando o conector de alimentação acessar esta voltagem aqui.
5V. A fonte de alimentação regulada usada para o microcontrolador e para outros componentes na placa. Pode vir tanto do VIN através do regulador embarcado ou da conexão USB ou outra fonte regulada em 5V.
3V3. Uma fonte de 3,3V gerada pelo regulador embarcado. A corrente máxima suportada é de 50mA.
GND. Pinos terra.
Memória

O ATmega328 têm 32KB (dos quais 0,5 são utilizados pelo bootloader). Também tem 2KB de SRAM e 1KB de EEPROM (que pode ser lido ou gravado com a biblioteca EEPROM).




Entrada e Saída:

Cada um dos 14 pinos digitais do Uno podem ser utilizados como uma entrada ou uma saída utilizando-se as funções pinMode(),digitalWrite(), e digitalRead(). Eles operam a 5V. Cada pino pode fornecer ou receber um máximo de 40mA e tem um resistor pull-up interno (desconectado por padrão) de 20-50kΩ. Além disso alguns pinos tem funções especializadas:
Serial: 0 (RX) e 1 (TX). Usados para receber (RX) e transmitir (TX) dados seriais TTL. Estes pinos são conectados aos pinos correspondentes do chip serial USB-para-TL ATmega8U2.
Interruptores Externos: 2 e 3. Estes pinos podem ser configurados para disparar uma interrupção de acordo com alguma variação sensível pelo circuíto. Veja a função attachInterrupt() para mais detalhes.
SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estes pinos dão suporte à comunicação SPI utilizando a biblioteca SPI.
LED: 13. Há um LED integrado ao pino digital 13. Quando este pino está no valor HIGH este LED está aceso, quando o pino está em LOW o LED está apagado.
I2C: 4 (SDA) and 5 (SCL). Fornecem suporte a comunicação I2C (TWI) utilizando a biblioteca Wire.
AREF. Voltagem de referência para as entradas analógicas. Utilizado com a função analogReference().
Reset. Envio o valor LOW para esta linha para resetar o microcontrolador. Tipicamente usado para adcionar um botão de de reset para shileds montados sobre a placa original.



O Uno tem 6 entradas analógicas, etiquetadas de A0 a A5, cada uma tem 10 bits de resolução (i.e. 1024 valores diferentes). Por padrão elas medem de 0 a 5V, embora seja possível alterar o limite superior utilizando o pino AREF e a função analogReference().
Comunicação

O Arduino Uno possui uma série de facilidades para se comunicar com um computador, outro Arduino, ou outros microcontroladores. O ATmega328 fornece comunicação serial UART TTL (5V) que está disponível nos pinos digitais 0 (RX) e 1 (TX). Um ATmega8U2 na placa canaliza esta comunicação para a USB e aparece como uma porta virtual para o software no computador. O firmware do '8U2 utiliza os drivers padrão USB COM e nenhum driver externo é necessário. Entretanto, no Windows, um arquivo .inf é necessário. Ainda faltam as instruções específicas mas em breve estarão disponíveis. O software do Arduino inclui um monitor serial que permite dados textuais ser enviados e recebidos da placa. LEDs conectados ao RX e TX piscarão enquanto dados estiverem sido transmitidos pelo chip USB-para-serial e pela conexão USB (mas não para comunicação serial nos pinos 0 e 1).

Uma biblioteca de SoftwareSerial permite comunicação serial em qualquer dos pinos digitais do Uno.

O ATmega328 também suporta comunicação I2C (TWI) e SPI. O software do Arduino inclui uma biblioteca Wire para simplificar o uso do bus I2C, veja a documentação para mais detalhes. Para comunicação SPI utilize a biblioteca SPI.



Programação:


O Arduino Uno pode ser programado com o software Arduino (download). Simplesmente selecione "Arduino Uno" no menu Tools > Board.

O ATmega328 no Arduino Uno vem pré-gravado com um bootloader que permite a você enviar código novo para ele sem a utilização de um programador de hardware externo. Ele se comunica utilizando o protocolo original STK500 (referencia, arquivos C header).

Você também pode saltar o bootloader e programar o microcontroaldor através do conector ICSP (In-Circuit Serial Programming); veja estas instruções para mais detalhes.

O código fonte do firmware do ATmega8U2 também está disponível. Este chip é carregado com um bootloader DFU, que pode ser ativado conectando o jumper de solda na parte posterior da placa (próximo ao mapa da Itália) e depois resetando o 8U2. Você pode utilizar o software FLIP da Atmel (Windows) ou o programador DFU (Mac OS X e Linux) para carregar um novo firmware. Ou ainda utilizar um programador externo (sobrescrevendo o bootloader DFU).


Reset automatico por software:


Ao invés de necessitar do pressionamento físico de um botão antes de um upload, o Arduino Uno é desenvolvido que permita esta operação ser feita por meio do software rodando em um computador. Uma das linhas de controle de fluxo do hardware (DTR) do ATmega8U2 é conectado à linha de reset do ATmega328 através de um capacitor de 100nF. Quando esta linha é declarada (rebaixada) a linha de reset cai o suficiente para resetar o chip. O software do Arduino utiliza esta capacidade para permitir o envio de código novo simplismente pressionando o botão de upload na IDE. Isto significa que o bootloader pode ter um intervalo mais curto, uma vez que o rebaixamento do DTR pode ser melhor coordenado com o início do upload.

Esta configuração tem outras implicações. Quando o Uno é conectado a um computador rodando Mac OS X ou Linux, ele é resetado cada vez que uma conexão é estabelecida com o software (via USB). Durante o próximo meio segundo o bootloader estará rodando no Uno. Uma vez que ele está programado para ignorar dados malformados (i.e. qualquer coisa diferente do upload de um novo código), ele irá interceptar os primeiros bytes de informação após a abertura da conexão. Se um programa rodando na placa recebe alguma configuração ou outra informação quando começa a rodar esteja seguro de que o software com o qual ela se comunica espere por um segundo antes de começar a enviar dados.

O Uno contem uma trilha que pode ser interrompida (cortada fisicamente) para desabilitar o auto-reset. Os conectores de cada lado da trilha podem ser soldados para reabilitar esta função. Ela está identificada como "RESET-EN". Você também pode desabilitar o auto-reset conectando um resistor de 110Ω do 5V à linha de reset.


Proteção contra sobre-corrente na USB:

O Arduino Uno possui um polyfuse resetável que protege a porta USB do seu computador contra sobre-corrente e curto circuítos. Embora muitos computadores tenham sua própria proteção interna, o fuso fornece uma camada a mais de proteção. Se mais de 500mA forem aplicados a porta USB ele automaticamente irá interromper a conexão até que o curto ou a sobrecarga seja removido.
Características físicas

A largura e o comprimento máximos do PCB do Uno são 68,58 e 53,34mm respectivamente (2,7" x 2,1"), com os conectores USB e de alimentação extendendo-se além destas dimensões. Quatro orifícios para parafusos permitem que a placa seja fixada a uma superfície ou encapsulamento. Verifique que a distância entre os pinos digitais 7 e 8 é de 160mil (milésimos de polegada ou 0,16"), não é nem mesmo um múltiplo dos 100mil que separam os outros pinos.