Прежде чем спросить про Сервомашинку / Servo, посмотри тут.

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Понадобилось завести ещё одну серву для управления фиксированными поворотами по заданным углам, но только уже на четыре позиции. Принцип тот же, что и прежде, но что-то никак не получается прописать вторую серву. Делаю вроде все по аналогии, добавляя порядковый номер к новой серве и прочее, но ничего не выходит. Скорее всего какие-то команды дублировать с присвоением порядкового номера не следует, из за использования в скетче массива, но я так за два дня и не разобрался с этим. Решил ещё раз обратиться к вам за помощью. 

 

#include <Servo.h>
Servo mode;
Servo mode2;

int LEDS[3] = {12, 13, 2};
int LEDS2[4] = {6, 9, 10, 11};
int sizeof_LEDS = 3;
int sizeof_LEDS2 = 4;
int current_led_index = 0;
int current_led2_index = 0;
const int BUTTON = 7;
const int BUTTON2 = 8;
bool but_state = false;
bool but2_state = false;

void setup() {
  
  for(int i = 0; i < sizeof_LEDS; i++)
  for(int i = 0; i < sizeof_LEDS2; i++)
  {
    pinMode(LEDS[i], OUTPUT);
    pinMode(LEDS2[i], OUTPUT);
  }
  digitalWrite(LEDS[current_led_index], HIGH);
  digitalWrite(LEDS2[current_led2_index], HIGH);
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);
  mode.attach(3);
  mode2.attach(5);
}
void loop() {
  
  bool current_but_state = digitalRead(BUTTON);
  bool current_but2_state = digitalRead(BUTTON2);
  if( (current_but_state == true) && (but_state == false) )
  if( (current_but2_state == true) && (but2_state == false) )
  {
    but_state = true;
    but2_state = true;
       
    digitalWrite(LEDS[current_led_index], LOW);
    digitalWrite(LEDS2[current_led2_index], LOW);
    current_led_index = check_contact_param(current_led_index + 1);
    current_led2_index = check_contact_param2(current_led2_index + 1);
    digitalWrite(LEDS[current_led_index], HIGH);
    digitalWrite(LEDS2[current_led2_index], HIGH);
    
    if(current_led_index ==0)
    if(current_led2_index ==0)
    mode.write(0);
    mode2.write(20);

    if(current_led_index ==1) 
    if(current_led2_index ==1) 
    mode.write(90);
    mode2.write(90);

    if(current_led_index ==2)
    if(current_led2_index ==2)
    mode.write(160);
    mode2.write(180);

    if(current_led2_index ==3)
    mode2.write(180);
    
  }
  else if( (current_but_state == false) && (but_state == true) )
  else if( (current_but2_state == false) && (but2_state == true) )
  {
    but_state = false;
    but2_state = false;
  }

  delay(2);
}

int check_contact_param (int param)
int check_contact_param2 (int param2)
{
  if (param >= sizeof_LEDS)
  if (param2 >= sizeof_LEDS2)
    return 0;
  else
    return param;
    return param2;
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

серва не на PWM пине, на нано это 3, 5, 6, 9, 10, 11

а не, на правильном ... )))

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Не, вроде все правильно, я это учитывал. 

28   mode.attach(3);
29   mode2.attach(5);

Код не компилируется, вы считаете что должен?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

if ы закавычивать надо правильно...и код конечно бредятина

вот так хотя бы

    if(current_led_index ==0)     mode.write(0);
    if(current_led2_index ==0)   mode2.write(20);

    if(current_led_index ==1)     mode.write(90);
    if(current_led2_index ==1)   mode2.write(90);

    if(current_led_index ==2)     mode.write(160);
    if(current_led2_index ==2)   mode2.write(180);

    if(current_led2_index ==3)    mode2.write(180);

PS не программист, терминами не владею )))

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Не помогло, по прежнему компилятор ругается. Это после моих правок возможно он стал бредовым, а изначально он выглядел так. 

#include <Servo.h>
Servo mode;

int LEDS[3] = {12, 13, 2};
int sizeof_LEDS = 3;
int current_led_index = 0;
const int BUTTON = 7;
bool but_state = false;
void setup() {
  for(int i = 0; i < sizeof_LEDS; i++)
  {
    pinMode(LEDS[i], OUTPUT);
  }
  digitalWrite(LEDS[current_led_index], HIGH);
  pinMode(BUTTON, INPUT_PULLUP);
  mode.attach(3);
}
void loop() {
  bool current_but_state = digitalRead(BUTTON);
  if( (current_but_state == true) && (but_state == false) )
  {
    but_state = true;
    digitalWrite(LEDS[current_led_index], LOW);
    current_led_index = check_contact_param(current_led_index + 1);
    digitalWrite(LEDS[current_led_index], HIGH);
    
    if(current_led_index ==0)
    mode.write(0);

    if(current_led_index ==1) 
    mode.write(90);

    if(current_led_index ==2)
    mode.write(180);
  }
  else if( (current_but_state == false) && (but_state == true) )
  {
    but_state = false;
  }

  delay(2);
}

int check_contact_param (int param)
{
  if (param >= sizeof_LEDS)
    return 0;
  else
    return param;
}
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

после 40 строки вставляй такой же блок но на вторую серву и будет тебе счастье )))

NVN Plus
Offline
Зарегистрирован: 04.12.2017

deleted

NVN Plus
Offline
Зарегистрирован: 04.12.2017

deleted

 

 

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Всё, добил я этот код! Поиграл со скобками в конце - после delay(2) и все сразу встало на свои места. ua6em, огромное вам спасибо за оказанную помощь, правда, вы мне сильно помогли. Публикую законченный вариант кода. Теперь осталось сделать по человечески антидребезг и можно считать, что время потеряно не зря.

 

#include <Servo.h>
Servo mode;
Servo mode2;

int LEDS[3] = {10, 11, 6};
int sizeof_LEDS = 3;
int current_led_index = 0;
const int BUTTON = 7;
bool but_state = false;

int LEDS2[4] = {12, 13, 2, 4};
int sizeof_LEDS2 = 4;
int current_led2_index = 0;
const int BUTTON2 = 8;
bool but2_state = false;
void setup() {
  for(int i = 0; i < sizeof_LEDS; i++)
  for(int i = 0; i < sizeof_LEDS2; i++)
  {
    pinMode(LEDS[i], OUTPUT);
  
    pinMode(LEDS2[i], OUTPUT);
  }
  
  digitalWrite(LEDS[current_led_index], HIGH);  
  digitalWrite(LEDS2[current_led2_index], HIGH);
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);
  mode.attach(3);
  mode2.attach(4);  
}
void loop() {
  bool current_but_state = digitalRead(BUTTON);
  if( (current_but_state == true) && (but_state == false) )
  {
    but_state = true;
    digitalWrite(LEDS[current_led_index], LOW);
    current_led_index = check_contact_param(current_led_index + 1);
    digitalWrite(LEDS[current_led_index], HIGH);
    
    if(current_led_index ==0)
    mode.write(0);

    if(current_led_index ==1) 
    mode.write(90);

    if(current_led_index ==2)
    mode.write(180);
  }
  else if( (current_but_state == false) && (but_state == true) )
  {
    but_state = false;
  }
bool current_but2_state = digitalRead(BUTTON2);
  if( (current_but2_state == true) && (but2_state == false) )
  {
    but2_state = true;
    digitalWrite(LEDS2[current_led2_index], LOW);
    current_led2_index = check_contact_param2(current_led2_index + 1);
    digitalWrite(LEDS2[current_led2_index], HIGH);
    
    if(current_led2_index ==0)
    mode2.write(20);

    if(current_led2_index ==1) 
    mode2.write(90);

    if(current_led2_index ==2)
    mode2.write(160);

    if(current_led2_index ==3)
    mode2.write(180);
  }
  else if( (current_but2_state == false) && (but2_state == true) )
  {
    but2_state = false;
  }
  delay(5);
}
int check_contact_param (int param)
{
   if (param >= sizeof_LEDS)
      return 0; 
   else
    return param;
}
int check_contact_param2 (int param2)
{
   if (param2 >= sizeof_LEDS2)
      return 0; 
   else
    return param2;
}

 

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Теперь точно все! Сделал защиту от дребезга - как и полагается. Доволен на 100%. Удалил светодиоды от второй сервы. Они для моего проекта не предусматривались. Ещё раз спасибо!

#include <Servo.h>
Servo mode;
Servo mode2;

int LEDS[3] = {12, 13, 2};
int sizeof_LEDS = 3;
int current_led_index = 0;
const int BUTTON = 7;
bool but_state = false;

int sizeof_LEDS2 = 4;
int current_led2_index = 0;
const int BUTTON2 = 8;
bool but2_state = false;
unsigned long last_press;
void setup() {
  for(int i = 0; i < sizeof_LEDS; i++)
  for(int i = 0; i < sizeof_LEDS2; i++)
  {
    pinMode(LEDS[i], OUTPUT);   
  } 
  digitalWrite(LEDS[current_led_index], HIGH);   
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);
  mode.attach(3);
  mode2.attach(5);  
}
void loop() {
  bool current_but_state = digitalRead(BUTTON);
  if( (current_but_state == true) && (but_state == false) && (millis() - last_press > 500))
  {
    but_state = true;
    digitalWrite(LEDS[current_led_index], LOW);
    current_led_index = check_contact_param(current_led_index + 1);
    digitalWrite(LEDS[current_led_index], HIGH);
    
    if(current_led_index ==0)
    mode.write(0);

    if(current_led_index ==1) 
    mode.write(90);

    if(current_led_index ==2)
    mode.write(180);

    last_press = millis();
  }
  else if( (current_but_state == false) && (but_state == true) )
  {
    but_state = false;
  }
bool current_but2_state = digitalRead(BUTTON2);
  if( (current_but2_state == true) && (but2_state == false) && (millis() - last_press > 100))
  {
    but2_state = true;    
    current_led2_index = check_contact_param2(current_led2_index + 1);
        
    if(current_led2_index ==0)
    mode2.write(20);

    if(current_led2_index ==1) 
    mode2.write(90);

    if(current_led2_index ==2)
    mode2.write(160);

    if(current_led2_index ==3)
    mode2.write(180);
    
    last_press = millis();
  }
  else if( (current_but2_state == false) && (but2_state == true) )
  {
    but2_state = false;
  }
  
}
int check_contact_param (int param)
{
   if (param >= sizeof_LEDS)
      return 0; 
   else
    return param;
}
int check_contact_param2 (int param2)
{
   if (param2 >= sizeof_LEDS2)
      return 0; 
   else
    return param2;
}