Mostrando postagens com marcador arduíno. Mostrar todas as postagens
Mostrando postagens com marcador arduíno. Mostrar todas as postagens

domingo, 30 de setembro de 2012

Sugestão

Na biblioteca do sensor HC-SR04 veio um modelo que sugere usar o sensor de ultrassom com lcd conforme programa abaixo:

#include "Ultrasonic.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 10, 9, 4, 5, 6, 7);
Ultrasonic ultrasonic(12,13);

void setup() {
lcd.begin(16, 2);
lcd.print("testing...");
}

void loop()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ultrasonic.Ranging(CM));
  lcd.print("cm");
 
  delay(100);
}

Caso queira tentar use o esquema abaixo:

Detalhe: quando fui testar na versão Arduíno 1.0.1 descobri que a biblioteca não funciona. Tive que alterar o Arduíno versão 0022 aí a biblioteca funcionou.

SENSOR DE ULTRASSOM HC-SR04

Aplicação em robôs de sumô: detecção de objetos.
Programa de testes- Utilizado para 2 sensores de ultrassom:

// Comandos para leitura de sensor de ultrassom para os robôs TITAN e ORION.
//sensor 1
#define echoPin 2                            // Pino do Arduino para emissor
#define trigPin 3                            // Pino do Arduino para receptor
//sensor 2
#define echoPin1 4                           // Pino do Arduino para emissor
#define trigPin1 5                           // Pino do Arduino para receptor

float distancia=0; // variável para distância do sensor 1
float distancia1=0;//variável para distância do sensor 2

float valorSensor=0; //valor do sensor 1
float valorSensor1=0;//valor do sensor 2

void setup(){
  Serial.begin(9600);
  pinMode(echoPin, INPUT); // seta pino 2 como entrada - receptor - echo
  pinMode(trigPin, OUTPUT); // seta pino 3 do Arduino como saída - transmissor - trigger
  pinMode(echoPin1, INPUT);//seta o pino 4 como entrada receptor
  pinMode(trigPin1, OUTPUT);//seta o pino 5 como saída (gatilho) - transmissor
}

void loop(){
  //sensor de objeto 1
  digitalWrite(trigPin, LOW); // desliga o pino gatilho do sensor por 2 microssegundos
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);// gatilho ativado por 10 microssegundos
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);// gatilho desligado
  //sensor de objeto 2
  digitalWrite(trigPin1, LOW); // desliga o pino gatilho do sensor por 2 microssegundos
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH); // gatilho ativado por 10 microssegundos
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW); // gatilho desligado

  int distance = pulseIn(echoPin, HIGH);//leitura do sensor 1 - alto ou baixo.
  int distance1 = pulseIn(echoPin1, HIGH);//leitura do sensor 2 - alto ou baixoo pulso em microssegundos.
  distance = distancia/58;//converte o valor do sensor1 em cm
  distance1 = distancia1/58;//converte o valor do sensor2 em cm
  //a partir daqui pode seguir com as variáveis para controlar os motores usando a distância
  //comando para exibir no serial monitor o valor de distância
  Serial.print(distancia);
  Serial.print(distancia1);
  Serial.println(distancia);
  Serial.println(distancia1);
  delay(100);
}


FONTE: http://www.webtronico.com/documentos/HC-SR04.pdf


Descrição:
 Medidor de distância ultrasônico é capaz de medir distâncias de 2cm a 5 metros. O módulo possui um circuito pronto, com emissor e receptor ultrasônico.
Conexões:
  • 5V Supply
  • Trigger Pulse Input
  • Echo Pulse Output
  • 0V Ground
Também pode ser utilizado para detectar objetos, movimento, etc.
Especificações:
  • power supply :5V DC
    Corrente: 15mA
  • quiescent current : <2mA
  • effectual angle: <15°
  • alcance da medição : 2cm – 500 cm
  • resolution : 3mm
O módulo possui 4 pinos : VCC , Trig, Echo, GND . Sendo assim, é muito simples utiliza-lo. O processo de medição se resume em: coloque o pino TRIG em nível ALTO por mais de 10us, e a medição começa; Quando o ultrassom emitido bater em um obstáculo e voltar, o pino ECHO ficará em nível ALTO pelo tempo correspondente a distância medida. Assim, a distância do obstáculo pode ser medida pelo tempo (largura do pulso) que o pino ECHO ficar em nível alto usando a seguinte regra:
Distância em CEMTIMETROS: (largura do pulso em uS) / 58;
Distância em POLEGADAS: (largura do pulso em uS) / 148;
Se a largura do pulso for igual a 38ms, então não tem obstaculo.

quinta-feira, 13 de setembro de 2012

Convite

Recebemos hoje, por intermédio da Prof. Marisa da Puc/SP, um convite do Sr. Marcio Vinicius Corallo do Departamento de Física da Universidade Federal de São Paulo para participarmos da Semana de Tecnologia do Instituto Federal (mais detalhes em :
http://spo.ifsp.edu.br/component/content/article/114-avisos/887-vi-semana-de-educacao-ciencia-e-tecnologia.html). É claro que nos sentimos lisonjeados de apresentar nosso trabalho e aceitamos prontamente. Vamos começar os preparatórios e, me breve, postamos mais informações. 
VI Semana de Educação, Ciência e Tecnologia
15 a 20 de Outubro de 2012
Entre 15 e 20 de outubro de 2012, das 8h às 23h, será realizada a “VI Semana de Educação, Ciência e Tecnologia” do Instituto Federal de Educação, Ciência e Tecnologia de São Paulo - IFSP - Campus São Paulo.
A finalidade principal desta Semana é mobilizar a comunidade do IFSP e de seu entorno, para a participação em atividades de Educação, Ciência, Tecnologias e Artes, valorizando a criatividade, a atitude científica e a inovação das diversas áreas do conhecimento. Desta forma, pretendemos demonstrar a importância da Educação, Ciência, Tecnologia e Artes para a vida de cada um e, também, para o desenvolvimento do País.

sábado, 25 de agosto de 2012

Sensor IR com R$0,00

Estávamos trabalhando num sensor IR usando partes de controle remoto (led emissores) e recpetores que existem em aparelhos com controle remoto. O sensor que fizemos, além de aquecer o resistor, mantinha pequenas distâncias (5cm). Bom, pesquisando no site do Arduíno (www.arduino.cc) encontrei o que pode ser a solução para o problema - na base do TSOP ligamos um resistor de 10Kohm, como os receptores normais mas, segundo a apostila da parallax (Apostila parallaxde onde eu tirei o esquema abaixo apareceu a solução - ligar um resistor de 220 ohm na base. Com isso a estimativa é um sensor de 30 cm. Se der certo conseguiremos 4 sensores de distância IR com boa resolução.


Sugiro o uso de resistores de 100 a 200 ohm no emissor para uma melhor distância.

domingo, 5 de agosto de 2012

Pequenos Cientistas - Lógica de Programação

Análise de programação do projeto de robô de sumô para o Torneio Juvenil de Robótica 2012:
M1 motor direito: 8–FRENTE, 9–RÉ
M2 motor esquerdo: 10-FRENTE, 11–RÉ
S1 – sensor de linha dianteiro
S2 -  sensor de linha traseiro
S3 – sensor de objeto dianteiro
S4 – sensor de objeto traseiro
S5 – sensor de objeto direito
S6 – sensor de objeto esquerdo
---------------------------------------------------
S1 - ↓ - 9, 11
S2 - ↑ - 8, 10
S3 - ↑ - 8, 10
S4 - ↓ - 9, 11 
S5 - ←90° ↑ - 9, 10 DELAY 8,10
S6 - →90º ↑ - 8, 11 DELAY 8,10
S1 + S3 - ↑ - 8, 10
S1 + S4 - ↓ - 9, 11
S2 + S3 - →90°↑→90°↑ - 8, 11 DELAY 8,10 - 8, 11 DELAY 8,10

Programa elaborado na IDE do Arduíno:
/* Projeto desenvolvido para robô de sumô no Torneio Juvenil de robótica 2012 pela equipe Pequenos Cientistas*/
// —————————————————————————  Pinos dos Motores
int direito_frente = 7;
int direito_re = 8;
int esquerdo_frente = 9;
int esquerdo_re = 10;
//--------------------------------------------- giro de 90°
int giro = 200;
//--------------------------------------------- Pinos sensores
int IR1 = 0;
int IR2 = 1;
int IR3 = 2;
int IR4 = 3;
int IR5 = 4;
int IR6 = 5;
//--------------------------------------------Variaveis de leitura dos sensores
int maximo = 3; // tensão de detecção do sensor IR
int VR1;
int VR2;
int VR3;
int VR4;
int VR5;
int VR6;
// ————————————————————————— Setup
void setup() {
// Seleciona motores
pinMode(direito_frente, OUTPUT);
pinMode(direito_re, OUTPUT);
pinMode(esquerdo_frente, OUTPUT);
pinMode(direito_re, OUTPUT);
//Ativa sensores
pinMode(IR1, INPUT);
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
pinMode(IR3, INPUT);
pinMode(IR4, INPUT);
pinMode(IR5, INPUT);
}

// ————————————————————————— Loop
void loop() {
  //faz a leitiura dos sensores e converte o valor lido (de 0 a 1024) em valores de tensão 
VR1 = analogRead(IR1) * 0.0049;//sensor de linha dianteiro
VR2 = analogRead(IR2) * 0.0049;//sensor de linha traseiro
VR3 = analogRead(IR3) * 0.0049;//sensor de objeto dianteiro
VR4 = analogRead(IR4) * 0.0049;//sensor de objeto traseiro
VR5 = analogRead(IR5) * 0.0049;//sensor de objeto direito
VR6 = analogRead(IR6) * 0.0049;//sensor de objeto esquerdo

//leitura de sensores e comparação com limite de leitura (variável máximo), com resposta
//S1 - ↓ - 9, 11
if (VR1 < maximo) {
digitalWrite (direito_frente,  LOW);
digitalWrite (direito_re, HIGH);
digitalWrite (esquerdo_frente, LOW);
digitalWrite (esquerdo_re, HIGH);
}
//S2 - ↑ - 8, 10
if (VR2 < maximo){
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
}
//S3 - ↑ - 8, 10
if (VR3 < maximo){
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
}
//S4 - ↓ - 9, 11 
if (VR4 < maximo){
digitalWrite (direito_frente,  LOW);
digitalWrite (direito_re, HIGH);
digitalWrite (esquerdo_frente, LOW);
digitalWrite (esquerdo_re, HIGH);
}
//S5 - ←90° ↑ - 9, 10 DELAY 8,10
if (VR5 < maximo){
digitalWrite (direito_frente, LOW);
digitalWrite (direito_re, HIGH);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
delay(giro);
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
}
//S6 - →90º ↑ - 8, 11 DELAY 8,10
if (VR6 < maximo){
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, LOW);
digitalWrite (esquerdo_re, HIGH);
delay(giro);
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
}
//S1 + S3 - ↑ - 8, 10
if (VR1 < maximo && VR3 < maximo){
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
}
//S1 + S4 - ↓ - 9, 11
if (VR1 < maximo && VR4 < maximo){
digitalWrite (direito_frente,  LOW);
digitalWrite (direito_re, HIGH);
digitalWrite (esquerdo_frente, LOW);
digitalWrite (esquerdo_re, HIGH);
}
//S2 + S3 - →90°↑→90°↑ - 8, 11 DELAY 8,10 delay 8, 11 DELAY 8,10
if (VR2 < maximo && VR3 < maximo){
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, LOW);
digitalWrite (esquerdo_re, HIGH);
delay(giro);
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
delay(giro);
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, LOW);
digitalWrite (esquerdo_re, HIGH);
delay(giro);
digitalWrite (direito_frente, HIGH);
digitalWrite (direito_re, LOW);
digitalWrite (esquerdo_frente, HIGH);
digitalWrite (esquerdo_re, LOW);
}
}
/*FIM*/

Bom, salvo os problemas (o simulino não consegue ligar as 4 saídas digitais ao mesmo tempo e, as saídas analógicas não funcionam corretamente - a 4 e 5 não ativam e eu não sei porquê) o simulino pode demonstrar este programa funcionando, conforme vídeo abaixo:

terça-feira, 17 de julho de 2012

Controle de Motor Usando Ponte H

06/03/2013
Começamos a desenvolver pontes H com TIP 110/115 para uso nos robôs que tem motores de escova. A vantagem desta ponte é a corrente que suporta, chegando a 4A.

Fotos da montagem:



17/07/2012
No projeto do Grupo Orion (Elza Facca) e do grupo Fenix (Frei Dagoberto) estamos pensando em trabalhar com servo motores de parabólica, adaptados para rotação contínua (veja exemplo aqui - http://www.roboticasimples.com/artigos.php?acao=16), usando o arduino 2009 controlando os motores por meio de pontes H.




Na ponte H, estudamos o TIP120, conforme esquema acima e, para o arduino controlar os motores, vamos utilizar o seguinte código fonte:

// Comando de motores usando ponte H
// —————————————————————————  Motores
int motor_esquerdo[] = {2, 3}; //pinos do motor1
int motor_direito[] = {7, 8}; //pinos do motor2
// ————————————————————————— Setup
void setup() {
Serial.begin(9600);
// Seleciona motores
int i;
for(i = 0; i < 2; i++){
pinMode(motor_esquerdo[i], OUTPUT);
pinMode(motor_direito[i], OUTPUT);
}
}
// ————————————————————————— Loop
void loop() {
motor_frente();
delay(1000);
//mudança de sentido
motor_parar();
motor_re();
delay(1000);
//mudança de sentido
motor_parar();
vire_esquerda();
delay(1000);
//mudança de sentido
motor_parar();
vire_direita();
delay(1000);
//mudança de sentido
motor_parar();
motor_parar();
delay(1000);
//mudança de sentido
motor_parar();
}
// ————————————————————————— Drive do motor: coordena as funções de parada, frente, direita e esquerda
void motor_parar(){
digitalWrite(motor_esquerdo[0], LOW);
digitalWrite(motor_esquerdo[1], LOW);
digitalWrite(motor_direito[0], LOW);
digitalWrite(motor_direito[1], LOW);
delay(25);
}
void motor_frente(){
digitalWrite(motor_esquerdo[0], HIGH);
digitalWrite(motor_esquerdo[1], LOW);
digitalWrite(motor_direito[0], HIGH);
digitalWrite(motor_direito[1], LOW);
}
void motor_re(){
digitalWrite(motor_esquerdo[0], LOW);
digitalWrite(motor_esquerdo[1], HIGH);
digitalWrite(motor_direito[0], LOW);
digitalWrite(motor_direito[1], HIGH);
}
void vire_esquerda(){
digitalWrite(motor_esquerdo[0], LOW);
digitalWrite(motor_esquerdo[1], HIGH);
digitalWrite(motor_direito[0], HIGH);
digitalWrite(motor_direito[1], LOW);
}
void vire_direita(){
digitalWrite(motor_esquerdo[0], HIGH);
digitalWrite(motor_esquerdo[1], LOW);
digitalWrite(motor_direito[0], LOW);
digitalWrite(motor_direito[1], HIGH);
}

fonte: Não lembro mais, sorry!!!

Este código fonte foi revisado pela equipe EADUINO - Robson Machado (www.eaduino.com.br), valeu gente pela ajuda.

Em breve, postaremos os vídeos do trabalho em funcionamento.