кнопка переключения режимов

Тема в разделе "Arduino & Shields", создана пользователем Иropь, 5 июн 2016.

  1. Иropь

    Иropь Нерд

    Попробовал но выдает ошибку
     
  2. fogary

    fogary Гик

    Чего пишет-то?
    В if по идее, нужно поменять знак "<" на ">=".
     
  3. Иropь

    Иropь Нерд

    скетч получился такой
    #include "IRremote.h" // https://github.com/z3t0/Arduino-IRremote

    #define BUTTON_1 0xB47 // коды кнопок пульта
    #define BUTTON_2 0x80B47
    #define BUTTON_4 0xC0B47
    #define BUTTON_5 0x20B47
    #define BUTTON_7 0x60B47
    #define BUTTON_8 0xE0B47
    #define BUTTON_3 0x40B47
    #define BUTTON_6 0xA0B47
    #define BUTTON_A 0x10B47
    #define BUTTON_B 0xA90
    #define BUTTON_PLUS 0x490
    #define BUTTON_MINUS 0xC90
    int RELAY_PIN = 12;
    const byte receiverPin = 6; // пин для подключения выхода ИК-приемника
    const byte motorPin[20] = {
    22,23,24,25,
    26,27,28,29,
    30,31,32,33,
    34,35,36,37,
    38,39,40,41};
    Boolian IsGone=true;
    Unsinged long GoneTime; // массив пинов всех моторов

    const byte ledPin[5] = {
    15,16,17,18,19}; // индикаторы активного мотора
    byte currentMotor = 1; // переменная для хранения текущего (активного) мотора
    const byte motorPause = 3; // длительность четверти шага

    IRrecv irrecv(receiverPin);
    decode_results results;
    bool LampState = false;


    void setup()
    {
    pinMode(RELAY_PIN, OUTPUT);
    for(byte i = 0; i < 20; i++) pinMode(motorPin, OUTPUT);
    for(byte i = 0; i < 5; i++) pinMode(ledPin, OUTPUT);
    irrecv.enableIRIn();
    }

    void loop()
    {
    if (irrecv.decode(&results)) // получен сигнал с пульта
    {
    switch(results.value)
    {
    case BUTTON_1: // кнопки 1-5 выбирают движок
    currentMotor = 1;
    break;

    case BUTTON_2:
    currentMotor = 2;
    GoneTime=millis();
    IsGone=false;
    break;

    case BUTTON_3:
    currentMotor = 3;
    GoneTime=millis();
    IsGone=false;
    break;

    case BUTTON_4:
    currentMotor = 4;
    GoneTime=millis();
    IsGone=false;
    break;

    case BUTTON_5:
    currentMotor = 5;
    GoneTime=millis();
    IsGone=false;
    break;

    case BUTTON_PLUS:
    stepRight(); // делаем 1 шаг в одну сторону
    break;

    case BUTTON_MINUS:
    stepLeft(); // делаем 1 шаг в другую сторону
    break;

    case BUTTON_A: // эта кнопка сбрасывает все активные движки
    currentMotor = 0;
    break;

    case BUTTON_B: // эта кнопка активирует следующий движок
    currentMotor = currentMotor > 4 ? 1 : currentMotor=+1;
    break;
    } // switch
    if(!IsGone&&millis()-GoneTime<20000)
    {
    currentMotor= 1;
    IsGone=true;
    }


    irrecv.resume();
    {
    if (results.value == 0x3EE)
    {
    LampState = !LampState;
    if (LampState)
    {
    digitalWrite(RELAY_PIN,HIGH);
    delay(2000);
    }
    else
    {
    digitalWrite(RELAY_PIN,LOW);
    delay(2000);
    }
    }
    irrecv.resume();
    }
    }
    // гасим все индикаторы
    for(byte i = 0; i < 5; i++) digitalWrite(ledPin, LOW);
    // включаем индикатор выбранного движка
    if (currentMotor > 0) digitalWrite(ledPin[currentMotor - 1], HIGH);

    } // loop


    void stepLeft()
    {
    byte startPin = (currentMotor - 1) * 4;
    if (currentMotor > 0)
    {
    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], HIGH );
    delay(motorPause);

    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], HIGH );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);

    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], HIGH );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);

    digitalWrite( motorPin[startPin], HIGH );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);

    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);
    }
    }

    void stepRight()
    {
    byte startPin = (currentMotor - 1) * 4;
    if (currentMotor > 0)
    {
    digitalWrite( motorPin[startPin], HIGH );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);

    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], HIGH );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);

    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], HIGH );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);

    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], HIGH );
    delay(motorPause);

    digitalWrite( motorPin[startPin], LOW );
    digitalWrite( motorPin[startPin + 1], LOW );
    digitalWrite( motorPin[startPin + 2], LOW );
    digitalWrite( motorPin[startPin + 3], LOW );
    delay(motorPause);
    }

    }
    и куча ошибок внизу
     
  4. ostrov

    ostrov Гуру

    Индийский код?
     
  5. qwone

    qwone Гик

    Не, это "битва на Марне". 3000 строк программы это не предел.
    Зачем вы пытаетесь проблему завалить строками. Организуйте 6 вычислительных потока и решайте проблемы по мере поступления.
    Код (C++):
    /*
    #1 1-й шаговый двигатель
    #2 2-й шаговый двигатель
    #3 3-й шаговый двигатель
    #4 4-й шаговый двигатель
    #5 5-й шаговый двигатель
    #6 кнопки
    */

    //#1
    //#2
    //#3
    //#4
    //#5
    //#6
    void setup() {
    //#1
    //#2
    //#3
    //#4
    //#5
    //#6
    }

    void loop() {
    //#1
    //#2
    //#3
    //#4
    //#5
    //#6
    }
     
    Последнее редактирование: 20 окт 2016
    Иropь нравится это.
  6. qwone

    qwone Гик

    Ну хотя бы так
    Код (C++):
    /*
    #1 1-й шаговый двигатель ->2,3,4,5
    #2 2-й шаговый двигатель ->6,7,8,9
    #3 3-й шаговый двигатель ->10,11,12,13
    #4 4-й шаговый двигатель
    #5 5-й шаговый двигатель
    #6 кнопки -> A0, A1, A2, A3, A4, A5  0 нажата 1 нет
              GND->GND
    */

    //#1
    const byte STEP_MAP[] = {0x01, 0x02, 0x04, 0x08};
    const byte stepping_motor_1_pin[] = {2, 3, 4, 5};
    const int time_step_1 = 100 ; // длительность одного шага ШД1 в миллисекундах
    uint8_t Step_1 = 0;
    const int Step_max_1 = 3; // максимальная количество шагов 0,1,2,3
    uint8_t pace_1 = 0; // приращение + вращение по часовой / - против

    //#2
    const byte stepping_motor_2_pin[] = {6, 7, 8, 9};
    const int time_step_2 = 100 ; // длительность одного шага ШД1 в миллисекундах
    uint8_t Step_2 = 0;
    const int Step_max_2 = 3; // максимальная количество шагов 0,1,2,3
    uint8_t pace_2 = 0; // приращение + вращение по часовой / - против
    //#3
    const byte stepping_motor_3_pin[] = {10, 11, 12, 13};
    const int time_step_3 = 100 ; // длительность одного шага ШД1 в миллисекундах
    uint8_t Step_3 = 0;
    const int Step_max_3 = 3; // максимальная количество шагов 0,1,2,3
    uint8_t pace_3 = 0; // приращение + вращение по часовой / - против
    //#4
    //#5
    //#6
    const byte btm_pin[] = {A0, A1, A2, A3, A4, A5};
    byte btm[] = {0, 0, 0, 0, 0, 0};

    void setup() {
      //#1
      pinMode(stepping_motor_1_pin[0], OUTPUT);
      pinMode(stepping_motor_1_pin[1], OUTPUT);
      pinMode(stepping_motor_1_pin[2], OUTPUT);
      pinMode(stepping_motor_1_pin[3], OUTPUT);
      //#2
      pinMode(stepping_motor_2_pin[0], OUTPUT);
      pinMode(stepping_motor_2_pin[1], OUTPUT);
      pinMode(stepping_motor_2_pin[2], OUTPUT);
      pinMode(stepping_motor_2_pin[3], OUTPUT);
      //#3
      pinMode(stepping_motor_3_pin[0], OUTPUT);
      pinMode(stepping_motor_3_pin[1], OUTPUT);
      pinMode(stepping_motor_3_pin[2], OUTPUT);
      pinMode(stepping_motor_3_pin[3], OUTPUT);
      //#4
      //#5
      //#6
      pinMode(btm_pin[0], INPUT_PULLUP); // + 1 ШД
      pinMode(btm_pin[1], INPUT_PULLUP); // - 1 ШД
      pinMode(btm_pin[2], INPUT_PULLUP); // + 2 ШД
      pinMode(btm_pin[3], INPUT_PULLUP); // - 2 ШД
      pinMode(btm_pin[4], INPUT_PULLUP); // + 3 ШД
      pinMode(btm_pin[5], INPUT_PULLUP); // - 3 ШД
      btm[0] = btm[0] << 1 | digitalRead(btm_pin[0]);
      btm[1] = btm[1] << 1 | digitalRead(btm_pin[1]);
      btm[2] = btm[2] << 1 | digitalRead(btm_pin[2]);
      btm[3] = btm[3] << 1 | digitalRead(btm_pin[3]);
      btm[4] = btm[4] << 1 | digitalRead(btm_pin[4]);
      btm[5] = btm[5] << 1 | digitalRead(btm_pin[5]);
    }

    void loop() {
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1
      static uint32_t future1 = 0 ;
      if (MILLIS >= future1) {
        future1 = MILLIS + time_step_1 ;
        Step_1 = Step_1 + pace_1;
        if (Step_1 < 0)  Step_1 = Step_max_1;
        if (Step_1 > Step_max_1)  Step_1 = 0;
        digitalWrite( stepping_motor_1_pin[0], STEP_MAP[Step_1] & 1);
        digitalWrite( stepping_motor_1_pin[1], STEP_MAP[Step_1] & 2);
        digitalWrite( stepping_motor_1_pin[2], STEP_MAP[Step_1] & 4);
        digitalWrite( stepping_motor_1_pin[3], STEP_MAP[Step_1] & 8);
        MILLIS = millis() ;
      }
      //#2
      static uint32_t future2 = 0 ;
      if (MILLIS >= future2) {
        future2 = MILLIS + time_step_2 ;
        Step_2 = Step_2 + pace_2;
        if (Step_2 < 0)  Step_2 = Step_max_2;
        if (Step_2 > Step_max_2)  Step_2 = 0;
        digitalWrite( stepping_motor_2_pin[0], STEP_MAP[Step_2] & 1);
        digitalWrite( stepping_motor_2_pin[1], STEP_MAP[Step_2] & 2);
        digitalWrite( stepping_motor_2_pin[2], STEP_MAP[Step_2] & 4);
        digitalWrite( stepping_motor_2_pin[3], STEP_MAP[Step_2] & 8);
        MILLIS = millis() ;
      }
      //#3
      static uint32_t future3 = 0 ;
      if (MILLIS >= future3) {
        future3 = MILLIS + time_step_3 ;
        Step_3 = Step_3 + pace_3;
        if (Step_3 < 0) Step_3 = Step_max_3;
        if (Step_3 > Step_max_3) Step_3 = 0;
        digitalWrite( stepping_motor_3_pin[0], STEP_MAP[Step_3] & 1);
        digitalWrite( stepping_motor_3_pin[1], STEP_MAP[Step_3] & 2);
        digitalWrite( stepping_motor_3_pin[2], STEP_MAP[Step_3] & 4);
        digitalWrite( stepping_motor_3_pin[3], STEP_MAP[Step_3] & 8);
        MILLIS = millis() ;
      }
      //#4
      //#5
      //#6
      static uint32_t future6 = 0 ;
      if (MILLIS >= future6) {
        future6 = MILLIS + 200 ;
        btm[0] = btm[0] << 1 | digitalRead(btm_pin[0]);
        btm[1] = btm[1] << 1 | digitalRead(btm_pin[1]);
        btm[2] = btm[2] << 1 | digitalRead(btm_pin[2]);
        btm[3] = btm[3] << 1 | digitalRead(btm_pin[3]);
        btm[4] = btm[4] << 1 | digitalRead(btm_pin[4]);
        btm[5] = btm[5] << 1 | digitalRead(btm_pin[5]);
        if (btm[0] & 3 == 2) pace_1 = 1; // нажата + 1 ШД
        if (btm[1] & 3 == 2) pace_1 = -1; // нажата - 1 ШД
        if (btm[2] & 3 == 2) pace_2 = 1; // нажата + 2 ШД
        if (btm[3] & 3 == 2) pace_2 = -1; // нажата - 2 ШД
        if (btm[4] & 3 == 2) pace_3 = 1; // нажата + 3 ШД
        if (btm[5] & 3 == 2) pace_3 = -1; // нажата - 3 ШД
        MILLIS = millis() ;
      }
    }
     
    Иropь нравится это.
  7. Иropь

    Иropь Нерд

    Что то мой код изменился до неузнаваемости )))))) , спасибо, попробую сюда теперь пульт ду добавить.
     
  8. Иropь

    Иropь Нерд

    Для чего нужна эта срока
    const byte STEP_MAP[]={0x01, 0x02, 0x04,0x08}; ?
     
  9. qwone

    qwone Гик

    У вас полный оборот состоит из 4 шагов 0001,0010,0100,1000. Вот эти шаги и записаны так. Осталось это число прочитать и разложить по пинам.
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    гм, в байте остается еще 4 свободных бита, и если разложить шаги на полушаги, то в теории получим поворот вала не на 1,8 градуса, а на 0,9, заодно и меньше дерганье и более тихую работу ШД. Так?
    0001, 0011, 0010, 0110, 0100, 1100, 1000, 1001.
     
    Иropь нравится это.
  11. qwone

    qwone Гик

  12. Tomasina

    Tomasina Сушитель лампочек Модератор

    во, я, оказывается, мыслю в правильном направлении ;)
     
  13. Иropь

    Иropь Нерд

    Ну вообще то мы уже в какие дебри полезли))))))), мне полушаги ни к чему , мне всего лишь регулятор громкости крутить, а можно все же мой старый скетч поправить, чтобы автовозврат к первому двигателю через 20 сек происходил ? А то я к этому пульт ду еще сто лет буду прикручивать
     
  14. fogary

    fogary Гик

    Сообщение об ошибках Вы так и не показали.

    К примеру, должно быть не "Boolian IsGone=true;", а "Boolean IsGone=true;".
    В строке "if (!IsGone && millis() - GoneTime < 20000){" Вы так и не поменяли "<" на ">=".
    Как думаете, что получится в строке "byte startPin = (currentMotor - 1) * 4;" когда "currentMotor == 0"?

    С переменной "currentMotor" не совсем понятно, при объявлении она равна "1" и по-умолчанию Вы хотите выбирать мотор №1, но при этом есть команда отменяющая выбор моторов ("currentMotor = 0;").
     
    Иropь нравится это.
  15. Иropь

    Иropь Нерд

    currentMotor = 1 должен быть "1" потому что это громкость , чтобы каждый раз не нажимать кнопку 1, и просто регулировать громкость + и - , а currentMotor = 0; можно убрать я ей не пользуюсь
     
  16. Иropь

    Иropь Нерд

    Вобщем исправил как вы написали , выдает ошибки
    'Boolean' does not name a type
    expected constructor, destructor, or type conversion before 'long'
    'GoneTime' was not declared in this scope
    'IsGone' was not declared in this scope
     
  17. ZAZ-965

    ZAZ-965 Гуру

    boolean базовый (встроенный) тип и пишется с маленькой буквы
    Код (C++):
    boolean IsGone=true;
     
    Иropь нравится это.
  18. qwone

    qwone Гик

    Ну а как вам управлять сервами с помощью ИК. Вот мой код. Там если долго держать клавишу серв продолжает работать. Правда ИК периодически не тот код хватает
    Код (C++):
    /*
    Ик приемник -> 2 (IR_pin)
    серва servo1 ->3 (servo_pin[0]) 0-255  0-180  кнопкой "0"<->"1"
    серва servo2 ->5 (servo_pin[0]) 0-255  0-180  кнопкой "2"<->"3"
    серва servo3 ->6 (servo_pin[0]) 0-255  0-180  кнопкой "4"<->"5"
    серва servo4 ->9 (servo_pin[0]) 0-255  0-180  кнопкой "6"<->"7"
    серва servo5 ->10 (servo_pin[0]) 0-255  0-180  кнопкой "8"<->"9"
    */

    //#1
    const int IR_pin = 2; // пин Ик приемника
    #include "IRremote.h"
    IRrecv irrecv(IR_pin);
    decode_results results;
    //#2
    const int servo_pin[] = {3, 5, 6, 9, 10}; // пин сервы servo1-servo5
    #include <Servo.h>
    Servo servo_1, servo_2, servo_3, servo_4, servo_5;

    uint8_t servo[5] ;
    uint8_t i ;
    uint32_t value, value_old;
    void setup() {
      Serial.begin(9600);
      //#1
      irrecv.enableIRIn();
      //#2
      servo_1.attach(servo_pin[0]);
      servo_1.write(servo[0] = 0);
      servo_2.attach(servo_pin[1]);
      servo_2.write(servo[1] = 0);
      servo_3.attach(servo_pin[2]);
      servo_3.write(servo[2] = 0);
      servo_4.attach(servo_pin[3]);
      servo_4.write(servo[3] = 0);
      servo_5.attach(servo_pin[4]);
      servo_5.write(servo[4] = 0);
    }
    void loop() {
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1 0,200 сек
      static uint32_t future1 = 0 ;
      if (MILLIS >= future1)   {
        future1 = MILLIS + 200 ;// каждые 0,200 сек
        if ( ! irrecv.decode( &results )) value = 0;
        else value = results.value;

        switch (value) {
          case 0x0     : //  нет приема
          case 0xFF6897: //  кнопка "0"
          case 0xFF30CF: //  кнопка "1"
          case 0xFF18E7: //  кнопка "2"
          case 0xFF7A85: //  кнопка "3"
          case 0xFF10EF: //  кнопка "4"
          case 0xFF38C7: //  кнопка "5"
          case 0xFF5AA5: //  кнопка "6"
          case 0xFF42BD: //  кнопка "7"
          case 0xFF4AB5: //  кнопка "8"
          case 0xFF52AD: //  кнопка "9"
            value_old = value;
            break;
        }
        switch (value_old) {
          case 0xFF6897: //  кнопка "0"
            servo[0] = servo[0] + 1;
            if (servo[0] > 170)servo[0] = 170;
            servo_1.write(servo[0] );
            break;
          case 0xFF30CF: //  кнопка "1"
            servo[0] = servo[0] - 1;
            if (servo[0] < 10)servo[0] = 10;
            servo_1.write(servo[0] );
            break;
          case 0xFF18E7: //  кнопка "2"
            servo[1] = servo[1] + 1;
            if (servo[1] > 170)servo[1] = 170;
            servo_2.write(servo[1] );
            break;
          case 0xFF7A85: //  кнопка "3"
            servo[1] = servo[1] - 1;
            if (servo[1] < 10)servo[1] = 10;
            servo_2.write(servo[1] );
            break;
          case 0xFF10EF: //  кнопка "4"
            servo[2] = servo[2] + 1;
            if (servo[2] > 170)servo[2] = 170;
            servo_3.write(servo[2] );
            break;
          case 0xFF38C7: //  кнопка "5"
            servo[2] = servo[2] - 1;
            if (servo[2] < 10)servo[2] = 10;
            servo_3.write(servo[2] );
            break;
          case 0xFF5AA5: //  кнопка "6"
            servo[3] = servo[3] + 1;
            if (servo[3] > 170)servo[3] = 170;
            servo_4.write(servo[3] );
            break;
          case 0xFF42BD: //  кнопка "7"
            servo[3] = servo[3] - 1;
            if (servo[3] < 10)servo[3] = 10;
            servo_4.write(servo[3] );
            break;
          case 0xFF4AB5: //  кнопка "8"
            servo[4] = servo[4] + 1;
            if (servo[4] > 170)servo[4] = 170;
            servo_5.write(servo[4] );
            break;
          case 0xFF52AD: //  кнопка "9"
            servo[4] = servo[4] - 1;
            if (servo[4] < 10)servo[4] = 10;
            servo_5.write(servo[4] );
            break;
        }
        Serial.print(value, HEX);
        Serial.print("  ");
        Serial.println(value_old, HEX);
        if (value != 0) irrecv.resume();
      }
    }
     
    Иropь нравится это.
  19. fogary

    fogary Гик

    Про написание boolean маленькими буквами Вам уже написали.
    Видимо этот фрагмент из той же оперы (слово Unsinged заменить на unsigned):
    Код (C++):
    Unsinged long GoneTime;
     
    Иropь нравится это.
  20. Иropь

    Иropь Нерд

    Ок попробую сегодня , что-то изначально предельно простенький скетч , довольно таки усложнился