скетч получился такой #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); } } и куча ошибок внизу
Не, это "битва на Марне". 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 }
Ну хотя бы так Код (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() ; } }
У вас полный оборот состоит из 4 шагов 0001,0010,0100,1000. Вот эти шаги и записаны так. Осталось это число прочитать и разложить по пинам.
гм, в байте остается еще 4 свободных бита, и если разложить шаги на полушаги, то в теории получим поворот вала не на 1,8 градуса, а на 0,9, заодно и меньше дерганье и более тихую работу ШД. Так? 0001, 0011, 0010, 0110, 0100, 1100, 1000, 1001.
Ну вообще то мы уже в какие дебри полезли))))))), мне полушаги ни к чему , мне всего лишь регулятор громкости крутить, а можно все же мой старый скетч поправить, чтобы автовозврат к первому двигателю через 20 сек происходил ? А то я к этому пульт ду еще сто лет буду прикручивать
Сообщение об ошибках Вы так и не показали. К примеру, должно быть не "Boolian IsGone=true;", а "Boolean IsGone=true;". В строке "if (!IsGone && millis() - GoneTime < 20000){" Вы так и не поменяли "<" на ">=". Как думаете, что получится в строке "byte startPin = (currentMotor - 1) * 4;" когда "currentMotor == 0"? С переменной "currentMotor" не совсем понятно, при объявлении она равна "1" и по-умолчанию Вы хотите выбирать мотор №1, но при этом есть команда отменяющая выбор моторов ("currentMotor = 0;").
currentMotor = 1 должен быть "1" потому что это громкость , чтобы каждый раз не нажимать кнопку 1, и просто регулировать громкость + и - , а currentMotor = 0; можно убрать я ей не пользуюсь
Вобщем исправил как вы написали , выдает ошибки '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
Ну а как вам управлять сервами с помощью ИК. Вот мой код. Там если долго держать клавишу серв продолжает работать. Правда ИК периодически не тот код хватает Код (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(); } }
Про написание boolean маленькими буквами Вам уже написали. Видимо этот фрагмент из той же оперы (слово Unsinged заменить на unsigned): Код (C++): Unsinged long GoneTime;