Bom, esse post é um pouco diferente dos outros, pois não há nenhum projeto a ser discutido, mas continuarei dando ênfase no estudo do servomotor.
Para maior conhecimento organizei uma tabela com os principais comandos do uso da porta serial e destaquei algumas explicações de tais comandos.
Com estudo dessa tabela o uso da porta serial ficará bem mais facil.
Depois irei postar um novo projeto bem simples usando apenas o arduino e um servomecanismo.
Nesse novo projeto iremos controlar um servo utilizando o teclado do PC. É um program simples onde entenderemos mais a fundo sobre os comandos Serial.
Material:
- Arduino
- Servo
Esquema:
Código:
#include <Servo.h> //incluir a biblioteca de servo
Servo myservo; //Inclusao do servo
int n = 0; //Entradas seriais
int pos = 0; //Posição zero para o servop
void setup(){
Serial.begin(9600); //Ativando a porta serial
myservo.attach(8); //Pino do servo+arduino
myservo.write(0); //Servo setado com valor zero
Serial.flush(); //Limpando a memoria do serial
Serial.println("Digite: \n 2-90 \n 3-180 \n 4-02"); //criação de um cabeçalho no serial
}
void loop(){
if(Serial.available()>0){ //Teste se porta serial esta recebendo dados
n = Serial.read(); //leitura de dados
Serial.print("Valor lido: ");
Serial.println(n); //Printa o valor teclado
if(n==50){ //girar 90
myservo.write(90);
delay(500);
}
if(n==51){ //girar 180
myservo.write(180);
delay(500);
}
if(n==52){ //volta pra 0
myservo.write(-180);
delay(500);
}
}
Serial.flush();
}
Vídeo:
Comentário sobre o código:
Podemos notar que ao fazer o upload do código e abrirmos o serial(Crtl+Shift+M) aparecerá um tipo de cabeçalho:
Digite:
- 2-90
- 3-180
- 4-0
Isso ocorre porque o Serial.print está no void setup, se estivesse no void loop seria constantemente mostrado na tela.
Temos a leitura do valor "n" que é gerado pelo teclado. Como o objetivo é comparar valores lidos pelo teclado precisamos utilizar o valor real do "n" e compara-lo em uma condição: (n==50) "n é igual a 50?", como 50 representa do digito "2", caso você tenha pressionado o número "2" a condição torna-se verdade e uma tarefa é executada.
É possível usar outros valores e também acionar outros dispositivos como motores/leds usando essa mesma lógica, basta adicionar mais condições.
Bom, esse segundo projeto é uma maneira simples de interagir um servo usando um LDR. Tente fazer a parte de hardware mais simples possível e ao mesmo tempo mais explicativa possível.
Material:
- Servomecanismo
- Resistor 10kohms
- LDR
- Arduino
- Protoboard
- Fios Jumpers
Esquema:
Código:
#include <Servo.h> //inclusão da biblioteca servo
Servo myservo; //nomeando o servo
int pos = 0; //determinando posição 0 para o servo
int pinLDR = A0; //Pino analógico A0 para o LDR
int valor; //variável valor
#define LDR 0 //definindo o valor de LDR como zero
void setup(){
Serial.begin(9600); //Abrindo comunicação serial
myservo.attach(9); //Pino de conexão servo+arduino
myservo.write(0); //Servo com valor setado zero
}
void loop(){
valor = analogRead(LDR); //Variável valor recebendo o valor do LDR
Serial.print("O valor do LDR e: "); //Printar a frase O valor do LDR e:
Serial.println(valor); //Printar o valor serial do LDR
//Se variável valor for menor que 550 o servo deverá andar 180 graus com resposta de 500ms
if(valor<550){
myservo.write(180);
delay(500);
}
//Se não, o servo deverá voltar ao estado original
else{
myservo.write(-180);
delay(500);
}
} Vídeo:
Ao fazer o upload do programa o servo se comportará toda vez que um sombra atuá sobre o LDR, movimentando-o 180 graus.
O primeiro projeto que apresento é o velho mas
também importante semáforo interativo, onde temos as luzes para o tráfego dos
automóveis e as luzes para a travessia dos pedestres. Mas, nesse projeto
adicionei algo á mais: um display de 7 segmentos, cujo faz a contagem
regressiva de 5 até 0, cronometrando o tempo de travessia do pedestre.
DICA: Para realizar esse projeto baseie no exemplo
nº 4 do livro Arduino Básico, ed. NOVATEC (recomendo).
int redCar = 12; //pino luz vermelho
int yellowCar = 11; //pino luz amarelo
int greenCar = 10;
int redPed = 7; //pino luz vermelho pedestre
int greenPed = 8; //pino luz verde pedestre
int button = 2; //push button
int displayA = 3; //seguencia de leds do display e seus respecitvos pinos
int displayB = 4;
int displayC = 5;
int displayD = 1;
int displayE = 6;
int displayF = 9;
int displayG = 13;
digitalWrite(greenCar, HIGH); //acende verde para carros
digitalWrite(redPed, HIGH);
pinMode(3, OUTPUT); //pinos dos display como saída
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(1, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
}
void loop(){
int state = digitalRead(button); /* verifica se o botão foi pressionado e
se transcorreram 5 segundos desde a última vez que isso ocorreu*/
if(state == HIGH){ //Chama a funçao para alterar as luzes
trocaLed();
}
}
void trocaLed(){
digitalWrite(greenCar, LOW); //Apaga o verde
digitalWrite(yellowCar, HIGH); //acende o amarelo
delay(2000); //espera dois segundos
digitalWrite(yellowCar, LOW); //Apaga o amarelo
digitalWrite(redCar, HIGH); //Acende o vermelho
delay(2000); //Espera 2 segundos
digitalWrite(redPed, LOW); //Apaga o vermelho dos pedestres
digitalWrite(greenPed, HIGH); //cende o verde dos pedestres
//espera por um intervalo de tempo predefinido
digitalWrite(displayA, LOW); //Seqüência do numero 5
digitalWrite(displayB, LOW);
digitalWrite(displayC, LOW);
digitalWrite(displayD, HIGH);
digitalWrite(displayE, HIGH);
digitalWrite(displayF, LOW);
digitalWrite(displayG, LOW);
delay(1000);
digitalWrite(displayA, LOW); //Seqüência do numero 4
digitalWrite(displayB, LOW);
digitalWrite(displayC, HIGH);
digitalWrite(displayD, LOW);
digitalWrite(displayE, HIGH);
digitalWrite(displayF, HIGH);
digitalWrite(displayG, LOW);
delay(1000);
digitalWrite(displayA, LOW); //Seqüência do numero 3
digitalWrite(displayB, HIGH);
digitalWrite(displayC, LOW);
digitalWrite(displayD, LOW);
digitalWrite(displayE, HIGH);
digitalWrite(displayF, LOW);
digitalWrite(displayG,LOW);
delay(1000);
digitalWrite(displayA, LOW); //Seqüência do numero 2
digitalWrite(displayB, HIGH);
digitalWrite(displayC, LOW);
digitalWrite(displayD, LOW);
digitalWrite(displayE, LOW);
digitalWrite(displayF, LOW);
digitalWrite(displayG, HIGH);
delay(1000);
digitalWrite(displayA, HIGH); //Seqüência do numero 1
digitalWrite(displayB, HIGH);
digitalWrite(displayC, HIGH);
digitalWrite(displayD, LOW);
digitalWrite(displayE, HIGH);
digitalWrite(displayF, HIGH);
digitalWrite(displayG, LOW);
delay(1000);
digitalWrite(displayA, HIGH); //Seqüência do numero 0
digitalWrite(displayB, LOW);
digitalWrite(displayC, LOW);
digitalWrite(displayD, LOW);
digitalWrite(displayE, LOW);
digitalWrite(displayF, LOW);
digitalWrite(displayG, LOW);
delay(1000);
//pisca o verde para os pedetres
for(int x=0; x<3; x++){
digitalWrite(greenPed, HIGH);
delay(250);
digitalWrite(greenPed, LOW);
delay(250);
}
//Acende o vermelho dos pedretres
digitalWrite(redPed, HIGH);
delay(500);
digitalWrite(yellowCar, HIGH);
digitalWrite(redCar, LOW);
delay(1000);
digitalWrite(greenCar, HIGH);
digitalWrite(yellowCar, LOW);
//Registra o tempo desde a ultima alteração no semaforo
}
Vídeo:
Ao fazer o upload do arquivo os led's verde para carros e
vermelhos para pedestres deverão está aceso, ao pressionar o botão o led
vermelho para carro apaga e o amarelo se acenderá logo depois o verde de
pedestre também se acenderá e o led vermelho se apagará começando a contagem do
tempo no display, em seguido ao término da contagem o led verde de pedestre
piscará 3 vezes e voltará ao estado inicial do programa.
Comentário: Esse projeto é muito interessante pois já
requer um certo nível de conhecimento de programação somado com eletrônica
básica.
Aperfeiçoamento: - Reduzir código;
Agradeço a atenção de todos e fico aberto a sugestões
Bom, vejamos, por que criar um blog? Para registro?
Talvez!....No meu caso o blog foi uma sugestão de um dos meus
"mentores" sobre programação de Arduino. Isso mesmo, esse blog tem
como objetivo expor experiências e projetos que andei fazendo ou estudando.
Logo abaixo temos um projeto que fiz recentemente.