Written by admin
Simplemente sustituimos el sensor LDR por uno RGB del tipo TCS34725. Ya lo hemos probado aparte, y el montaje lo hacemos similar al anterior:
Ahora probamos el circuito montado con la pistola roja. El programa que hemos modificado es el siguiente:
/*
EASY LASER GUN BY ARNAUD ATCHIMON @NEOFUTURISM.NET
DO NOT SHOOT YOUR EYES OUT!! PLEASE :)
Using Photocell_Example.ino from (https://www.sparkfun.com/products/9088) Jim Lindblom @ SparkFun Electronics
LIBRARY NEEDED:
I'm using the fanstastic servo library from PaulStoffregen @ https://github.com/PaulStoffregen/PWMServo
CONNECTION
----------
NANO
PIN 5 // BUTTON PIN
PIN 6 // NEOPIXEL PIN
PIN 9 // SERVO PIN
PIN A0 // LDR PIN -- 1OKOHM RESISTOR TO GROUND
*/
#include <Adafruit_NeoPixel.h>
#include <PWMServo.h>
#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include "TARGET_PITCHES.h"
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
const int btnMode = 5; //TRIGGER BTN
const int ledPin = 6; //NEOPIXEL PIN
const int ledCount = 24; //NEOPIXEL COUNT
const int piezoPin = 8; // SOUND PIN
const int servoPin = 9; // SERVO PIN
const int ONBOARD_PIN = 13; // ONBOARD LED
Adafruit_NeoPixel neoLights(ledCount, ledPin, NEO_GRB + NEO_KHZ800);
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_101MS, TCS34725_GAIN_1X);
PWMServo MYSERVO;
int MELODY[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
bool basePosition = false;
int servoPos = 0; // SERVO POSITION
int minServoPos = 100;
int maxServoPos = 20;
int targetHit = 0; // TARGET COUNT
int targetLight = 0;
float lightHit = 4; // NEOPIXE RING (24 / 4) = 6 SHOTS TO FINISH GAME
int modeBtn;
int modeSelect = 0;
// LDR VALUES YOU DO NOT NEED TO MODIFY THIS, CONNECT A 10K RESISTOR BETWEEEN GROUND AND A0
const float VCC = 4.98;
const float r_div = 4660.0;
const float DARK_THRESHOLD = 10000.0;
void setup()
{
Serial.begin(115200);
pinMode(btnMode, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pinMode(piezoPin, OUTPUT);
pinMode(ONBOARD_PIN, OUTPUT);
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
neoLights.begin();
neoLights.show();
neoLights.setBrightness(100);
//SERVO AND NEOPIXEL LOOP, IF THE SERVO GET STUCK HERE, PRESS RESET A FEW TIME, OR CHECK POWERING
colorWipe_B(neoLights.Color(255, 0, 0), 10);
MYSERVO.attach(servoPin);
SERVO_INIT();
// SERVO_RST();
colorWipe_B(neoLights.Color(0, 0, 255), 10);
colorWipe_B(neoLights.Color(0, 0, 0), 10); // CLEARING LEDS
// Activa el sensor RGB si está presente
if (tcs.begin()) {
Serial.println("TCS34725 activado");
}
else
{
Serial.println("Error: TCS34725 no encontrado");
while (1);
}
}
void loop()
{
uint16_t r, g, b, c, colorTemp, lux;
modeBtn = digitalRead(btnMode);
tcs.getRawData(&r, &g, &b, &c);
Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
// Comprueba botón y cambia modo de funcionamiento
if (modeBtn == LOW)
{
delay(250);
modeSelect++;
if (modeSelect == 1)
SERVO_FLAT();
else
SERVO_INIT();
}
// MODE:: TABLE MODE VS WALL MODE
if (modeSelect == 0)
{
// POINT THE LASER TO THE LDR AND SET "lightHit" ACCORDINGLY
if (r>200)
{
HITMISS(minServoPos, maxServoPos);
}
else noTone(piezoPin);
}
if (modeSelect == 1)
{
if (r>200)
{
HITMISS(maxServoPos, minServoPos);
}
else noTone(piezoPin);
}
if (modeSelect >= 2)
modeSelect = 0;
if (targetHit < ledCount / 2)
targetLight = 0;
else if (targetHit >= 12 && targetHit < ledCount)
targetLight = 1;
switch (targetLight)
{
case 0:
colorWipe(neoLights.Color(255, 0, 0), 10, targetHit);
break;
case 1:
colorWipe(neoLights.Color(0, 0, 255), 10, targetHit);
break;
}
if (targetHit >= ledCount)
{
for (int i = 0; i <= 2; i++)
{
// i++;
colorWipe_B(neoLights.Color(255, 0, 0), 15);
colorWipe_B(neoLights.Color(0, 255, 0), 15);
colorWipe_B(neoLights.Color(0, 0, 255), 15);
colorWipe_B(neoLights.Color( 0, 0, 0), 5);
}
MYSERVO.detach(); // STOP THE SERVO BUZZ
delay(500);
targetHit = 0;
}
// threshold setting, turn the LED on.
// if (lightR >= DARK_THRESHOLD) {
// digitalWrite(ledPin, HIGH);
// } else {
// digitalWrite(ledPin, LOW);
// }
Serial.println();
Serial.print("TARGET ");
Serial.println(targetHit);
Serial.print("MODES ");
Serial.println(modeSelect);
delay(1);
}
// NEOPIXELLED SETUP
void colorWipe(uint32_t color, int wait, int colorNum) {
for (int i = 0; i < colorNum; i++) {
neoLights.setPixelColor(i, color);
neoLights.show();
delay(wait);
}
}
void colorWipe_B(uint32_t color, int wait) {
for (int i = 0; i < neoLights.numPixels(); i++) {
neoLights.setPixelColor(i, color);
neoLights.show();
delay(wait);
}
}
// SERVO SETUP
void SERVO_INIT() {
SERVO_MOVE(minServoPos);
delay(1000);
SERVO_MOVE(maxServoPos);
delay(1500);
MYSERVO.detach();
}
void SERVO_FLAT()
{
SERVO_MOVE(maxServoPos);
delay(1000);
SERVO_MOVE(minServoPos);
delay(500);
MYSERVO.detach();
}
void SERVO_MOVE(int servoMove)
{
MYSERVO.attach(servoPin);
MYSERVO.write(servoMove);
// delay(10);
}
// SERVO IS HIT
void HITMISS(int maxServo, int minServo)
{
tone(piezoPin, 1000, 500);
targetHit = targetHit + 4;
SERVO_MOVE(maxServo);
colorWipe_B(neoLights.Color(0, 0, 255), 10);
SERVO_MOVE(minServo);
colorWipe_B(neoLights.Color(0, 0, 0), 10);
}
void SERVO_RST()
{
for (servoPos = 0; servoPos < minServoPos; servoPos += 10) { // goes from 0 degrees to 180 degrees, 1 degree steps
MYSERVO.write(servoPos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (servoPos = minServoPos; servoPos >= 1; servoPos -= 10) { // goes from 180 degrees to 0 degrees
MYSERVO.write(servoPos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
MYSERVO.detach();
}
Y el resultado se ve en el vídeo.
Deja una respuesta