Запуск готового кода по сигналу
- Войдите на сайт для отправки комментариев
Привет всем!) Так как первый раз пишу, вкратце расскажу о себе - я не программист но электронщик старой школы (лужу паяю, ламповые телеки починяю, начинал с МП42, К561ЛА7 и т.д). В общем в электронике знаю очень много, а Ардуину осваиваю недавно.. Написать простой код могу, сделать запуск по внешним сигналам тоже могу, с АЦП тоже могу и т.д. А вот с текущей задачей запнулся, не могу вообще понять как работает данный код и что сделать чтобы он работал так как мне нужно.
Итак, потребовалось управлять несколькими сервомашинками с ардуины (8шт).
Машинки выполняют одновременно 28 движений (кадров) за один цикл (представим что это робот и цикл - например один шаг).
Нашел автоматизированное решение для этой как казалось бы сложной задачи - есть одна программулина, которой просто указываешь положения сервомашинок и кадры. Далее она просто всё это генерирует в массив точек и готовый код для ардуины. Дело 5 минут. Но огромная проблема в том, что программу писал любитель-программист и там только нужные ему функции, а то чего нужно мне сейчас - нет. В частности при генерации кода есть галочка - повтор циклично. Если её поставить, то при подаче питания ардуина просто будет выполнять кадры с 0-го по 27-ой и всё. Если галочку не ставить, то выполнит один цикл - 28 кадров и всё.
А мне нужно чтобы цикл запускался например при срабатывании датчика или ещё от чего. Упростим задачу до предела - просто при появлении сигнала высокого уровня на какой-нибудь ножке. Но кроме выводов D2-D13, так как на них повешаны сервомашинки и они используются программой. Например я вешаю на D1 кнопку, которую подтягиваю на +5 вольт. Или наоборот, на D1 подтягиваю +5 вольт, а кнопкой создается низкий логический уровень. Да хоть как могу спаять, не в этом суть..
У меня ничего не получается сделать с этим кодом.. Попытки ввести дополнительные переменные , ножки на вход, операции сравнения сигналов и т.д. приводят либо к неработоспособности всего, либо ничего не меняют.
То что я вижу необычным - то что весь массив точек находится до блока "VOID LOOP" !
Более того - он находится даже перед "VOID SETUP" !!! Это как вообще ? (при этом оно отлично работает)
Вообще не могу понять как работает данный код.. Может кто объяснит в чём тут загвоздка?
Прилагаю два примера кода - робот27-1 - это однократный цикл, робот27-888 - это бесконечный повтор циклов.
Они фактически одинаковые, разницы почти не нашел, но то что нашел, особо не помогло (в одном месте true, в другом false).
Название проги, которая генерит массив, находится в третьей строчке кода и прописывается автоматически... (мало ли вдруг посчитают за рекламу, хотя она бесплатная).
робот27-1
// Device : RB-27-1 // Arduino Player // Created by ServoStudio 12 (c) Pavlo Zvozdetskyi #include <avr/pgmspace.h> #include <Servo.h> struct TServoState { uint16_t CurPos; uint16_t EndPos; }; #define REPEAT false #define MAX_FRAME 28 #define CH_COUNT 8 #define TIME_POS 16 const uint16_t MainSequence[29][17] PROGMEM = { {0x047E,0x044C,0x0320,0x0320,0x0320,0x0320,0x0320,0x0320,0x094F,0x0951,0x095D,0x095D,0x095D,0x095D,0x095D,0x095D,0x00FA}, {0x047E,0x044C,0x0320,0x0320,0x08FC,0x08FC,0x0320,0x0320,0x0001,0x0001,0x0001,0x0001,0x003C,0x003C,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x0320,0x0320,0x08FC,0x08FC,0x060E,0x060E,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x001E,0x001E,0x00FA}, {0x047E,0x044C,0x0320,0x0320,0x079C,0x079C,0x060E,0x060E,0x0001,0x0001,0x0001,0x0001,0x000E,0x000E,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x04A0,0x04A0,0x079C,0x079C,0x060E,0x060E,0x0001,0x0001,0x000F,0x000F,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x079C,0x04A0,0x079C,0x049D,0x060E,0x060E,0x0001,0x0001,0x001E,0x0001,0x0001,0x001E,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x079C,0x04A0,0x079C,0x049D,0x079A,0x060E,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x000F,0x0001,0x00FA}, {0x053B,0x05CF,0x079C,0x04A0,0x079C,0x049D,0x079A,0x0497,0x0007,0x000F,0x0001,0x0001,0x0001,0x0001,0x0001,0x000F,0x00FA}, {0x0684,0x05CF,0x079C,0x04A0,0x079C,0x049D,0x079A,0x0497,0x000D,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x079C,0x04A0,0x079C,0x049D,0x079A,0x0497,0x0001,0x0007,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x079C,0x04A0,0x079C,0x058E,0x079A,0x0497,0x0001,0x0001,0x0001,0x0001,0x0001,0x0009,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x079C,0x0594,0x079C,0x058E,0x079A,0x0497,0x0001,0x0001,0x0001,0x0009,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x0470,0x0594,0x043E,0x058E,0x04AC,0x03F8,0x0001,0x0001,0x0020,0x0001,0x0022,0x0001,0x001E,0x0006,0x00FA}, {0x0520,0x0684,0x0470,0x0594,0x043E,0x0511,0x0591,0x03F8,0x000E,0x0001,0x0001,0x0001,0x0001,0x0005,0x0009,0x0001,0x00FA}, {0x0520,0x07B9,0x0470,0x0594,0x043E,0x0511,0x0591,0x03F8,0x0001,0x000C,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0520,0x07B9,0x0470,0x0594,0x07E6,0x071B,0x0591,0x089C,0x0001,0x0001,0x0001,0x0001,0x0025,0x0014,0x0001,0x002F,0x00FA}, {0x0538,0x07B9,0x0657,0x0594,0x07E6,0x071B,0x0591,0x089C,0x0001,0x0001,0x0013,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x060E,0x07B9,0x0657,0x05F9,0x07E6,0x071B,0x0591,0x089C,0x0008,0x0001,0x0001,0x0004,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x060E,0x07B9,0x0657,0x05F9,0x07E6,0x071B,0x064D,0x089C,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0007,0x0001,0x00FA}, {0x060E,0x07B9,0x0657,0x0672,0x07E6,0x071B,0x064D,0x089C,0x0001,0x0001,0x0001,0x0004,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x042F,0x042D,0x042C,0x042D,0x064A,0x064D,0x064D,0x089C,0x0013,0x0024,0x0016,0x0017,0x0010,0x0008,0x0001,0x0001,0x00FA}, {0x042F,0x042D,0x042C,0x042D,0x064A,0x064D,0x064D,0x064D,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0017,0x00FA}, {0x042F,0x042D,0x042C,0x04E5,0x064A,0x064D,0x064D,0x064D,0x0001,0x0001,0x0001,0x0007,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x042F,0x042D,0x0540,0x04E5,0x05B9,0x062D,0x064D,0x064D,0x0001,0x0001,0x000B,0x0001,0x0005,0x0001,0x0001,0x0001,0x00FA}, {0x042F,0x05B3,0x0540,0x04E5,0x05B9,0x062D,0x06B3,0x064D,0x0001,0x000F,0x0001,0x0001,0x0001,0x0001,0x0004,0x0001,0x00FA}, {0x062C,0x05B3,0x0540,0x04E5,0x05B9,0x062D,0x06B3,0x0725,0x0014,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0008,0x00FA}, {0x0521,0x04B8,0x0454,0x03F5,0x03F4,0x044F,0x04BC,0x0521,0x000A,0x000A,0x0009,0x0009,0x0012,0x0013,0x0014,0x0014,0x00FA}, {0x0521,0x04B8,0x0454,0x03F5,0x03F4,0x044F,0x04BC,0x0521,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0521,0x04B8,0x0454,0x03F5,0x03F4,0x044F,0x04BC,0x0521,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA} }; Servo smotors[CH_COUNT]; TServoState SStates[CH_COUNT]; uint16_t CurFrame; unsigned long NextFrameTime; void setup() { for (int n = 0; n < CH_COUNT; n++) { smotors[n].attach(n + 2); SStates[n].CurPos = pgm_read_word(&MainSequence[0][n]); smotors[n].writeMicroseconds(SStates[n].CurPos); SStates[n].EndPos = SStates[n].CurPos; } NextFrameTime= pgm_read_word(&MainSequence[0][TIME_POS]); NextFrameTime += millis(); CurFrame = 0; } void loop() { if (CurFrame <= MAX_FRAME) { if (Step(CurFrame)) { if (millis() < NextFrameTime)return; CurFrame++; if (CurFrame > MAX_FRAME) { if (REPEAT)CurFrame = 0; else return; } for (int n = 0;n < CH_COUNT;n++) { SStates[n].EndPos = pgm_read_word(&MainSequence[CurFrame][n]); } NextFrameTime = pgm_read_word(&MainSequence[CurFrame][TIME_POS]); NextFrameTime += millis(); } } delay(15); } bool Step(uint16_t frame) { bool result = true; uint16_t stp; for (int n = 0; n < CH_COUNT;n++) { if (SStates[n].EndPos != SStates[n].CurPos) { result = false; stp = pgm_read_word(&MainSequence[frame][n + CH_COUNT]); if (abs(SStates[n].EndPos - SStates[n].CurPos)>stp) { if (SStates[n].EndPos > SStates[n].CurPos) { SStates[n].CurPos += stp; } else { SStates[n].CurPos -= stp; } } else { SStates[n].CurPos = SStates[n].EndPos; } smotors[n].writeMicroseconds(SStates[n].CurPos); } } return result; }
робот27-888
// Device : RB-27-888 // Arduino Player // Created by ServoStudio 12 (c) Pavlo Zvozdetskyi #include <avr/pgmspace.h> #include <Servo.h> struct TServoState { uint16_t CurPos; uint16_t EndPos; }; #define REPEAT true #define MAX_FRAME 28 #define CH_COUNT 8 #define TIME_POS 16 const uint16_t MainSequence[29][17] PROGMEM = { {0x047E,0x044C,0x0320,0x0320,0x0320,0x0320,0x0320,0x0320,0x094F,0x0951,0x095D,0x095D,0x095D,0x095D,0x095D,0x095D,0x00FA}, {0x047E,0x044C,0x0320,0x0320,0x08FC,0x08FC,0x0320,0x0320,0x0001,0x0001,0x0001,0x0001,0x003C,0x003C,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x0320,0x0320,0x08FC,0x08FC,0x060E,0x060E,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x001E,0x001E,0x00FA}, {0x047E,0x044C,0x0320,0x0320,0x079C,0x079C,0x060E,0x060E,0x0001,0x0001,0x0001,0x0001,0x000E,0x000E,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x04A0,0x04A0,0x079C,0x079C,0x060E,0x060E,0x0001,0x0001,0x000F,0x000F,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x079C,0x04A0,0x079C,0x049D,0x060E,0x060E,0x0001,0x0001,0x001E,0x0001,0x0001,0x001E,0x0001,0x0001,0x00FA}, {0x047E,0x044C,0x079C,0x04A0,0x079C,0x049D,0x079A,0x060E,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x000F,0x0001,0x00FA}, {0x053B,0x05CF,0x079C,0x04A0,0x079C,0x049D,0x079A,0x0497,0x0007,0x000F,0x0001,0x0001,0x0001,0x0001,0x0001,0x000F,0x00FA}, {0x0684,0x05CF,0x079C,0x04A0,0x079C,0x049D,0x079A,0x0497,0x000D,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x079C,0x04A0,0x079C,0x049D,0x079A,0x0497,0x0001,0x0007,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x079C,0x04A0,0x079C,0x058E,0x079A,0x0497,0x0001,0x0001,0x0001,0x0001,0x0001,0x0009,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x079C,0x0594,0x079C,0x058E,0x079A,0x0497,0x0001,0x0001,0x0001,0x0009,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0684,0x0684,0x0470,0x0594,0x043E,0x058E,0x04AC,0x03F8,0x0001,0x0001,0x0020,0x0001,0x0022,0x0001,0x001E,0x0006,0x00FA}, {0x0520,0x0684,0x0470,0x0594,0x043E,0x0511,0x0591,0x03F8,0x000E,0x0001,0x0001,0x0001,0x0001,0x0005,0x0009,0x0001,0x00FA}, {0x0520,0x07B9,0x0470,0x0594,0x043E,0x0511,0x0591,0x03F8,0x0001,0x000C,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0520,0x07B9,0x0470,0x0594,0x07E6,0x071B,0x0591,0x089C,0x0001,0x0001,0x0001,0x0001,0x0025,0x0014,0x0001,0x002F,0x00FA}, {0x0538,0x07B9,0x0657,0x0594,0x07E6,0x071B,0x0591,0x089C,0x0001,0x0001,0x0013,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x060E,0x07B9,0x0657,0x05F9,0x07E6,0x071B,0x0591,0x089C,0x0008,0x0001,0x0001,0x0004,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x060E,0x07B9,0x0657,0x05F9,0x07E6,0x071B,0x064D,0x089C,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0007,0x0001,0x00FA}, {0x060E,0x07B9,0x0657,0x0672,0x07E6,0x071B,0x064D,0x089C,0x0001,0x0001,0x0001,0x0004,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x042F,0x042D,0x042C,0x042D,0x064A,0x064D,0x064D,0x089C,0x0013,0x0024,0x0016,0x0017,0x0010,0x0008,0x0001,0x0001,0x00FA}, {0x042F,0x042D,0x042C,0x042D,0x064A,0x064D,0x064D,0x064D,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0017,0x00FA}, {0x042F,0x042D,0x042C,0x04E5,0x064A,0x064D,0x064D,0x064D,0x0001,0x0001,0x0001,0x0007,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x042F,0x042D,0x0540,0x04E5,0x05B9,0x062D,0x064D,0x064D,0x0001,0x0001,0x000B,0x0001,0x0005,0x0001,0x0001,0x0001,0x00FA}, {0x042F,0x05B3,0x0540,0x04E5,0x05B9,0x062D,0x06B3,0x064D,0x0001,0x000F,0x0001,0x0001,0x0001,0x0001,0x0004,0x0001,0x00FA}, {0x062C,0x05B3,0x0540,0x04E5,0x05B9,0x062D,0x06B3,0x0725,0x0014,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0008,0x00FA}, {0x0521,0x04B8,0x0454,0x03F5,0x03F4,0x044F,0x04BC,0x0521,0x000A,0x000A,0x0009,0x0009,0x0012,0x0013,0x0014,0x0014,0x00FA}, {0x0521,0x04B8,0x0454,0x03F5,0x03F4,0x044F,0x04BC,0x0521,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA}, {0x0521,0x04B8,0x0454,0x03F5,0x03F4,0x044F,0x04BC,0x0521,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x00FA} }; Servo smotors[CH_COUNT]; TServoState SStates[CH_COUNT]; uint16_t CurFrame; unsigned long NextFrameTime; void setup() { for (int n = 0; n < CH_COUNT; n++) { smotors[n].attach(n + 2); SStates[n].CurPos = pgm_read_word(&MainSequence[0][n]); smotors[n].writeMicroseconds(SStates[n].CurPos); SStates[n].EndPos = SStates[n].CurPos; } NextFrameTime= pgm_read_word(&MainSequence[0][TIME_POS]); NextFrameTime += millis(); CurFrame = 0; } void loop() { if (CurFrame <= MAX_FRAME) { if (Step(CurFrame)) { if (millis() < NextFrameTime)return; CurFrame++; if (CurFrame > MAX_FRAME) { if (REPEAT)CurFrame = 0; else return; } for (int n = 0;n < CH_COUNT;n++) { SStates[n].EndPos = pgm_read_word(&MainSequence[CurFrame][n]); } NextFrameTime = pgm_read_word(&MainSequence[CurFrame][TIME_POS]); NextFrameTime += millis(); } } delay(15); } bool Step(uint16_t frame) { bool result = true; uint16_t stp; for (int n = 0; n < CH_COUNT;n++) { if (SStates[n].EndPos != SStates[n].CurPos) { result = false; stp = pgm_read_word(&MainSequence[frame][n + CH_COUNT]); if (abs(SStates[n].EndPos - SStates[n].CurPos)>stp) { if (SStates[n].EndPos > SStates[n].CurPos) { SStates[n].CurPos += stp; } else { SStates[n].CurPos -= stp; } } else { SStates[n].CurPos = SStates[n].EndPos; } smotors[n].writeMicroseconds(SStates[n].CurPos); } } return result; }
Прошу прощения, ошибся, не одновременно все 28 кадров выполняются, а конечно же последовательно - кадр за кадром, причем время выполнения кадра тоже задано. Но в одном кадре может быть несколько движений одновременно. (первый пост почему то нельзя редактировать)
Загвоздка наверно в том, что ты сам себе придумал какие-то правила, по которым программа не может быть так написана, вместо того, чтобы изучить реальные правила, по которым это вполне приличная программа. .
Во-первых, я на "ты" с Вами не переходил. А во-вторых - где я говорил про какие-то правила? Мне нужно функцию запустить, чего так просто не получается сделать, ясно описал суть проблемы и обратился на форум, причём тут какие-то придуманные правила, которых вовсе не придумывали? Не вносите путаницы. "Приличная программа" - это про что? Про получившийся код или про прогу-генератор? Само слово "программа"-то имеет много значений, и в данной фразе непонятна.
Вопрос был
Может кто объяснит в чём тут загвоздка?
я объяснил в чем.
Что касается твоей проблемы - неумения программировать - ну, сочувствую. Учиться не пробовал?
А во-вторых - где я говорил про какие-то правила? Мне нужно функцию запустить, чего так просто не получается сделать, ясно описал суть проблемы и обратился на форум, причём тут какие-то придуманные правила, которых вовсе не придумывали?
Про правила, это вы сами, в начале. Все глобальные переменные объявляются до сетап и луп. Ваш массив объявлен там же, плюс помещен во флэш память, для экономии ОЗУ.
Я имел ввиду объяснить особенности кода! Почему он так странно сделан и как его модернизировать? А то что я не программист - я сразу сказал, поэтому и обратился за помощью. Потому что с такими кодами раньше не встречался, если внимательнее прочтете первый пост, увидите, что я изучал ардуину, основные задачи могу решить. А тут нестандартная какая-то, про подобные нигде не могу найти информацию, разве не понятно? Если не разбираетесь и не можете подсказать как реализовать задачу, не флудите, а проходите мимо. Лишь бы загнобить новичков.
bwn, Разве массив тоже может быть глобальной переменной? И как тогда его запускать в данном случае? Я уже по всякому прописывал условие для высокого уровня на 1 ножке, никак не работает.
bwn, Разве массив тоже может быть глобальной переменной? И как тогда его запускать в данном случае?
А какая разница, завести десять однотипных переменных или массив из десяти ячеек? В данном случае, он константа. Почитайте про PROGMEM.
Задача непонятна. Вам нужно только начинать по условию? А потом всё как сейчас? Или надо уметь по условию прерваться, сделать паузу и начать с начала (с того места где прервались) - это большая разница.
Строки №№ 70-71, 84 (по первому скетчу) написаны неправильно. Если устройство предполагается включать и выключать, то пофиг, а если оно должно работать не выключаясь месяцами, то их надо переделывать.
Строки №№ 70-71, 84 (по первому скетчу) написаны неправильно. Если устройство предполагается включать и выключать, то пофиг, а если оно должно работать не выключаясь месяцами, то их надо переделывать.
Ви таки что, хотите чтобы восстание машин не состоялось?
Я имел ввиду объяснить особенности кода! Почему он так странно сделан и как его модернизировать?
Код сделан нормально и модернизировать его не надо.
Потому что с такими кодами раньше не встречался
Это код ничем фундаментально не отличается от другого кода. Если он не понятен - это значит, нет понимания базовых элементов, составляющих код. Значит их нужно изучить.
основные задачи могу решить.
Не надо врать. Полтора цикла уже в тупик поставили.
А тут нестандартная какая-то, про подобные нигде не могу найти информацию, разве не понятно? Если не разбираетесь и не можете подсказать как реализовать задачу
Информация есть в учебнике по программированию. Решить задачу можно, переписав программу под свои требования.
bwn, спасибо за наводку, почитаю.
ЕвгенийП, хороший вопрос! Задавая правильные вопросы, можно приблизиться к решению. Сейчас попробую объяснить. Вот например есть цикл, который состоит из 28 кадров. Он выполняется допустим за 5 секунд. Мне нужно чтобы при поступлении сигнала высокого (или низкого) уровня на какую-нибудь свободную ножку цикл начинался с 0-го кадра и завершался полностью, то есть доходил до последнего 27-го кадра и ардуина переходила в режим ожидания следующего импульса. Входящий импульс имеет длительность гораздо меньшую чем сам цикл - около 50-200 миллисекунд. Управляющий ипмульс будет приходить не чаще, чем 1 раз в 5 сек. Если же вдруг подадим импульс раньше, например на 3-ей секунде (пока ещё выполняются кадры 17-20), то он просто будет игнорироваться, ардуина будет ждать завершения цикла, только потом будет стартовать от следующего запускающего импульса. Плата постоянно под напряжением. При первой подачи питания сервомашинки не должны двигаться (в теории надеюсь так и получится).
И главное, что не так в тех строчках? Оно как раз должно работать не выключаясь месяцами.
Я имел ввиду объяснить особенности кода! Почему он так странно сделан и как его модернизировать?
Код сделан нормально и модернизировать его не надо.
Вот после такого я вообще буду игнорировать ТВОИ сообщения, потому что ТЫ ЦИНИК в чистом виде! А также злой и нехороший человек. Понятно теперь, почему сходу "тыкаешь" новичкам, потому что их за людей не считаешь, а ты типа такой умный весь из себя. Я по-моему ясно написал, что МНЕ НУЖНО ПЕРЕДЕЛАТЬ этот код! Какого фига ты указываешь мне тут? Я написал на форум чтобы разобраться в вопросе, так как сам не смог, ну не программист я! А ты тут разводишь холивары. Когда меня спрашивают о чем-то, я всегда стараюсь помочь, а не тыкаю носом спросившего, что он тупой и не видит очевидных для профи вещей. Потому что понимаю что невозможно всё знать и изучить разом, а дело может быть в какой-то мелочи, которую даже не знаешь где искать.
Я по-моему ясно написал, что МНЕ НУЖНО ПЕРЕДЕЛАТЬ этот код!
Переделать - ради бога. Вот модернизировать не надо. И странным не надо называть самый обычный код.
дело может быть в какой-то мелочи, которую даже не знаешь где искать.
Нет, дело не в мелочи, а в незнании основ. Основы нужно искать в учебнике по программированию. И не надо каждого профи тыкать носом в том что он циник потому что "может быть" дело в какой-то мелочи. Профи на то и профи, что знает, в чем дело.
Drakon88 - давайте Вы не будете нервничать, потому что ничем хорошим это не кончится. Что Вы хотите от форума? Чтобы кто-то написал вам готовый код? - может кто и сжалится, но вообще тут так не принято. А подсказать вам, чтобы Вы это сделали сами - боюсь без шансов, судя по рассуждениям про массивы....
Для начала прочитать http://www.lookatme.ru/mag/how-to/etiquette/207763-etiquette-you
Это по крайней мере даст понять, почему к человеку, которого не знают и по задаваемым вопросам оценивают его уровень знаний обращаются на ты. Если в кратце, то Вы надо заслужить. Это открытый форум.
Для переделки кода, надо понять где производится генерация кадров и окружить эту часть программы оператором if с условием, по которому эта часть программы должна выполняться. В качестве подсказки - все программы на си начинаются с функции main. Разработчики ардуино ИДЕ спрятали функцию main от пользователя, но она есть и вызывает функцию loop. Таким образом выход из функции loop приводит к тому, что функция loop вызывается с начала. Это объяснение того, в чем разница двух программ и почему это зависит от значения REPEAT.
Для переделки кода, надо понять где производится генерация кадров и окружить эту часть программы оператором if с условием, по которому эта часть программы должна выполняться.
nik182, привет! Тут еще проще. ТС желает, чтобы весь блок из 28 "кадров" выполнялся. За повтор отвечает глобал REPEAT. Ну и пусть переключает его сколько влезет просто кнопкой в начале лупа, шаг лупа написан неблокирующим, кнопку найдет, если захочет!
===============
2ТС: Уважаемый! Ты б не обижался на "ты"? В сети так принято, поверь 50летнему дядьке. Старые традиции уходят со временем, но те, кто в сети с самого её начала - автоматом общаются на "ты". А обращение на "Вы" используется как демонстрация отчуждения и часто как затравка к началу срача... ;))))
2ТС: Уважаемый! Ты б не обижался на "ты"? В сети так принято, поверь 50летнему дядьке. Старые традиции уходят со временем, но те, кто в сети с самого её начала - автоматом общаются на "ты". А обращение на "Вы" используется как демонстрация отчуждения и часто как затравка к началу срача... ;))))
Паттверждаю. :) У кого ухи из ФИДО растут, все тыкают в незнакомых людей.
nik182, привет! Тут еще проще. ТС желает, чтобы весь блок из 28 "кадров" выполнялся. За повтор отвечает глобал REPEAT. Ну и пусть переключает его сколько влезет просто кнопкой в начале лупа, шаг лупа написан неблокирующим, кнопку найдет, если захочет!
Ну да, почти согласен. Только REPEAT проверяется после выполнения блока. Повторно можно REPEAT по кнопке труить и в конце блока принудительно фалзить. А первый раз как быть? Ну или строчки местами поменять надо - блок гонять после проверки REPEAT. Но тогда REPEAT надо в переменный перевести.
Я это всё прекрасно знаю, и "else" тоже, и другие операторы, уже ведь говорил, что не совсем с нуля разбираюсь, и перечитал много информации, но нужного пока не нашел. Почти полгода ищу решение. И с портом тоже работать умею, данные отправлять и принимать, и с ЖК экранами, но встречаются вещи, к которым не знаешь с какой стороны подойти - я про данный случай.
....
...Это объяснение того, в чем разница двух программ и почему это зависит от значения REPEAT.
Вот с этими моментами как раз и сложности. Во всех примерах которые я изучал, так и было, что всё основное в loop, и этот скан постоянно повторяется, ещё некоторые параметры прописываются в setup, но как может работать та часть кода, которая не находится в loop? И тем более когда нужно управлять ей.. Про "REPEAT" спасибо за подсказку, почитаю. С ним первый раз столкнулся. Кроме него в данном коде ещё много незнакомых слов и функций, я смотрел их описание, но связи не нашел, как что где изменить. И даже пробовал через if задать условие, вариантов 15 наверно было, но они не дают результата. Такое впечатление что этот код задом наперед как-то работает, а не так как в книжках учат. Я конечно понимаю что у программистов свой склад ума, но хотя бы примерно последовательность алгоритмов обработки понять нужно..
2ТС: Уважаемый! Ты б не обижался на "ты"? В сети так принято, поверь 50летнему дядьке. Старые традиции уходят со временем, но те, кто в сети с самого её начала - автоматом общаются на "ты". А обращение на "Вы" используется как демонстрация отчуждения и часто как затравка к началу срача... ;))))
Эх, зря они уходят, непривычно всё это, в СССР лучше было! Я в интернете редкий гость и привык как и в реальной жизни с уважением - на Вы. А тут оно оказывается ещё и постыдно... Понятно. Но на других форумах такой проблемы я не встречал (и 10 лет назад нормально на Вы общались). Ну да ладно. Надо изучать дальше.
Drakon88 - ваши слова о том, что "вы не с нуля разбираетесь", понимаете операторы и даже писали какие-то коды - совершенно не стыкуются не просто с элементарными. а скорее с ламерскими вопросами о коде, который не может лежать за пределами loop.
По-моему вы очень преувеливаете свои знания.
В данном коде в начале скетча лежит МАССИВ. Массив это переменная, а не исполняемый код. поэтому все ваши вопросы как же он выполняется снаружи процедуры - выглядят откровенным бредом. Массивы не выполняются...
Выполнять любое действие по нажатию кнопки умеете? Приравняйте в setup CurFrame = MAX_FRAME+1; и первой строчкой в loop по нажатию кнопки CurFrame = 0; и будет Вам счастье.
b707, я не пытаюсь преувеличить, и не говорю что прям совсем всё знаю, я просто сообщаю то, с чем знаком и имел дело. Не исключаю, что для специалистов вопрос кажется смешным, но для меня он не смешной. Могу объяснить это так - в процессе изучения я узнал самые основные возможности ардуины и основы кода по которому она работает. Делая различные устройства, особо не сталкивался с трудностями, так как знал зачем каждое слово и зачем я его пишу именно в это место. Грубо говоря пользовался известными мне операторами, переменными и функциями. А тут код писал не я, а машина. Он оказался сложным и непонятным так как половина слов (значений, функций) я увидел впервые. И хоть я и читал про них уже, но целого понимания нет. Вы сейчас хорошее замечание сделали - про переменную. Я вспомнил что она может быть с разным именем. Кстати до сих пор не пойму как именно тут - const, const uint16_t или const uint16_t MainSequence. А про массив верное замечание. Я не считал его переменной ввиду такого огромного размера и кажущейся сложности, приму к сведению.
Выполнять любое действие по нажатию кнопки умеете? Приравняйте в setup CurFrame = MAX_FRAME+1; и первой строчкой в loop по нажатию кнопки CurFrame = 0; и будет Вам счастье.
Умею. Зажигать светодиоды например, включать генератор и т.д. А вот второе предложение уже кажется сложным, но попробую вникнуть (опять незнакомые переменные CurFrame и MAX_FRAME+1; и CurFrame = 0). Только вот про CurFrame ничего не нашел, ни в гугле, ни тут, на сайте. Про MAX_FRAME также. Вот отсюда и проблемы. Я даже не пойму что это - переменная, функция, константа, оператор или что она из себя представляет? Где искать, если даже гугл не знает. Набираю на этом сайте в
Где искать, если даже гугл не знает.
Гугл знает всё. Вам надо искать по фразе "Учебник С++". И начинать с этого, и только с этого.
Это литералы и переменные объявленные в программе, строчки 18 и 57 . В гугле их быть не может, так ка это придуманные Вами вещи.
Вам надо искать по фразе "Учебник С++". И начинать с этого, и только с этого.
+100
Дракон, какой может быть разговор про редактирование программы, если вы даже не можете отличить в коде операторы языка от имен переменных, которые автор программы назвал как хотел и искать их в Гугле бесполезно?
Чтобы понять, что такое CurFrame и MAX_FRAME+1; и CurFrame = 0 - Гугль не поможет, тут надо уметь читать код, что без знания С++ невозможно в принципе
А тут код писал не я, а машина. Он оказался сложным и непонятным так как половина слов (значений, функций) я увидел впервые.
Код писал человек. И код этот вполне внятный и легкочитаемый. Машина генерит только массив данных к этому коду. А, судя по вашим вопросам, в программировании вы не разбираетесь от слова "совсем". И общаться сейчас с вами это как пытаться объяснить как сделать полицейский разворот человеку, который не знает что такое газ, тормоз и ручник. Освойте азы сначала, а потом приходите опять сюда.
DIYMan, я сейчас серьёзно, эта фраза нигде не находится, я в недоумении, скопировал же точно название. Выдаёт какие-то видеокамеры, либо что-то про php код (но это из серии изготовления сайтов насколько знаю и там нет ничего про ардуину)
А вот второе предложение уже кажется сложным, но попробую вникнуть (опять незнакомые переменные CurFrame и MAX_FRAME+1; и CurFrame = 0). Только вот про CurFrame ничего не нашел, ни в гугле, ни тут, на сайте. Про MAX_FRAME также. Вот отсюда и проблемы. Я даже не пойму что это - переменная, функция, константа, оператор или что она из себя представляет? Где искать, если даже гугл не знает. Набираю на этом сайте в
Так что вы в гугеле найти хотели? Просто посмотрите, где и как они объявлены, CurFrame - обычная переменная, MAX_FRAME - идет в дефайне (константа) и это просто число 28. Гугель здесь бессилен, лучше уж раздел "Программирование", на этом форуме почитать. ИМХО.
... автор программы назвал как хотел и искать их в Гугле бесполезно?...
Чтобы понять, что такое CurFrame и MAX_FRAME+1; и CurFrame = 0 - Гугль не поможет, тут надо уметь читать код, что без знания С++ невозможно в принципе
Так вот оно что оказалось-то, это не ардуиновские коды оказывается. Сразу бы сказали. Спасибо. Учебник читал, но весь-то его не перечитаешь, тем более мне не нужно быть программистом, мне нужно просто запустить контроллер. Я как раньше делал - изучаю какой-нибудь код и увидел там незнакомое аглицкое слово - копирую его и в гугл с пометкой ардуино, всё прекрасно находит и объяснения и статьи в разных журналах есть. А тут хитрость значит, говорил же что необычный код для простого человека.
DIYMan, я сейчас серьёзно, эта фраза нигде не находится, я в недоумении, скопировал же точно название.
Вы издеваетесь?
Вам же уже человек пять сказали, что это название переменной. Её автор кода придумывает как его левая пятка захочет. Попробуйте в коде заменить (только везде) max_frame на vse_pidarasy_a_ya_dartagnant и убедитесь, что ничего не изменилось - код работает точно также. А потом начинайте гуглить уже это новое название - может с ним больше повезёт.
мне не нужно быть программистом, мне нужно просто запустить контроллер.
Одно без другого не бывает.
Ну или в коммерческий раздел и размещайте заказ. Кто-нибудь сделает.
Я не издеваюсь, а не могу так быстро печатать как вы. Пока я готовил то своё сообщение и разбирался как загрузить картинку на форум, уже напечатали много сообщений. Я сам понять хотел, не надо мне в коммерческий. Теперь много новой информации, которую в одиночку не найти было, а посоветоваться не с кем.
bwn, Тоже спасибо, теперь понял в чем дело с этим кодом!
А тут хитрость значит, говорил же что необычный код для простого человека.
слушайте, сколько можно писать эту чушь про "хитрый необычный код" ?
Это совершенно банальная программа, она кажется вам необычной ТОЛЬКО ПОТОМУ. что реально вы полный ноль в языке.
Вот вам моя реакция на всё происходящее:
Я как раз маюсь подобной ерундой - как без программирования заставить "ходуна на сервах" ходить. ТС, поясните в чём удобство программы "Серво студия 12"? Имея готовую тушку робота и ворочая качалки серв для выставления конечностей по кадрам Вы всё равно не узнаете какие углы стоят. Для этого надо обратная связь от потенциометров...
А так программа полезная. Я узнал, что можно "сервы в массив объявлять". Правда не знаю как в цикле прописать условие подобное для массива серв:)
while(tabl_a[i]!=servo_a.read()||tabl_b[i]!=servo_b.read())//пока хоть один элемент не совпадает с выставленным...
Мне кажется это только часть эквивалента условия. Без флага наверное не получится. Пробовал вставить "фор" внутрь условия "пока":)
Без флага не получится. В условие вставлять цикл - это какой-то кич, завернутый в лямбду.
Да, просто выдаёт ошибку и всё. Попробую счас с флагом.
Такой вариант получился, проверить не могу т.к. весь скетч переделать пока не могу:)
Вопрос: достигнет ли счётчик i значения 16 когда все сервы станут в 90 градусов?
А добиться-то надо чего - ждать, пока все суставы на место не встанут?
Ну, да. Внутри цикла while каждая серва едет к своему новому углу с разной скоростью (но доехать должны одновременно или почти). Смысл в том, что выход из цикла должен происходить когда все доедут до своих углов - это окончание исполнения одного кадра-такта и переход к другому. Для двух серв сделал и работает, для 3 и т.д. стратегия ясна по аналогии, но хотелось бы всё через массивы сделать.
Если не заморачиваться, то можно так:
А по-уму тут ещё таймаут необходим - вдруг зацепится нога за половик.
Я как раз маюсь подобной ерундой - как без программирования заставить "ходуна на сервах" ходить. ТС, поясните в чём удобство программы "Серво студия 12"? Имея готовую тушку робота и ворочая качалки серв для выставления конечностей по кадрам Вы всё равно не узнаете какие углы стоят. Для этого надо обратная связь от потенциометров...
А так программа полезная. Я узнал, что можно "сервы в массив объявлять". Правда не знаю как в цикле прописать условие подобное для массива серв:)
while(tabl_a[i]!=servo_a.read()||tabl_b[i]!=servo_b.read())//пока хоть один элемент не совпадает с выставленным...
Открою тайну, в массив можно упаковать не только сервы, а вообще большинство создаваемых объектов
А по-уму тут ещё таймаут необходим - вдруг зацепится нога за половик.
Это точно! Но пока пробовать буду преобразовать исходный скетч.
Открою тайну, в массив можно упаковать не только сервы, а вообще большинство создаваемых объектов
Да, поэтому сходу не могу переписать, пока всё осмысливаю - много массивов надо и даже двухмерный под углы! Плюс массив поправок на индивидуальность серв с потенциометрами (числа 75, 79 и т.д.)
if
(tabl_a[i]!=0||tabl_b[i]!=0)
//если хоть один элемент не 0
Да ещё вот это придётся тогда переписывать.
Мое ИМХО - тут надо начинать с миганием светодиодиком "по сигналу" и плавно переходить к запуску подпрограмм по прерыванию.
Я как раз маюсь подобной ерундой - как без программирования заставить "ходуна на сервах" ходить. ТС, поясните в чём удобство программы "Серво студия 12"? Имея готовую тушку робота и ворочая качалки серв для выставления конечностей по кадрам Вы всё равно не узнаете какие углы стоят. Для этого надо обратная связь от потенциометров...
А как часто требуется знать именно углы? Для выполнения каких-либо действий не всегда обязательно знать положения машинок, так как при включении они сами выставляются в заданные положения (записанное в EEPROM контроллера). Дальше выполняют движение по заданной программе. А даже если и нужно знать - то нет проблемы прицепиться к переменному резистору и завести сигнал на аналоговый вход ардуины. Или, для особо точных проектов, поставить энкодер на движущуюся часть.
Уважаемый, мигание светодиодом вообще не задача и это я давно прошел (год назад примерно). Делал (правда редко и с большими перерывами) не один проект, и с экранами, и шаговиками, и с термодатчиками и прочими устройствами. А вот с сервомашинками что-то не идёт.
Вот такой получается код ТОЛЬКО ДЛЯ ОБРАБОТКИ КНОПКИ. Потому что необходимо же создать исключение срабатывания запуска цикла от случайного нажатия во время работы самого цикла и задать ему определённое время, также. Для эксперимента взял 5 секунд.
На выход А0 повесил светодиод для наблюдения состояния переменной shag27.
Кнопку подключил на А2. Заземлена резистором на землю, при нажатии подаёт 1 на вход.
Логика работы данного кода проста и понятна - нажимаю кратковременно кнопку - светодиод (а также переменная shag27) включается на 5 секунд. И при этом ничего не произойдет если нажимать кнопку хоть сто раз пока еще цикл не закончился.
Теперь вот эта переменная shag27 должна как-то управлять чем-то в первом коде с массивом. Пробовал объединить два кода в один - где то ошибка, не компилируется. Отдельно при этом коды работают отлично.
Решил упростить задачу, убрал таймеры, защиты, лишние служебные переменные? Да и вообще все переменные на всякий пожарный, мало ли. Оставил только это -
И уже напрямую стал прописывать digitalRead (16) в большой код с сервами и массивом.
Пробовал разные участки кода, и для REPEAT ставить значения зависящие от кнопки - 1 или 0 (конечно же предварительно убрав его из define - заколебали уже вы говорить что я ничего не знаю! кто полный ноль даже не в курсе что такое ардуино вообще и светодиод, и тем более запустить его не смогут, не говоря про переменные, define и прочее). Меняется только цикл - если кнопка нажата, то циклы будут бесконечно идти, пока не отпустишь, но запускаться с кнопки не получается. Другие функции пробовал, тоже не идёт, либо не компилируется. В том числе вышеперечисленные вами гипотезы (хотя не могу утверждать что правильно их реализовывал).
Выполнять любое действие по нажатию кнопки умеете? Приравняйте в setup CurFrame = MAX_FRAME+1; и первой строчкой в loop по нажатию кнопки CurFrame = 0; и будет Вам счастье.
Про CurFrame теперь понятно, вспомнил. Сделал этот вариант. Результат есть, но странный - нажимаю на кнопку - двигается только одна машинка - и в одно положение. Остальные не шевелятся вообще. Отпускаю - эта же машинка возвращается в исходную точку. Нажимаю ещё раз - тоже самое. То есть выполняется первый кадр. Менял MAX_FRAME+1 на +2, +3 и т.д. эффекта нет. Также только первая машинка двигается.
Самое удачное место оказалось во второй части блока LOOP. На 109 строке. Если там поставить вместо true для переменной result это -
то при подаче питания всё здорово - машинки стоят на месте. При нажатии кнопки начинают выполнять цикл. Но чуть отпустишь кнопку - машинки встают будто на паузу, продолжаешь давить кнопку - цикл продолжается с той же точки, на которой остановился и завершается до конца (для других проектов это может быть большим плюсом, но мне так не надо). Но повторное нажатие на кнопку ни к чему не приводит, требуется перезагрузка ардуины. Эффект интересный, но что с этим делать дальше? Теоретически если совместить оба кода и прописать вместо digitalRead (16); ту самую переменную shag27, то получится почти то что нужно - кратковременно нажал на кнопку и пошел цикл (посчитать время и прописать в таймер).
Но как быть с повторным запуском? Что не дает старту при повторном нажатии?
Уважаемый, мигание светодиодом вообще не задача и это я давно прошел (год назад примерно). Делал (правда редко и с большими перерывами) не один проект, и с экранами, и шаговиками, и с термодатчиками и прочими устройствами.
Судя по коду, вывсёврёти!
особенно умиляет вот
это, чесносжыженое из FLProg, не разбираясь.
Так что "делал праэкты" относится не к тебе, а к программе для передвигания готовых блочков мышкой. Это она делала.