Почта
Диск
     

Цифровой ввод-вывод

Модули Arduino имеют контакты D0, D1, D2, D3..., предназначенные для ввода или вывода цифровых сигналов ("логический ноль" = 0 В, "логическая единица" = +5 В). Перед использованием цифрового контакта необходимо перевести его в режим измерения входного сигнала или режим генерации сигнала. Для этого служит команда pinMode(). В качестве аргументов команды указывается номер контакта и режим (INPUT или OUTPUT).
Для подачи на контакт логического нуля или единицы используется команда digitalWrite(), которой в качестве аргументов передается номер цифрового контакта и логический уровень (LOW или HIGH).
Ниже представлен пример управления светодиодом, подключенным к цифровому контакту номер D6 (+) и контакту GND (-). При подаче на контакт +5 В светодиод загорается, а при подаче 0 В - гаснет. Чередование включений и выключений светодиода приводит к эффекту "световой сигнализации".
void setup() {
    pinMode(5, OUTPUT);
}

void loop() {
    digitalWrite(5, HIGH);
    delay(100);
    digitalWrite(5, LOW);
    delay(100);
    digitalWrite(5, HIGH);
    delay(100);
    digitalWrite(5, LOW);
    delay(700);
}
В случае, когда необходимо плавно менять яркость свечения светодиода, можно использовать фукнцию analogWrite(), которая чередует на выходе уровни логического нуля и единицы с частотой 490 Гц и скважностью, задаваемую кодом в диапазоне от 0 до 255 ("0" - скважность 0, "127" - скважность 0.5, "255" - скважность 1.0). Функция работает с цифровыми контактами 3, 5, 6, 9, 10 и 11 (на Arduino Mega на контактах 2-13 и 44 - 46).
int pinLED = 5;
int value;

void setup() {
    pinMode(pinLED, OUTPUT);
}

void loop() {

    for(int i=0; i<180; i++) {
        value = int(255*sin(i*3.1415/180.0));
        analogWrite(pinLED, value);
        delay(30);
    }
    digitalWrite(pinLED, LOW);
    delay(800);
}

Для измерения продолжительности времени, в течении которого цифровой сигнал на входе находится либо в состоянии логического нуля, либо логической единицы, служит команда pulseIn(). В качестве аргументов команде передается номер цифрового контакта и логический уровень, длительность которого необходимо измерить. Примером использования этой функции является работа с ультразвуковым датчиком расстояния HC-SR04, который имеет два управляющих сигнлала: TRIG служит для включения ультразвукового передатчика, ECHO предназначен для измерения времени прохождения сигнала от передатчика до приемника (устанавливается в логическую единицу при включении передатчика и переходит в логический ноль при приеме отраженного сигнала приемником).
//////////////////////////////////////
// Датчик HC-SR04
//////////////////////////////////////
// VCC   -> +5 В
// TRIG  -> 2
// ECHO  -> 4
// GND   -> GND

// Номера цифровых контактов
const int TRIG = 2;
const int ECHO = 4;

// Скорость звука в воздухе, м/с
float c = 340.0;

void setup() {

    // Задаем режим цифровых контактов
    pinMode(TRIG, OUTPUT);
    pinMode(ECHO, INPUT);
     
    // Инициализируем последовательный интерферс на скорости 9600 бод
    Serial.begin(9600);
}


void loop() {
  
    // Посылаем сигнал с ультразвукового датчика
    digitalWrite(TRIG, HIGH);
    // Удерживаем 10 мкс
    delayMicroseconds(10);
    // Затем убираем
    digitalWrite(TRIG, LOW);
    // Измеряем время прохождения сигнала от передатчика до приемника, с
    float tau = pulseIn(ECHO, HIGH)*1E-6;
    // Рассчитываем расстояние до отражающего объекта, м
    float L = c*tau/2.0;

    // Выводим значение расстояния с точностью до 1 миллиметра
    Serial.println(L, 3);

    // Делаем паузу на 0.1 секунды
    delay(100);
}

Полезная информация