- Код: Выделить всё
// код управления 2й ардуиной, управление пушкой, водометом и светом.
#include <PS2X_lib.h> //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0;
Servo LXservo;
Servo LYservo;
Servo LAservo;
Servo LBservo;
// управление реле
int flag=0;
int flag1=0;
// управление реле конец
#define SHOT 9 // пин для водомета
#define SHOT2 2 // пин для водомета
enum States
{
WAITING,
READING,
RUNNING,
ERROR,
TIMEOUT
};
States state;
States onWait();
States onRead();
States onRun();
States onError();
States onTimeout();
int mass[4]; //здесь будем хранить значения для скоростей и направлений
//mass[0] лев.напр.
//mass[1] лев.скор.
//mass[2] прав.напр.
//mass[3] прав.скор.
void setup(){
LXservo.attach(10);
LYservo.attach(11);
LAservo.attach( 4 );
LBservo.attach( 3 ); // серва пушки верх низ
Serial.begin(57600);
// пины управление реле
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(SHOT, OUTPUT); // задаем выход для стрельбы водой
pinMode(SHOT2, OUTPUT); // задаем выход для стрельбы пульками
PS2 = ps2x.config_gamepad(8,6,7,5, true, true); //Настройка выводов: (clock, command, attention, data, true, true)
}
void loop(){
// управление реле фарой
if((ps2x.Button(PSB_L2))==HIGH&&flag==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
flag=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
}
if((ps2x.Button(PSB_L2))==LOW&&flag==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
digitalWrite(13,!digitalRead(13));
flag=0;//обнуляем переменную flag
}
// управление реле 2 подсветка (при зажатии мигает)
if((ps2x.Button(PSB_L1))&&flag1==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
flag1=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
}
if((ps2x.Button(PSB_L1))&&flag1==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
digitalWrite(12,!digitalRead(12));
flag1=0;//обнуляем переменную flag
}
// управление реле конец
//-------— включение насоса —-------------
if (ps2x.Button(PSB_L3))
{
digitalWrite (SHOT, HIGH);
Serial.println("Насос вкл");
}
//-------— выключение насоса происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_L3))
{
digitalWrite (SHOT, LOW);
}
//-------— включение насоса —-------------
if (ps2x.Button(PSB_TRIANGLE))
{
digitalWrite (SHOT, HIGH);
Serial.println("Насос вкл");
}
//-------— выключение насоса происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_TRIANGLE))
{
digitalWrite (SHOT, LOW);
}
if(ps2x.Button(PSB_CROSS))
{
digitalWrite (SHOT, LOW);
}
//-------— включение пушки —-------------
if (ps2x.Button(PSB_R3))
{
digitalWrite (SHOT2, HIGH);
Serial.println("пушка вкл");
}
//-------— выключение пушки происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_R3))
{
digitalWrite (SHOT2, LOW);
}
if (ps2x.Button(PSB_SQUARE))
{
digitalWrite (SHOT2, HIGH);
Serial.println("пушка вкл");
}
//-------— выключение пушки происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_SQUARE))
{
digitalWrite (SHOT2, LOW);
}
if(ps2x.ButtonReleased(PSB_CIRCLE))
{
digitalWrite (SHOT2, LOW);
}
// geirf ifhbrb
LXservo.write(map(ps2x.Analog(PSS_LX), 255, 0, 0, 180)); ;
delay(50);
ps2x.read_gamepad(false, 0);
// ktdj ghfdj
LYservo.write(map(ps2x.Analog(PSS_LY), 0, 255, 0, 60)); ;
delay(50);
ps2x.read_gamepad(false, 0);
LAservo.write(map(ps2x.Analog(PSS_RX), 255, 0, 0, 180)); ;
delay(50);
ps2x.read_gamepad(false, 0);
LBservo.write(map(ps2x.Analog(PSS_RY), 255, 0, 0, 90)); ;
delay(50);
ps2x.read_gamepad(false, 0);
// dir_pwm(ps2x.Analog(PSS_RY),2); //обрабатываем правый джойстик
//digitalWrite(R_dir, mass[2]);
//analogWrite(R_pwm, mass[3]);
}
он управляет сервами и реле с джойстка сони плейстейшин.
сюда же я захотел добавить код управляющий бегущими огнями на адресной светодиодной ленте
с таким кодом
- Код: Выделить всё
#include "FastLED.h"
#define NUM_LEDS 60
CRGB leds[NUM_LEDS];
#define PIN 1
void setup()
{
FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}
// *** REPLACE FROM HERE ***
void loop() {
Sparkle(0xff, 0xff, 0xff, 0);
}
void Sparkle(byte red, byte green, byte blue, int SpeedDelay) {
int Pixel = random(NUM_LEDS);
setPixel(Pixel,red,green,blue);
showStrip();
delay(SpeedDelay);
setPixel(Pixel,0,0,0);
}
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}
void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}
по отдельности оба кода работают исправно
а если совместить то почемуто светодиоды на адресной ленте не работают и сервы сами по себе произвольно подергиваються, но при этом управление с джойстика сохраняется.
вот общий код
- Код: Выделить всё
/ код управления 2й ардуиной, управление пушкой, водометом и светом.
#include <PS2X_lib.h> //for v1.6
#include <Servo.h>
PS2X ps2x;
int PS2 = 0;
Servo LXservo;
Servo LYservo;
Servo LAservo;
Servo LBservo;
// управление реле
int flag=0;
int flag1=0;
// управление реле конец
#define SHOT 9 // пин для водомета
#define SHOT2 2 // пин для водомета
#include "FastLED.h"
#define NUM_LEDS 60
CRGB leds[NUM_LEDS];
#define PIN 1
enum States
{
WAITING,
READING,
RUNNING,
ERROR,
TIMEOUT
};
States state;
States onWait();
States onRead();
States onRun();
States onError();
States onTimeout();
int mass[4]; //здесь будем хранить значения для скоростей и направлений
//mass[0] лев.напр.
//mass[1] лев.скор.
//mass[2] прав.напр.
//mass[3] прав.скор.
void setup(){
LXservo.attach(10);
LYservo.attach(11);
LAservo.attach( 4 );
LBservo.attach( 3 ); // серва пушки верх низ
Serial.begin(57600);
// пины управление реле
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(SHOT, OUTPUT); // задаем выход для стрельбы водой
pinMode(SHOT2, OUTPUT); // задаем выход для стрельбы пульками
PS2 = ps2x.config_gamepad(8,6,7,5, true, true); //Настройка выводов: (clock, command, attention, data, true, true)
{
FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}
}
void loop(){
Sparkle(0xff, 0xff, 0xff, 0);
}
void Sparkle(byte red, byte green, byte blue, int SpeedDelay) {
int Pixel = random(NUM_LEDS);
setPixel(Pixel,red,green,blue);
showStrip();
delay(SpeedDelay);
setPixel(Pixel,0,0,0);
// управление реле фарой
if((ps2x.Button(PSB_L2))==HIGH&&flag==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
flag=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
}
if((ps2x.Button(PSB_L2))==LOW&&flag==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
digitalWrite(13,!digitalRead(13));
flag=0;//обнуляем переменную flag
}
// управление реле 2 подсветка (при зажатии мигает)
if((ps2x.Button(PSB_L1))&&flag1==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
flag1=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
}
if((ps2x.Button(PSB_L1))&&flag1==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
digitalWrite(12,!digitalRead(12));
flag1=0;//обнуляем переменную flag
}
// управление реле конец
//-------— включение насоса —-------------
if (ps2x.Button(PSB_L3))
{
digitalWrite (SHOT, HIGH);
Serial.println("Насос вкл");
}
//-------— выключение насоса происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_L3))
{
digitalWrite (SHOT, LOW);
}
//-------— включение насоса —-------------
if (ps2x.Button(PSB_TRIANGLE))
{
digitalWrite (SHOT, HIGH);
Serial.println("Насос вкл");
}
//-------— выключение насоса происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_TRIANGLE))
{
digitalWrite (SHOT, LOW);
}
if(ps2x.Button(PSB_CROSS))
{
digitalWrite (SHOT, LOW);
}
//-------— включение пушки —-------------
if (ps2x.Button(PSB_R3))
{
digitalWrite (SHOT2, HIGH);
Serial.println("пушка вкл");
}
//-------— выключение пушки происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_R3))
{
digitalWrite (SHOT2, LOW);
}
if (ps2x.Button(PSB_SQUARE))
{
digitalWrite (SHOT2, HIGH);
Serial.println("пушка вкл");
}
//-------— выключение пушки происходит автоматически после отпускания кнопки—-------------
if(ps2x.ButtonReleased(PSB_SQUARE))
{
digitalWrite (SHOT2, LOW);
}
if(ps2x.ButtonReleased(PSB_CIRCLE))
{
digitalWrite (SHOT2, LOW);
}
// geirf ifhbrb
LXservo.write(map(ps2x.Analog(PSS_LX), 255, 0, 0, 180)); ;
delay(50);
ps2x.read_gamepad(false, 0);
// ktdj ghfdj
LYservo.write(map(ps2x.Analog(PSS_LY), 0, 255, 0, 60)); ;
delay(50);
ps2x.read_gamepad(false, 0);
LAservo.write(map(ps2x.Analog(PSS_RX), 255, 0, 0, 180)); ;
delay(50);
ps2x.read_gamepad(false, 0);
LBservo.write(map(ps2x.Analog(PSS_RY), 255, 0, 0, 90)); ;
delay(50);
ps2x.read_gamepad(false, 0);
// dir_pwm(ps2x.Analog(PSS_RY),2); //обрабатываем правый джойстик
//digitalWrite(R_dir, mass[2]);
//analogWrite(R_pwm, mass[3]);
}
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}
void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}
в чем может быть причина? или может оба кода не тянет сам контролер и нужно делать все отдельными платами?