С Вашего позволения - “Вы”.
А так да, умный, как целая стая уток, Вам не понять
Зачем на бумаге, я в Loyout сейчас её делаю, просто ещё не доделал.
(соображалка устала. сижу пиво пью.)
Извините если Вас обидел.
Во первых быстрее, во вторых будешь представлять как лучше расположить в Loyout
Значит в SPlan сможете схему нарисовать.
Ни разу не работал в SPLan
Я то в Fritzing только неделю работаю… И то из-за проекта начал в нём.
И как это связано с приведенной схемой?
Где винтовка? Где мишень?
Это еще в процессе. Думаю, что самое главное я сделал, дальше уже кто как хочет может использовать.
В видео кольцо адресных светодиодов. На схеме нет. Лишнее?
Я в SPL не нащол адресную ленту, так же как и серво, заменил на квадраты с тремя выводами и подписал их.
Могу просто начертить выводы и подписать куда они идут.
пере залил переделанную, спасибо Вам.
/*
EASY LASER GUN BY ARNAUD ATCHIMON @NEOFUTURISM.NET
DO NOT SHOOT YOUR EYES OUT!! PLEASE :)
TUNES: Thanks to Robson Couto for his mario tune
https://github.com/robsoncouto/arduino-songs/blob/master/supermariobros/supermariobros.ino
Super Mario Bros theme
Score available at https://musescore.com/user/2123/scores/2145
Theme by Koji Kondo
CONNECTION
----------
NANO
PIN 10 // BUTTON PIN
PIN 5 // LASER PIN
PIN 8 // PIEZO PIN
CONNECT 9V CONNECTOR TO [ (+) TO VIN ] - [ (-) TO GND ]
*/
#include "GUN_PITCHES.h"
const int laserPin = 5; // LASER PIN
const int audioPin = 8; // PIEZO PIN
const int buttonPin = 10; //W TRIGGER PIN
const int onboardLed = 13; // ONBOARD LED
//TUNES MARIO/DOOM
int tempo = 200; //MUSIC SPEED
int marioNotes = sizeof(MARIO_TONE) / sizeof(MARIO_TONE[0]) / 2;
int dooomnotes = sizeof(DOOM_TONE) / sizeof(DOOM_TONE[0]) / 2;
int whole_note = (65000 * 4) / tempo;
int divider = 0, noteDuration = 0;
//GUN SETTINGS
bool bulletMode = false;
int bulletNumber = 6; // CHANGE THIS IF YOU WANT MORE BULLETS
int gunReload = 0;
int bulletReload = bulletNumber;
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(onboardLed, OUTPUT);
pinMode(laserPin, OUTPUT);
digitalWrite(laserPin, LOW);
digitalWrite(buttonPin, HIGH);
// IF TRIGGER PRESSED FULLY AUTOMATIC SHOOTING
// IF NOT # BULLET IS NUMBER IN YOUR CLIP
if (digitalRead(buttonPin) == LOW) {
bulletMode = true;
START_TUNE(DOOM_TONE, dooomnotes ); //PLAY DOOM TUNE
} else {
START_TUNE(MARIO_TONE, marioNotes ); //PLAY MARIO TUNE
}
}
void loop() {
int btnReads = digitalRead(buttonPin);
Serial.println("BUTTON READ: " + String(btnReads) );
Serial.println("BULLETS " + String(gunReload) );
//READ BUTTON
if (btnReads == LOW) {
digitalWrite(onboardLed, LOW);
tone(audioPin, PEWPEW_TUNE[0], 100);
gunReload++;
digitalWrite(laserPin, HIGH);
delay(200);
} else {
digitalWrite(laserPin, LOW);
digitalWrite(onboardLed, HIGH);
noTone(audioPin);
}
// CHECK IF SINGLE OR FULL AUTOMATIC MODE
if (bulletMode == false) {
if (gunReload >= bulletNumber) {
digitalWrite(laserPin, LOW);
for (int i = 0; i <= bulletReload; i++) {
i++;
tone(audioPin, PEWPEW_TUNE[1], 30);
btnReads = 1;
digitalWrite(onboardLed, LOW);
delay(50);
digitalWrite(onboardLed, HIGH);
delay(100);
noTone(audioPin);
}
gunReload = 0;
delay(10000);
}
}
}
//PLAY MUSIC
void START_TUNE(int tune[], int notesSize) {
for (int thisNote = 0; thisNote < notesSize * 2; thisNote = thisNote + 2) {
divider = tune[thisNote + 1];
if (divider > 0) {
noteDuration = (whole_note) / divider;
} else if (divider < 0) {
noteDuration = (whole_note) / abs(divider);
noteDuration *= 1.5;
}
tone(audioPin, tune[thisNote], noteDuration * 0.9);
delay(noteDuration);
noTone(audioPin);
}
}
код для Лазера
Ссылка на код и библиотеку для пистолета на лазерныый тир
Мишень для лазерного и пневматического тира
Ссылка на код и библиотеку для лазерного и пневматического тира (остольные библиотеки есть в IDE)
Вроде исправил. Можно пробовать.
китайцам предлагал за долю в прибыли делать их массово? общество милитаризуется, код идеален, схема то фигня косые сами разберутся, я считаю.
/*
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 <PCF8574.h> // Создаем объект и указываем адрес устройства 0x27
#include <Adafruit_NeoPixel.h>
#include <PWMServo.h>
#include "TARGET_PITCHES.h"
PWMServo MYSERVO;
PCF8574 pcf8574_1(0x27);
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
const int lightPin = A0; // PHOTOCELL PIN
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
boolean buttonWasUp_1 = true;
boolean buttonWasUp_2 = true;
boolean buttonWasUp_3 = true;
boolean buttonWasUp_4 = true;
boolean ledEnabled_1 = false;
boolean ledEnabled_2 = false;
boolean ledEnabled_3 = false;
boolean ledEnabled_4 = false;
//
int MELODY[] = {
NOTE_B4, 16, NOTE_B5, 16, NOTE_FS5, 16, NOTE_DS5, 16, //1
NOTE_B5, 32, NOTE_FS5, -16, NOTE_DS5, 8, NOTE_C5, 16,
NOTE_C6, 16, NOTE_G6, 16, NOTE_E6, 16, NOTE_C6, 32, NOTE_G6, -16, NOTE_E6, 8,
};
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;
//задаем начальные значения для переменных
Adafruit_NeoPixel neoLights(ledCount, ledPin, NEO_GRB + NEO_KHZ800);
void setup()
{
Serial.begin(115200);
pinMode(lightPin, INPUT);
pinMode(btnMode, INPUT_PULLUP);
pinMode(ledPin, 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
//конфигурируем пины, пин кнопки на вход(с него мы будем считывать данные)
pcf8574_1.pinMode(P0, OUTPUT);
pcf8574_1.pinMode(P1, OUTPUT);
pcf8574_1.pinMode(P2, OUTPUT);
pcf8574_1.pinMode(P3, OUTPUT);
//пин светодиода на выход, на него мы будем подавать сигнал
pcf8574_1.pinMode (P4, INPUT_PULLUP);
pcf8574_1.pinMode (P5, INPUT_PULLUP);
pcf8574_1.pinMode (P6, INPUT_PULLUP);
pcf8574_1.pinMode (P7, INPUT_PULLUP);
// Проверка инициализация библиотеки pcf8574
Serial.print("Init pcf8574...");
if (pcf8574_1.begin()){
Serial.println("OK");}
else{
Serial.println("ERROR");}
delay(50); // Необходимо время для инициализации
}
void loop()
{
int lightAdc = analogRead(lightPin);
modeBtn = digitalRead(btnMode);
// LDR CHECK
float lightV = lightAdc * VCC / 1023.0;
float lightR = r_div * (VCC / lightV - 1.0);
Serial.println("Voltage: " + String(lightV) + " V");
Serial.println("Resistance: " + String(lightR) + " ohms");
Serial.println("base position: " + String(basePosition) + " ohms");
//BUTTON TO MOVE FROM DESK TO FLAT MODE
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 (lightV >= lightHit) {
HITMISS(minServoPos, maxServoPos);
} else(noTone(piezoPin));
}
if (modeSelect == 1)
{
if (lightV >= lightHit) {
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(0, 255, 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++) {
tone(piezoPin, 600, 500);
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);
//1
boolean buttonIsUp_1 = pcf8574_1.digitalRead(P4);
if (buttonWasUp_1 && !buttonIsUp_1) {
delay(25);
buttonIsUp_1 = pcf8574_1.digitalRead (P4);
if (!buttonIsUp_1) {
ledEnabled_1 = !ledEnabled_1;
pcf8574_1.digitalWrite(P0, ledEnabled_1);
}
}
buttonWasUp_1 = buttonIsUp_1;
//2
boolean buttonIsUp_2 = pcf8574_1.digitalRead(P5);
if (buttonWasUp_2 && !buttonIsUp_2) {
delay(25);
buttonIsUp_2 = pcf8574_1.digitalRead (P5);
if (!buttonIsUp_2) {
ledEnabled_2 = !ledEnabled_2;
pcf8574_1.digitalWrite(P1, ledEnabled_2);
}
}
buttonWasUp_2 = buttonIsUp_2;
//3
boolean buttonIsUp_3 = pcf8574_1.digitalRead(P6);
if (buttonWasUp_3 && !buttonIsUp_3) {
delay(25);
buttonIsUp_3 = pcf8574_1.digitalRead (P6);
if (!buttonIsUp_3) {
ledEnabled_3 = !ledEnabled_3;
pcf8574_1.digitalWrite(P2, ledEnabled_3);
}
}
buttonWasUp_3 = buttonIsUp_3;
//4
boolean buttonIsUp_4 = pcf8574_1.digitalRead(P7);
if (buttonWasUp_4 && !buttonIsUp_4) {
delay(25);
buttonIsUp_4 = pcf8574_1.digitalRead (P7);
if (!buttonIsUp_4) {
ledEnabled_4 = !ledEnabled_4;
pcf8574_1.digitalWrite(P3, ledEnabled_4);
}
}
buttonWasUp_4 = buttonIsUp_4;
}
//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, 600, 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();
}
Доработал код (настроил звук при попадании и при полной победе)
и соответственно доработанная схема.