Boa tarde galera,

Estou começando agora com o Arduino, ja vi várias video aulas e artigos sobre Arduino.

Devido a gama de utilidades do Arduino resolvi usar ele para desenvolver um projeto de sensores para deficientes, tem alguns rolado por ai.

Já fiz o sensor HC-SR04 funcionar e tudo mais, mas agora não tenho ideia de como acoplar o motor vibratório junto ao sistema.

Alguém poderia me dar uma luz?

Agradecido.

Exibições: 6267

Responder esta

Respostas a este tópico

Olá diego

Cara, ninguem aqui do LDG é de entregar projetos prontos,  geralmente apontamos caminhos,  mas seu projeto é tão legal, e como foco tão altruista que resolvi desenvover ele pra você.

  Porem, só executei no simulador, com excessão do sensor ultrasonico que não sei como simular, usei um potenciometro e depois troquei pelo sensor na montagem.

   Bem, tá aqui pra você o projeto e o sketch,  testa ai pra gente e vê se funciona.

   A finalidade dele é toda vez que você vai se aproximando de algo ele vai aumentando a vibração, se voce se afasta a vibracao diminui.

ta aqui uma forma para motores mais potentes:

O sketch precisa ser testado montando, mas basicamente é esse aqui:


const int trigPin2 = 6;
const int eChoPin2 = 7;


void setup() {
  Serial.begin(9600);
  pinMode(9,OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(eChoPin2, INPUT);
}


void loop() {  
  //###############################FUNÇÃO DE CAPTURA DA DISTANCIA -= SENSOR 2 #####    
    digitalWrite(trigPin2, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin2, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin2, LOW);
    unsigned long duracao2 = pulseIn(eChoPin2, HIGH);
    int distancia2 = duracao2 / 58;
    Serial.print("  --  Distancia2 em Cm:");
    Serial.println(distancia2);
    delay(500);
//*******************************FIM DA FUNÇÃO DE CAPTURA DA DISTANCIA  SENSOR 2 ***  
int valsensor = map(distancia2, 0, 4000, 0, 255);   // O sensor mede segundo o fabricante ate 4m o que significa 4000cm,  como o sistema aceita ate os 255 de 1 bit então fazemos a conversao
analogWrite(9 , valsensor);  // escrevemos o valor lino em uma porta PWM que ira aumentar ou baixar de acordo com o valor lido no sensor
Serial.println(valsensor); // aqui voce pode acompanhar no serial monitor a distancia

}

Meus queridos agradeço muito a ajuda, agradeço muito mesmo!! :D

Principalmente o Rafael e o Weider que me responderam.

Não tinha lembrado do transistor, vou montar hoje a noite.. (y)

Eu estava utilizando o código assim:

const int trigPin = 12;
const int echoPin = 13;


void setup()
{
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(motor, OUTPUT);

}

void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  unsigned long duracao = pulseIn(echoPin, HIGH);
  int distancia = duracao / 58;
  Serial.print("Distancia em CM: ");
  Serial.println(distancia);
  delay(2000);
 

---------------ATÉ QUI FUNCIONA-----------------------------------

digitalWrite(motor,LOW);
   
 if (distancia > 15);
   digitalWrite(motor,HIGH);
 }

Só por curiosidade, vocês poderiam me dar explicar como fazer a tensão agir diretamente com o motor a partir daí?

MUITO OBRIGADO MESMO, JA AJUDARAM DEMAIS!!!

Diego,

   Provavelment eseu codigo não iria funcionar.

   Pela experiencia que tenho, o que vocÊ ta fazendo é atrelando a rotação do motor aos pulsos do arduino, só que antes vocÊ coloca um delay(2000),  o que ira fazer o motor travar.

 

seu digitalWrite(motor,LOW);  ira apenas deslitar o motor simplesmente, e no caso do IF, ligar em alguma suposição.

   Vai pelo codigo que te passei que deve funcionar.

   veja no meu codigo como é feita a variação,  não com um digitalwrite que apenas liga a desliga o motor, o que faria com que qualquer irregularidade no ciclo do microcontrolador, faria o motor ficar doido.

 

  Ao contrario eu uso um analogwrite,  que como o arduino trabalha com PWM que são pulsos digitais, não deixa de ter seus problemas,  mas é a melhor solução encontrada.

aproveita que eu comentei cada linha e da uma aprendido no que ta sendo feito ok.

   

Muito obrigado mais uma vez Weider,

Vou fazer exatamente como esta lá, Foi simplesmente esclarecedora sua postagem...

Sou novo no forum e espero poder colaborar com algo algum dia, Muito obrigado mesmo.

Amanhã posto um FeedBack de como se comportou!!!

VALEW!

AEEEEEEEEEEEEEEEEEEEEEE, Funcionou! :D

Valew Weider funcionou!

Só uma dúvida, ele vibra a todo momento, como eu calibro para ele vibra só por exemplo a 30 cm?

Muito agradecido!

Olá Diego,

    Existem trocentas maneiras e fazer o que vocë deseja,  e cada um tem sua propria lógica,  no meu caso quando quero fazer travamentos eu uso o lanço While,  no caso ele iria prender o funcionamento do arduino até satisfeita uma condição e ai liberaria.

    No exemplo abaixo, onde ta 30 voce pode mudar pra testar ok.

   Tá aqui o sketch,   mas lembra que tô te mandando sem testar, tô fazendo na mão grande,  testa ai pra mim, se der alguma falha me comunica que eu corrijo:

const int trigPin2 = 6;
const int eChoPin2 = 7;
int distancia2 = 0;


void setup() {
  Serial.begin(9600);
  pinMode(9,OUTPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(eChoPin2, INPUT);
}

void capturavalor(){
  //###############################FUNÇÃO DE CAPTURA DA DISTANCIA -= SENSOR 2 #####    
    digitalWrite(trigPin2, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin2, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin2, LOW);
    unsigned long duracao2 = pulseIn(eChoPin2, HIGH);
    distancia2 = duracao2 / 58;
    Serial.print("  --  Distancia2 em Cm:");
    Serial.println(distancia2);
    delay(500);
//*******************************FIM DA FUNÇÃO DE CAPTURA DA DISTANCIA  SENSOR 2 ***  

}


void loop() {  
capturavalor();

int valsensor = map(distancia2, 0, 4000, 0, 255);   // O sensor mede segundo o fabricante ate 4m o que significa 4000cm,  como o sistema aceita ate os 255 de 1 bit então fazemos a conversao

analogWrite(9 , valsensor);  // escrevemos o valor lino em uma porta PWM que ira aumentar ou baixar de acordo com o valor lido no sensor

Serial.println(valsensor); // aqui voce pode acompanhar no serial monitor a distancia



while(distancia2 < 30){  // PRENDE O CIRCUITO EM UM LAÇO ENQUANTO O VALOR MEDIDO FOR MENOR QUE 30 (CM)
analogWrite(9 , 0);  //   Zera o valor do pino 9, ou seja, do motor
Serial.println("Sistema parado, distancia abaixo do ponto de ligamento");     // Emite um aviso no monitor serial para que se perceba que a coisa ta funcionando
Serial.println(valsensor); // aqui voce pode acompanhar no serial monitor a distancia
capturavalor();
}


}

Ola Weider, ajudando muito como sempre.

Eu havia criado um aqui também, só não tenho certeza se vai funcionar pois estou no trabalho e estou sem o arduino..rsrsrs

const int trigPin = 6;
const int echoPin = 7;
const int motor = 9;

void setup()

{
  Serial.begin(9600);
  pinMode(9,OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop()

{
  unsigned long duracao;
  int distancia;
  int valsensor;

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duracao = pulseIn(echoPin, HIGH);
  distancia = duracao / 58;

  Serial.print("  --  Distancia em Cm:");
  Serial.println(distancia);

  if (distancia <= 2000)
{
    valsensor = map(distancia, 0, 2000, 0, 255);
    analogWrite(motor, valsensor);
    Serial.println(valsensor);
}
  else
    {
    analogWrite(motor, 0);
    }

  delay(500);
}

Acha que assim vai rolar?

Cara,  o que você me pediu foi pra funcionar somente acima de 30 cm,  no seu codigo você tá mandando o sistema só funcionar abaixo de 2m,  mas não informa o minimo.

eu já vi uma bengala de cego com esses sensores de ultrassom que fazem vibrar um motorzinho igual um vibracall de celular. Não sei exatamente a distância a partir do qual era detectado obstáculo, mas lembro que longe do obstáculo a vibração era leve, em tempo bem espaçado. Cada vez que o obstáculo se aproximava, a vibração se tornava mais intensa, em intervalo de tempo menor. Fora isso, havia padrão de tremedeira diferente, um que indicava obstáculo para joelho/canela/pé e outro que indicava obstáculo para peito/ombro/cabeça

imhugo,

   É exatamente isso que o codigo que criei faz.

   O que estamos fazendo agora é só filtrar o codigo pra ele só funcionar acima de 30cm e pelo que tô entendendo o pedido abaixo de 2m.

   De resto isso ai que estamos criando funciona direitinho.

Weider tudo tranquilo? O código que você me mandou  deixou o motor meio maluco, vibra a todo momento.

Eu tentei fazer um outro que praticamente deu certo, mas o problema é que quando o sensor desliga ele guarda a última informação coletada e fica jogando isso no motor...

Como posso fazer o motor parar toda vez que o sensor desligar???

const int trigPin = 7;
const int echoPin = 6;
const int motor = 9;

void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop()
 {  
  unsigned long duracao;
  float distancia;
  int valsensor;
  int startSensor = 70; // centimetros
 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duracao = pulseIn(echoPin, HIGH);
  distancia = (float)duracao / 58.2;
 
  if (distancia <= startSensor)
  if (distancia > 0) {
    valsensor = map(distancia, 0, startSensor, 0, 255);
    analogWrite(motor, valsensor);
    Serial.println("Distancia: " + String(distancia) + "cm. Potencia: " + String(valsensor) + "PWM");
  }
  else {
    digitalWrite(motor, 0);
  }
 
  delay(500);
}

Muito obrigado pela ajuda ! :D

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço