Colorino V2 – Eletrônica e Arduino na Prática 3
Aloha! Depois de muito tempo (muito²!) venho continuando a série Arduino com uma “evolução” do Colorino: o Colorino V2!
Essencialmente peguei o projeto anterior do Colorino e substituí os resistores deslizantes por sensores sônicos de distância. A minha idéia inicial (e que deu certo) é a de controlar a intensidade de cada cor do led RGB aproximando ou distanciando a palma da mão do respectivo sensor sônico.
Como é de praxe, adquiri esse sensor de distância no DealExtreme. Seguem os componentes usados:
- 1 Arduino Duemilanove ATMega328 (“Brasileirino”) [Arduino Uno];
- 1 Led RGB 5W 70 Lumen [Deal Extreme];
- 3 Sensores sônicos de distância HC-SR04 [Deal Extreme];
- 3 Transistores NPN Tip122 [Wiki];
- 1 Bateria 4V de alta descarga (pode ser uma bateria de 3,7V de celular)*;
- 1 Bateria 9V convencional para alimentar o Arduino (“opcional”) [Google Images];
- Muitos fios.
Na esquemática a seguir deixei apenas 1 sensor de distância para simplificar.
Nessa montagem e testes tive muitos problemas com variações loucas nas leituras dos sensores de distância. Mexi muito em código até perceber que o problema era nas variações de corrente no circuito.
Provavelmente eu deveria ter incluído resistores em algum ponto, pois, usando a alimentação de uma USB normal, com fornecimento limitado de corrente, as leituras dos sensores constantemente ficam estranhas.
Utilizando uma bateria 9V para alimentar o Arduino o problema some (demorei pra descobrir isso…).
Agora o código. Para testes, gerei uns 3 códigos diferentes até mesmo utilizando um lib para controle de sensores sônicos de distância. Mas deixo aqui apenas o primeiro código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
int echoPin1 = 12; int echoPin2 = 10; int echoPin3 = 3; int initPin1 = 4; int initPin2 = 11; int initPin3 = 2; int redPin = 5; int greenPin = 6; int bluePin = 9; int pulseTimeout = 2000; void setup() { pinMode(initPin1, OUTPUT); pinMode(echoPin1, INPUT); pinMode(initPin2, OUTPUT); pinMode(echoPin2, INPUT); pinMode(initPin3, OUTPUT); pinMode(echoPin3, INPUT); Serial.begin(9600); } void loop() { int distance1 = processDistance(initPin1, echoPin1); if(distance1 > 0) { int redValue = map(distance1, 1, 30, 0, 150); analogWrite(redPin, redValue); } Serial.print(distance1); Serial.print(" - "); delay(100); int distance2 = processDistance(initPin2, echoPin2); if(distance2 > 0) { int greenValue = map(distance2, 1, 30, 0, 255); analogWrite(greenPin, greenValue); } Serial.print(distance2); Serial.print(" - "); delay(100); int distance3 = processDistance(initPin3, echoPin3); if(distance3 > 0) { int blueValue = map(distance3, 1, 30, 0, 255); analogWrite(bluePin, blueValue); } Serial.print(distance3); Serial.println(""); delay(100); } int processDistance(int initPin, int echoPin) { digitalWrite(initPin, HIGH); delayMicroseconds(10); digitalWrite(initPin, LOW); int pulseTime = pulseIn(echoPin, HIGH, pulseTimeout); int distance = pulseTime/58; return distance; } |
Analisando o código é possível começar a entender o funcionamento do sensor ultrassônico. No método processDistance um sinal é enviado a um dos sensores fazendo-o disparar um pulso de som. Assim que o mesmo sensor obtém o eco desse pulso, ele responde com um sinal para a porta do Arduino.
O tempo transcorrido nesse processo, pode ser usado para calcular a distância e, consequentemente, pode ser convertido para a intensidade que o led RGB deve acender.
Bem… esse foi um post que queria ter feito já faz tempo pra poder desmontar o projeto e poder fazer outra coisa… =P
Na verdade queria ter postado muitas outras coisas sobre Java, mas o tempo passou, e fiquei sem postar nada em 2013… o_O
Fui!
Leave a Reply