Программирование Arduino — математические функции


1. Программирование Arduino — введение
2. Структура программы, константы
3. Цифровой ввод/вывод
4. Аналоговый ввод/вывод
5. Дополнительные функции ввода/вывода
6. Работа со временем

7. Математические

рассмотрим специфичные математические функции Arduino

min(x, y)

Описание:
Возвращает меньшее из двух чисел

Код:

#define min(a,b) ((a)<(b)?(a):(b))

Параметры:
x: первое число
y: второе число

Возвращаемое значение:
Меньшее число из двух

Пример:

sensVal = min(sensVal, 100); // sensVal не меняет значения, если он меньше 100
                                   // получается, что sensVal не сможет превысить 100.

Примечание:
т.к. min(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Например:

min(a++, 100);   // возможен неправильный результат

лучше так:

a++;
min(a, 100);  

max(x, y)

Описание:
Возвращает большее из двух чисел

Код:

#define max(a,b) ((a)>(b)?(a):(b))

Параметры:
x: первое число
y: второе число

Возвращаемое значение:
Большее число из двух

Пример:

sensVal = max(sensVal, 20); // sensVal не меняет значения, если он больше 20
                                  // получается, что sensVal не сможет быть меньше 20.

Примечание:
т.к. max(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Например:

max(a--, 0);   // возможен неправильный результат

лучше так:

a--;
max(a, 0);  

abs(x)

Описание:
Возвращает модуль (абсолютную величину) числа. (http://ru.wikipedia.org/wiki/Модуль_числа)

Код:

#define abs(x) ((x)>0?(x):-(x))

Параметры:
x: число

Возвращаемое значение:
x: если x больше или равен 0.
-x: если x меньше 0.

Примечание:
т.к. abs(x) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Например:

abs(a++);   // возможен неправильный результат

лучше так:

a++;
abs(a);  

constrain(x, a, b)

Описание:
Проверяет находится ли число x в диапазоне (a,b)

Код:

#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))

Параметры:
x: число для проверки
a: нижняя грань диапазона
b: верхняя грань диапазона

Возвращаемое значение:
x: если x лежит между a и b
a: если x меньше, чем a
b: если x больше, чем b

Пример:

sensVal = constrain(sensVal, 10, 150); // ограничиваем интервал значений сенсора между 10 и 150

map(value, fromLow, fromHigh, toLow, toHigh)

Описание:
Отображает число из одного диапазона в другой.

Код (\hardware\cores\arduino\WMath.cpp):

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Примечание:
Функция не проверяет – содержится ли число в необходимом диапазоне, поэтому можно вызвать функцию constrain() перед или после функции map().
Так же, "нижняя граница " диапазонов может быть больше или меньше, чем "верхняя граница", т.о. функция map() может быть использована, чтобы перевернуть диапазон чисел, например:

y = map(x, 1, 50, 50, 1); 

функция так же может оперировать с отрицательными числами:

y = map(x, 1, 50, 50, -100); 

Функция map() оперирует целыми числами, поэтому никаких десятичных значений не выдаётся. Дробные остатки отсекаются, а не округляются или усредняются.

Параметры:
value: число для отображения
fromLow: нижняя граница текущего диапазона числа value
fromHigh: верхняя граница текущего диапазона числа value
toLow: нижняя граница целевого диапазона
toHigh: верхняя граница целевого диапазона

Возвращаемое значение:
Целое число типа long

Пример:

/* отображает аналоговое значение к 8 битам (диапазон от 0 до 255) */
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);

pow(base, exponent)

Описание:
Функция предназначена для возведения числа в заданную степень.

Параметры:
base: число(float)
exponent: степень(float)

Возвращаемое значение:
Результат возведения в степень (double)

Пример:
http://arduino.cc/playground/Main/Fscale

sq(x)

Описание:
Вычисляет квадрат числа: число умноженное на себя.

Код:

#define sq(x) ((x)*(x))

Параметры:
x: число

Возвращаемое значение:
Квадрат числа

sqrt(x)

Описание:
Вычисляет квадратный корень числа.

Параметры:
x: число

Возвращаемое значение:
Квадратный корень числа, тип double

Тригонометрия

sin(rad)

Описание:
Вычисляет синус угла (в радианах). Результат будет между -1 и 1.

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Синус угла, тип double

Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.

cos(rad)

Описание:
Вычисляет косинус угла (в радианах). Результат будет между -1 и 1.

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Косинус угла, тип double

Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.

tan(rad)

Описание:
Вычисляет тангенс угла (в радианах). Результат будет между плюс и минус бесконечностью 🙂

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Тангенсс угла, тип double

Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.

читать далее: 8. Псевдослучайные числа

Ссылки
http://arduino.cc/en/Reference/HomePage (или же в каталоге ArduinoIDE \reference\HomePage.html )


4 комментария на «“Программирование Arduino — математические функции”»

    • спасибо! данное замечание было верно на момент написание материала.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака телеприсутствие управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение