Урок 1 – управление светодиодами

STM32F4. Урок 1 – управление светодиодами

Этой статей, мы начинаем публикацию цикла материалов (состоящего из нескольких десятков статей), посвященных работе с микроконтроллерами семейства STM32. В основном, работа будет рассматриваться на примере отладочной платы STM32F4Discovery, но практически все примеры будут работоспособны на любом STM32 микроконтроллере.

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

  • LED4 (зеленый) подключается к PD12
  • LED3 (оранжевый) подключается к PD13
  • LED5 (красный) подключается к PD14
  • LED6 (синий) подключается к PD15

Требования:

  • Подключаемые модули CooCox-IDE : GPIO.
  • Поддерживаемые библиотеки: отсутствуют.

Перечисления:

typedef enum { LED_GREEN = 0, LED_ORANGE = 1 LED_RED = 2, LED_BLUE = 3
}LED_NAME_t; typedef enum { LED_OFF = 0, //Светодиод выключен LED_ON //Светодиод включен
}LED_STATUS_t;

Функции:

void UB_Led_Init(void); //Инициализация светодиодов
void UB_Led_On(LED_NAME_t led_name); //Включение светодиода
void UB_Led_Off(LED_NAME_t led_name); //Выключение светодиода
void UB_Led_Toggle(LED_NAME_t led_name); //Переключить светодиод
void UB_Led_Switch(LED_NAME_t led_name, LED_STATUS_t wert); //Инвертировать состояние светодиода

Пример использования:

//————————————————————–
// File : main.c
// Date : 10.02.2013
// Version : 1.0
// Author : UB
// EMail : mc-4u(@)t-online.de
// Web : www.mikrocontroller-4u.de
// CPU : STM32F4
// IDE : CooCox CoIDE 1.7.0
// Modules : CMSIS_BOOT, M4_CMSIS_CORE
// Function : Demo of the LED Library
// Reference: These two files must be written to 8MHz
// “cmsis_boot/stm32f4xx.h”
// “cmsis_boot/system_stm32f4xx.c”
//————————————————————– #include “main.h”
#include “stm32_ub_led.h” void Delay(volatile uint32_t nCount)
{ while(nCount–) { }
} int main(void)
{ SystemInit(); // Инициализация настроек кварца UB_Led_Init(); // Инициализация светодиодов UB_Led_On(LED_GREEN); // Включение зеленого светодиода while(1) { Delay(5000000); UB_Led_Toggle(LED_RED); // Мигание красным светодиодом }
}

Режим работы:

Зеленый светодиод горит постоянно; Красный светодиод мигает.

Библиотека, использованная в примере: stm32_ub_led.

Увеличение числа светодиодов:

Если вы хотите подключить дополнительные светодиоды или отключить неиспользуемые, необходимо:

  1. В файле “stm32_ub_led.h” все светодиоды должны быть указаны в перечислении “LED_NAME_t”, а “LED_ANZ” скорректировано с учетом числа используемых светодиодов.
  2. В файле “stm32_ub_led.с” в определении “LED_t” каждому светодиоду должны быть присвоены порты, пины микроконтроллера и начальное состояние.

В приложении проект CooCox отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.

Оригинал статьи

Прикрепленные файлы:

  • ub_stm32f4_led_v101_rus.rar (3 Кб)
  • Demo_01_Led_rus.rar (143 Кб)

Источник: http://cxem.net/mc/mc293.php

Ардуино: управление светодиодом

Как известно, первая программа, которую человек пишет при изучении программирования называется «Hello World!». Суть этой программы сводится к тому, чтобы после запуска на экране появилась указанная простая фраза.

В мире микроэлектроники, симметричной задачей смело можно назвать мигание светодиодом

Источник: http://robotclass.ru/tutorials/arduino-led/

Урок 5. Первая программа. Функции управления вводом/выводом. Кнопка, светодиод

В этом уроке напишем первую программу, научимся считывать значение цифровых входов и устанавливать состояние выходов. Реализуем управление такими простыми элементами, как кнопка и светодиод.

Предыдущий урок     Список уроков     Cледующий урок

Первая программа должна управлять светодиодом с помощью кнопки:

  • при нажатой кнопке светодиод светится;
  • при отжатой кнопке светодиод не светится.

Подключение кнопки и светодиода к плате Ардуино.

Для связи с внешними элементами в контроллере Arduino UNO существуют 14 цифровых выводов. Каждый вывод может быть определен программой как вход или выход.

У цифрового выхода есть только два состояния высокое и низкое. Высокое состояние соответствует напряжению на выходе порядка 5 В, низкое состояние – 0 В. Выход допускает подключение нагрузки с током до 40 мА.

Когда вывод определен как вход, считав его состояние, можно определить уровень напряжения на входе. При напряжении близком к 5 В (реально более 3 В) будет считано высокое состояние, соответствующее константе HIGH. При напряжении близком к 0 (менее 1,5 В) будет считано низкое состояние, или константа LOW.

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

Светодиод подключается через резистор, ограничивающий ток. Вот типичная схема.

Резистор рассчитывается по формуле I = Uвыхода – Uпадения на светодиоде / R.

Uвыхода = 5 В, Uпадения на светодиоде можно принять равным 1,5 В (более точно указывается в справочнике). Получается, то в нашей схеме ток через светодиод задан на уровне 10 мА.

Можете выбрать любой вывод, но я предлагаю для простоты соединений использовать светодиод, установленный на плате. Тот самый, который мигал в первом тестовом примере. Он подключен к цифровому выводу 13. В этом случае дополнительный светодиод к плате подключать не надо.

Кнопку подключаем к любому другому выводу, например, 12. Аппаратная часть схемы подключения кнопки должна обеспечивать уровни напряжений 0 В при нажатой кнопке и 5 В при свободной. Это можно сделать простой схемой.

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

Все выводы платы имеют внутри контроллера резисторы, подключенные к 5 В. Их можно программно включать или отключать от выводов. Сопротивление этих резисторов порядка 20-50 кОм.

Слишком много для реальных схем, но для нашей программы и кнопки, установленной вблизи контроллера, вполне допустимо.

В итоге схема подключения будет выглядеть так.

Кнопку можно припаять на проводах к разъему. Я установил ее на макетную плату без пайки. Купил специально для демонстрации уроков.

Функции управления вводом/выводом.

Для работы с цифровыми выводами в системе Ардуино есть 3 встроенные функции. Они позволяют установить режим вывода, считать или установить вывод в определенное состояние. Для определения состояния выводов в этих функциях используются константы HIGH и LOW, которые соответствуют высокому и низкому уровню сигнала.

pinMode(pin, mode)

Устанавливает режим вывода (вход или выход).

Аргументы: pin и mode.

  • pin – номер вывода;
  • mode – режим вывода.
 mode = INPUT вывод определен как вход, подтягивающий резистор отключен
 mode = INPUT_PULLUP вывод определен как вход, подтягивающий резистор подключен
 mode = OUTPUT вывод определен как выход

Функция не возвращает ничего.

digitalWrite(pin, value)

Устанавливает состояние выхода (высокое или низкое).

Аргументы pin и value:

  • pin – номер вывода;
  • value – состояние выхода.
 value = LOW устанавливает выход в низкое состояние
 value = HIGH устанавливает выход в высокое состояние

Функция не возвращает ничего.

digitalRead(pin)

Считывает состояние входа.

Аргументы:  pin – номер вывода.

Возвращает состояние входа:

 digitalRead(pin) = LOW  низкий уровень на входе
 digitalRead(pin) = HIGH  высокий уровень на входе

Программа управления светодиодом.

С учетом предыдущего урока теперь у нас есть вся необходимая информация для написания программы. Программа в Ардуино состоит из двух функций setup() и loop.

В setup() мы устанавливаем режимы выводов, а в loop() считываем состояние кнопки в переменную buttonState и передаем его на светодиод. По пути инвертируем, т.к.

при нажатой кнопке низкое состояние сигнала, а светодиод светится при высоком.

/* Программа scetch_5_1 урока 5
   Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */
 
boolean buttonState;   // создаем глобальную переменную buttonState
   
 void setup() {
  pinMode(13, OUTPUT);        // определяем вывод 13 (светодиод) как выход
  pinMode(12, INPUT_PULLUP);  // определяем вывод 12 (кнопка) как вход
}

//  бесконечный цикл
void loop() {
  buttonState = digitalRead(12);  // считываем состояние 12 входа (кнопки) и записываем в buttonState
  buttonState = ! buttonState;    // инверсия переменной buttonState
  digitalWrite(13, buttonState);  // записываем состояние из buttonState на выход 13 (светодиод)
}

Для хранения промежуточного значения состояния кнопки создаем переменную buttonState с типом boolean. Это логический тип данных. Переменная может принимать одно из двух значений: true (истинно) или false (ложно). В нашем случае – светодиод светится и не светится.

Скопируйте или перепишите код программы в окно Arduino IDE. Загрузите в контроллер и проверьте.

Для сохранения проектов Ардуино я создал папку d:Arduino ProjectsLessonsLesson5. В каждом уроке программы называю scetch_5_1, scetch_5_2, … Вы можете поступать также или ввести свою систему сохранения файлов.

Блок программы:

buttonState = digitalRead(12);  // считываем состояние 12 входа (кнопки) и записываем в buttonState
  buttonState = ! buttonState;    // инверсия переменной buttonState
  digitalWrite(13, buttonState);  // записываем состояние из buttonState на выход 13 (светодиод)

можно записать без использования промежуточной переменной buttonState.

digitalWrite(13, ! digitalRead(12) );

В качестве аргумента для функции digitalWrite() выступает  функция digitalRead(). Хороший стиль это именно такой вариант. Не требуются дополнительные переменные, меньше текст.

Т.е. функцию можно использовать как аргумент другой функции. Функции можно вызывать из функций.

Другой вариант этой же программы, использующий условный оператор if.

/* Программа scetch_5_2 урока 5
   Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */
  
void setup() {
  pinMode(13, OUTPUT);        // определяем вывод 13 (светодиод) как выход
  pinMode(12, INPUT_PULLUP);  // определяем вывод 12 (кнопка) как вход
}

//  бесконечный цикл
void loop() {
  if ( digitalRead(12) == LOW ) digitalWrite(13, HIGH);
  else digitalWrite(13, LOW);
}

В бесконечном цикле проверяется состояние вывода 12 (кнопка), и если оно низкое (LOW), то на выводе 13 (светодиод) формируется высокое состояние (HIGH). В противном случае состояние светодиода низкое (LOW).

Директива  #define.

Во всех примерах для функций ввода/вывода мы указывали аргумент pin, определяющий номер вывода, в виде конкретного числа – константы. Мы помнили, что константа 12 это номер вывода кнопки, а 13 – номер вывода светодиода. Гораздо удобнее работать с символьными именами. Для этого в языке C существует директива, связывающая идентификаторы с константами, выражениями.

Директива #define определяет идентификатор и последовательность символов, которая подставляется вместо идентификатора, каждый раз, когда он встречается в тексте программы.

В общем виде она выглядит так:

#define имя последовательность_символов

Если в наших программах мы напишем:

#define LED_PIN 13     // номер вывода светодиода равен 13

то каждый раз, когда в программе встретится имя LED_PIN, при трансляции вместо него будет подставлены символы 13. Функция включения светодиода выглядит так:

digitalWrite(LED_PIN, HIGH);

Окончательный вариант программы с использованием #define.

/* Программа урока 5
   Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */
  
#define LED_PIN 13     // номер вывода светодиода равен 13
#define BUTTON_PIN 12  // номер вывода кнопки равен 12

void setup() {
  pinMode(LED_PIN, OUTPUT);    // определяем вывод 13 (светодиод) как выход
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // определяем вывод 12 (кнопка) как вход
}

//  бесконечный цикл
void loop() {
  digitalWrite(LED_PIN, ! digitalRead(BUTTON_PIN) );
}

Обратите внимание, что после директивы #define точка с запятой не ставится, потому что это псевдо оператор. Он не совершает никаких действий.  Директива задает константы, поэтому принято имена для нее писать в верхнем регистре с разделителем – нижнее подчеркивание.

В следующем уроке будем бороться с дребезгом кнопки, разобьем программу на блоки и создадим интерфейс связи между блоками.

Предыдущий урок      Список уроков      Cледующий урок

Источник: http://mypractic.ru/urok-5-pervaya-programma-funkcii-upravleniya-vvodomvyvodom-knopka-svetodiod.html

Занятие №1. Простейшая программа

Дата публикации: 18 декабря 2010.

Рейтинг:  5 / 5

Угловые скобки < и > указывают компилятору, что подключаемые файлы нужно сначала искать в стандартной папке WinAvr с именем include. Двойные кавычки “ и “ указывают компилятору начинать поиск с директории, в которой хранится проект.

Для каждого типа микроконтроллера есть свой заголовочный файл. Для ATMega8 этот файл называется iom8.h, для ATtiny2313 – iotn2313.h.

В начале каждой программы мы должны подключать заголовочный файл того микроконтроллера, который мы используем. Но есть и общий заголовочный файл io.h.

Препроцессор обрабатывает этот файл и в зависимости от настроек проекта включает в нашу программу нужный заголовочный файл.

Для нас первая строчка программы будет выглядеть вот так:#include Любая программа на языке Си должна обязательно содержать одну главную функцию. Она имеет имя main. Выполнение программы всегда начинается с выполнения функции main. У функции есть заголовок – int main(void) и тело – оно ограниченно фигурными скобками {}.

int main(void)

{тело функции

}

В тело функции мы и будем добавлять наш код. Перед именем функции указывается тип возвращаемого значения. Если функция не возвращает значение – используется ключевое void.

int – это целое 2-х байтное число, диапазон значений от – 32768 до 32767

После имени функции в скобках () указываются параметры, которые передаются функции при ее вызове. Если функция без параметров – используется ключевое слово void. Функция main содержит в себе набор команд, настройки системы и главный цикл программы.

Далее настраиваем порт D на вход. Режим работы порта определяется содержимым регистра DDRD(регистр направления передачи информации). Записываем в этот регистр число “0x00” (0b0000000 – в двоичном виде), кроме кнопки к этому порту ничего не подключено, поэтому настраиваем весь порт D на вход.

Настроить порт поразрядно можно записав в каждый бит регистра числа 0 или 1 (0-вход, 1-выход), например DDRD = 0x81 (0b10000001) – первая и последняя линия порта D работают на выход, остальные на вход. Необходимо также подключить внутренний нагрузочный резистор.

Включением и отключением внутренних резисторов управляет регистр PORTx, если порт находится в режиме ввода. Запишем туда единицы.

Настраиваем порт B на выход. Режим работы порта определяется содержимым регистра DDRB. Ничего кроме светодиода к порту B не подключено, поэтому можно весь порт настроить на выход.

Это делается записью в регистр DDRB числа “0xFF”. Для того чтобы при первом включении светодиод не загорелся запишем в порт B логические нули.

Это делается записью PORTB = 0x00;

Для присвоения значений используется символ “=” и называется оператором присваивания, нельзя путать со знаком “равно”

Настройка портов будет выглядеть так:DDRD = 0x00;PORTD = 0xFF;DDRB = 0xFF;

PORTB = 0x00;

Пишем основной цикл программы. while (“пока” с англ.) – эта команда организует цикл, многократно повторяя тело цикла до тех пор пока выполняется условие, т. е пока выражение в скобках является истинным. В языке Си принято считать , что выражение истинно, если оно не равно нулю, и ложно, если равно.

Команда выглядит следующим образом:

while (условие)

{тело цикла

}

В нашем случае основной цикл будет состоять лишь из одной команды. Эта команда присваивает регистру PORTB инвертируемое значение регистра PORTD.

PORTB = ~PIND; //взять значение из порта D, проинвертировать его и присвоить PORTB (записать в PORTB)

// выражения на языке Си читаются справа налево

PIND регистр ввода информации. Для того, чтобы прочитать информацию с внешнего вывода контроллера, нужно сначала перевести нужный разряд порта в режим ввода. То есть записать в соответствующий бит регистра DDRx ноль.

Только после этого на данный вывод можно подавать цифровой сигнал с внешнего устройства. Далее микроконтроллер прочитает байт из регистра PINx. Содержимое соответствующего бита соответствует сигналу на внешнем выводе порта.

Наша программа готова и выглядит так:

#include int main (void) { DDRD = 0x00; //порт D – вход PORTD = 0xFF; //подключаем нагрузочный резистор DDRB = 0xFF; //порт B – выход PORTB = 0x00; //устанавливаем 0 на выходе while(1) { PORTB = ~PIND; //~ знак поразрядного инвертирования } }

В языке Си широко используются комментарии. Есть два способа написания.

/*Комментарий*/
//Комментарий

При этом компилятор не будет обращать внимание на то что написано в комментарии.

Если используя эту же программу и подключить к микроконтроллеру 8 кнопок и 8 светодиодов, как показано на рисунке 2, то будет понятно что каждый бит порта D соответствует своему биту порта B. Нажимая кнопку SB1 – загорается HL1, нажимая кнопку SB2 – загорается HL2 и т.д.

Рисунок 2

В статье были использованы материалы из книги Белова А.В. “Самоучитель разработчика устройств на AVR”

Печать E-mail

Авторизация

Сейчас 155 гостей и ни одного зарегистрированного пользователя на сайте

Источник: https://radioparty.ru/prog-avr/program-c/224-lesson1

Делаем управление светодиодом голосом с помощью Arduino

В этом уроке по Arduino мы покажем, как использовать мобильное приложение для Android и модуль Bluetooth HC-05 для голосового управления светодиодом.

Шаг 1: Комплектующие

Для этого урока нам понадобится минимум комплектующих. После того как вы сделаете урок – вы сможете усложнить схему и дополнить её устройствами по своему вкусу.

  • Arduino UNO
  • HC-05 Bluetooth Модуль
  • Макетная плата
  • Провода
  • 330 Ом резистор
  • Светодиоды (LED)

Шаг 2: Подключение модуля Bluetooth HC-05

Стандартный модуль Bluetooth HC-05 имеет шесть контактов. Однако в этом проекте мы будем использовать только 4.

Мы будем использовать вывод VCC, вывод GND, вывод TXD и вывод RXD. Вывод VCC модуля bluetooth подключается к + 3,3 В от Arduino. Вывод GND модуля подключается к GND Arduino (земля). Штырь TX модуля bluetooth соединяется с цифровым выводом 0 (RXD), а контакт RXD подключается к цифровому выходу 1 (TXD).

Шаг 3: Подключение светодиодов

Следующим шагом в создании светодиодов, управляемых голосом, является подключение светодиодов к Arduino через макет.

Сначала подключите короткий конец светодиода к земле. Затем подключите длинный конец каждого из светодиодов к резистору 330 Ом. Наконец, подключите сопротивление тока от светодиодов к цифровым контактам на Arduino.

В этом проекте мы будем подключать один светодиод к цифровому выводу 2, другой – к цифровому выходу 3, а последний светодиод – к цифровому выходу 4.

Шаг 4: Питание

Для этого проекта мы можем подавать питание на Arduino через любой источник питания + 5 В. Вы можете использовать USB-порт со своего компьютера для питания Arduino, но в этом проекте мы будем использовать портативную батарею 5В. Прежде чем подключать источник питания к вашему Arduino, убедитесь, что GND Arduino подключен к земле макетной платы.

Шаг 5: Код

Код для нашего проекта ниже.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 #include 'SoftwareSerial.h' //Replace (' ') with (< >)SoftwareSerial BLU(0,1);String voice;int Green = 4; //Connect To Pin #4int Yellow = 2; //Connect To Pin #2int Red = 3; //Connect To Pin #3void allon(){digitalWrite(Red, HIGH);digitalWrite(Yellow, HIGH);digitalWrite(Green, HIGH);}void alloff(){digitalWrite(Red, LOW);digitalWrite(Yellow, LOW);digitalWrite(Green, LOW);}void setup(){Serial.begin(9600);BLU.begin(9600);pinMode(Red, OUTPUT);pinMode(Yellow, OUTPUT);pinMode(Green, OUTPUT);}void loop(){while (Serial.available()) //Check if there is an available byte to read{ delay(10); //Delay added to make thing stablechar c = Serial.read(); //Conduct a serial readif (c == '#'){break; //Exit the loop when the # is detected after the word}voice += c;}if (voice.length() > 0){if(voice == “*turn on all LED”){allon();}else if(voice == “*turn off all LED”){alloff();}else if(voice == “*switch on red”){digitalWrite(Red,HIGH);}else if(voice == “*switch on yellow”){digitalWrite(Yellow,HIGH);}else if(voice == “*switch on green”){digitalWrite(Green,HIGH);}else if(voice == “*switch off red”){digitalWrite(Red,LOW);}else if(voice == “*switch off yellow”){digitalWrite(Yellow,LOW);}else if(voice == “*switch off green”){digitalWrite(Green,LOW);}voice=””; //Reset variable}}

Шаг 6: Использование мобильного приложения

Вы можете начать тестировать свой проект, загрузив приложение для Android – BT Voice Control для Arduino (BT Voice Control for Arduino), созданное SimpleLabsIN.

После того как вы скачали и установили приложение на свой телефон на базе Android нажмите на строку меню в правом верхнем углу и выберите «Подключить робота». В появившемся новом окне выберите модуль Bluetooth HC-05 и подключите его.

Теперь, когда вы говорите с помощью определенных команд из кода на свое устройство через приложение, определенные светодиоды должны включаться и выключаться. Посмотрите внимательнее на код, где указаны команды и поставьте свои. Например, вместо “*switch on red” можно просто указать “red”. Так команды будут быстрее, короче и понятнее.

Шаг 7: Итоговый результат

Итоговый результат можно посмотреть на видео ниже.

Желаем вам успешных проектов! Не забывайте оставлять комментарии на проект в нашей группе ВКонтакте или здесь.

Больше интересного ↓

Источник: https://ArduinoPlus.ru/upravlenie-svetodiodom-golosom-arduino/

Урок 3. Часть 1. Управление яркостью светодиода программным методом

Источник: http://gm-project.ucoz.com/publ/arduino_s_nulja/rabota_s_arduino/urok_3_chast_1_upravlenie_jarkostju_svetodioda_programmnym_metodom/5-1-0-21

Урок 1. Мигающий светодиод на Arduino

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

Светодиод — это полупроводниковый прибор, трансформирующий электроток в видимое свечение.

И на основе свечения светодиода мы будем работать и рассматривать основу программирования Arduino. Перейдем непосредственно к практике Для начала нам нужно приготовить необходимый набор предметов для работы!

Для начала работы нам понадобятся такие компоненты

  • плата Arduino
  • Breadboard (макетная плата для удобного подключения приборов к Arduino)
  • Провода
  • светодиод
  • резистор

Также вам потребуется программа Arduino IDE, которую можно скачать с официального сайта Arduino.

Данные комплектующие можно приобрести на официальном сайте или в интернет-магазине AliExpress или Амперка.

Спросите вы, что такое Breadboard ?

Breadboard– макетная (монтажная) беспаечная плата. Breadboard представляет из себя сетку из гнезд, которые обычно соединяются так:

Далее, когда мы приготовили все компоненты к работе и установили программу на ПК , нам следует правильно их подключить . Подключать нужно очень внимательно, чтобы все компоненты остались целыми и невредимыми.

Схема подключения светодиода к Arduino

Не забудьте проверить “+” и “-” у светодиода. Минус у светодиода можно отличить двумя способами :

  • У “минуса” на светодиоде по стандарту ножка вывода длиннее чем у плюса.
  • Если вы внимательно всмотритесь в светодиод, то можете увидеть своеобразный флажок, так вот, где флажок там и “минус” светодиода.

После правильного подключения перейдем к этапу программирования

/*
Зажигаем светодиод на одну секунду, затем выключаем его на
одну секунду в цикле.

*/
int led = 8;
/*объявление переменной целого типа, содержащей номер порта к которому мы подключили провод */
void setup() {
/* Инициализируем объявление используемого порта вход/выход в режиме выхода.

*/
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH); // зажигаем светодиод
delay(1000); // ждем секунду
digitalWrite(led, LOW); // выключаем светодиод
delay(1000); // ждем секунду
}

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

Перейдем к пояснению нашего скетча (кода)

С начала в нашем скетче мы объявили переменную int led = 8; .

Мы таким образом заявили, что хотим иметь ячейку памяти, к которой будем обращаться по имени led и изначально, при старте Arduino, в ней должно лежать значение 8 пина.

Перед именем переменной в определении указывается тип данных для этой переменной. В нашем случае — это int , что означает «целое число» (int — сокращение от английского «integer»: целочисленный).

Процедура setup выполняется один раз при запуске микроконтроллера. Обычно она используется для конфигурации портов микроконтроллера и других настроек. В нашем случае мы указали, что наш светодиод на 8 выходе . “pinMode(led, OUTPUT);” Хотелось бы сказать, что Arduino выполняет с начала действие setup , а далее выполняет действие другой процедуры, про которую мы сейчас поговорим.

После выполнения setup запускается процедура loop, которая выполняется в бесконечном цикле . Именно этим мы пользуемся в данном примере, чтобы маячок мигал постоянно.

Процедуры setup и loop должны присутствовать в любой программе (скетче), даже если вам не нужно ничего выполнять в них — пусть они будут пустые, просто не пишите ничего между фигурными скобками. Запомните, что каждой открывающей фигурной скобке { всегда соответствует закрывающая } .

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

Вскоре вы будете понимать, где они нужны, а где нет.

Функция digitalWrite(pin, value) не возвращает никакого значения и принимает два параметра: pin — номер цифрового порта, на который мы отправляем сигнал value — значение, которое мы отправляем на порт.

Для цифровых портов значением может быть HIGH (высокое, единица) или LOW (низкое, ноль) Если в качестве второго параметра вы передадите функции digitalWrite значение, отличное от HIGH , LOW, 1 или 0, компилятор может не выдать ошибку, но считать, что передано HIGH. Будьте внимательны Обратите внимание, что использованные нами константы: INPUT, OUTPUT, LOW, HIGH, пишутся заглавными буквами, иначе компилятор их не распознает и выдаст ошибку. Когда ключевое слово распознано, оно подсвечивается синим цветом в Arduino IDE

Задачи для самостоятельного решения, для укрепления материала

1) Измените скетч так, чтобы светодиод светился 3 секунды, а пауза между свечением была 0.5 секунды.

2) Измените скетч так, чтобы светодиод ,при включении Arduino, горел непрерывно 4 секунды (подсказка: сделайте это с помощью процедуры setup ), а потом продолжал мигать в интервале, который мы должны были задать в первом задании .

Источник: http://helpduino.ru/svetodiod.html

Урок 1. arduino и мигающий светодиод

Принципиальная схема к уроку 1. Arduino и Мигающий светодиод

LEDs (light-emitting diodes) — по русски Светоизлучающий диод, используется во многих электронных устройствах. При прохождении через его кристалл ток вызывает свечение, которое усиливается оптическим колпачком-линзой.

Его неоспоримые достоинства — быстрое включение, высокая прочность, длительный срок службы, экологичность. Как правило используется как световой индикатор включения — переключения, а также отображение режимов работы.

Делятся светодиоды на две группы — Монохромные (одноцветные) и RGB (многоцветные).

Мы начнем наше знакомство с платой Arduino с самого простого опыта, который называется Мигающий Светодиод. В этом опыте мы попробуем заставить Arduino помигать нам приветственно светодиодом. Да, да, вы не ослышались, именно заставим, потому что мы обладаем всей полнотой власти над этой маленькой, но очень мощной платой под названием Arduino.

Для первого опыта вам понадобится:

Плата Arduino UNO — 1 шт.

Резистор 330ом. (можно использовать подходящие от 200 ом до 550 ом) — 1 шт. На корпусе резистора нанесены цветовые полоски, они указывают его номинал, мощность и т.д* На резисторе 330 ом. полоски должны быть Оранжевая, Оранжевая, Коричневая.

Светоизлучающий диод — 1 шт.

Макетная плата — 1 шт.

Соединительные провода.

Вы должны собрать проект по электрической принципиальной схеме на первом рисунке.  В качестве подсказки и полноты понимания у вас есть следующий рисунок, который вам поможет разобраться куда, как и что подключается. Какме цветом брать провода, как правильно вставить детали.

Схема соединений урока №1. Arduino и Мигающий светодиод

Скачайте и распакуйте архив с программой урока, подсоедините ардуино к компьютеру с помощью USB шнура, запустите скетч урока № 1, дважды щелкнув по файлу lesson_01.

ino, после этого у вас должна запустится среда программирования ArduinoIDE, в окне которой будет показан текст программы с многочисленными коментариями и пояснениями на русском языке.

Внимательно прочитайте весь sketch от начала до конца, а затем загрузите программу в Arduino с помощью кнопки ЗАГРУЗИТЬ, или UPLOAD, в зависимости от языка программы.

Набор для экспериментов ArduinoKit
Код программы для опыта №1: sketch 01

Что-то подобное должно получиться у вас:

В результате, после заливки программы в ардуино вы должны увидеть подмигивающий светодиод, который как бы говорит «Привет, Мир!». Если этого не произошло и светодиод не светится, вам необходимо проверить правильность соединения проводов. Правильность полярности светодиода +, -. Правильность полярности шин питания.

P.S. Таблица цветовой маркировки резисторов:

Таблица цветовой маркировки резисторов

Всем удачи! Ждём ваши комментарии к ARDUINO УРОК 1 МИГАЮЩИЙ СВЕТОДИОД.

Источник: http://arduinokit.ru/arduino/lessons-arduino/urok-1-arduino-migayushchij-svetodiod.html

Управление большим количеством светодиодов через Binary Angle Modulation

Вот приспичило вам сделать себе могучую светодиодную хреновину, чтобы моргала и переливалась. Да еще в RGB и плавненько так. Собрали вы это дело, поглядели на количество каналов которыми нужно рулить и призадумались…
 

▌А что не так с ШИМ?
Да все с ним хорошо, только аппаратных каналов обычно всего несколько штук. А программный ШИМ имеет ряд недостатков. Да, можно взять и на базе алгоритма управления кучей сервомашинок, используя всего один таймер собрать многоканальный ШИМ, но сколько у нас будет вызовов прерываний?
 

 

Каждый отдельный фронт потребует своего прерывания на смену уровня. А представьте, что у нас этих каналов будет не 4, а 40? Или 400? Да контроллер из прерываний вылезать не будет. Прерывания будут налезать друг на друга, порождая джиттер. Не говоря уже о том, что все эти каналы надо будет при любом изменении скважности заново сортировать по длительности. В общем, тупилово будет еще то.
 

▌Нас спасет BAM Но решение есть. Зовется этот метод BAM. Суть его в том, что мы включаем нагрузку импульсами, поразрядно, с длительностью равной весу разряда.

 

В результате мы имеем высокую дискретность, но при этом у нас всего 7 прерываний на любое число каналов. Соответственно разрядам.

 

Интегрируется все аналогично обычному ШИМу. Но есть ряд нюансов:

  1. Частота плавает и на малых разрядах она повышается. Для светодиода или грелки это наплевать. А вот двигатель или еще какую нагрузку с реактивными элементами вроде обмоток или емкостей я бы таким сигналом питать не стал.
  2. При переходе с малых весов к одному большому наблюдается мерцание. Но с этим можно бороться, подробности ниже.
  3. Выдавать вес лучше с большего к меньшему, так меньше заметно влияние второго пункта.

 

▌Код Концепция ясна, попробуем замутить прогу которая это реализует.

Начнем с автомата который формирует временные интервалы. Все реализации которые я видел, использовали массив выдержек, что загружались в таймер.

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

И байт с битом в нужном разряде автоматически становится правильной временной выдержкой.
 

Поэтому нам для всего этого хватит таймера в режиме СТС и одного прерывания OCR. Поглядим даташит на ATMega16A, раздел 8-bit Timer/Counter0 with PWM.
 

Там есть такая вот картинка:

 

То что нужно!
 

Дальше работать будет до смешного просто. Мы загружаем в OCR0 число 0b10000000 и запускаем таймер. А в прерывании по OCR сдвигаем это число по кругу направо, получая автоматом 0b01000000 -> 0b00100000 -> 0b00010000 -> 0b00001000 и так далее. Попутно у нас получается маска для выбора бита из массива. И все это само. Красота же 🙂
 

Вот код автомата времени:

Иногда, при конструировании устройства, нужно применять плавное увеличение яркости, или наоборот – плавное ее уменьшение.

В данной серии уроков, мы поможем вам разобраться с этим вопросом. И подробно расскажем о всех тонкостях данного процесса. 

Есть большое количество способов реализации подобной идеи. Мы расскажем вам о трех основных, это:

  1. Программный метод управления яркостью (рассматривается в данном уроке);
  2. Управление яркостью с помощью фоторезистора (яркость управляется автоматически, в зависимости от освещения);
  3. Управление яркостью с помощью переменного резистора (ручной метод изменения яркости).

Все три пункта будут разделены на три части соответственно. В данном уроке мы разберем первый пункт – управление яркостью светодиода программным методом. 

Суть метода хотелось бы пояснить на небольшом, но очень актуальном примере:

Имеется кинотеатр. Во время всего сеанса, свет в зале выключен, и зрители смотрят фильм. Как только фильм заканчивается, по сути, должен включаться свет. Если он включится резко, то это очень негативно скажется на зрении зрителей.

Поэтому в большинстве кинотеатров, такая ситуация предусмотрена. После сеанса, свет включается плавным нарастанием яркости.

Вот чтобы достичь такого эффекта, с помощью Arduino, или других цифровых устройств, рациональнее будет использовать изменение яркости программным методом. 

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

Теперь давайте подробнее разберем данный способ.

В основе метода лежит широтно-импульсная модуляция, она же ШИМ. Если вы не сталкивались с этим понятием, или не понимаете его суть, то советую для начала прочитать эту статью.

Для этого урока понадобятся следующие компоненты:

Подключаем светодиоды к Arduino по схеме представленной ниже:

Та же самая схема, только в другом представлении:

Вы можете использовать любой пин Arduino, в номере которого имеется знак тильды “~”. Именно в этих пинах может использоваться ШИМ. 

Схема в сборе:

Теперь, когда схема собрана. Перейдем в программную часть. 

Суть метода состоит именно в том, что алгоритм изменения яркости светодиода будет заложена в программе, и в процессе выполнения, мы уже никак не сможем влиять на работу нашего устройства. 

Открываем программу Arduino IDE и пишем следующий код:

int led_1 = 3; //Номер пина первого светодиода void setup() { pinMode (led_1 , OUTPUT); //режим пина led_1 на выход
} void loop() { analogWrite (led_1 , 20); //Выставляем значение уровня пина led_1 равный 20 delay (400); //Выжидаем паузу в 400мс analogWrite (led_1 , 50); //Выставляем значение уровня пина led_1 равный 50 delay (400); //Выжидаем паузу в 400мс analogWrite (led_1 , 110); //Выставляем значение уровня пина led_1 равный 110 delay (400); //Выжидаем паузу в 400мс analogWrite (led_1 , 170); //Выставляем значение уровня пина led_1 равный 170 delay(400); //Выжидаем паузу в 400мс analogWrite (led_1 , 230); //Выставляем значение уровня пина led_1 равный 230 delay(400); //Выжидаем паузу в 400мс analogWrite (led_1 , 255); //Выставляем значение уровня пина led_1 равный 255 delay(400); //Выжидаем паузу в 400мс
}

Как мы видим, появилась новая функция analogWrite(pin , value). Функция выдает аналоговую величину (value) на порт вход/выхода (pin).

  • pin: порт вход/выхода на который подаем ШИМ сигнал.
  • value: период рабочего цикла значение между 0 (полностью выключено) и 255 (сигнал подан постоянно).

Таким образом, с помощью данной функции, мы можем контролировать яркость нашего светодиода, подавая значения от 0 (минимум 0В) до 255 (максимум 5В).

Если пробежаться по алгоритму, то мы видим, что в начале мы выставляем значение уровня нашего пина равное 20.

analogWrite (led_1 , 20);

Потом, через небольшую задержку (400мс),

delay (400);

мы изменяем уровень на 50,

analogWrite (led_1 , 50);

и потом через задержку до уровня 255.

После того, как уровень стал равен 255 (соответствующее максимальному значению 5В),

analogWrite (led_1 , 255);

происходит задержка, после чего программа переходит в начало. И все повторяется снова. 

Видео работы такого устройства:

Если посмотреть внимательно, то переходы с одного уровня на другой, сопровождаются небольшими скачками. Есть несколько способов, чтобы избавиться от такого эффекта.  

  1. Для этого можно использовать маленькую задержку (что не всегда хорошо);
  2. Можно добавить промежуточные значения яркости.

Первый пункт, в связи с нерациональностью, мы использовать не будем. Перейдем сразу ко второму способу. 

Мы можем добавить в наш код еще несколько подобных строк:

analogWrite (led_1 , value); delay (400);

с разными значениями уровня. Чем больше таких уровней, тем более плавный будет переход.

Это все конечно же хорошо. Но сколько таких строк мы добавим? Пять? Десять? Этот способ нам не подходит, хотя бы потому, что большое количество таких строк, повлечет за собой трату памяти нашего контроллера. И не всегда эффект от такого способа будет хороший. 

Поэтому делаем следующее:

добавьте следующий код в новом проекте Arduino IDE (или измените старый):

int led_1 = 3; //Номер пина первого светодиода void setup() { pinMode (led_1 , OUTPUT); //режим пина led_1 на выход
} void loop() { for (int i = 0; i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include
#include
#include
#include
 
 
// Макросы циклических сдвигов
#define ROL(x) ((x > 7))
#define ROR(x) ((x >> 1) | (x

Источник: http://easyelectronics.ru/upravlenie-bolshim-kolichestvom-svetodiodov-cherez-binary-angle-modulation.html

Ардуино учебный курс Урок 7 ШИМ управление светодиодом

   
Включение и выключение светодиодов – это конечно круто, но теперь давайте сделаем так, чтобы наш светодиод включался плавно и постепенно. Для этого используем функцию analogWrite () ;

.Отсоедините USB-кабель и удалите из макетки всё, кроме первого светодиода. Потом переместите его желтый провод а на контакт 9 платы Arduino.  

  
Ссылка на эту симуляцию на Autodesk Tinkercad

    Скопируйте / загрузите код из модуля Tinkercad Circuits или откройте скетч в примерах программного обеспечения Arduino в меню File -> Examples -> 01.Basics -> Fade    Подключите плату в USB и загрузите скетч в плату Arduino Uno. После этого наблюдаем за тем, как светодиод плавно включается и затухает.    Давайте посмотрим на код, чтобы узнать, как был достигнут этот эффект.  В этих строках бъявляются три переменные, используемые в программе:int led = 9;           // the PWM pin the LED is attached toint brightness = 0;    // how bright the LED isint fadeAmount = 5;    // how many points to fade the LED by

Процедура Setup настраивает вывод 9 как выход:

void setup() {  // declare pin 9 to be an output:  pinMode(led, OUTPUT);}analogWrite (); устанавливает контакт 9 в зависимости от содержимого переменной  brightnessв течение заданного времени.analogWrite(led, brightness);

В следующей строке кода яркость увеличивается на 5 (

fadeAmountbrightness = brightness + fadeAmount;

Далее в коде используется оператор

if для проверки содержимого пересенной brightnessс использованием операторов сравнения.if (brightness = 255) {    fadeAmount = -fadeAmount;  }
Если brightness меньше или равно ( =) 255, то выполняется код внутри фигурных скобок, иначе этот участок кода просто пропускается. Таким образом, этот код увеличивает brightness до тех пор, пока значение не достигнет или не привысит 255, а затем устанавливает fadeAmount и -5 и уменьшает brightness , пока brightnessне достигнет нуля (или станет меньше нуля).delay(30);Эта строка создает задержку в 30 миллисекунд, для того, чтобы уменьшить скорость выполнения кода, и чтобы наш глаз смог увидеть эффект. Попробуйте изменить значение fadeAmount и загрузить код в свою плату. Как изменение этой переменной влияет на видимый эффект затухания?

Плата Arduino способна генерировать цифровые сигналы (HIGH и LOW), но

analogWrite (); имитирует появление промежуточных яркостей между включенным и отключенным состояниями светодиода. Такой метод назывется широтно-импульсной модуляцией (ШИМ, PWM). Светодиод мигает очень быстро, и ваш глаз, из-за инерционности зрения, воспринимает это как постоянный свет. Соотношение времени, в течение которого светодиод включен ко времени, когда он находится в выключенном состоянии определяет видимую яркость его свечения. Только определенные контакты платы способны генерировать ШИМ, и на плате Ардуино они помечены значком ~около  номера пина. PWM также может использоваться для управления скоростью двигателя постоянного тока, что мы с вами и сделаем в одном из последующих уроков.

Следующий урок…  

Источник: https://musbench.com/e_digital/arduino_class7.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}