Помогите соединить 2 скетча

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Помогите соединить 2 скетча

Сообщение slom » 04 мар 2016, 01:52

на ардуино мини про или как там ее у меня есть такой скетч,
Код: Выделить всё
// код управления 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();
}


в чем может быть причина? или может оба кода не тянет сам контролер и нужно делать все отдельными платами?
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Помогите соединить 2 скетча

Сообщение RootAdmin » 04 мар 2016, 11:03

Все, именно все delay - выкинуть.
Ну нерационально использовать эту функцию.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Помогите соединить 2 скетча

Сообщение slom » 05 мар 2016, 22:25

использовать может и нерационально зато просто, написал дели и цифру и готово.... а через милис запутаная история с кучей строчек :((( вобщем милис неосилил.
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)

Re: Помогите соединить 2 скетча

Сообщение elmot » 05 мар 2016, 23:16

произносится "дилэй" с ударением на э
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Помогите соединить 2 скетча

Сообщение lorry » 06 мар 2016, 03:31

1. На "delay" выполнение программы останавливается на указанное число миллисекунд, по этой причине программа может работает не верно. Для реализации задержек необходимо использовать команду "millis" с проверкой условия окончания задержки времени, это усложняет код программы, но вы получите постоянно работающий без остановок цикл. Выглядеть это должно примерно так:
Код: Выделить всё
void loop() {
  static unsigned long timer; // переменная в которой хранится время Ч
  /*
   какой-то ваш программный код
   */

  // Этот участок кода будет выполняться только через заданные вами промежутки
  if(millis() => timer) {
    timer = millis() + 50; // здесь вы записываете в переменную новое значение времени Ч с приращением, в данном случае 50 миллисекунд
    /*
     то что должно выполняться при наступлении времени Ч
     */
   }
   
  /*
   какой-то ваш программный код
   */   
}

2. Проверьте не перекрываются ли номера используемых вами пинов для серв с пинами для led.
3. Перенесите все #include в начало программного кода. Все библиотеки должны быть подключены до объявления переменных.
4. Поместите все #define после #include
Последний раз редактировалось lorry 07 мар 2016, 02:24, всего редактировалось 2 раз(а).
Аватара пользователя
lorry
 
Сообщения: 448
Зарегистрирован: 04 фев 2014, 13:53
Откуда: Комсомольск-на-Амуре
прог. языки: машинные коды
ФИО: Иван Иваныч

Re: Помогите соединить 2 скетча

Сообщение slom » 06 мар 2016, 10:34

спасибо буду пробовать
Аватара пользователя
slom
 
Сообщения: 645
Зарегистрирован: 07 сен 2014, 19:29
Откуда: Севастополь
Skype: slom_3d
прог. языки: 3d max :)


Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11