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

Comunicação Bluetooth - HC-06

Criado em 1994 pela Ericsson, o Bluetooth é uma especificação de rede sem fio (IEEE 802.15.1) utilizada para conectar dispositivos pessoais como telefones celulares, notebooks, computadores, dispositivos IoT, entre outros permitindo a troca de informações entre esses dispositivos através de uma frequência de rádio de curto alcance. Devido sua versatilidade, diversos shields de bluetooth foram desenvolvido onde podemos citar o NRF2401, os módulos ZIGBEE e o HC-06 que será usado em nossa experiência. Na figura 1 podemos ver uma foto do modulo HC-06.


Figura 1. Modulo Bluetooth HC-06.
Para ligar o bluetooth ao Arduíno é bem simples, para isso basta polarizar o dispositivo ligando VCC e GND aos pinos de 5V e GND do Arduíno e o RX e TX aos pinos 0 e 1 conforme indicado na figura 2.
Figura 2. Polarização e conexão RX/TX do Modulo HC-06.

O desenvolvimento do código é bem simples, basta usar a biblioteca SoftwareSerial.h que permite que o chip Atmega receba comunicação serial mesmo enquanto trabalha em outras tarefas, desde que haja espaço no buffer serial de 64 bytes. Para maiores informações sobre essa biblioteca, clique aqui.

Os comando utilizados em nosso experimentos serão:

SoftwareSerial bluetooth(rxPin, txPin) -  O SoftwareSerial é usado para criar uma instância de um objeto SoftwareSerial, cujo nome (bluetooth) você precisa fornecer. Os parâmetros rxPin, txPin são referentes aos pinos utilizados no Arduíno para realizar a comunicação RX/TX.

bluetooth.begin(BAUD) - Define a velocidade (taxa de transmissão) para a comunicação serial, onde BAUD é o valor da taxa (para saber mais sobre comunicação serial, cilque aqui).

bluetooth.println("TEXTO") -  Imprime dados no pino de transmissão da porta serial do software. Funciona da mesma forma que a função Serial.print ().

bluetooth.read() -  Retorna um caractere que foi recebido no pino RX da porta serial do software. 

Hardware e software devidamente configurado, para realizar nossos testes, podemos fazer o download no celular do Aplicativo Bluetooth terminal. Após baixar o aplicativo, basta realizar um scan para localizar o HC-06 e parear os dispositivos. Caso o celular solicite uma senha, digite 1234.

Com base no circuito da figura 2 e nos comandos descritos acima, o programa abaixo irá acender um LED na porta 13 quando a letra 'H' for digitada e apaga-lo quando for digitado a letra 'L'.

#include <SoftwareSerial.h>// Incluir biblioteeca Software Serial para habilitar bluetooth
SoftwareSerial bluetooth(1, 0); //indicação das entradas onde TX, RX serão ligadas
int RXBLUE;

void setup() 
{
  //Habilitando leds na porta 13
  pinMode(13, OUTPUT);

  //Inicializando  software serial - Bluetooth
  bluetooth.begin(9600);
  bluetooth.println("iniciando bluetooth");
  bluetooth.println("Digite H para ligar o LED");
  bluetooth.println("Digite L para desligar o LED");
}

void loop() {
  //Checa se bluetoohth esta conectado
   if (bluetooth.available()>0)
  {
    RXBLUE = bluetooth.read();
    bluetooth.println("Led ligado");
    if(RXBLUE == 'H')
    {
      digitalWrite(13, HIGH);
      bluetooth.println("Led ligado");

    }
    if(RXBLUE == 'L')
    {
      digitalWrite(13, LOW);
      bluetooth.println("Led desligado");
    }
  }
}


Você poderá verificar a implementação do código/circuito acima clicando na imagem abaixo.

 Exclusão mutua com Arduíno




Não esqueça do like do video e de curtir nossa pagina no facebook no link abaixo:

Brincando com o Multi function Shield

O projeto Arduíno foi criado para prover facilidade no desenvolvimento de projetos microcontrolados e certamente um dos grandes responsáveis por essa facilidade é o shield.
Shields" é o nome dado às placas de expansão de hardware que encaixam na placa Arduíno principal.  Através dos Shields podemos adicionar novos elementos ao nosso projeto sem a necessidade de grandes conhecimentos em eletrônica. Os circuitos contidos nos diversos shields  existente contém uma eletrônica que adiciona funções que a placa principal não possui. Nessa postagem iremos apresentar o Multi function Shield da figura 1.
Figura 1. Multi function Shield  

No caso do  Multi function Shield, temos os seguintes componentes instalados:

UnitPIN #
Buzzer (autofalante/beeper)3 (digital On/Off)
4 LEDs10, 11, 12, 13
3 botões + reset buttonA1, A2, A3
Potenciômetro (10 kOhm)A0
4 Displays de 7-sementos e driven 74HC595Latch 4, Clock 7, Data 8
Socket para sensor IR (controle remoto)2
Socket para sensor LM35 ou DS18B20A4
Pinos para BluethoothGND, +5v, 0, 1 (rx/tx)
Pinos livres (pwm)5, 6, 9, A5



Buzzer 

O primeiro componente que iremos testar no shield é o buzzer. Usado para emitir sons de alerta, o buzzer pode ser configurado para tocar melodias idem ao video que pode ser acessado clicando no link abaixo:

Melodia com Arduino



Para testar o buzzer do  Multi function Shield  vamos utilizar o código abaixo:

int portSpeak(3);  //porta ligada no speaker

//melodia
int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};

//duraçao de cada nota
int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};

void setup() {
  //for para tocar as 156 notas começando no 0 ate 156 ++ incrementado
        for (int nota = 0; nota < 156; nota++) {

              int duracaodanota = duracaodasnotas[nota];
              tone(portSpeak, melodia[nota],duracaodanota);

  //pausa depois das notas
              int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
              delay(pausadepoisdasnotas[nota]);}

              noTone(portSpeak);
}

void loop() {

}

Leds

Conforme já mencionado, no  Multi function Shield  os leds estão ligados aos pinos 10, 11, 12 e 13 do Arduíno. No código abaixo iremos piscar todos os leds ao mesmo tempo. 
int led1 = 13;
int led2 = 12;
int led3 = 11;
int led4 = 10;
void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
}
void loop() 
{
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  delay(1000);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 delay (1000);
}

Botões

Os botões no Multi function Shield foram implementados de maneira onde quando pressionado, a entrada do Arduíno que o botão estão ligado recebera o sinal HIGH. No programa abaixo temos um exemplo onde usamos dois botões para acender e apagar os leds do shield.
#define Bt1 A1  //Botão 1 do shield configurado no pino A1
#define Bt2 A2  //Botão 1 do shield configurado no pino A1
int led1 = 13;
int led2 = 12;
int led3 = 11;
int led4 = 10;
void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
}
void loop() 
{
  if(!digitalRead(Bt1)) //se o valor de botão 1 for 0 liga leds
  {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH); 
  }
  if(!digitalRead(Bt2)) //se o valor de botão 1 for 0 desliga leds
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
  }
}

Potenciômetro 


Potenciômetro é resistor com resistência variável. Será utilizado para enviar um sinal analógico ao Arduíno. Na figura 2 temos alguns exemplos de potenciômetros.
Figura 2. Exemplos de potenciômetros.
Por permitir variar a resistência, segundo a lei de OHM teremos uma modulação da tensão, logo o potenciômetro deve ser ligado a porta analógica do Arduíno.  No caso do kit Multi function Shield  o potenciômetro está ligado a porta analógica A0. Abaixo segue como medir o valor na entrada A0 que será modulada pelo potenciometro e enviar o valor para a porta serial.
#define Pot1 0 
void setup() 
{ 
       Serial.begin(9600); 
} 
void loop() 
{ 
    int PotValue;
    PotValue = analogRead(Pot1); 
    Serial.print("Potenciomentro: "); 
    Serial.println(PotValue); 
 }

Display de 7 segmentos

Displays de sete segmentos são usados em eletrônica para de exibir uma informação alfanumérica (binário, decimal ou hexadecimal). devido a simplicidade e fácil configuração  seu uso é muito popular.
Figura 3. Display de 7 segmentos - Facilidade para representar números. 
Como o próprio nome já diz, um display de sete segmentos é composto de sete elementos (LEDs), os quais podem ser ligados ou desligados individualmente. Na figura 4 podemos observar que no display de 7 segmentos temos um anodo comum e o catodo de cada LED receberá um nome (A, B, C,...), assim para formação dos dígitos, basta seguir a "tabela do decodificador" mostrada na figura 4.
Figura 4. Configuração do display de 7 segmentos.
O Multi function Shield  possui um registrador de descolamento onde os valores e o display que será utilizado é controlado por codificação em hexadecimal. Os código abaixo irá mostrar os numero 0 1 2 3 no display.

int LED[]= {13,12,11,10}; /* Configurações do registador de deslocamento */ #define LATCH_DIO 4 #define CLK_DIO 7 #define DATA_DIO 8 /* Mapa de Segmentos dos números de 0 to 9 */ const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; /* Byte maps to select digit 1 to 4 */ const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; void setup () { /* Set DIO pins to outputs */ pinMode(LATCH_DIO,OUTPUT); pinMode(CLK_DIO,OUTPUT); pinMode(DATA_DIO,OUTPUT); } void loop() { /* O comando WriteNumberToSegment indicando qual numero deve ser escrito e o segmento */
WriteNumberToSegment(0 , 0);
WriteNumberToSegment(1 , 1);
WriteNumberToSegment(2 , 2);
WriteNumberToSegment(3 , 3);
}
 
/* Função que controlará os displays */
void WriteNumberToSegment(byte Segment, byte Value)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}




Desafios:
Desafio 1 - Faça um programa que conte de 0 a 9 com intervalo de 1 segundo, uso estrutura de repetição FOR.
Desafio 2 - Receba uma centena via serial e exiba a centena no display
Não esqueça do like do video e de curtir nossa pagina no facebook no link abaixo:

Comando SELECT - Principais cláusulas

Desenvolvida nos anos 70, SQL é uma linguagem de pesquisa declarativa para banco de dados relacional. Muitas das características originais do SQL foram inspiradas na álgebra relacional. Essa caracteristica permite a seleção de dados previamente cadastrados dentro da base atraves da instruções SELECT. A sintaxe abaixo apresenta a sintaxe mais basica da instrução.

SELECT <lista_de_campos ou *> 
FROM <nome_da_tabela>

Exemplos:

SELECT CODIGO, NOME FROM CLIENTE
/*Seleção dos campos CODIGO e NOME da tabela cliente*/

SELECT * FROM CLIENTE
/*Seleção de todos os campos da tabela cliente, onde o "*" indica que todos campos e registros devem ser selecionados*/

Nos exemplos acima, todos os registros da tabela CLIENTE serão selecionados, agora imagine se a tabela CLIENTE tiver 150 mil registros!!!!!
Achar um cliente ou um grupo de clientes especificos dentre dessa seleção não será uma tarefa facil. Para refinar as buscas, diversas cláusulas podem ser adicionadas à instrução permitindo a extração de dados especificos da base. Na sintaxe abaixo temos algumas clasulas que podem ser adicionadas a instrução.

SELECT [DISTINCT | ALL]   * |nomes_das_colunas
FROM nome_da_tabela
[WHERE campo <operador> termo]
[ORDER BY  nome_da_coluna];

Com base na sintaxe acima, vamos definir alguma possibilidades que irão refinar nossas seleções:

Selecionando registros específicos:

Para selecionar registros específicos devemos utilizar a cláusula Where, onde através dessa cláusula poderemos atribuir condições de filtragem para selecionar um ou mais campos da tabela. A partir do exemplo apresentado na figura 1 iremos refinar nossa seleção com a cláusula where.
Figura 1. Clientes cadastrados na tabela CLIENTE da base de dados.
Com base na tabela apresentada na figura 1, vamos selecionar todas as clientes da base de dados, ou seja, vamos selecionar todos registros cujo sexo seja feminino. Para executar a demanda proposta vamos utilizar o comando abaixo cuja execução do comando pode ser visualizadas na figura 2.

SELECT  * FROM Cliente
WHERE sexo=‘F’;

Figura 2. Seleção de todas as clientes da base de dados.
Em outro exemplo, na figura 3 temos um exemplo onde serão selecionados todos clientes de São Paulo.
Figura 3. Seleção de todos clientes que moram em São Paulo.
Dependendo da campo utilizado na consulta, outros operadores relacionais podem ser utilizandos. Na Tabela 1 temos uma relação de operadores relacionais que podem ser utilizados na clausula Where. Na coluna exemplo, o campo preço é utilizado como referencia.
Tabela 1. Operadores relacionais que podem ser utilizando na clausula WHERE.
Em geral, os operadores acima são bem intuitivos(caso voce tenha alguma duvida, pode postar aqui no blog que responderei o mais rapido possivel), devido a essa facilidade, irei comentar somente os operadores LIKE, BETWEEN e IN.

Operador LIKE:

O operador LIKE é utilizando em colunas definidas como dados tipo caractere onde a consulta pode ser realizada utilizando somente parte da string armazenada na base de dados. Imagine que você não lembra o sobrenome do seu cliente (Figura 1), para realizar uma consulta usando somente uma parte da string (neste caso só o primeiro nome do cliente) devemos associar o operador Like e o "%" que servirá como curinga. Na figura 4 temos um exemplo de como selecionar todos os clientes cujo nome começa com "Zé".
Figura 4. Seleção usando operador LIKE e curinga "%"
Para selecionar todos cliente "Zé" não importando o sobrenome, o curinga foi utilizando logo após a palavra "Zé%". O curinga pode seu utilizado em qualquer ponto da string e se necessario, pode ser utilizando mais de um curinda conforme os exemplos das figura 5 e 6.
Figura 5. Exemplo usando operador like e curinga no inicio da string

Figura 6. Exemplo usando operador like e dois curingas.
Alem do curinga "%" que irá substituir uma sequencia de caracteres, podemos utilizar o sublinhado "_" como curinga, substituindo um caractere especifico.

Operador Between:

O operador Between é usado quando precisamos selecionar linhas de uma tabela cujo valor de um campo encontra-se dentro de um intervalo específico. Com diversas aplicações, esse tipo de consulta pode ser usado para filtrar os dados num determinado intervalos de tempo (datas), ou estabelecer intervalos de classe muito utilizandos em estatística. Sua sintaxe é a seguinte: 

SELECT campos FROM tabela 
WHERE campo BETWEEN inicio_intervalo AND fim_intervalo;

Na figura 7 temos um exemplo onde é exibido todos personagens da tabela Ducktales criados entre 1940 e 1950.
Figura 7. Uso do operador Between para filtrar periodo

Usando o mesmo principio apresentado na figura 7, podemos utilizar o operador NOT BETWEEN (sintaxe abaixo) e exibir todos personagens da tabela Ducktales criados fora do intervalo de 1940 a 1950. O resultado da seleção utilizando o NOT BETWEEN pode ser visto na figura 8.

SELECT campos FROM tabela 
WHERE campo NOT BETWEEN inicio_intervalo AND fim_intervalo;

Figura 8. Uso do operador NOT Between selecionando todos personagens fora do intervalo.

Operador IN:

O operador IN trabalha com a ideia de conjuntos selecionando informações que estão ou não contidas nesse conjunto. Diferente do operador relacional de igualdade (=) que seleciona dados a paritr de um valor especifico, o IN permite selecionar diversos valores com base numa lista de valores. Sua sintaxe é a seguinte:

SELECT campos FROM tabela WHERE campo IN (valor1, valor2, valor3);

.....



Ordenando os registros para exibição (order by):

A cláusula ORDER BY é utilizada para mostrar as linhas da consulta seguindo o critério de ordenação (crescente ou decrescente) definido pelo utilizador usando uma coluna como referencia. Nas figura 9 e 10 podemos ver exemplo de ordenação crescente e decrescente.
Figura 9. Seleção ordenada pelo campo NOME em ordem crescente.

Figura 10. Seleção ordenada pelo campo NOME em ordem decrescente.



Pesquisa case sensitive:

O oracle é case sensitive, ou seja, quando vamos realizar uma seleção é preciso diferenciar letras maisculas de letras minusculas. Como nem sempre temos certeza sobre como a string foi inserida na base de dados, em geral são utlizados as funções LOWER() e UPPER() que tornam a seleção case insensitive. Esse assunto será tratado em outra postagem.....





Ainda ta com duvida, curta nossa pagina no facebook no link abaixo e poste sua duvida lá.


Bibliotecas no Arduino

As bibliotecas são fundamentais para o desenvolvimento de programas em C. Caracterizadas como um conjunto de rotinas padronizadas da linguagem, as bibliotecas contém funções de entrada/saída e processamento de informações.  O uso de uma biblioteca facilita o desenvolvimento de aplicações, pois para que a função digitalRead leia o valor de tensão na entrada de uma porta qualquer, alguém já programou algumas dezenas de linhas indicando como o digitalRead irá acessar a porta, coletar o valor e definir se esse valor é HIGH ou LOW. Ao adicionar uma biblioteca ao seu projeto, as funções contidas nessa biblioteca podem ser acessadas e utilizadas pelo desenvolvedor.
Além de facilitar nossa vida, é nas bibliotecas que o compilador irá verificar se as funções que você digitou não contem nenhum erro de sintaxe, ou seja, se você escreveu o comando corretamente.
Ao contrario da programação C convencional, no Arduino a biblioteca padrão (core) não precisa ser declarada, por isso que quando você usa algumas funções como digitalRead, digitalWrite, Serial.begin e analogRead (entre outras) o programa "roda" normalmente.

Como as bibliotecas na verdade são códigos adicionais, a IDE do Arduino não adiciona todas as bibliotecas que ele possui para não utilizar recursos de memória sem necessidade, sendo assim, quando um projeto requer o uso de uma biblioteca adicional, o desenvolvedor deve adiciona-la através do comando #include.

Além das funções básicas do Arduino, segue uma relação com as principais bibliotecas que podem ser usadas no seu projeto.


#include EEPROM.h 

Usada para ler e gravar dados em uma memória EEPROM no Arduino. No Arduino Uno a EEPROM tem o tamanho de 1024 bytes, no ATmega328 a capacidade da EEPROM é de 1024 bytes  e no ATmega168 e ATmega8 a capacidade é de 4096 bytes. Dentre as funções dessas bibliotecas temos:
read(), write(), update(), get(), put(),EEPROM[]...

#include Ethernet.h

Permite conectar o Arduino à Internet ou à rede local usando um shield Ethernet. Dentre as funções dessas bibliotecas temos:
begin(), localIP(), maintain(), IPAddress(), etc...

Também não podia deixar de citar que ela retorna o valor absoluto de um número inteiro usando abs.

#include LiquidCrystal.h

Com essa biblioteca podemos controlar displays de cristal líquido (LCD). Dentre as funções dessas bibliotecas temos:
LiquidCrystal(), begin(), clear(), home(), setCursor(), write(), print() etc....


#include SD.h

 Biblioteca muito importante, usada para que seja possível escrever e ler dados em cartões de memória SD/SDHC.Dentre as funções dessas bibliotecas temos:
begin(), exists(), mkdir(), open(), remove(), rmdir(), etc


Além das bibliotecas citadas acima, a IDE do Arduino possui outras que não foram citadas como SPI (Serial Peripheral Interface), a  Servo usada para controlar motores servo e a WiFi que permite conexão à uma rede (LAN e/ou WAN)por meio de um shield WiFi. Para conhecer outras bibliotecas e aprender mais sobre a sintaxe das funções contidas nessas bibliotecas, Clique aqui e acesse o site do Arduino.

Bibliotecas desenvolvida e disponibilizadas por desenvolvedores "Anônimos" também podem ser incluídas no seus projetos, para o Arduino reconhecer essas bibliotecas basta adiciona-la IDE do Arduino conforme indicado na Figura 1.
Figura 1. IDE Arduino - Instalando e selecionando bibliotecas.



Ainda ta com duvida, curta nossa pagina no facebook no link abaixo e poste sua duvida lá.


Motor DC - Como controlar via Arduino

Os motores de corrente contínua (CC) ou motores DC (Direct Current), como também são chamados, são dispositivos que transformam energia elétrica em mecânica aproveitando as forças de atração e repulsão geradas por eletroímãs e ímãs permanentes. O vídeo abaixo, apesar de estar inglês é bem simples e exemplifica o principio de funcionamento do motor DC.





Conforme visto no vídeo acima, ao passar corrente por um condutor o campo magnético fará com que o eixo do motor gire, logo para que um motor CC seja acionado pelo Arduino, basta implementar o circuito apresentado na Figura 1.

Figura 1. Circuito simples de controle de motor CC.
Com base no circuito da Figura 1 o código abaixo irá acionar o motor por 2 segundos e desligar o motor por 1 segundo.

int motor = 8; // Varíavel criada para guardar numero da porta que controlará o motor

void setup() 
{
  pinMode(motor, OUTPUT);
}

void loop() 
{
  digitalWrite(motor, HIGH);   // liga o motor
  delay(2000);               // espera 2 segundos
  digitalWrite(motor, LOW);    // desliga o motor
  delay(1000);               // espera 1 segundo
}

No circuito da Figura 1, note que o terminal 2 do motor foi ligado no GND e o terminal 1 na porta 8 do Arduino. Se a ligação foi invertida, o sentido da corrente támbem será invertido fazendo com que o motor gire no sentido oposto (faça o teste no seu simulador).
Para fazer uso dessa característica do motor podemos usar uma Ponte H para mudar o sentido que o motor irá girar. O principio da ponte H é o bem simples, o motor conectado a ponte será controlado por 4 chaves e uma fonte de alimentação conforme mostrado na Figura 2.

Figura 2. Esquema de chaveamento da ponte H
Conforme Figura 3, podemos observar que quando as chaves 1 e 4 (Figura 3 (A)) estiverem fechadas a corrente irá passar no sentido anti-horário, ao inverter o fechamento das chaves (chave 2 e 3 fechadas, Figura 3 (B))a corrente irá passar no sentido horário invertendo o giro do motor.
Figura 3. Principio de funcionamento da Ponte H

O CI utilizado da ponte H é o L293D cujo Datasheet já está disponível no blog. Para utilizar o CI L293D além de polarizar o CI conforme Figura 4, o desenvolvedor irá ligar uma tensão de referencia ao pino 1 (setar como HIGH ou usar PWM)  e controlar o sentido da corrente através dos pinos 2 e 9 (Fios verdes na figura 4). Se o pino 2 foi setado como HIGH e 9 como LOW o motor irá girar no sentido horário, ao inverter (pino 2= LOW e pino 9 = HIGH) o motor irá girar no sentido anti-horário.
Figura 4. Controle de motor CC usando ponte H (L293D)


Agora Pratique:

Exercício 1. Reproduza o esquema da Figura 4 e controle o motor via porta serial. Onde o programa deve atender as seguintes condições:
  - Se o usuário digitar 1 - Motor gira em sentido horário
  - Se usuário  digitar 2 - Moto gira em sentido anti-horário.
  - Se o usuário digitar 0 -Motor desliga.

Exercício 2. Reproduza o mesmo projeto do exercício 1 e adicione dois Led (Vermelho e Laranja) , quando o motor girar no sentido horário, o Led vermelho deve estar ligado, quando o motor inverter o Led azul deve ser ligado.

Exercício 3. Realize um projeto com 2 motores ligados ao L293D que serão controlados pela serial. O motores quando ligados devem sempre girar em sentidos opostos.


Ainda tá com duvida, curta nossa pagina no facebook no link abaixo e poste sua duvida lá.


Alterando estrutura da tabela - Alter Table

Nesta postagem iremos apresentar ao leitor o comando ALTER TABLE do SGBD Oracle. Enquadrada na categoria de Data Definition Language (DDL), o comando alter table é usado quando é necessário realizar alguma alteração na estrutura das tabelas já criadas na base de dados. Basicamente o comando se resumirá ao exemplo abaixo:


ALTER TABLE <nome_da_tabela>  CLÁUSULA  (colunas/especificações);

As diversas clausulas realizadas pelo comando serão discutidas na sequencia:


Modificando uma coluna na tabela (MODIFY):

Para modificar a estrutura de uma coluna (já criada), devemos utilizar a clausula MODIFY do comando alter table conforme sintaxe abaixo:

ALTER TABLE <nome_da_tabela>  MODIFY (colunas tipo_do_dado [restrições],..... );

Na figura 1, iremos mostrar um exemplo do comando onde o campo NOME_CLI terá o tamanho de sua variável alterado de 20 para 25 posições. No exemplo o comando describe é utilizado antes e depois do comando ALTER TABLE mostrando a mudança realizada após a execução do comando.
Figura 1. Comando alterando do tamanho da variável nome_cli;

Adicionando uma coluna a tabela (ADD):

Quando é necessário adicionar um novo atributo (coluna) a uma tabela já existente a seguinte sintaxe deve ser usada:


ALTER TABLE <nome_da_tabela>  ADD (colunas tipo_do_dado);

Na figura 2 é possível ver a inclusão do campo CPF a tabela cliente.
Figura 2. Inclusão do campo CPF a tabela ciente.
Com um único comando é possível incluir mais de um campo numa tabela já existente.
Também traves do ADD é possível incluir atributos com restrições, na figura 3 é possível ver a inclusão dos campos logradouro e complemento onde o campo logradouro possui uma restrição não nomeada NOT NULL.
Figura 3.  Inclusão de dois campos (Logradouro, complemento) na tabela cliente.

A clausula ADD também pode ser usada para adicionar uma restrição (Constraint) à um campo já existente conforme a sintaxe abaixo:

ALTER TABLE  nome_da_tabela ADD  CONSTRAINT restrição tipo (coluna);

Usando como base a sintaxe acima, na figura 4 é possível ver como a restrição de chave primaria foi adicionada ao campo COD_CLI da  tabela cliente.
Figura 4. Inclusão de restrição de chave primeira (Primary Key) ao campo COD_CLI usando ALTER TABLE.


Excluindo uma coluna a tabela (DROP COLUMN):

A cláusula que elimina um atribuoda tabela é o DROP COLUMN cuja sintaxe pode ser verificada abaixo:

ALTER TABLE  nome_da_tabela DROP COLUMN nome_da_coluna;

Na figura 5 é possível ver o comando sendo utilizado para excluir o atributo ID_SEXO. O comando describe é utilizado para mostrar o sucesso da alteração.
Figura 5. Excluindo uma coluna usando DROP COLUMN.

Não esqueça que quando a coluna é excluída, todos os dados armazenados nessa coluna serão excluídos também!!!!!


Renomeando uma coluna a tabela (RENAME COLUMN):

Finalizando nossa postagem veremos a cláusula RENAME COLUMN que é responsavel por renomear uma coluna. Abaixo é possível ver a sintaxe do comando:

ALTER TABLE  nome_da_tabela RENAME COLUMN nome_da_coluna TO  novo_ nome_da_coluna ;

Na figura 6 é possível ver um exemplo onde a coluna COMPLEMENTO da tabela cliente foi alterada para COMPL.
Figura 6. Renomeando colunas com clausula RENAME COLUMN.



Comando SPOOL - Gerando os dados e relatórios em arquivo.

Uma pergunta frequente entre meus alunos é:  Como gerar um arquivo TXT  ou CSV (extensão para abrir no microsoft Excel) gerando assim relatórios que possam ser impressos ou entregues via email quando uma atividade for solicitada. A solução para o problema desses alunos é o comando SPOOL cuja sintaxe pode ser vista abaixo.

SPO[OL] [file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]] | OFF | OUT]


O comando SPOOL é um comando SQL que salva uma série de instruções SQL e resultados de instruções em um arquivo de saída ou envia o arquivo para uma impressora. A utilização do SPOOL é simples, basta estar conectado ao SQL e digitar as seguintes linhas de comando:

 SQL> spool c:\[nome_qualquer_do_seu_arquivo].[txt ou csv]

 SQL>   Comando/relatórios que serão gravados no arquivo

 SQL>  spool off

O primeiro passo para a criação do Arquivo de SPOOL é indicar o nome e tipo do arquivo que será gerado o relatório. Nesta primeira linha de comando também deve ser indicado o diretório que o arquivo será gerado. Após habilitar o comando SPOOL, todos os comando digitados assim como as mensagens e relatórios gerados pelos SQL serão armazenados no arquivo criado. Na figura 1 é possível ver um exemplo onde um arquivo chamado atividade1.txt foi criado na pasta c:\test. Dentro deste arquivo serão salvas as informações obtidas através do comando DESC e do comando SELECT conforme apresentado na figura 2.

Figura 1. Criação de arquivo de SPOOL no SQL 11g Express. 
Após digitar todos os comandos que você deseja registar no arquivo de SPOOL, você deve finalizar o arquivo digitando SPOOL OFF no prompt de comando.
Após finalizar o comando, vá na pasta onde o arquivo foi gerado e verifique se está tudo ok.

Figura 2. Arquivo de extensão TXT gerado pelo SQL.
Por padrão, se você utilizar o comando SPOOL em um arquivo onde outras informações já tenham sido salvas, o comando irá substituir o arquivo existente por um novo arquivo. Caso o programador desejar incluir informações adicionais (Não substituir o conteúdo) ao arquivo já existente basta adicionar a palavra APPEND ao comando de criação de arquivo SPOOL conforme indicado na figura 3.
Figura 3. Inclusão de conteudo ao Arquivo de SPOOL.

Não esqueça que se você tiver usando uma rede no seu trabalho ou no laboratório da Universidade o administrador da rede pode restringir as pastas onde o usuário pode salvar arquivos, caso você tente gerar um arquivo em local onde o administrador de redes não concede permissão o SQL não irá avisa-lo sobre o "problema".

Espero que essa postagem tenha sido útil, qualquer duvida deixei uma mensagem para nós. Não esqueça de curtir nossas redes sociais (Facebook e G+) clicando os gadget abaixo.




Uso da instrução scanf - Entrada de dados

Pertencente a biblioteca stdio.h (Standard Input/Output- entradas e saídas padrões), comando scanf é usado para entrada de dados à partir do teclado.


Sintaxe:

scanf("expressão de controle",argumentos);

onde expressão de controle indica o tipo do dado que será lido pelo computador. A tabela 1 abaixo mostra as expressões de controle usadas no scanf e o tipo de dado que cada expressão representa.

Tabela 1. Expressão de controle e os dados que a expressão representa.
nos argumentos o programador deve indicar o identificador da variável que receberá o valor digitado pelo usuário. Na figura 1, temos um exemplo de entrada de dados para dois tipos de dados de dados diferentes.
Figura 1. Declaração de variáveis e seus respectivos comandos de entrada de dados.

Note que no argumento é usado o símbolo & antes do identificador da variável (Não lembra o que é o identificador da variável? clique aqui e relembre). O uso desse símbolo é obrigatório e serve para avisar o compilador o endereço de memória onde a informação lida no teclado será guardada. Na figura 2 temos uma seta que indica o simbolo referido no texto.
Figura 2. Simbolo usado no argumento do scanf indicando o endereço de memorial que receberá o valor digitado.
Normalmente quando temos uma entrada de dados, um comando de saída de dados (printf) é associado ao scanf e servirá para instruir o usuário sobre o que ele deve fazer. Para entender melhor essa história de associar um printf com o scanf,  observe o código apresentado na figura 3.
Figura 3. Exemplo de programa usando 2 entrada de dados do tipo inteiro.
Conhecendo o código fonte do exemplo apresentado na figura 3 é fácil saber que o programa que irá receber 2 números inteiros, somar esses dois números e exibir o resultado da soma para o usuário que digitou os números. No entanto, quando não temos acesso ao código fonte não é tão fácil deduzir o que o programa vai fazer. Na figura 4 temos a tela do programa exibido na figura 3 após a compilação e execução do código.
Figura 4. Execução do programa apresentado na figura 3.
Notem que ao executar o programa é difícil saber o que deve ser feito, pois o usuário irá se deparar com uma tela preta com um cursor piscando. Neste caso o que deve ser feito? Devemos digitar uma palavra, um numero, esse numero deve ser inteiro, real? É impossível saber ao certo o que devemos fazer. Para ajudar o usuário, o programador deve criar mecanismos para  instruir o usuário sobre o que deve ser feito em cada parte do programa. Na figura 5 temos o código da figura 3 reescrito.

Figura 5. Código associando printf com a entrada de dados.
No código apresentado na figura 5 acrescentamos 3 printf's. O primeiro printf apresenta uma mensagem explicando o que o programa irá fazer, no segundo e terceiro printf o programador irá instruir o usuário sobre como ele deve interagir com o programa. Na figura 6 temos uma tela da execução do programa após as modificações. 
Figura 6. Execução do programa associando printf e scanf orientando o usuário.

Na figura 6 vemos o resultado com as alterações realizadas no código conforme apresentado na figura 5. Na tela de maior destaque temos a primeira parte do programa onde uma mensagem explicando a função do programa será exibida assim como a primeira instrução para o usuário indicando que ele deve digitar o primeiro numero. No quadrado vermelho em destaque, temos o programa após a exibição da soma entre os números. 
Notem que nessa nova versão é muito mais simples para o usuário entender o que deve ser feito ao longo da execução do programa.

Variação do comando:

Conforme o código apresentado na figura 7, um único comando scanf pode ser usado para receber mais de uma variável, no entanto, a pratica não é aconselhada, pois o usuário terá que digitar os dois números na sequencia o que pode gerar duvidas no momento da execução. Na figura 8 temos a execução do programa exibido na figura 7.
Figura 7. Comando scanf recebendo duas variáveis. 
Figura 8.  Execução do código exibido na figura 7.

  
Ainda ta com duvida, curta nossa pagina no facebook e poste sua duvida lá....