Модуль расширения i2c при запуске горят светодиоды

,

С Вашего позволения - “Вы”.
А так да, умный, как целая стая уток, Вам не понять :frowning:

Зачем на бумаге, я в Loyout сейчас её делаю, просто ещё не доделал.
(соображалка устала. сижу пиво пью.)

Извините если Вас обидел.

Во первых быстрее, во вторых будешь представлять как лучше расположить в Loyout

Значит в SPlan сможете схему нарисовать.

Ни разу не работал в SPLan

Я то в Fritzing только неделю работаю… И то из-за проекта начал в нём. :slight_smile:

И как это связано с приведенной схемой?

Где винтовка? Где мишень?

Это еще в процессе. Думаю, что самое главное я сделал, дальше уже кто как хочет может использовать.

В видео кольцо адресных светодиодов. На схеме нет. Лишнее?

1 лайк

Я в 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();

}

Доработал код (настроил звук при попадании и при полной победе)

и соответственно доработанная схема.