Criado em outubro de 2016, Oficina de Ideias é uma empresa registrada, que busca construir conhecimentos nas áreas da eletrônica, programação e mecânica clássica, unindo a prática com a teoria.
* programa para controlar um display de 7 segmentos
* C4
* B3 D5
* A2
* E6 G8
* F7 H9
*/
#define A2 2
#define B3 3
#define C4 4
#define D5 5
#define E6 6
#define F7 7
#define G8 8
#define H9 9
int tempo = 1000;
#define buzzer 12
void setup() {
pinMode(A2,OUTPUT);
pinMode(B3,OUTPUT);
pinMode(C4,OUTPUT);
pinMode(D5,OUTPUT);
pinMode(E6,OUTPUT);
pinMode(F7,OUTPUT);
pinMode(G8,OUTPUT);
pinMode(H9,OUTPUT);
pinMode(buzzer,OUTPUT);
}
void loop() {
tempo = tempo - 50;
for (int i = 0; i < 10; i++) {
switch (i) {
case 0:
zero();
break;
case 1:
um();
break;
case 2:
dois();
break;
case 3:
tres();
break;
case 4:
quatro();
break;
case 5:
cinco();
break;
case 6:
seis();
break;
case 7:
sete();
break;
case 8:
oito();
break;
case 9:
nove();
break;
}
//limpa();
Buzzer(2500);
delay(tempo);
}
}
void limpa(){
digitalWrite(A2, LOW);
digitalWrite(B3, LOW);
digitalWrite(C4, LOW);
digitalWrite(D5, LOW);
digitalWrite(E6, LOW);
digitalWrite(F7, LOW);
digitalWrite(G8, LOW);
digitalWrite(H9, LOW);
}
void zero(){
digitalWrite(A2, LOW);
digitalWrite(B3, HIGH);
digitalWrite(C4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(E6, HIGH);
digitalWrite(F7, HIGH);
digitalWrite(G8, HIGH);
}
void um(){
digitalWrite(A2, LOW);
digitalWrite(B3, LOW);
digitalWrite(C4, LOW);
digitalWrite(D5, HIGH);
digitalWrite(E6, LOW);
digitalWrite(F7, LOW);
digitalWrite(G8, HIGH);
}
void dois(){
digitalWrite(A2, HIGH);
digitalWrite(B3, LOW);
digitalWrite(C4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(E6, HIGH);
digitalWrite(F7, HIGH);
digitalWrite(G8, LOW);
}
void tres(){
digitalWrite(A2, HIGH);
digitalWrite(B3, LOW);
digitalWrite(C4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(E6, LOW);
digitalWrite(F7, HIGH);
digitalWrite(G8, HIGH);
}
void quatro(){
digitalWrite(A2, HIGH);
digitalWrite(B3, HIGH);
digitalWrite(C4, LOW);
digitalWrite(D5, HIGH);
digitalWrite(E6, LOW);
digitalWrite(F7, LOW);
digitalWrite(G8, HIGH);
}
void cinco(){
digitalWrite(A2, HIGH);
digitalWrite(B3, HIGH);
digitalWrite(C4, HIGH);
digitalWrite(D5, LOW);
digitalWrite(E6, LOW);
digitalWrite(F7, HIGH);
digitalWrite(G8, HIGH);
}
void seis(){
digitalWrite(A2, HIGH);
digitalWrite(B3, HIGH);
digitalWrite(C4, HIGH);
digitalWrite(D5, LOW);
digitalWrite(E6, HIGH);
digitalWrite(F7, HIGH);
digitalWrite(G8, HIGH);
}
void sete(){
digitalWrite(A2, LOW);
digitalWrite(B3, LOW);
digitalWrite(C4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(E6, LOW);
digitalWrite(F7, LOW);
digitalWrite(G8, HIGH);
}
void oito(){
digitalWrite(A2, HIGH);
digitalWrite(B3, HIGH);
digitalWrite(C4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(E6, HIGH);
digitalWrite(F7, HIGH);
digitalWrite(G8, HIGH);
}
void nove(){
digitalWrite(A2, HIGH);
digitalWrite(B3, HIGH);
digitalWrite(C4, HIGH);
digitalWrite(D5, HIGH);
digitalWrite(E6, LOW);
digitalWrite(F7, HIGH);
digitalWrite(G8, HIGH);
}
void ponto(){
digitalWrite(H9, HIGH);
}
void Buzzer(int Freq){
tone(buzzer,Freq,100);
}
terça-feira, 15 de dezembro de 2020
Circuito detector de cores
Olá. Nesta aula vamos aprender a construir um circuito capaz de detectar 3 cores (vermelho, verde e azul) usando nosso Arduino Uno. Para realizar este experimento vamos precisar de:
1 Arduino Uno;
1 proto board;
1 display LCD 16X2 com módulo I2C,;
1 led RBG (anodo comum);
1 LDR (resistor sensível a luz);
3 resistores de 330 Ohms;
1 resistor de 1K Ohms;
Teremos também que usar uma biblioteca especial para controlar o módulo I2C. Ela está disponível no seguinte link:
Para fazer a configuração correta do módulo I2C recomendo fortemente que você assista o seguinte vídeo, e já aproveite e se inscreva no canal do Brincando Com Idéias:
Obs.: não encontrei uma imagem do módulo I2C no Fritzing, por isso coloquei apenas aquela caixa de texto para indicar as conexões. O módulo I2C é este que está logo a baixo:
Este módulo costuma vir soldado na parte traseira do display lcd. A montagem do circuito ficou assim:
Vocês podem ver na imagem que eu não usei o proto board. Preferi fixar tudo em uma tabuinha branca e montar o sensor em forma de um "módulo". Soldei os componentes do circuito em uma plaquinha de circuito impresso para ficar um pouco mais resistente e esteticamente mais organizado. Também usei um tubo preto de borracha para proteger o sensor da luz externa. Nele fiz uma divisória interna que impede que o LDR receba luz diretamento do led RGB. Atrás do display está uma bateria que fiz na impressora 3D. dentro estão duas capsulas de bateria de notebook, que juntas geram aproximadamente 8v.
A próxima imagem dá uma ideia do anteparo para a luz. Ele pode ser feito de qualquer material, até de papel, de preferência na cor preta.
O anteparo deve ter uma altura suficiente para que o led RGB fique totalmente dentro dele mas próximo à borda. O LDR deve ficar em uma posição entre o meio e o fundo do tubo, para impedir que ele receba luz externa que não venha do objeto refletor, mas ao mesmo tempo, que receba o máximo possível da luz refletida. Desta forma a luz precisa ser emitida para fora do tubo e ser refletida em algum objeto, para só então chegar no LDR. Este é o "segredinho" deste sensor... Para que isso aconteça, você terá que encontrar o ajuste correto ai no seu projeto.
Como Isso Funciona?
O princípio de funcionamento deste sensor é, na verdade, bem simples. O que ele faz na prática é emitir cada uma das 3 cores (vermelho,verde e azul) de cada vez, e medir separadamente, a intensidade de luz que retornou do objeto do qual se deseja saber a cor. Sabemos que um objeto de cor vermelha por exemplo, terá sua maior intensidade de luz refletida na faixa do vermelho, e uma menor intensidade de luz refletida no verde e no azul. Desta forma o programa identifica em qual das três cores a intensidade de luz refletida foi mais intensa e exibe esta informação na tela do display lcd. É claro que ele não funciona perfeitamente. Ele se "perde" um pouco quando tentamos identificar algumas tonalidades de cores intermediárias. É que este sketch está bem simples. O programa pode funcionar bem melhor com alguns aprimoramentos. A ideia aqui é apenas mostrar uma alternativa para a construção de um sensor de cores simples e de baixo custo.
Obs.: dentro da parte que identifiquei como: "LÓGICA DE DEFINIÇÃO DE COR PREDOMINANTE" precisei definir um limite para que o programa não ficasse tentando encontrar alguma cor mesmo sem que houvesse algum objeto refletindo, o que sempre resultaria em erro. Determinei um limite máximo para a cor azul, por isso o "200" dentro dos "ifs". Quando o valor da variável "ldrEMazul" ultrapassa 200, o programa imprime no canto inferior direito do display lcd o texto "INDEF" que quer dizer "indefinido". Dependendo de como ficar o seu projeto, você terá que modificar este valor de 200 para mais ou para menos.
Sketch do Detector de Cores
Copie e cole o seguinte sketch no IDE do Arduino:
/*
Neste sketch vamos controlar um display lcd de duas linhas
e 16 colunas; Vamos usar um sensor de cores composto por um LDR
e um led RGB anodo comum; A cor detectada será escrita na tela do
display lcd;
OBS.: Para este tipo de led, o Anodo comum deve ser conectado no vcc
e para aciona-lo o catodo deve estar em nivel lógico baixo;
*/
int ledVermelho = 9; // porta onde está conectado o catodo do led vermelho;
int ledVerde = 10; // porta onde está conectado o catodo do led verde;
int ledAzul = 11; // porta onde está conectado o catodo do led azul;
int ldrEMvermelho; // valor do ldr com reflexo de luz vermelha;
int ldrEMverde; // valor do ldr com reflexo de luz verde;
int ldrEMazul; // valor do ldr com reflexo de luz azul;
int LDR = A0; // porta de entrada de sinal do LDR;
int tempo1 = 1000; // variável para armazenar um dado valor para usar ao longo do programa;
int tempo2 = 10;
// VARIÁVEIS DE NIVELAMENTO
/*
estas variáveis serão usadas para igualar as intensidades refletidas quando a cor for branca;
Muito obrigado por visitar este blog. Espero ter ajudado. Caso você tenha alguma observação, ou queira fazer alguma sugestão, sinta-se a vontade. Toda a ajuda é bem vinda. Um forte abraço a todos e até a próxima. ☺
Olá pessoal. Este é mais um de nossos projetos. Desta vez estamos construindo uma plataforma motorizada que servirá para posicional com precisão um telescópio azimutal refletor. Os componentes estruturais foram feitos na impressora 3D. Estamos usando um arduino uno, um display de 16X2 com modulo I2C, um buser e dois motores de passo 28BYJ-48. A orientação aqui está sendo feita por meio do sensor MPU6050, que possui acelerômetro mas não bussola. O projeto final contará com um sensor mais adequado, o GY273. Ele não utiliza os pinos scl e sda do arduino, como o MPU6050. Vamos precisar destes pinos livres para conectar nosso modulo I2C do display, esta é mais uma vantagem do GY273.
Esta montagem é apenas o protótipo para testes de programação. O telescópio real é bem maior. A baixo o sketch que já funciona parcialmente. Este apresenta um menu no monitor serial do arduino que oferece algumas opções bem básicas. O programa final possibilitará as opções de controle via bluetoth por meio de um aparelho celular ou computador, por meio de uma interface gráfica que será escrita no processing. Estamos estudando também a viabilidade de agregar um modulo GPS ao telescópio, o que possibilitará uma maior precisão na localização.
//******************* Relação de Variáveis do programa ****************************
int stepsPerRevolution1 = 500; // change this to fit the number of steps per revolution
int stepsPerRevolution2 = 500; // change this to fit the number of steps per revolution
int velocidadeX = 50;
int velocidadeZ = 50;
char comando = '0';
long eixoX = 0;
long eixoZ =0;
int dialogo = 0;
//********************** Instanciação de Objetos **********************************
//************************* Inicio do Setup ***************************************
void setup() {
Serial.begin(9600);
myStepper1.setSpeed(velocidadeX);
myStepper2.setSpeed(velocidadeZ);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
tone(13,500,500);
Serial.println(" Ok ");
Serial.println(" ");
Serial.println("**********************************************************************");
Serial.println("******* Digite a letra 'm' sempre que quiser visualizar o Menu.*******");
Serial.println("**********************************************************************");
}
//************************* Inicio do Loop ***************************************
void loop() {
mpu6050.update();
entradaSerial();
if (comando == 'm') {
Serial.println(comando);
Serial.println("************************ Menu **************************");
Serial.println(" Selecione uma das opções desejadas: ");
Serial.println("'a' - Controlar ajuste automático dos eixos ");
Serial.println("'b' - Controlar ajuste manual dos eixos ");
Serial.println("'s' - Sair do menu. ");
}
while (comando == 'm') { // Entrada no primeiro nivel do menu;
entradaSerial();
}
if (comando == 'a') {
Serial.println("*******************************************************");
Serial.println("'l' - Ligar ajuste automático dos eixos ");
Serial.println("'d' - Desligar ajuste automático dos eixos ");
Serial.println("'s' - Sair do menu. ");
}
while (comando == 'a') { // Entrada no primeiro nivel do menu;
entradaSerial();
}
if (comando == 'l') {
Serial.println("******************************************************");
Serial.println("Ajuste automático dos eixos ATIVADO!!!");
Serial.println("Aguarde o posicionamento dos eixos !!!!");
Serial.println("'d' - Desliga ajuste automático dos eixos ");
while (comando != 'd') { // Entrada no primeiro nivel do menu;
AutoAjuste();
//Serial.println("*");
entradaSerial();
if (mpu6050.getAngleX()> -1 && mpu6050.getAngleX()< 1 && mpu6050.getGyroZ() > -1 && mpu6050.getGyroZ() < 1){
//tone(13,500,500);
}
}
}
if (comando == 'd') {
Serial.println("******************************************************");
Serial.println("Ajuste automático dos eixos DESATIVADO!!!");
Serial.println("Telescópio apontando para o norte.");
Serial.println("Paratelo com o orizonte.");
Serial.println("eixo X = 0");
Serial.println("eixo Z = 0");
eixoX = 0;
eixoZ = 0;
}
while (comando == 'd') { // Entrada no primeiro nivel do menu;
entradaSerial();
}
if (comando == 's') {
Serial.println("*****************************************************");
Serial.println("Voce saiu do MENU");
}
while (comando == 's') { // Entrada no primeiro nivel do menu;
entradaSerial();
}
}
//************************** Inicio das Funções **********************************
void AutoAjuste() {
mpu6050.update();
/*
Serial.print("angleX : ");
Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");
Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");
Serial.print(mpu6050.getAngleZ());
Serial.print("Velocidade: ");
Serial.println(velocidade);
*/
if (mpu6050.getAngleX() > 1) {
velocidadeX = map(mpu6050.getAngleX(), 10, 0, 50, 0); // faz variar a velocidade do eixo x para suavisar o movimento;
myStepper1.setSpeed(velocidadeX);
myStepper1.step(1);
}
if (mpu6050.getAngleX() < -1) {
velocidadeX = map(mpu6050.getAngleX(), -10, 0, 50, 0); // faz variar a velocidade do eixo x para suavisar o movimento;
myStepper1.setSpeed(velocidadeX);
myStepper1.step(-1);
}
if (mpu6050.getGyroZ() > 2) {
velocidadeZ = map(mpu6050.getGyroZ(), -10, 0, 50, 0); // faz variar a velocidade do eixo z para suavisar o movimento;
myStepper1.setSpeed(velocidadeZ);
myStepper2.step(1);
}
if (mpu6050.getGyroZ() < -2) {
velocidadeZ = map(mpu6050.getGyroZ(), 10, 0, 200, 0); // faz variar a velocidade do eixo z para suavisar o movimento;
myStepper1.setSpeed(velocidadeZ);
myStepper2.step(-1);
}
}
void entradaSerial() {
if (Serial.available()) // verifica se existe algo digitado no monitor serial;
{
comando = Serial.read(); // carrega o valor digitado no monitor serial na variavel "comando";
tone(13,500,100);// porta,freq,duracao
noTone(13);
delay(50);
tone(13,500,100);
}
}
Olá pessoal. Eu estava com estes vídeos guardados no celular faz mêses... Este é um dos trabalhos que desenvolvi com meus alunos de 3º a 5º anos no curso de robótica educacional no ano de 2018. Peço desculpas pela qualidade terrível dos vídeos. Não sei o que aconteceu, mas de qualquer maneira vou colocar aqui como registro. Não deixem de curtir nossos outros vídeos na aba ***NOSSOS VÍDEOS*** a direita da tela.