0@0 LibraryRoot LibraryGroup-Оформление LibraryGroup-Базовые элементы LibraryGroup-Триггеры LibraryGroup-Счетчики LibraryGroup-Сравнение LibraryGroup-Переключатель LibraryGroup-Строки 0@-126 211 0@-760 163 292 0@-336 root input output globalVariable 2 37762029-2e24-48e6-af44-fbc95a42959a LibraryGroup-Шаговый двигатель LibraryGroup-ШД AlexCrane 0@-693 1 6 160@60 180@60 corner: 342.0d@80 160@60 corner: 362.0d@80 184@74.5d 160@70 180@70 152.0d@73.5d 160@60 corner: 180@80 342.0d@70 362.0d@70 342.0d@60 corner: 362.0d@80 9.0d 154.0d Количество шагов в программе 14 380@10 380@10 corner: 779.0d@46.0d 4 left Несколько косячно, но работает. Писалось без оптимизаций на скоруюю руку. Как пример пойдет. Несколько косячно, но работает. Писалось без оптимизаций на скоруюю руку. 393.0d 3@13.0d 10.0d Как пример пойдет. 99.0d 3@28.0d 3 100@20 120@20 corner: 272.0d@40 100@20 corner: 292.0d@40 125.0d@35.0d ШД основной для 1х ШД v1.1 46b26a3e-27dd-47e8-a666-9fac62c24486 ШД основной для 1х ШД v1.1 Блок ШД для управления ШД через драйвер типа А4988 и пр. модификация AlexCrane, 2019 Работает на библиотеке AccelStepper.h и TimerOne.h http://www.airspayce.com/mikem/arduino/AccelStepper/index.html Основной блок для управления одним ШД Совместно использовать с блоком ШД1 274 period 100 50 Период прерывания, мкс, Менять Оторожно 41695f6c-ad2c-4843-8dc1-d29c1575da1b 761f7340-3f25-42dd-a366-852384a4cbf5 Timer1.initialize( period ); // инициализация таймера 1, Timer1.attachInterrupt ( timerInterrupt, period ); // задаем обработчик прерываний 143 #include <TimerOne.h> #include <AccelStepper.h> Длительность импульса, вставлять больше 100 крайне не рекомендуется #define lengthPulse 10 if (Continuous01) {Ready01 = false; Stepper01.runSpeed();} else { Ready01 = true; if (EnSteps01temp) {Ready01 = !Stepper01.run(); if (!Ready01) {EnSteps01temp = false;}} } 174 void timerInterrupt 152.0d 171.0d Читаем состояние кнопок и концевиков 70@20 90@20 corner: 220.0d@40 70@20 corner: 240.0d@40 94@34.5d 250@20 270@20 corner: 421.0d@40 250@20 corner: 441.0d@40 274@34.5d 250@20 corner: 270@40 0.0d 421.0d@30 441.0d@30 421.0d@20 corner: 441.0d@40 250@30 143.0d Старт поиска концевика пер 5 270@30 240.0d@30 corner: 240.0d@30 226.0d@30 240.0d@30 122.0d Старт поиска концевика ~3 digital 250@60 270@60 corner: 346.0d@80 250@60 corner: 366.0d@80 274@74.5d 70@60 90@60 corner: 145.0d@80 70@60 corner: 165.0d@80 94@74.5d 165.0d@70 47.0d Концевик 0 2 151.0d@70 165.0d@70 corner: 165.0d@70 250@70 270@70 346.0d@70 366.0d@70 68.0d Концевик пер 70@110 90@110 corner: 160.0d@130 70@110 corner: 180.0d@130 94@124.5d 250@110 270@110 corner: 348.0d@130 250@110 corner: 368.0d@130 274@124.5d 250@120 348.0d@120 368.0d@120 70.0d Переменник 1 15 270@120 180.0d@120 corner: 180.0d@120 160.0d@120 180.0d@120 62.0d Переменник A0 analogInput 211.0d Инициализация поиска концевика 340@60 360@60 corner: 400@100 340@60 corner: 420@100 366.5d@74.5d 10 230@40 250@40 corner: 290@100 230@40 corner: 310@100 258.5d@53.5d 8 30@60 50@60 corner: 201.0d@80 30@60 corner: 221.0d@80 54@74.5d 30@70 221.0d@70 201.0d@70 221.0d@70 corner: 221.0d@70 230@70 250@70 9 30@80 50@80 corner: 126.0d@100 30@80 corner: 146.0d@100 54@94.5d 30@90 146.0d@90 126.0d@90 146.0d@90 corner: 146.0d@90 230@90 244@90 310@90 Q 290@90 310@90 corner: 310@90 I 340@90 360@90 480@110 500@110 corner: 598.0d@150 480@110 corner: 618.0d@150 504@134.5d 480@120 500@120 460.0d@123.5d 480@140 90.0d Поиск концевика1 En 500@140 7 480@160 500@160 corner: 533.0d@200 480@160 corner: 553.0d@200 504@183.5d 480@170 500@170 460.0d@173.5d 480@190 7.0d 25.0d CCW 500@190 480@210 500@210 corner: 543.0d@250 480@210 corner: 563.0d@250 504@233.5d 480@220 500@220 456.0d@223.5d 480@240 35.0d Enable 12 mosi 11 SPI ~11 500@240 480@60 500@60 corner: 668.0d@100 480@60 corner: 688.0d@100 504@84.5d 500 480@70 500@70 460.0d@73.5d 480@90 160.0d Скорость для поиска концевика 500@90 480@260 500@260 corner: 591.0d@300 480@260 corner: 611.0d@300 504@284.0d 480@270 500@270 456.0d@273.5d 480@290 8.0d 83.0d Включить шаги 1 En 500@290 480@310 500@310 corner: 586.0d@350 480@310 corner: 606.0d@350 504@334.5d 480@320 500@320 472.0d@323.5d 480@340 78.0d Шаг программы 500@340 13 480@360 500@360 corner: 564.0d@400 480@360 corner: 584.0d@400 504@384.5d 480@370 500@370 456.0d@373.5d 480@390 56.0d Программа 500@390 420@90 corner: 420@390 400@90 420@90 40@10 40@10 corner: 287.0d@30.0d При сработанном концевике поиск не включаем 241.0d 3@12.0d 550@170 550@170 corner: 713.0d@190.0d Задаем направление вращения 157.0d 3@12.0d 550@220 550@220 corner: 671.0d@241.0d Включаем драйвер ШД 115.0d 3@13.0d 481.0d Если вдруг во время работы ШД сработает концевик, то обнулим координаты обязательно Поиск концевика без отката от него 160@30 180@30 corner: 220@70 160@30 corner: 240@70 186.5d@44.5d 30@50 50@50 corner: 126.0d@70 30@50 corner: 146.0d@70 54@64.5d 30@60 146.0d@60 126.0d@60 146.0d@60 corner: 146.0d@60 I 160@60 180@60 280@90 300@90 corner: 398.0d@130 280@90 corner: 418.0d@130 304@114.5d 280@100 300@100 256.0d@103.5d 280@120 300@120 280@50 300@50 corner: 447.0d@70 280@50 corner: 467.0d@70 304@65.0d 280@60 447.0d@60 467.0d@60 139.0d Установка нулевой позиции 300@60 310@140 330@140 corner: 394.0d@180 310@140 corner: 414.0d@180 334@164.5d 310@150 330@150 290.0d@153.5d 310@170 330@170 240@60 corner: 240@170 Q 220@60 240@60 261.0d Основная плата для управления ШД 120@180 140@180 corner: 173.0d@200 120@180 corner: 193.0d@200 144@193.5d 120@190 20 220@20 240@20 corner: 396.0d@240 220@20 corner: 416.0d@240 294.0d@34.5d 60@40 80@40 corner: 178.0d@60 60@40 corner: 198.0d@60 84@54.5d 60@50 198.0d@50 178.0d@50 198.0d@50 corner: 198.0d@50 Continuous01 220@50 240@50 ШагДвиг_mod FindEndSwitch 3dd2a884-0b23-4cb1-a919-c8fcdd913331 При true постоянно шагаем для поиска концевика по CCW dd7e7512-0e44-4b12-a3f1-2bfb7f9fd8e0 SpeedEndSwitch 0da09e76-9abd-4209-8994-3906b4e99e09 Скорость ШД для поиска концевика e8002159-6d09-4b1f-97de-6f287b7a5e9f ШагДвиг Установка En 22502748-2126-49f6-a695-bae1e55d0464 3d062544-2c05-4514-9cbe-cbdff30ee30f MaxSpeed b4f1be77-2577-4f2d-8375-3e1ea4216d92 Максимальная скорость вращения ротора двигателя (шагов/секунду) d146d221-19f1-4a4d-b6ca-5801a5a3af91 Acceleration 12308427-b97e-437d-bd1c-aee97865b6ec Ускорение вращения (шагов/секунду^2) e0c65a93-e82f-4d23-a7a7-679313d04991 c4e4c49d-0b43-4310-82ce-026db0767636 Установка параметров шагового двигателя Step Пин управления шагами контроллера 66f1483d-3159-450f-8e82-e654741e6c57 8bc42495-0960-4300-adb7-22efc1573ceb Dir Пин направления вращения контроллера c31d485e-f907-4651-bd19-51f5b0a023b8 72abb887-5e2a-4587-aebd-f3908812b2a9 If (En) { Stepper1.setMaxSpeed(MaxSpeed); Stepper1.setAcceleration(Acceleration); } 83 1 - режим "external driver" (A4988) Stepper1 (1, Step, Dir); AccelStepper EnSteps Speed Acceleration ШагДвиг En Скорость Ускорение Шагов 4b139470-65a1-49a3-8a95-6418d90824c2 Количество шагов, которые должен сделать двигатель 011babd7-655e-464f-b4be-4f06bf7e3d31 Готов f75858a5-7f06-4bf0-9caa-3515dd3118a4 Двигатель закончил движение d1e9f08d-ba11-403b-8751-573ef2a3a8cb 198f8292-fe38-4914-8ded-a59a71b45bbe Управление шаговым двигателем через контроллер А4988 If (En) { SetStepperMaxSpeed(Скорость); SetStepperAcceleration(Ускорение); StepperMove(Шагов); } Готов = Stepper.distanceToGo() == 0; Stepper.run(); 148 #include <AccelStepper.h> 1 - режим "external driver" (A4988) Stepper (1, Step, Dir); AccelStepper curMaxSpeed = 0; int curAcceleration = 0; int if (curMaxSpeed != MaxSpeed) { Stepper.setMaxSpeed(MaxSpeed); curMaxSpeed = MaxSpeed; } 87 void SetStepperMaxSpeed int MaxSpeed if (curAcceleration != Acceleration) { Stepper.setAcceleration(Acceleration); curAcceleration = Acceleration; } 111 void SetStepperAcceleration int Acceleration Stepper.move(Distance); 23 void StepperMove int Distance Steps CCW 1749a012-0c84-41fa-bf04-5a19d56a9907 По часовой стрелке 385bd673-ed11-4ff5-b385-63a75de09b57 Ready Позиция 3e95bd51-7ae3-449f-9b9d-986ce8be7e53 Текущая позиция двигателя 0d87726d-d3cb-406f-b42d-bc70bcf6c19c 0681950a-4e83-4f02-b52f-192689d207f9 If (En) { SetStepperMaxSpeed(Скорость); SetStepperAcceleration(Ускорение); StepperMove(Шагов); } Готов = !Stepper.run(); Позиция = Stepper.currentPosition(); 157 Position 0eeb9b7f-900c-46d1-bb27-99aec13d1572 if (En) { SetStepperMaxSpeed(Speed); SetStepperAcceleration(Acceleration); StepperMove(Steps*(CCW ? 1 : -1)); } Ready = !Stepper.run(); Position = Stepper.currentPosition(); 173 Stepper.move(Distance); 24 SetZeroPosition 60c5b2c1-55c8-41ea-a856-60fc36f95afe Установка начальной позиции в 0. Использовать через RTrig b8593427-7917-4c17-a926-7694d939e155 AbsSteps 25f628bb-19fc-47b3-a5c9-e3b95ca997d8 Если true то шагаем по абосютным координатам от нулевой позиции, иначе идем относительно последенй позиции 98054e13-9c74-4d04-bede-871f2478e134 8e86d344-9473-4f19-8548-4591a220e880 Управление шаговым двигателем через контроллер А4988 mod Блог ШагДвиг для управления ШД через драйвер типа А4988 и пр. модификация AlexCrane, 2019 Работает на библиотеке AccelStepper.h Входы: FindEndSwitch - При true постоянно шагаем для поиска концевика по CCW, имеет больший приоритет перед EnSteps SpeedEndSwitch - Скорость ШД для поиска концевика EnSteps - при true начинаем шагать Speed - Максимальная скорость шаг/сек Acceleration - Ускорение шаг/сек2 Steps - Количество шагов для выполнения CCW - true крутить по часовой, иначе против SetZeroPosition - Установка начальной позиции в 0. Использовать через RTrig AbsSteps - Если true то шагаем по абосютным координатам от нулевой позиции, иначе идем относительно последенй позиции Выходы: Ready - true двигатель закончил движение Position - Текущая позиция двигателя 769 if (FindEndSwitch) {Stepper.setSpeed(SpeedEndSwitch*(CCW ? -1 : 1)); Stepper.runSpeed()} else{ if (EnSteps) { SetStepperMaxSpeed(Speed); SetStepperAcceleration(Acceleration); if (AbsSteps) {StepperMoveA(Steps*(CCW ? -1 : 1));} else {StepperMove(Steps*(CCW ? -1 : 1));} } Ready = !Stepper.run(); Position = Stepper.currentPosition(); if (SetZeroPosition) {Stepper.setCurrentPosition(0);} } 389 Stepper.move(Distance); void StepperMove long Distance Stepper.moveTo(AStep); 22 void StepperMoveA long AStep 220@40 corner: 240@60 0@60 20@60 corner: 188.0d@80 0@60 corner: 208.0d@80 24@74.5d 0@70 208.0d@70 188.0d@70 208.0d@70 corner: 208.0d@70 SpeedContinuous01 220@70 240@70 220@60 corner: 240@80 10@80 30@80 corner: 177.0d@100 10@80 corner: 197.0d@100 34@95.0d 10@90 197.0d@90 177.0d@90 197.0d@90 corner: 197.0d@90 SetZeroPosition01 220@90 240@90 220@80 corner: 240@100 60@100 80@100 corner: 171.0d@120 60@100 corner: 191.0d@120 84@114.0d 60@110 191.0d@110 171.0d@110 191.0d@110 corner: 191.0d@110 EnSteps01 220@110 240@110 на переднем фронте начинаем шагать, использовать через RTrig 220@100 corner: 240@120 MaxSpeed01 2000 220@130 240@130 194.0d@133.5d 220@120 corner: 240@140 Acceleration01 800 220@150 240@150 200.0d@153.5d 220@140 corner: 240@160 120@160 140@160 corner: 174.0d@180 120@160 corner: 194.0d@180 144@173.5d 120@170 194.0d@170 26.0d Шаги 174.0d@170 194.0d@170 corner: 194.0d@170 Steps01 220@170 240@170 220@160 corner: 240@180 220@180 corner: 240@200 19 120@200 140@200 corner: 195.0d@220 120@200 corner: 215.0d@220 144@213.5d 120@210 215.0d@210 Абс.шаги 16 195.0d@210 215.0d@210 corner: 215.0d@210 AbsSteps01 220@210 240@210 220@200 corner: 240@220 StopAccel01 220@230 240@230 ШагДвиг_mod_INT_v2 Continuous SpeedContinuous MaxSpeed Против часовой стрелки StopAccel feb8597c-6c86-4cf8-a3f6-33b79fea3e86 Остановка с использованием текущей скорости и ускорения e63ef32a-1278-4528-be56-9a9bd875735c a3ce2693-d1c9-40a7-a191-f8250fdb2d78 ШагДвиг_mod (step/dir) INT Блог ШагДвиг для управления ШД через драйвер типа А4988 и пр. модификация AlexCrane, 2019 Работает на библиотеке AccelStepper.h и TimerOne.h http://www.airspayce.com/mikem/arduino/AccelStepper/index.html Входы: Continuous - При true постоянно шагаем, имеет больший приоритет перед EnSteps SpeedContinuous - Скорость ШД для "постоянно шагаем" Эти два входа можно использовать для поиска концевика и просто чтобы покрутить двигателем, но без ускорений SetZeroPosition - Установка начальной позиции в 0. Использовать через RTrig EnSteps - при переднем фронте начинаем шагать. Использовать через RTrig Speed - Максимальная скорость шаг/сек Acceleration - Ускорение шаг/сек2 Steps - Количество шагов для выполнения (hint: можно и отрицательные) CCW - true крутить против часовой, иначе по AbsSteps - Если true то шагаем по абосютным координатам от нулевой позиции, иначе идем относительно последеней позиции StopAccel - Остановка с использованием текущей скорости и ускорения Выходы: Ready - true двигатель закончил движение Position - Текущая позиция двигателя 1063 period Период прерывания, мкс, Менять Оторожно 41695f6c-ad2c-4843-8dc1-d29c1575da1b 761f7340-3f25-42dd-a366-852384a4cbf5 if (SetZeroPosition) {Stepper.setCurrentPosition(0);} if (Continuous) { if (curMaxSpeed != MaxSpeed) { Stepper.setMaxSpeed(MaxSpeed); curMaxSpeed = MaxSpeed; } if (curSpeed != SpeedContinuous) { Stepper.setSpeed(SpeedContinuous*(CCW ? -1 : 1)); curSpeed = SpeedContinuous; }} else{ if (EnSteps) { noInterrupts(); if (curMaxSpeed != MaxSpeed) { Stepper.setMaxSpeed(MaxSpeed); curMaxSpeed = MaxSpeed; } if (curAcceleration != Acceleration) { Stepper.setAcceleration(Acceleration); curAcceleration = Acceleration; } if (AbsSteps) {Stepper.moveTo(Steps*(CCW ? -1 : 1));} else {Stepper.move(Steps*(CCW ? -1 : 1));} interrupts(); } if (StopAccel) {Stepper.stop;} } Position = Stepper.currentPosition(); 703 Timer1.initialize( period ); // инициализация таймера 1, Timer1.attachInterrupt ( timerInterrupt, period ); // задаем обработчик прерываний Stepper.setMinPulseWidth(lengthPulse); 181 #include <TimerOne.h> #include <AccelStepper.h> Длительность испульса, вставлять больше 100 крайне не рекомендуется #define lengthPulse 10 1 - режим "external driver" (A4988) Stepper (1, Step, Dir); AccelStepper curSpeed = 0; int curMaxSpeed = 0; int curAcceleration = 0; int if (Continuous) {Ready = Stepper.runSpeed();} else Ready = !Stepper.run(); 75 void timerInterrupt 220@220 corner: 240@240 470@200 490@200 corner: 526.0d@220 470@200 corner: 546.0d@220 494@213.5d 470@210 526.0d@210 546.0d@210 28.0d Готов 490@210 416.0d@210 corner: 416.0d@210 Ready01 42.0d 396.0d@210 416.0d@210 396.0d@200 corner: 416.0d@220 18 430@220 450@220 corner: 477.0d@240 430@220 corner: 497.0d@240 454@233.5d 430@230 477.0d@230 497.0d@230 19.0d Pos 450@230 416.0d@230 corner: 416.0d@230 Position01 50.0d 396.0d@230 416.0d@230 396.0d@220 corner: 416.0d@240 220@190 ШД1_v1.1 CCW01 66c390af-6e1c-44f5-b7a2-af2f9da1ef6e ШД1_v1.1 Блок ШД1 для управления ШД через драйвер типа А4988 и пр. модификация AlexCrane, 2019 Работает на библиотеке AccelStepper.h и TimerOne.h http://www.airspayce.com/mikem/arduino/AccelStepper/index.html Входы: Continuous - При true постоянно шагаем, имеет больший приоритет перед EnSteps SpeedContinuous - Скорость ШД для "постоянно шагаем" Эти два входа можно использовать для поиска концевика и просто чтобы покрутить двигателем, но без ускорений SetZeroPosition - Установка начальной позиции в 0. Использовать через RTrig EnSteps - при переднем фронте начинаем шагать. Использовать через RTrig Speed - Максимальная скорость шаг/сек Acceleration - Ускорение шаг/сек2 Steps - Количество шагов для выполнения (hint: можно и отрицательные) CCW - true крутить против часовой, иначе по AbsSteps - Если true то шагаем по абсолютным координатам от нулевой позиции, иначе идем относительно последней позиции StopAccel - Остановка с использованием текущей скорости и ускорения Выходы: Ready - true двигатель закончил движение Position - Текущая позиция двигателя 1059 Step01 Dir01 if (SetZeroPosition01) {Stepper01.setCurrentPosition(0); curSpeed01=0; } if (Continuous01) { if (curMaxSpeed01 != MaxSpeed01) { Stepper01.setMaxSpeed(MaxSpeed01); curMaxSpeed01 = MaxSpeed01;} if (curSpeed01 != SpeedContinuous01) { Stepper01.setSpeed(SpeedContinuous01*(CCW01 ? -1 : 1)); curSpeed01 = SpeedContinuous01;} } else{ if (EnSteps01) { EnSteps01temp = true; if (curMaxSpeed01 != MaxSpeed01) { Stepper01.setMaxSpeed(MaxSpeed01); curMaxSpeed01 = MaxSpeed01;} if (curAcceleration01 != Acceleration01) { Stepper01.setAcceleration(Acceleration01); curAcceleration01 = Acceleration01;} if (AbsSteps01) {Stepper01.moveTo(Steps01*(CCW01 ? -1 : 1));} else {Stepper01.move(Steps01*(CCW01 ? -1 : 1));} } if (StopAccel01) {Stepper01.stop();} } Position01 = Stepper01.currentPosition(); 801 Stepper01.setMinPulseWidth(lengthPulse); 40 1 - режим "external driver" (A4988) Stepper01 (1, Step01, Dir01); AccelStepper curSpeed01 = 0; int curMaxSpeed01 = 0; int curAcceleration01 = 0; int EnSteps01temp = false; bool 156.0d 240@190 193.0d@190 corner: 193.0d@190 173.0d@190 193.0d@190 321.0d Выполняем заданное количество программ 20@160 40@160 corner: 76.0d@180 20@160 corner: 96.0d@180 44@173.5d 20@170 140@140 160@140 corner: 200@200 140@140 corner: 220@200 168.5d@153.5d 140@170 20@180 40@180 corner: 104.0d@200 20@180 corner: 124.0d@200 44@194.5d 20@190 124.0d@190 104.0d@190 124.0d@190 corner: 124.0d@190 140@190 160@190 230@160 250@160 corner: 290@200 230@160 corner: 310@200 256.5d@174.5d 230@190 380@160 400@160 corner: 480@240 380@160 corner: 500@240 429.0d@173.5d 380@190 250@230 270@230 corner: 330@290 250@230 corner: 350@290 284.5d@244.0d 20@250 40@250 corner: 202.0d@270 20@250 corner: 222.0d@270 44@264.5d 20@260 222.0d@260 202.0d@260 222.0d@260 corner: 222.0d@260 I1 250@260 270@260 I2 250@280 270@280 244.0d@283.5d 350@280 Q 330@280 350@210 corner: 350@280 Max 380@210 400@210 R 380@230 400@230 520@180 540@180 corner: 604.0d@220 520@180 corner: 624.0d@220 544@204.5d 520@190 540@190 496.0d@193.5d 520@210 540@210 500@210 corner: 500@210 >L 14.0d 480@210 500@210 520@220 540@220 corner: 626.0d@240 520@220 corner: 646.0d@240 544@234.5d 520@230 626.0d@230 646.0d@230 540@230 500@230 corner: 500@230 V 480@230 500@230 up C 400@190 440@40 460@40 corner: 500@100 440@40 corner: 520@100 468.5d@53.5d 340@20 360@20 corner: 420@80 340@20 corner: 440@80 371.5d@34.0d 70@40 90@40 corner: 176.0d@60 70@40 corner: 196.0d@60 94@54.5d 70@50 196.0d@50 176.0d@50 196.0d@50 corner: 196.0d@50 I1 340@50 360@50 70@60 90@60 corner: 252.0d@80 70@60 corner: 272.0d@80 94@74.5d 70@70 272.0d@70 252.0d@70 272.0d@70 corner: 272.0d@70 I2 340@70 360@70 440@70 <= 420@70 440@70 corner: 440@70 440@70 460@70 440@90 520@80 540@80 corner: 631.0d@100 520@80 corner: 651.0d@100 544@94.0d 520@90 631.0d@90 651.0d@90 540@90 520@90 corner: 520@90 500@90 520@90 460@90 310@90 corner: 310@190 290@190 310@190 I 250@190 220@190 corner: 220@190 200@190 220@190 160@170 96.0d@170 corner: 96.0d@170 76.0d@170 96.0d@170 371.0d Выполнение программы 1 == 360@50 380@50 corner: 414.0d@90 360@50 corner: 434.0d@90 384@73.5d 360@60 380@60 340.0d@63.5d 230@50 250@50 corner: 290@90 230@50 corner: 310@90 256.5d@64.5d 25 140@30 160@30 corner: 220@90 140@30 corner: 240@90 171.5d@44.0d 26 0@50 20@50 corner: 106.0d@70 0@50 corner: 126.0d@70 24@64.5d 0@60 20@60 0@50 corner: 20@70 106.0d@50 corner: 126.0d@70 126.0d@60 106.0d@60 126.0d@60 corner: 126.0d@60 I1 140@60 160@60 I2 140@80 160@80 134.0d@83.5d 240@80 == 220@80 230@80 corner: 230@80 230@80 250@80 310@80 290@80 360@110 380@110 corner: 413.0d@150 360@110 corner: 433.0d@150 384@133.5d 360@120 380@120 336.0d@123.5d 360@110 corner: 380@130 360@130 corner: 380@150 360@140 380@140 310@80 corner: 310@140 360@80 380@80 231.0d Выполнение программы 2 360@50 380@50 corner: 414.0d@90 360@50 corner: 434.0d@90 384@73.5d 360@60 380@60 340.0d@63.5d 230@50 250@50 corner: 290@90 230@50 corner: 310@90 256.5d@64.5d 140@30 160@30 corner: 220@90 140@30 corner: 240@90 171.5d@44.0d 0@50 20@50 corner: 106.0d@70 0@50 corner: 126.0d@70 24@64.5d 0@60 126.0d@60 106.0d@60 126.0d@60 corner: 126.0d@60 140@60 160@60 140@80 160@80 132.0d@83.5d 240@80 220@80 230@80 corner: 230@80 230@80 250@80 310@80 290@80 360@110 380@110 corner: 413.0d@150 360@110 corner: 433.0d@150 384@133.5d 360@120 380@120 340.0d@123.5d 360@140 380@140 310@80 corner: 310@140 360@80 380@80 Программа 3 Пропорциональное управление 160@0 180@0 corner: 240@60 160@0 corner: 260@60 191.5d@14.0d 0@20 20@20 corner: 106.0d@40 0@20 corner: 126.0d@40 24@34.5d 0@30 126.0d@30 106.0d@30 126.0d@30 corner: 126.0d@30 I1 160@30 180@30 I2 160@50 180@50 152.0d@53.5d 340@10 360@10 corner: 415.0d@30 340@10 corner: 435.0d@30 364@23.5d 340@20 415.0d@20 435.0d@20 360@20 600@140 620@140 corner: 654.0d@180 600@140 corner: 674.0d@180 624@163.5d 420@210 440@210 corner: 500@250 420@210 corner: 520@250 452.5d@223.5d 280@190 300@190 corner: 389.0d@250 280@190 corner: 409.0d@250 305.0d@204.5d en 280@220 300@220 Filtr_median_10 period d96c2961-fff2-4449-8388-5999d963410b период работы в милисекундах 84b3a024-284e-43f6-81ff-41fd4fff8cb3 in 78b943eb-acec-4bd9-934f-45bcb7c005c7 82d19dd8-844c-4667-b63f-c950b7900a44 out 0d7b91be-0457-4d0f-a8e8-762c61bcfe27 5bb75863-99a4-4647-abce-808582004e46 ok f7f451ac-00fb-4616-a2df-cb7e9dbf6c27 ab8af86d-9a8f-4730-9c14-09d1d5a292cf cadbd814-f8f8-47f2-ba47-b4a23888ab88 Filtr_median_10 // Filtr_median_10 time = millis() - time_old; ok = false; if (time>period) { time_old = millis(); N = 0; Loop_1: if (N >= 10) {GOTO Post_loop;} out = AdcF[N]; M = 0; S1 = 0; S2 = 0; Loop_2: if (out < AdcF[M]) { S1++; if (S1 > 5) {N++; GOTO Loop_1;} } if (out > AdcF[M]) { S2++; if (S2 > 5) {N++; GOTO Loop_1;} } M++; if (M < 10) {GOTO Loop_2;} Post_loop: AdcF[0] = AdcF[1]; AdcF[1] = AdcF[2]; AdcF[2] = AdcF[3]; AdcF[3] = AdcF[4]; AdcF[4] = AdcF[5]; AdcF[5] = AdcF[6]; AdcF[6] = AdcF[7]; AdcF[7] = AdcF[8]; AdcF[8] = AdcF[9]; ok = true; } 611 time ; unsigned long time_old ; unsigned long N ; byte M ; byte S1 ; byte S2 ; byte AdcF [10]; integer 13f96943-4e94-4927-8910-6f61c9e59167 17fa1b6e-f4f7-4699-92a0-48e7b694a80f time ; unsigned long time_old ; unsigned long N ; byte M ; byte S1 ; byte S2 ; byte AdcF [10]; integer разрешение работы 30@230 50@230 corner: 128.0d@250 30@230 corner: 148.0d@250 54@244.5d 30@240 148.0d@240 128.0d@240 148.0d@240 corner: 148.0d@240 280@240 300@240 409.0d@240 Filtr_median_10 8211eec7-9298-4b1e-936a-1dc34de300c6 Filtr_median_10 Медианный фильтр на 10. Работает при en=1. Принцип работы: Есть ряд значений (11,10,12,100,500,30,10,9,10,12,11), которые запомнил фильтр. Фильтр раскладывает их по возрастанию (9,10,10,10,11,11,12,12,30,100,500) и на выход выдает средний член этого ряда (11). Алгоритм и описание отсюда: http://electronix.ru/forum/index.php?s=&showtopic=114436&view=findpost&p=1180687 Автор: Boroda 384 // Filtr_median_10 if (en) { array[9] = in; for (N=0; N<10; N++) // 0 до 9 { out = array[N]; S1 = 0; S2 = 0; for (M=0; M<10; M++) // 0 до 9 { if (out < array[M]) { S1++; if (S1>5) {break;} } if (out > array[M]) { S2++; if (S2>5) {break;} } } if (M>=10) {break;} } for (N=0; N<9; N++) {array[N] = array[(N+1)];} } 335 N ; byte M ; byte S1 ; byte S2 ; byte array [10]; int 89.0d 17.0d 389.0d@240 409.0d@240 corner: 409.0d@240 I 420@240 440@240 520@240 1023 500@240 520@150 corner: 520@240 600@150 620@150 600@140 corner: 620@160 600@160 corner: 620@180 600@170 620@170 340@30 360@30 corner: 451.0d@70 340@30 corner: 471.0d@70 364@54.0d 340@40 360@40 320.0d@43.5d 340@60 360@60 340@70 360@70 corner: 393.0d@110 340@70 corner: 413.0d@110 364@93.5d 340@80 360@80 316.0d@83.5d 340@100 360@100 260@20 corner: 260@220 240@50 260@50 == 331.0d 110@10 130@10 corner: 185.0d@50 110@10 corner: 205.0d@50 135.0d@24.5d lcd.begin lcdBeginWire addr 0cbb0d56-c71d-4dd8-9c09-644a77d635a2 Адрес LCD десятичный a6fd035c-9ac8-49a9-8e0b-c2f9672ea72e lcd.beginWire event 6eeee19a-df7c-4d58-9d60-3ef7bd79e40f 8408774b-7bee-43be-82ac-cd66560cc1f5 4a79b299-60c3-4f5c-9411-7da77ce04bec lcd.beginWire - управление Lcd на шине lcd 63,20,4,0 ТИП ИНТЕРФЕЙСА 'P' - через пины (обмен тетрадами), 'I' - через i2c, 'S' - через SPI 7b365250-e395-41ca-982d-551950d1a803 I bcefedc2-c824-442f-9273-ef2630fbb8c6 НОМЕР ДИСПЛЕЯ b8e93434-17e1-4a0a-82fe-b26008176ed8 dc856e5e-59ec-422c-8b06-5e21d9e2a8c5 КОЛ_ВО КОЛОНОК 88ed9508-c0ef-4a86-ae9b-7c0394ed2cd0 6e55c2ce-ccf4-49f1-a074-f4e789e25b14 КОЛ_ВО СТРОК 2c5ba6b2-c5fd-4666-87ee-93c5d923d1a8 aa13b04f-b642-4e0b-aa15-a2a5c0c7cded ПЕРИОД_HOT 60 в секундах 5bf1a7a9-149a-4330-a0b9-082919724353 в мс 2424b97c-ed39-4963-8a81-1155e5facb02 РЕЖИМ_RT Y - режим реального времени, N - без режима реального времени 3707c0ac-91b4-4f8e-b99d-a00031ca7b4d Y =1 - режим реального времени f2bafcd5-9f35-41ac-b61f-8ac8809b33d7 ДЕЛИТЕЛЬ 255 246363f4-7cef-4e21-ab35-54f91be1042c 063ad25d-12ef-4066-8b54-e87c3dffd761 АДРЕС_ДЕСЯТИЧНЫЙ 63 b3b29e7f-6ba4-409c-8dd3-c7984da02bff 45b1c849-ea87-4cfb-bec8-fc0affe6a1dc //---------------------- БЛОК ИНИЦИАЛИЗАЦИИ ДИСПЛЕЯ ------------------ //--Контроль----> номер дисплея, deviceID, кол-во колонок, кол-во строк, период Hot в сек, режим RT ('T','N'),делитель (0-255), адрес на шине i2c(десятичный) if(!z.init) {RT_HW_Lcd_hd44780.setBeginWire( НОМЕР ДИСПЛЕЯ ,z, КОЛ_ВО СТРОК , ПЕРИОД_HOT , РЕЖИМ_RT , ДЕЛИТЕЛЬ , АДРЕС_ДЕСЯТИЧНЫЙ );} RT_HW_Lcd_hd44780.printBegin(zLcd); event = RT_HW_Lcd_hd44780.dividerTask(zLcd); //--------------------------------------------------------------------------------------------------- /* if(EN) { if( !z.init ) { RT_HW_Wire.begin(); //--Настройка i2c выполнится только если она ранее не выполнялась RT_HW_Lcd_hd44780.setDeviceID( НОМЕР ДИСПЛЕЯ , z, 'I', КОЛ_ВО КОЛОНОК , КОЛ_ВО СТРОК , АДРЕС_ДЕСЯТИЧНЫЙ ); RT_HW_Lcd_hd44780.setPeriodHot(z, (ПЕРИОД_HOT) *1000UL); z.rt= РЕЖИМ_RT; } ; if( RT_HW_Lcd_hd44780.eventMillis (z.timePeriodHot, z. periodHot)) {z.run=true;} //--Установка "run" для повторной (для надежности) инициализации RT_HW_Lcd_hd44780.begin (z); // --Инициализация по флагу z.run } //-------------------------------------------------------------------------------------------------- */ 1243 ---------------------- БЛОК ИНИЦИАЛИЗАЦИИ ДИСПЛЕЯ ------------------ #include "RT_HW_LCD_HD44780.h" #include "RT_HW_Wire.h" z ; RT_HW_LCD_HD44780_DeviceID --------------------------------------------------------------------------------------------------- control 8dac3c4f-3dde-4864-bfa1-31bd3e2922d9 lcdBeginWire - управление Lcd на шине lcd Y //---------------------- БЛОК ИНИЦИАЛИЗАЦИИ ДИСПЛЕЯ ------------------ //--Контроль----> номер дисплея, deviceID, кол-во колонок, кол-во строк, период Hot в сек, режим RT ('T','N'),делитель (0-255), адрес на шине i2c(десятичный) if(!z.init) { RT_HW_Wire.begin(); //--Настройка i2c выполнится только если она ранее не выполнялась RT_HW_Lcd_hd44780.setBeginWire( НОМЕР ДИСПЛЕЯ ,z, КОЛ_ВО КОЛОНОК, КОЛ_ВО СТРОК , ПЕРИОД_HOT , РЕЖИМ_RT , ДЕЛИТЕЛЬ , addr );} RT_HW_Lcd_hd44780.printBegin(z); control = RT_HW_Lcd_hd44780.dividerTask(z); //--------------------------------------------------------------------------------------------------- 652 da9964db-d3df-4c4c-8a4c-de5ba4fb602b 1.lcd.begin - управление Lcd на шине i2c БЛОК УПРАВЛЕНИЯ ДИСПЛЕЕМ ТИПА LCD HD-44780 Блок осуществляет инициализацию и контроля LCD. Допускается "горячее" подключение или "переподключение" во время работы. Непосредственный вывод выполняется через дополнительные блоки. Вход: addr - адрес (десятичный) на шине i2c; Параметры: НОМЕР ДИСПЛЕЯ - от 1 до 15. Предусмотрена одновременная работа многих дисплеев. КОЛ_ВО КОЛОНОК - кол-во колонок в дисплее; КОЛ-ВО СТРОК - кол-во строк в дисплее; ------------------------------------------------------------------------------------------ ecoins@mail.ru 01.10.19 568 Номер дисплея от 1 до 8 Ко-во колонок - от 8 до 20 Кол-во строк от 1 до 4 //====== БЛОК ИНИЦИАЛИЗАЦИИ И КОНТРОЛЯ LCD. Параметры ->lcd,id,col,row,addr; switch(z.dir){ default: case 1: break; case 0: Wire.begin(); RT_HW_Lcd_hd44780.device_setID( НОМЕР ДИСПЛЕЯ ,z, КОЛ_ВО КОЛОНОК , КОЛ_ВО СТРОК , addr ); break; case 2: RT_HW_Lcd_hd44780.begin(z,0); break; } //--------------------------------------------------------------------------------------------------- 410 #include "RT_HW_LCD_HD44780.h" z ; RT_HW_LCD_HD44780_DEVICE 39 110@40 130@40 96.0d@43.5d 55.0d 320@60 340@60 corner: 381.0d@120 320@60 corner: 401.0d@120 345.0d@73.5d EN 320@90 334@90 lcdInt16 4b6f0df5-fc72-4965-8313-6eba673c73dc 0ff214d2-ca55-4c97-b354-bcd6cc732d38 lcd.Blink RT_LcdBlink RT_Lcd_Float EN 7c0e692e-9eb8-44f8-9f84-b96ed7170192 6a77b665-a1c7-4b16-bb38-c7d79f9da138 RT_Lcd_ConfigFloat lcd 8723a50c-891e-4814-8372-a2ce9b25b710 3081f5e3-33e0-45d3-b778-5dc536834597 col 92b55601-0684-4671-8daa-a214adabccbf c0294930-507c-4cdf-9436-aea514678fac row bb4ff648-82ab-4ee3-8086-0d613a8d0f8b 3a6460fd-219a-4894-95e6-c5831a0f6873 len 237e26a2-5424-4d7b-8d06-9135d7aa3893 963b23d9-84ec-4761-9a50-f15dbeaff6f2 point e48ccea7-0b94-4d17-96b5-16a0d993b24d 22536794-8451-4a36-aa00-a30dae39a332 alig 9b664619-0b4d-4f5b-ba7d-4106e7290266 02d334f7-609c-4299-bc96-505f1d30cf91 val 4cf2bd25-7f1b-475e-b21f-eeb5e0a4dc86 ff456029-2219-4c02-a4ec-2a96a19a3f55 a41d65d8-a50e-4ce1-a794-fe15c5277376 RT_LiquidCrystal_ID_FLOAT id0_DHT_t1; 642afabf-054e-4d43-b15f-9f14e901382d RT_Lcd_Float if (! start ) { start=true; //RT_Lcd.configFloat (ID, col, row, lcd, len, point, alig); ID.lcd=lcd; ID.col=col; ID.row=row; ID.init=true; ID.fresh=true; ID.alig= RT_Lcd.convertAligFromChar(alig); ID.step=0; ID.val= val; ID.len=len; ID.point=point; } 273 ID ; RT_LiquidCrystal_ID_FLOAT start =0; bool RUN b98019d0-2d49-4b14-b781-59d636b042d6 4e95a6e1-d737-488f-8c7a-648b70504702 sign1 sign2 RT_LcdBlink fresh dd38d6b1-6775-4e79-8aff-5658d5a3ea95 b3421ed8-173d-4179-b761-cd24c10ddd68 40ae13cc-8b5c-467f-a7f7-4ecde19525cb RT_LcdBlink - вывод числа if (! INIT) { ID.lcd=lcd; ID.col=col; ID.row=row; ID.init=true; ID.fresh=true; ID.alig= RT_Lcd.convertAligFromChar(alig); ID.step=0; ID.val= val; ID.len=len; ID.point=point; } RT_Lcd.PrintBlink (step, fresh, blink, 0, 0,'<', '>', 0); 244 INIT =0; bool step =0; uint8_t fresh =0; uint8_t blink =0; uint8_t period 9c17e633-c7aa-400f-bbc8-f44494450ac8 RT_LcdBlink - мерцание символом if (EN) if (RT_HW_LCD_periodMillis( timeStart,period)) {fresh=1;}; RT_Lcd.PrintBlink (step, fresh, blink, col, row, sign1, sign2, lcd); 138 step =0; uint8_t fresh =0; uint8_t blink =0; uint8_t timeStart ; uint32_t lcd 9e1a4a7d-b5c7-4c44-b056-56667b38c7de 6b033be2-f9f4-4633-8611-693f36e75608 col 49ec0170-133f-4257-96d6-a61968bca22f 290a6d84-43de-45f8-8e7d-bb0f6b36087d row 20444a5e-d87b-43a3-aea3-a9bdc4d0800d 50467ca5-9ff9-4566-b25d-e7fbf79a17d2 sym ca5f6d10-f2b6-49dd-8ad7-df3ac8ab556d b437fbaf-cde6-4241-af65-b065a6c169be f89aab16-c014-4c30-b521-7dde30c971ba lcd.Blink -мерцание символом Символ 2 af1aba93-8e7a-41cc-8b2f-c0f6e86a18d6 5de6d7a1-422b-42b6-b984-190c9c3b7fd0 //-----------Инициализация блока мерцания символом if( ! x.init) {RT_HW_Lcd_hd44780.setDataID (x, col , row ); sign1=Symbol_1; sign2=Symbol_2; fresh=1; } //---------Вывод мерцающего символа if(RUN) x.fresh=1; RT_HW_Lcd_hd44780.printBlink (*RT_HW_Lcd_hd44780.prt[lcd], x, sym, Символ 2 ); 310 #include "RT_HW_Main.h" #include <Wire.h> #include "RT_LiquidCrystal.h" x ; RT_HW_LCD_HD44780_DataID val 1e52895b-f6e6-4b83-a724-0f27ef188c62 lcdInt16 -вывод числа (DEC,HEX,BIN) НОМЕР ДИСПЛЕЯ c0416ecc-2064-4ddb-9643-3d8736deb305 2138de8d-417a-4f1f-945c-325647f93101 КОЛОНКА 963bdf27-37ac-42d2-9f1c-05e2307c36b3 fd1d2572-ccd2-4600-a268-aa78307cfc7c СТРОКА 1e471073-2d61-4ed9-b148-a78123f47933 e8d5690a-cf39-4290-b2fb-31906966e2f3 ДЛИНА 05b66ac6-8596-467a-ad49-fd10eb66e7b6 63ca9829-2306-4e08-b7e6-00a2d3c66737 ПЕРИОД 250 335a9307-0bbb-4a1b-b2a6-f86b817935b4 f79b131f-34e2-445a-b46a-6103b6a19a78 ВЫРАВНИВАНИЕ N,L,C,R 2d243ce7-f539-4e7e-9acc-4910c65c4ba6 L L f4a74ded-d889-4c67-82e3-2b881131ed41 ФОРМАТ ВЫВОДА 'D' - DEC, 'H' - HEX, 'B' - BIN a4fd2125-7c2a-4091-b56b-a5d0ec64f373 D D 0d4ce472-e745-4e2c-965b-9066f594725f ЗАГОЛОВОК @ 30963709-7f28-42c3-a146-1b025c277038 e6e3d3d0-77ec-4d19-a30c-3a1eaa682b3f //---------------------- ВЫВОД INT16 В LCD --------------------------------------------------- if(EN){ if(RT_HW_Lcd_hd44780.getDividerEvent(id)) { if( !id.init) {RT_HW_Lcd_hd44780.setInt16 (НОМЕР ДИСПЛЕЯ, id,КОЛОНКА,СТРОКА,ПЕРИОД, ДЛИНА ,ВЫРАВНИВАНИЕ,ФОРМАТ ВЫВОДА );} RT_HW_Lcd_hd44780.printInt16(id,val);} } //----------------------------------------------------------------------------------------------------------- 423 #include "RT_HW_LCD_HD44780.h" id ; RT_HW_LCD_HD44780_DataID char x= ФОРМАТ ВЫВОДА; switch(x) { default: case 'N': id.s=String(id.val); break; case 'D': id.s=String(id.val,DEC); break; case 'H': id.s=String(id.val,HEX); break; case 'B': id.s=String(id.val,BIN); break; } 216 void setPrintData 210@100 230@100 corner: 257.0d@120 210@100 corner: 277.0d@120 234@113.5d 210@110 277.0d@110 257.0d@110 277.0d@110 corner: 277.0d@110 320@110 340@110 lcd.int 673cb915-dc41-47a4-a3da-38119d664b80 4.lcd.int -вывод числа int //======БЛОК ВЫВОДА INT16 В ДИСПЛЕЙ Блок выводит в LCD переменную int16. Вывод осуществляется в форматах DEC,HEX,BIN Вход: EN - разрешение работы. Через этот вход также достигается снижение затрат процессорного времени; val - переменная в формате int16_t (int) НОМЕР ДИСПЛЕЯ - обращается к инициализированному блоку RTlcdBegin с таким же номером; КОЛОНКА - номер колонки; СТРОКА - номер строки; ДЛИНА - разрешенная длина выводимого поля. Если =0, выводит до конца строки; ПЕРИОД - (мс) период изменения символа на дисплее; ВЫРАВНИВАНИЕ - выравнивание текста в поле: N - без выравнивания, L -влево, С -по центру, R -вправо; ----------------------------------------- ecoins@mail.ru 12.07.19 711 НОМЕР ДИСПЛЕЯ c0416ecc-2064-4ddb-9643-3d8736deb305 НОМЕР КОЛОНКИ 963bdf27-37ac-42d2-9f1c-05e2307c36b3 НОМЕР СТРОКИ 1e471073-2d61-4ed9-b148-a78123f47933 ВЫРАВНИВАНИЕ ЗАГОЛОВКА 959f195a-f1dd-4091-af94-fdff2825e244 L L 41418a96-e0ec-4a78-b084-bc26308c14e7 ДЛИНА ЗАГОЛОВКА 05b66ac6-8596-467a-ad49-fd10eb66e7b6 ТЕКСТ ЗАГОЛОВКА x= b7fde13b-b312-4c68-bd85-bc1c367ee3a5 67ea8554-eed9-4903-bddb-1a609d95b46a ВЫРАВНИВАНИЕ ЗНАЧЕНИЯ N,L,C,R 2d243ce7-f539-4e7e-9acc-4910c65c4ba6 L L ФОРМАТ ВЫВОДА 'D' - DEC, 'H' - HEX, 'B' - BIN a4fd2125-7c2a-4091-b56b-a5d0ec64f373 D D ДЛИНА ЗНАЧЕНИЯ abc3910a-edf2-4f65-bcaf-aa42d53eef9f f95d516e-0f48-4ed4-8d57-0cd8dc8f0470 ПЕРИОД В ТИКАХ 250 335a9307-0bbb-4a1b-b2a6-f86b817935b4 //======БЛОК ВЫВОДА INT16 В ДИСПЛЕЙ. Параметры ->lcd,id,col,row,period,aligHead,lenHead,aligVal,lenVal,modeVal switch(id.dir){default: case 1:break; case 0:if(EN){RT_HW_Lcd_hd44780.setID_int16( НОМЕР ДИСПЛЕЯ ,id, НОМЕР КОЛОНКИ , НОМЕР СТРОКИ , ПЕРИОД В ТИКАХ , ВЫРАВНИВАНИЕ ЗАГОЛОВКА , ДЛИНА ЗАГОЛОВКА , ВЫРАВНИВАНИЕ ЗНАЧЕНИЯ , ДЛИНА ЗНАЧЕНИЯ , ФОРМАТ ВЫВОДА , ТЕКСТ ЗАГОЛОВКА );}break; case 2:RT_HW_Lcd_hd44780.makeRun_int16(id,EN); RT_HW_Lcd_hd44780.print_int16(id, val );break;}; //------------------------------------------------------------------------------------------------------------- 625 ======БЛОК ВЫВОДА INT16 В ДИСПЛЕЙ. #include "RT_HW_LCD_HD44780.h" id ; RT_HW_LCD_HD44780_DATA_INT16 -------------------------------------------------------------------------------------------------- 41.0d 320@130 340@130 corner: 381.0d@190 320@130 corner: 401.0d@190 345.0d@143.5d 320@160 334@160 160@170 180@170 corner: 266.0d@190 160@170 corner: 286.0d@190 184@184.5d 160@180 286.0d@180 266.0d@180 286.0d@180 corner: 286.0d@180 320@180 340@180 L step= L D 320@200 340@200 corner: 381.0d@260 320@200 corner: 401.0d@260 345.0d@213.5d 320@230 334@230 160@240 180@240 corner: 258.0d@260 160@240 corner: 278.0d@260 184@254.5d 160@250 278.0d@250 258.0d@250 278.0d@250 corner: 278.0d@250 320@250 340@250 L a0= L D 341.0d LED sck SPI 13 Сброс 9600 arduinoIDE 212 1024 250747837 Arduino Uno 119858318