Программирование Arduino — дополнительные функции ввода/вывода


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

5. Дополнительные функции ввода/вывода сигнала

Рассмотрим дополнительные специфичные функции Arduino для ввода-вывода сигнала.

void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);

Вызов:

tone(порт, частота, длительность);

Описание:
Генерирует на выходе порта сигнал — прямоугольную «волну», заданной частоты (в Герцах) и с 50% рабочим циклом. Длительность сигнала можно задать параметром (в милисекундах), иначе сигнал будет генеририровать до тех пор, пока не будет вызвана функция noTone(). Для воспроизведения сигнала, к порту может быть подключен пьезоизлучатель или динамик.

Параметры:
порт: номер порта ввода-выхода, на котором будет генерироваться сигнал
частота: частота сигнала в Герцах
длительность: длительность сигнала в миллисекундах

Пример:

tone(12, 2400); // выдаём на 12 пине сигнал с частотой 2400 Гц

Примечание:
Одновременно может воспроизводиться только один сигнал. Если на одном порту, сигнал уже воспроизводится, то новый вызов tone() на другом порту ничего не даст, но если вызвать tone() на том же порту, то будет установлена новая частота сигнала.
Использование функции tone() помешает использовать ШИМ на портах 3 и 11 (кроме платы Arduino Mega).

void noTone(uint8_t _pin);

Вызов:

noTone(порт);

Описание:
Останавливает сигнал, генерируемый на порту вызовом функции tone(). Если сигнал не генерировался, то вызов noTone() ничего не даст.

Параметры:
порт: номер порта, на котором генерируется сигнал

Пример:

noTone(12); // останавливаем генерацию сигнала на 12 пине

Примечание:
Если необходимо генерировать сигналы на разных портах, то сначала следует остановить один сигнал функцией noTone(), а затем запускать генерацию нового сигнала на другом порту функцией tone().

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val);

Описание:
Сдвиг байта данных по одному биту за раз. Начиная с младшего бита или (реже) старшего бита. Каждый бит записывается в порт dataPin, после чего порт clockPin переключается, сигнализируя, что данные установлены.
Эта методика передачи данных широко применяется для обмена данными между микроконтроллером, сенсорами и другими микроконтроллерами. (SPI)

Код (\hardware\cores\arduino\wiring_shift.c):

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val)
{
	int i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
}

Параметры:
dataPin: порт для вывода бит (int)
clockPin: порт изменяющий своё состояние после установки данных dataPin (int)
bitOrder порядок сдвига бит; MSBFIRST или LSBFIRST.
(Most Significant Bit First или Least Significant Bit First (Little Endian - порядок от младшего к старшему ))

value: байт данных для сдвига (byte)

Примечание:
Порты dataPin и clockPin уже должны быть сконфигурированы на вывод функцией pinMode().

Пример:

 
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  for (int j = 0; j < 256; j++) {
    shiftOut(dataPin, clockPin, LSBFIRST, j);
}

unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);

Вызов:

pulseIn(порт, значение, таймаут); 

Описание:
Считывает импульс (высокий или низкий) c цифрового порта и возвращает продолжительность импульса в микросекундах, импульс ожидается в течении таймаута(если не указать - будет ждать 1с)

Например, если параметр «значение» при вызове функции установлен в HIGH, то pulseIn() ожидает, когда на порт поступит высокий уровень сигнала. С момента его поступления начинается отсчет времени до тех пор, пока на порт не поступит низкий уровень сигнала. Функция возвращает длину импульса (высокого уровня) в микросекундах. Работает с импульсами от 10 микросекунд до 3 минут. Обратите внимание, что эта функция не будет возвращать результат, пока импульс не будет обнаружен или пока не истечёт таймаут (по умолчанию 1с)

Параметры:
порт: номер порта, с которого считываем импульс

значение: тип импульса HIGH или LOW

таймаут: время в микросекундах в течении которого ждать импульс, опция, по умолчанию 1с

Возвращаемое значение: возвращает длительность импульса в микросекундах (тип int)

Пример:

  int duration; // объявление переменной duration типа int
  duration = pulseIn(pin, HIGH); // измеряем длительность импульса

читать далее: 6. Работа со временем

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


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

Arduino

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

Разделы

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

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

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

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