CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Программирование 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 )
  • 0
  • 6 июля 2009, 12:20
  • admin

Комментарии (5)

RSS свернуть / развернуть
+
0
в описании функции max(x,y) явные косяки
avatar

vruzh

  • 7 января 2011, 23:45
+
0
спасибо! пофиксил.
avatar

noonv

  • 8 января 2011, 00:22
+
0
Согласно этой странице официальный сайт
Serial.print() и Serial.println() в настоящее время ПОДДЕРЖИВАЮТ печать типа float.

Serial.print(1.23456) дает на печать "1.23" 
avatar

vruzh

  • 8 января 2011, 01:39
+
0
спасибо! данное замечание было верно на момент написание материала.
avatar

noonv

  • 8 января 2011, 09:47

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.