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

quinta-feira, 15 de novembro de 2012

Sensor de ultrassom

08/12/2012
Artigo que será a base do projeto:
http://www.nitt.edu/portal/rmi/home/projects/ultrasonic_sensors/

Fizemos o primeiro teste de sensor de ultrassom. Usamos um buzzer comum e um microfone retirado do Arduino, usando o comando tone - tone (6, 30000); - e, no microfone um resistor de 1k e de 10k ohm e o resultado foi negativo, não funcionou.

5/12/2012 - Planejamento do trabalho
Fase 1- Usando o Arduino para gerar 40kHz de frequência, buzzer e um microfone ligado a porta analógica
Fase 2- Adicionando a fase 1 um amplificador ou filtro de frequências (microfone)
Fase 3 - Adicionando a fase 2, no amplificador ou filtro, um RS232 para converter o sinal
Fase 4 - Substituindo o Arduino por um 555 gerando pulsos de 40kHz.
Fase 5 Montagem em placa e teste final

Perguntas para a introdução
O que é um sensor?
O que é frequência? O que é som? Quais são as frequências do ultrassom?
Quais são as aplicações de sensores de ultrassom?
Resumo do projeto (o que vamos fazer)

15/11/2012
Estamos planejando fabricar nosso próprio sensor de ultrassom e como referência básica usamos este link:
http://www.micro-examples.com/public/microex-navig/doc/090-ultrasonic-ranger.html

Para tanto, vamos usar este esquema:



Os primeiros testes foram feitos no Simulino, usando este sketch mas, ainda não obtivemos resultado, até porque nós não sabemos como criar uma simulação de reflexão.


/* Código adaptado do sensor PING */

// configura os pinos de sáida
const int emissor = 7;
const int receptor = 8;


void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  pinMode(emissor, OUTPUT);
  pinMode(receptor, INPUT);

}

void loop()
{
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:

  digitalWrite(emissor, LOW);
  delayMicroseconds(2);
  digitalWrite(emissor, HIGH);
  delayMicroseconds(5);
  digitalWrite(emissor, LOW);
  //o receptor faz a leitura do estado do pino e se retorna HIGH ele informa
  duration = pulseIn(receptor, HIGH);
  cm = duration/58;//converte o valor do sensor1 em cm


  Serial.print(cm);
  Serial.println("cm");
  delay(100);


}

terça-feira, 13 de novembro de 2012

Montagem de semáforo com arduino

02/12/2012 - Projeto - Semáforo para ser apresentado na exposição na EE Elza Facca Martins Bonilha
Projeto de semáforo que, durante o dia, funciona com led´s alterando as cores por 3 segundos, à noite, sem luminosidade, amarelo piscante e com um botão que, quando acionado, informa o motorista (amarelo e verde - alerta) e depois fecha o semáforo por 10 segundos.
Material
3 resistores de 220 ohm - Led´s
Led´s - Verde, amarelo e vermelho
2 resistores de 10k ohm
1 botão (push bottom)
1 LDR 

Imagem do esquema em protoboard do projeto

Programa no Arduino
/* Semáforo acionado por luz: Este semáforo aciona quando há luz, quando desligado o sinal fica amarelo piscante e quando o botão é pressionado o sinal avisa ao motorista,
acionando o amarelo e verde e depois no vermelho por mais tempo. Depois retorna a sequência normal
*/
void setup (){
  pinMode (A0, INPUT);
  pinMode (A1, INPUT);
  pinMode (8, OUTPUT);
  pinMode (7, OUTPUT);
  pinMode (4, OUTPUT);
  Serial.begin (9600);
}
  
 void loop (){
   float LDR; //variável que armazena o valor
   LDR=analogRead (A0)*0.0049; //leitura do LDR
   //leitura de botão
   float botao;
   botao=analogRead (A1)*0.0049;
  Serial.println ("LDR:/t"); 
  Serial.print (LDR/t);
  Serial.print ("/t Botão:/t");
  Serial.print (botao);
   
   if (LDR<3){  //se o ldr identificar que há luz então ativa o ciclo de funcionamento 
  //aciona os led´s por 3 segundos
 digitalWrite (8, HIGH);
 delay (3000); 
 digitalWrite (8, LOW);
 digitalWrite (7, HIGH);
 delay (3000); 
 digitalWrite (7, LOW);
 digitalWrite (4, HIGH);
 delay (3000); 
 digitalWrite (4, LOW);
  }
  if (LDR>3){  //se o ldr identificar que há luz então ativa o ciclo de funcionamento 
 //aciona os led amarelo por 1 segundo
 digitalWrite (7, HIGH);
 delay (1000); 
 digitalWrite (7, LOW);
 delay (1000);
 } 

 if (botao<3){  //se o botão estiver ativo aciona o led amarelo e verde e depois vermelho por 5 segundos  
 digitalWrite (8, HIGH);
 digitalWrite (7, HIGH);
 delay (3000); 
 digitalWrite (8, LOW);
 digitalWrite (7, LOW);
 digitalWrite (4, HIGH);
 delay (5000); 
 digitalWrite (4, LOW);
 }

}

Vídeo do teste do semáforo feito no Simulino. Tudo funcionou a contento e este projeto será apresentado na EE Elza Facca Martins Bonilha no interclasses de 10 a 13/12.



Dia 21 de Novembro de 2012,
Fizemos um novo semáforo, desta vez inteligente tendo um interruptor e sequencia correta.

 /*
Semáforo de LEDs inteligente, com interruptor para pedestre
*/

void setup() {    
Serial.begin (9600);
pinMode(A0,INPUT);
  pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(8,OUTPUT);
}
void loop (){
  int botao;
  botao=analogRead(A0);
  Serial.println (botao);
    if(botao>900){
      digitalWrite(8,LOW);
digitalWrite(13, HIGH);
  delay(1000);    
  digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
  delay(500);
digitalWrite(12, LOW) ;
  digitalWrite(8, HIGH);  
  delay(1000);
digitalWrite(8, LOW);

  }
  if(botao<10){
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);  
  digitalWrite(8, HIGH);
  delay(5000);
  }
}

//                                                                                                                                 //  
 Hoje dia 7 de novembro de  2012, fizemos um semáforo com 3 LEDs (Vermelho,Amarelo e Azul)
utilizando o Arduíno. (Aqui vai a programação para vocês)

  /*
  SEMÁFORO de LEDs
 */
void setup() {              
  // initialize the digital pin as an output.
  pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
pinMode(11, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(11, HIGH);   // liga o LED
  delay(1000);               // tempo do LED ligado
  digitalWrite(11, LOW);    // Desliga o LED
             

 digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(500);               // wait for a second
digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
             

 digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);               // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW

      digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(500);               // wait for a second
digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
}


terça-feira, 31 de julho de 2012

Transientes

Um dos problemas que foram detectados durante uma simulação para um seguidor de linha que estava desenvolvendo no Simulino foi a presença de transientes, assim definidos no Wikipédia (http://pt.wikipedia.org/wiki/Transiente, acesso em 31/07):
"...é um surto de tensão elétrica que ocorre num intervalo de tempo muito pequeno...
  • O chaveamento de cargas fortemente indutivas, como os motores elétricos, gera transientes que são causados pela força contra eletro-motriz. Isso ocorre porque um indutor opõe-se à variação de corrente elétrica. Quando ocorre o desligamento de uma chave - eletrônica ou não - a energia armazenada sob a forma de campo magnético força a passagem de corrente em sentido inverso ao sentido original. O resultado é um pulso rápido de alta tensão, conhecido como "spike".
Os transientes são um dos maiores causadores da queima de equipamentos eletrônicos..."
Bom, o código segue abaixo:

/* Programa para leitura de 2 sensores IR - Projeto Robô Lutador de Sumô
Equipe Pequenos Cientistas 2012
Este programa é a base para um robo seguidor de linha e pode ser aplicado em arenas de fundo branco com linha preta ou fundo preto linha branca A variável maximo estipula o limite de tensão entre o estado ligado e desligado do sensor, ou seja, se a tensão lida no  sensor for inferior não há reflexão ou, caso contrário, há reflexão. Para controle se faz uso de uma ponte H - O L298N. Foi escolhido por suportar correntes maiores do que L293 e, ser mais barato.
*/
//Variáveis de pino analógico
int IR1=0;
int IR2=1;
//variáveis de pino digital
int L1 = 5;
int L2 = 6;
int L3 = 7;
int L4 = 8;

//variável dos sensores
int maximo = 3; // tensão de corte - sensor ativo ou desligado
int VR1;
int VR2;

//variável de acionamento dos motores
int m1 = 3;
int m2 = 4;

void setup() {
// configura o pino como saida
pinMode(L1, OUTPUT); //pino 5
pinMode(L2, OUTPUT); //pino 6
pinMode(L3, OUTPUT); //pino 7
pinMode(L4, OUTPUT); //pino 8
//configura acionamento de motores
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
// configura o pino como entrada
pinMode(IR1, INPUT); //pino A0
pinMode(IR1, INPUT); //pino A1

}
void loop(){
  
  // le o estado do sensor e converte para volts
VR1 = analogRead(IR1) * 0.0049;
VR2 = analogRead(IR2) * 0.0049;
digitalWrite(m1, HIGH);//aciona o MOTOR 1
digitalWrite(m2, HIGH);//desliga o MOTOR 2

// verifica se o sensor está ativo
if (VR1 > maximo) { // se ativo:
digitalWrite(L1, HIGH);//aciona o pino digital 5
digitalWrite(L2, LOW);//desliga o pino digital 6
}
else {// se desligado:
digitalWrite(L1, LOW);//desliga o pino digital 5
digitalWrite(L2, HIGH);//aciona o pino digital 6
}
//verifica se o sensor está ativo
if (VR2 > maximo){ // se ativo:
digitalWrite(L3, HIGH);//aciona o pino digital 7
digitalWrite(L4, LOW);//desliga o pino digital 8
}
else {//se desligado:
digitalWrite(L3, LOW);//aciona o pino 7
digitalWrite(L4, HIGH);//aciona o pino 8
}
//L1 – MOTOR DIREITO LIGADO
//L2 – MOTOR DIREITO INVERTIDO
//L3 – MOTOR ESQUERDO LIGADO
//L4 – MOTOR ESQUERDO INVERTIDO

}
Aqui segue o circuito elétrico que utilizei na simulação:
 
Bom, notaram que usei diodos de proteção na tentativa inútil de remover os transientes detectados durante a simulação. Resultado: não funcionou. Consultando o site do Newton Braga (http://www.newtoncbraga.com.br/index.php/robotica/1396-mec018.html) ele sugere: "Os capacitores em oposição em paralelo com o motor são importantes para eliminar transientes que tanto podem afetar os transistores como também o próprio circuito integrado, a partir da fonte de alimentação."
Bom não testei ainda mas em breve posto o resultados dos testes.

quarta-feira, 25 de julho de 2012

Sincronização de motores

 Um dos problemas observados com a programação que estamos utilizando é a sincronização de motores. Quando utilizamos este código:

/* Este código permite o passo de 2 motores
*/
//motor direito
int motorPin1 = 5;
int motorPin2 = 6;
int motorPin3 = 7;
int motorPin4 = 8;
//motor esquerdo
int motorPin5 = 9;
int motorPin6 = 10;
int motorPin7 = 11;
int motorPin8 = 12;

int delayTime = 500;

void setup() {
  //configura os pinos digitais do motor direito
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  //configura os pinos digitais do motor esquerdo
  pinMode(motorPin5, OUTPUT);
  pinMode(motorPin6, OUTPUT);
  pinMode(motorPin7, OUTPUT);
  pinMode(motorPin8, OUTPUT);
}

void loop() {
//motor direito
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(delayTime);
  //motor esquerdo
  digitalWrite(motorPin5, HIGH);
  digitalWrite(motorPin6, LOW);
  digitalWrite(motorPin7, LOW);
  digitalWrite(motorPin8, LOW);
  delay(delayTime);
  digitalWrite(motorPin5, LOW);
  digitalWrite(motorPin6, HIGH);
  digitalWrite(motorPin7, LOW);
  digitalWrite(motorPin8, LOW);
  delay(delayTime);
  digitalWrite(motorPin5, LOW);
  digitalWrite(motorPin6, LOW);
  digitalWrite(motorPin7, HIGH);
  digitalWrite(motorPin8, LOW);
  delay(delayTime);
  digitalWrite(motorPin5, LOW);
  digitalWrite(motorPin6, LOW);
  digitalWrite(motorPin7, LOW);
  digitalWrite(motorPin8, HIGH);
  delay(delayTime);
}

Você vai notar no vídeo abaixo que os leds piscam fora de sincronia, ou seja, os motores girariam primeiro o direito e depois o esquerdo.
Uma das soluções foi ligar os dois motores nos pinos digitais de 8 a 12 e ligar o comando "Enable A/B" dos l297 em outros dois pinos digitais.
O grande problema reside no fato que somente um motor giraria e o outro ficaria parado. Não é possível por exemplo, girar o motor direito num sentido e o motor esquerdo em outro sentido. Isso causa no robô o comportamento de girar aberto. Com um motor num sentido e outro no sentido inverso, além de girar aberto, você pode girar fechado, o que aumenta as possibilidades de manobras evasivas.
O código abaixo foi testado com leds mas ilustra o giro em sentidos opostos dos motores, bastando pequenas correções no código acima, além de ocupar menos bytes.
/*Testes de Passo - Código utilizado para 2 motores de passo*/
//motor direito
int motorPin1 = 5;
int motorPin2 = 6;
int motorPin3 = 7;
int motorPin4 = 8;
//motor esquerdo
int motorPin5 = 9;
int motorPin6 = 10;
int motorPin7 = 11;
int motorPin8 = 12;

//tempo de passo
int passo = 50;

void setup() {
  //define os pinos digitais do motor direito
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  //define os pinos digitais do motor esquerdo
  pinMode(motorPin5, OUTPUT);
  pinMode(motorPin6, OUTPUT);
  pinMode(motorPin7, OUTPUT);
  pinMode(motorPin8, OUTPUT);
}

void loop() {
  //motor de passo direito e esquerdo, sincronizado
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin5, HIGH);
    delay(passo);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin5, LOW);
  digitalWrite(motorPin6, HIGH);
    delay(passo);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin6, LOW);
  digitalWrite(motorPin7, HIGH);
  delay(passo);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin7, LOW);
  digitalWrite(motorPin8, HIGH);
  delay(passo);
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin8, LOW);
  }

O vídeo do resultado no Simulino.


Este código ainda não utiliza funções até pelos testes mas, como base de estudo, ajuda muito.

terça-feira, 24 de julho de 2012

Teste Virtual do TITAN I - Simulino

Após o teste dos sensores utilizando led´s, agora testamos o programa em motores de passo no Simulino. O resultado foi positivo. O programa está pronto, falta a parte de chassi e placas.


Teste - sensores ativando o passo e motores

O filme abaixo apresenta o teste em Simulino apresentando 6 sensores ativando 2 motores (led´s verdes) e o passo utilizado nestes motores (led´s azuis). O objetivo e controlar sincronicamente 2 motores de passo utilizando 6 sensores e o Arduino.


 O código fonte utilizado está "sujo", ou seja, ainda não usa equações, vetores ou funções para obter o resultado final e, tem opção de 4 pinos digitais para ativação de motores.

/* Programa para leitura de 6 sensores IR - Projeto Robô Lutador de Sumô
Equipe Pequenos Cientistas 2012
*/
//variavel dos pinos analogicos
int IR1=0;
int IR2=1;
int IR3=2;
int IR4=3;
int IR5=4;
int IR6=5;

//variavel dos pinos digitais
//pinos de ativação dos motores
//int L1 = 4;
//int L2 = 5;
int L3 = 6;
int L4 = 7;
//pinos do passo
int L5 = 8;
int L6 = 9;
int L7 = 10;
int L8 = 11;
//tempo do passo
int tempo = 500;

//variaveis de comparação da leitura dos pinos analogicos
//valor da tensão do pino analógico que determina o sinal
int maximo = 2;
//variaveis das diversas leituras
int VR1;
int VR2;
int VR3;
int VR4;
int VR5;
int VR6;

void setup() {
// configura o pino como saida
//pinMode(L1, OUTPUT);
//pinMode(L2, OUTPUT);
pinMode(L3, OUTPUT);
pinMode(L4, OUTPUT);
pinMode(L5, OUTPUT);
pinMode(L6, OUTPUT);
pinMode(L7, OUTPUT);
pinMode(L8, OUTPUT);

// configura o pino como entrada
pinMode(IR1, INPUT);
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
pinMode(IR3, INPUT);
pinMode(IR4, INPUT);
pinMode(IR5, INPUT);

Serial.begin (9600);
}
void loop(){
   
  // le o estado do botao
VR1 = analogRead(IR1) * 0.0049;
VR2 = analogRead(IR2) * 0.0049;
VR3 = analogRead(IR3) * 0.0049;
VR4 = analogRead(IR4) * 0.0049;
VR5 = analogRead(IR5) * 0.0049;
VR6 = analogRead(IR6) * 0.0049;

// verifica se o sensor está ativo
if (VR1 > maximo) {
// aciona os motores 1 e 2
//digitalWrite(L1, HIGH);
//digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, HIGH);
//passo
digitalWrite(L5, HIGH);
delay(tempo);
digitalWrite(L5, LOW);
digitalWrite(L6, HIGH);
delay(tempo);
digitalWrite(L6, LOW);
digitalWrite(L7, HIGH);
delay(tempo);
digitalWrite(L7, LOW);
digitalWrite(L8, HIGH);
delay(tempo);
digitalWrite(L8, LOW);
}
else {
//desliga os motores 1 e 2
//digitalWrite(L1, LOW);
//digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
//desliga o passo
digitalWrite(L5, LOW);
digitalWrite(L6, LOW);
digitalWrite(L7, LOW);
digitalWrite(L8, LOW);
}

if (VR2 > maximo){
//aciona um dos motores, o outro desligado
//digitalWrite(L1, HIGH);
//digitalWrite(L2, HIGH);
digitalWrite(L3, LOW);
digitalWrite(L4, HIGH);
//passo
digitalWrite(L5, HIGH);
delay(tempo);
digitalWrite(L5, LOW);
digitalWrite(L6, HIGH);
delay(tempo);
digitalWrite(L6, LOW);
digitalWrite(L7, HIGH);
delay(tempo);
digitalWrite(L7, LOW);
digitalWrite(L8, HIGH);
delay(tempo);
digitalWrite(L8, LOW);
}
else {
//digitalWrite(L1, LOW);
//digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
}

if (VR3 > maximo) {
//aciona o outro dos motores, o anterior desligado
//digitalWrite(L1, LOW);
//digitalWrite(L2, LOW);
digitalWrite(L3, HIGH);
digitalWrite(L4, LOW);
//passo
digitalWrite(L5, HIGH);
delay(tempo);
digitalWrite(L5, LOW);
digitalWrite(L6, HIGH);
delay(tempo);
digitalWrite(L6, LOW);
digitalWrite(L7, HIGH);
delay(tempo);
digitalWrite(L7, LOW);
digitalWrite(L8, HIGH);
delay(tempo);
digitalWrite(L8, LOW);
}
else {
//digitalWrite(L1, LOW);
//digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
}

if (VR4 > maximo) {
// aciona os motores 1 e 2
//digitalWrite(L1, HIGH);
//digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, HIGH);
//PASSO INVERTIDO
digitalWrite(L8, HIGH);
delay (tempo);
digitalWrite(L8, LOW);
digitalWrite(L7, HIGH);
delay (tempo);
digitalWrite(L7, LOW);
digitalWrite(L6, HIGH);
delay (tempo);
digitalWrite(L6, LOW);
digitalWrite(L5, HIGH);
delay (tempo);
digitalWrite(L5, LOW);

}
else {
//digitalWrite(L1, LOW);
//digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
}

if (VR5 > maximo) {
//digitalWrite(L1, HIGH);
//digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, LOW);
//PASSO INVERTIDO
digitalWrite(L8, HIGH);
delay (tempo);
digitalWrite(L8, LOW);
digitalWrite(L7, HIGH);
delay (tempo);
digitalWrite(L7, LOW);
digitalWrite(L6, HIGH);
delay (tempo);
digitalWrite(L6, LOW);
digitalWrite(L5, HIGH);
delay (tempo);
digitalWrite(L5, LOW);
}
else {
//digitalWrite(L1, LOW);
//digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
}

if (VR6 > maximo) {
digitalWrite(L3, LOW);
digitalWrite(L4, HIGH);
//PASSO INVERTIDO
digitalWrite(L8, HIGH);
delay (tempo);
digitalWrite(L8, LOW);
digitalWrite(L7, HIGH);
delay (tempo);
digitalWrite(L7, LOW);
digitalWrite(L6, HIGH);
delay (tempo);
digitalWrite(L6, LOW);
digitalWrite(L5, HIGH);
delay (tempo);
digitalWrite(L5, LOW);
}
else {
//digitalWrite(L1, LOW);
//digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);

}
}


segunda-feira, 23 de julho de 2012

Teste - Sensores de IR

 Este teste usa o Simulino, simulador do Arduino no Proteus, com o código fonte abaixo, para simular a leitura de sensores IR. Estes sensores serão utilizados no TITAN I e outros robôs, sendo o código adaptado para cada situação em particular. Os botões atuam fechando o circuito, ou seja, se um objeto refletir a luz IR o Arduíno recebe um sinal acendendo um led específico. O fator de multiplicação converte o sinal analógico do Arduíno em tensão.


/* Programa para leitura de 6 sensores IR - Projeto Robô Lutador de Sumô
Equipe Pequenos Cientistas 2012
*/
int IR1=0;
int IR2=1;
int IR3=2;
int IR4=3;
int IR5=4;
int IR6=5;

int L1 = 5;
int L2 = 6;
int L3 = 7;
int L4 = 8;
int L5 = 9;
int L6 = 10;


int maximo = 2;
int VR1;
int VR2;
int VR3;
int VR4;
int VR5;
int VR6;

void setup() {
// configura o pino como saida
pinMode(L1, OUTPUT);
pinMode(L2, OUTPUT);
pinMode(L3, OUTPUT);
pinMode(L4, OUTPUT);
pinMode(L5, OUTPUT);
pinMode(L6, OUTPUT);

// configura o pino como entrada
pinMode(IR1, INPUT);
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
pinMode(IR3, INPUT);
pinMode(IR4, INPUT);
pinMode(IR5, INPUT);

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

  // le o estado do botao
VR1 = analogRead(IR1) * 0.0049;
VR2 = analogRead(IR2) * 0.0049;
VR3 = analogRead(IR3) * 0.0049;
VR4 = analogRead(IR4) * 0.0049;
VR5 = analogRead(IR5) * 0.0049;
VR6 = analogRead(IR6) * 0.0049;

// verifica se o sensor está ativo
if (VR1 > maximo) {
// se sim, acende o LED
digitalWrite(L1, HIGH);
}
else {
digitalWrite(L1, LOW);
}

if (VR2 > maximo){
// caso contrario, apaga o LED
digitalWrite(L2, HIGH);
}
else {
digitalWrite(L2, LOW);
}


if (VR3 > maximo) {
// se sim, acende o LED
digitalWrite(L3, HIGH);
}
else {
digitalWrite(L3, LOW);
}

if (VR4 > maximo) {
// se sim, acende o LED
digitalWrite(L4, HIGH);
}
else {
digitalWrite(L4, LOW);
}

if (VR5 > maximo) {
// se sim, acende o LED
digitalWrite(L5, HIGH);
}
else {
digitalWrite(L5, LOW);
}

if (VR6 > maximo) {
// se sim, acende o LED
digitalWrite(L6, HIGH);
}
else {
digitalWrite(L6, LOW);
}

}




O vídeo abaixo ilustra a execução do código.


Simulino - Simulador de Arduino

23/07/2013
Saiu a nova versão do Simulino - 2.0, com  muito mais funcionalidades e com novo design (rsrsrsrs). Além disso, esta nova versão você pode simular o sensor de ultrassom. Ou seja, agora é possível testar o programa do robô antes de construí-lo. Baixar leva alguns segundos e, ainda não testamos todas as funcionalidades mas damos os parabéns a equipe do Blog. Embarcado:
Link para baixar o simulino 2.0:
 http://blogembarcado.blogspot.com.br/2013/06/simulino-v20-biblioteca-para-proteus.html#comment-form

Link para o projeto de sensor de ultrassom:
http://blogembarcado.blogspot.com.br/2013/06/sensor-ultrassonico-v2.html

07/2012
Procurando um emulador de Arduino na Internet encontrei o Simulino - um simulador que utiliza o Proteus para agir como se fosse um Arduino UNO funcionando. Apanhei um pouco mas consegui testar o primeiro código - um programa para rodar um motor de passo bipolar com l298 (sem diodos de proteção). O bom é que não tem risco de queimar o Arduino.
Links para quem se interessar:
http://labdegaragem.com/profiles/blog/show?id=6223006%3ABlogPost%3A116712&commentId=6223006%3AComment%3A119207&xg_source=activity
http://blogembarcado.blogspot.com.br/2012/02/simulino-simulando-arduino.html

Proteus 7.7 Completo:
http://mecatronicadegaragem.blogspot.com.br/2010/09/proteus-77-pro-completo.html

Vídeo do Primeiro Teste com Simulino:
Código fonte utilizado:

/*Exemplo 1: exemplo simples
 *Motor de passo Copal
 * --------------------
 *
 * Programa para acionar um motor de passo proveniente de
 * um drive de disquete de 5'25
 * De acordo com a documentação encontrada, este motor:
 * "[...] motor
 * made by Copal Electronics, with 1.8 degrees per step and 96 ohms
 * per winding, with center taps brought out to separate leads [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * Trata-se de um motor de passo unipolar com 5 fios:
 *
 * - vermelho: alimentação, 5V pareceu-me bem
 * - laranja e preto: bobina 1
 * - marrom e amarelo: bobina 2
 *
 * (cleft) 2005 DojoDave para o K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Out 2005
 */

int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 500;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop() {
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(delayTime);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(delayTime);
}