Функция Arduino Pinmode

Оглавление

Arduino Internal Pull-up Resistor Tutorial

The following tutorial demonstrates how you can use INPUT_PULLUP with pinMode(), by monitoring the state of a switch through establishing a serial communication between your Arduino and PC.

Hardware Configurations:

Developed using Fritzing, For more circuit exmaples, do head here

  • Connect two wires to the Arduino board
    • Black wire connects ground to one leg of the pushbutton
    • Second wire connects digital pin 2 to the other leg of the pushbutton

Software Configurations with Arduino Code

Step 1: Establish 9600 bits of data between your Arduino and your PC by entering the code below:

Step 2: Initialize digital pin 2 as an input with the internal pull-up resistor enabled:

Step 3: Enter the following line, making pin 13, with the onboard LED an output

Step 4: Establish a variable to hold the information coming in from your switch:

Step 5: Once your Arduino has read the input, make it print this information back to the computer by entering this code:

Now, when you open your Serial Monitor, you’ll see a stream of “0” if your switch is closed and a stream of “1” if your switch is open. The LED on pin 13 will illuminate when the switch is “High”, and turn of when it’s “Low” as well.

For the full Arduino code, you can head here

pinMode Arduino IDE описание

Arduino pinMode OUTPUT (пины настроены как выход)

OUTPUT (порт работает как выход) — пин становится управляемым источником питания с максимальным током 40 мА. В зависимости от команды digitalWrite() пин принимает значение единицы или нуля. Пример:

Функция digitalWrite() и analogWrite()

Цифровой пин Ардуино может генерировать цифровой сигнал с помощью команды digitalWrite(), т.е. выдавать напряжение 5 Вольт. Цифровой сигнал может иметь два значения — 0 или 1 (0 Вольт или 5 Вольт). Если в программе используется команда analogWrite() для ШИМ портов платы, то микроконтроллер может генерировать сигнал PWM Arduino на портах — создавать имитацию аналогового сигнала.

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

void loop() {
   digitalWrite(10, HIGH);
   delay(250);
   digitalWrite(10, LOW);
   delay(250);
}

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

Arduino pinMode INPUT (пины настроены как вход)

INPUT (порт работает как вход) — пин в этом режиме считывает данные с аналоговых и цифровых датчиков, состояния кнопок. Порт находится в высокоимпедансном состоянии, т.е. у пина высокое сопротивление. Пример:

Функция digitalRead() и analogRead()

Arduino может определить наличие напряжения на пине через функцию digitalRead(), которая возвращает 0 (LOW) или 1 (HIGH). Существует разница между цифровым датчиком (который обнаруживает включение/выключение) и аналоговым датчиком, значение которого постоянно изменяется. Используя функцию analogRead(), можно прочитать напряжение с аналогового датчика, функция возвращает число от 0 до 1023.

void setup() {
   pinMode(10, INPUT);
   Serial.begin(9600);
}

void loop() {
   int data = digitalRead(10);
   Serial.println(data);
   delay(250);
}

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

INPUT_PULLUP (порт работает как вход) но к пину подключается резистор в 20 кОм. В этом режиме при подключении кнопки к Ардуино можно не использовать внешние подтягивающие резисторы. Пример:

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


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

Обратите внимание, что при использовании INPUT_PULLUP происходит подтяжка цифрового входа к 5 вольтам, поэтому значение входящего сигнала будет инвертирован. То есть, при отпущенной кнопке, которая подключена к заземлению — GND, на цифровом входе будет высокий сигнал

При нажатии на кнопку — на входе, который сконфигурирован с помощью INPUT_PULLUP, будет низкий сигнал.

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

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • светодиод;
  • 2 резистора 220 Ом;
  • 2 тактовых кнопки;
  • провода «папа-папа».


Схема для включения/выключения светодиода кнопкой от Ардуино

Для переключения светодиода кнопкой Ардуино соберите схему, как на изображении выше

Обратите внимание, что тактовая кнопка на макетной плате подключена к микроконтроллеру без подтягивающего резистора. Пин 2 подключен к 5V через встроенный резистор, поэтому при отпущенной кнопке на входе пине 2 будет высокий уровень сигнала, а при нажатии кнопки будет низкий уровень

Скетч. Управление светодиодом Ардуино через кнопку

boolean buttonWasUp = true;
boolean ledEnabled = false;

void setup() {
  pinMode(10, OUTPUT);
  pinMode(2, INPUT_PULLUP);
}
 
void loop() {
   // узнаем, отпущена ли кнопка сейчас
   boolean buttonIsUp = digitalRead(2);
 
   // если кнопка была отпущена и не отпущена сейчас
   if (buttonWasUp && !buttonIsUp) {

      // исключаем дребезг контактов тактовой кнопки
      delay(10);

    // и считываем сигнал с кнопки снова
    buttonIsUp = digitalRead(2);

      // если кнопка нажата, то переворачиваем сигнал светодиода
      if (!buttonIsUp) {
         ledEnabled = !ledEnabled;
         digitalWrite(10, ledEnabled);
      }
   }
 
   // запоминаем состояние кнопки для новой итерации
   buttonWasUp = buttonIsUp;
}

Пояснения к коду:

  1. — это глобальная переменная Ардуино, которая может принимать всего два значения – true (истина) и false (ложь);
  2. задержка в программе позволяет избежать «дребезг контактов» кнопки и исключить ложное срабатывание.


Схема управления светодиодом двумя кнопками от Ардуино

Скетч. Управление двумя кнопками одним светодиодом

boolean button1WasUp = true;
boolean button2WasUp = true;

void setup() {
   pinMode(10, OUTPUT);
   digitalWrite(10, LOW);

   pinMode(2, INPUT_PULLUP);
   pinMode(4, INPUT_PULLUP);
}

void loop() {
   // узнаем, отпущены ли две кнопки сейчас
   boolean button1IsUp = digitalRead(2);
   boolean button2IsUp = digitalRead(4);

   // если кнопка 1 была отпущена и не отпущена
   if (button1WasUp && !button1IsUp) {
      delay(10);
      // повторно считываем сигнал с кнопки 1
      button1IsUp = digitalRead(2);
      if (!button1IsUp) { digitalWrite(10, LOW); }
   }

   // если кнопка 2 была отпущена и не отпущена
   if (button2WasUp && !button2IsUp) {
      delay(10);
      // повторно считываем сигнал с кнопки 2
      button2IsUp = digitalRead(4);
      if (!button2IsUp) { digitalWrite(10, HIGH); }
   }

   // запоминаем состояние двух кнопок ардуино
   button1WasUp = button1IsUp;
   button2WasUp = button2IsUp;
}

Пояснения к коду:

  1. данный пример программы позволяет включать светодиод нажатием одной кнопки и выключать светодиод нажатием второй кнопки;
  2. задержка Ардуино позволяет избежать «дребезг контактов» кнопки и исключить возможность ложного срабатывания.

Следующий пример тоже потребует для подключения к Ардуино две кнопки, два светодиода, как на предыдущей схеме. Но вместо простого включения/выключения диода, мы будем увеличивать и уменьшать яркость светодиода с помощью ШИМ сигнала микроконтроллера. Загрузите пример программы для «Светодиод и кнопка Ардуино ШИМ», чтобы получить понятие о принципе работы кнопки с Arduino Uno.

Скетч. Управление яркостью светодиода кнопкой Ардуино

#define PLUS_BUTTON   2
#define MINUS_BUTTON  4

int brightness = 100;
boolean plusUp = true;
boolean minusUp = true;
 
void setup() {
   pinMode(10, OUTPUT);
   pinMode(PLUS_BUTTON, INPUT_PULLUP);
   pinMode(MINUS_BUTTON, INPUT_PULLUP);
}
 
void loop() {
   analogWrite(10, brightness);
  
   // реагируем на нажатия кнопки с помощью функции handleClick
   plusUp = handleClick(PLUS_BUTTON, plusUp, +20);
   minusUp = handleClick(MINUS_BUTTON, minusUp, -20);
}

boolean handleClick(int buttonPin, boolean wasUp, int delta) {
   boolean isUp = digitalRead(buttonPin);
   if (wasUp && !isUp) {
      delay(10);
      isUp = digitalRead(buttonPin);
      // если был клик кнопки, меняем яркость в пределах от 0 до 255
      if (!isUp)
         brightness = constrain(brightness + delta, 0, 255);
   }
   return isUp;
}

Пояснения к коду:

  1. для подключения светодиода следует использовать пин с ШИМ модуляцией;
  2. начальное значение яркости равен ста, в программе прирост и уменьшение яркости (20) можно поменять по своему усмотрению.

Заключение. Мы рассмотрели сразу несколько примеров для управления светодиодом Ардуино с помощью кнопки. Вы узнали, что светодиодом можно управлять с помощью одной кнопки, или производить включение/выключение двумя кнопками. Кроме того, можно менять яркость с помощью кнопки и ШИМ сигнала. Все рассмотренные примеры можно использовать в различных проектах на Arduino для начинающих.

Библиотеки .NET IoT

dotnet/iot

  • System.Device.Gpio. Пакет System.Device.Gpio поддерживает множество протоколов для взаимодействия с низкоуровневыми аппаратными интерфейсами:
    • General-purpose I/O (GPIO);
    • Inter-Integrated Circuit (I2C);
    • Serial Peripheral Interface (SPI);
    • Pulse Width Modulation (PWM);
    • Serial port.
  • Iot.Device.Bindings. Пакет Iot.Device.Bindings содержит:
    • Драйвера и обертки над System.Device.Gpio для различных устройств которые упрощают разработку приложений;
    • Дополнительные драйвера поддерживаемые сообществом (community-supported).

Стек библиотек .NET IoTBlink an LED

Разбор кода:

  • using System.Device.Gpio — пространство имен для использования контроллера GpioController доступа к аппаратным ресурсам;
  • using var controller = new GpioController() — создает экземпляр контроллера для управления контактами GPIO;
  • controller.OpenPin(pin, PinMode.Output) — инициализирует контакт pin = 18 на вывод, к 18 контакту подключен светодиод;
  • controller.Write(pin, ((ledOn)? PinValue.High: PinValue.Low)) — если ledOn принимает значение True, то PinValue.High присваивает высокое значение 18 контакту и светодиод загорается. На 18 контакт подается  напряжение в 3.3V. Если ledOn принимает значение False, то PinValue.Low присваивает низкое значение контакту 18 и светодиод гаснет. На 18 контакт подается напряжение в 0V (или минимальное пороговое для значения «0», может быть немного выше 0V).

dotnet publish -r linux-armdotnet publish -r linux-arm64GpioController

Драйвера доступа к GPIO из .NET

System.Device.Gpio.Drivers

  • HummingBoardDriver — GPIO драйвер для платы HummingBoard на процессоре NXP i.MX 6 Arm Cortex A9;
  • LibGpiodDriver — этот драйвер использует библиотеку Libgpiod для получения доступа к портам GPIO, заменяет драйвер SysFsDriver. Библиотека Libgpiod может быть установлена на Linux и Armbian, не является аппаратно-зависимой, что позволяет ее использовать для различных одноплатных компьютерах ARM32 и ARM64;
  • RaspberryPi3Driver — GPIO драйвер для одноплатных компьютеров Raspberry Pi 3 или 4;
  • SysFsDriver — GPIO драйвер работающий поверх интерфейса SysFs для Linux и Unux систем, предоставляет существенно меньше возможностей, чем драйвер LibGpiodDriver, но не требует установки библиотеки Libgpiod. Тот случай, когда хочется просто попробовать помигать светодиодом из C# без дополнительных действий;
  • UnixDriver — базовый стандартный класс доступа к GPIO для Unix систем;
  • Windows10Driver — GPIO драйвер для ОС Windows 10 IoT. Из поддерживаемых плат только Raspberry Pi, весьма ограниченное применение.

LibGpiodDriverSysFsDriver

  • Низкая скорость работы I/O;
  • Есть проблемы с безопасной работой с GPIO при совместном доступе;
  • При контейнеризации приложения на C# в контейнер придется пробрасывать много путей из файловой системы Linux, что создается дополнительные сложности. При использование библиотеки Libgpiod этого не требуется.

LibgpiodLibgpiodLibgpiod

Цепь

Подсоедините к Arduino два провода. Черный подсоедините к «земле» и к одной из ног кнопки. Второй провод подсоедините ко 2-му цифровому контакту и к другой ноге (не соединенной с первой) кнопки.
Таким образом, если нажать на кнопку, она соединит две точки цепи, а если не нажимать, то никакой связи между ногами кнопки не будет. Поскольку на Arduino у 2-го контакта уже имеется встроенный подтягивающий резистор, подключенный к напряжению в 5 вольт, состояние ненажатой кнопки будет считываться как HIGH. Но если на кнопку нажать, Arduino определит это как LOW, поскольку 5-вольтовое напряжение попросту уйдет в «землю».

4 ответа

7

Инициализаторы массива почти правы; вам просто нужно разделить значения запятыми:

Вам нужно будет вызвать pinMode () в цикле; он не принимает массивы в качестве аргументов.

Есть (по крайней мере) два способа: Сделать массивы значений HIGH и LOW, сопоставляя значения digitPins [] и segPins [] массивы один на один, соответственно. Или для упрощения обслуживания, объявите структуру данных () вывода # и значения; сделайте массив из них. Это немного сложнее, но и более полезно. Итак, например:

не подходит для «структуры данных»; он позволяет комбинировать данные разных типов с одним именованным и адресуемым модулем. объявляет новый тип данных и говорит: «Не выделяйте какую-либо память только сейчас, это (pinInit) — просто описание. Я буду использовать его позже». Это делает pinInit именованным типом данных, который можно использовать везде, где вы можете использовать собственный тип данных. Допускается допустимый многозначный тип данных (например, массив).

Таким образом, мы можем создать массив s (пары pin- # /boolean-value) только с помощью имени нового типа.

Тогда ваш код инициализации может выглядеть так:

Выражение оценивается числом инициализаторов (количество байтов в массиве /# байтов в одном элементе массива).

Выражение означает: «в pinInit array digitPins, получить i-й элемент …» (помните, что это пара значений), «. .. и взять значение члена «pinNum». Немного сложнее, в первый раз, когда мы думаем об этом, но посмотрим, как легко читается массив. И подсказка о чтении этого выражения: я прочитал его назад: «pinNum член i-го элемента массива digitPins. «

Завтра, или в следующем месяце, когда нам понадобится другой контакт, не нужно обновлять 2 массива (помните, конечно, чтобы держать их в последовательности друг с другом!); просто добавьте еще 2-значный элемент в один массив цифр [].

3

Это здорово, потому что вы можете использовать его, позвонив:

Использование цикла for не позволит копировать и вставлять какие-либо вещи. Это также позволяет вам сэкономить массу памяти.

Затем, чтобы отобразить небольшой таймер 0-9, вы можете сделать это:

Используйте массив и цикл for.

Это очень полезно. Сделайте то же самое и для цифр.

Этот метод работает во многих случаях:

  • многие датчики, переключатели
  • много выходов, таких как светодиоды, реле, транзисторы

Использование пользовательских методов

Используемая ссылка: https://stackoverflow.com/a/33235154/5500092

Вы можете использовать собственный метод, подобный этому:

Затем вы определяете массив с выводами:

И, наконец, в вашей настройке используйте:

Ваша логика

PS: Для вашей логики вы можете даже использовать:

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

Или даже:

И используйте:

-4

thats all:)

Библиотека libgpiod и инструменты управления GPIO

libgpiodLibgpiodLibGPIOdlibgpiod

  • gpiodetect — выведет список всех чипов GPIO, их метки и количество линий;
  • gpioinfo — выведет информацию о линиях GPIO конкретного контроллера GPIO. В таблице вывода по колонкам будет указано: номер линии, название контакта, направление ввода/вывода, текущее состояние;
  • gpioget — считает текущее состояние линии GPIO;
  • gpioset — установит значение для линии GPIO;
  • gpiofind — выполняет поиск контроллера GPIO и линии по имени;
  • gpiomon — осуществляет мониторинг состояния линии GPIO и выводит значение при изменение состояния.

libgpiod

C++, Python, C#,

Why doesn’t my button work!?

Consider the following circuit, which is a simple normally-open push-button on a breadboard. It has been wired so that one side is tied to +5V and the other side is connected to Pin 12 of an Arduino Uno. (Make you check with a multimeter to determine which pins are connected together and which are not.)

Picture 1: Floating Pushbutton on Breadboard

The code for this switch is very simple. The LED on Pin 13 should light up when Pin 12 is HIGH and be off when Pin 12 is LOW. The expected behavior is that the LED will be OFF whenever the button is not pushed and ON when the button is pushed.

void setup() {
  pinMode(13, OUTPUT); // Use Built-In LED for Indication
  pinMode(12, INPUT);   // Push-Button On Bread Board
}

void loop() {
  bool buttonState = digitalRead(12);  // store current state of pin 12
  digitalWrite(13, buttonState);
}

Take a look at this video to see what happens as the button is pushed. The LED’s behavior is not at all predictable! Sometimes it lights up, sometimes it stays on, sometimes it changes just when a finger gets close to it!

https://youtube.com/watch?v=R7U-74xlBSM

The pin is “Floating.” This schematic shows how the button is wired on the breadboard. What is PIN 12 connected to, when the button is unpressed? Nothing!

Schematic 1: Schematic of Floating Pin

This means that any signals in the air, such as from nearby electronics, can cause the pin to “float” to either a HIGH or LOW. For example, this waveform from an oscilloscope shows what the pin is doing when nothing is connected.

Picture 2: Oscilloscope Screenshot of Floating Pin

This video is the same breadboard circuit but with the oscilloscope waveform visible. As a human finger comes close to the pin, the waveform changes. 60Hz noise from the environment is being coupled into the circuit through the finger, which is what causes the “random” behavior of the input pin.

https://youtube.com/watch?v=dBIBFLYCjMM

Great! Now that we understand why the pin randomly changes, how does it get fixed? Easy! Just make your Arduino do exercises… pull-ups in fact!

1.0.1 and Later

Starting with 1.0.1,  if pinMode() is called with INPUT, the internal pull-up resistor is explicitly disabled.  However, when pinMode() is called with INPUT_PULLUP, the pull-up will be enabled.  You can still override the state of the pin after pinMode() has been called by using digitalWrite(), like in pre-1.0.1.

Conclusion

So when it comes down to it, when do you use Arduino pinMode()?  The only time you MUST call pinMode() is to set up a pin for use as a digital OUTPUT.  As a best practice, if you plan to use a pin as a digital INPUT or analog OUTPUT (PWM), you should call pinMode() in setup(), even though it is optional.  That way when you, or someone else, reads your code, you quickly see the pins in use.

Определение уровней на выводах: HIGH и LOW

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

Значение (по отношению к выводу) несколько различается в зависимости от того, установлен ли вывод на вход () или на выход (). Когда вывод настроен на вход с помощью и читается с помощью , Arduino (ATmega) будет сообщать , если:

  • на выводе присутствует напряжение более 3,0 В (для плат 5 В);
  • на выводе присутствует напряжение более 2,0 В (для плат 3,3 В).

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

Когда вывод настроен на выход () с помощью и установлен в значение с помощью , вывод находится в состоянии:

  • 5 вольт (для плат 5 В);
  • 3,3 вольта (для плат 3,3 В).

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

Значение также имеет разное значение в зависимости от того, настроен ли вывод на вход () или на выход (). Когда вывод настроен на вход () с помощью и читается с помощью , Arduino (ATmega) будет сообщать , если:

  • на выводе присутствует напряжение менее 1,5 В (для плат 5 В);
  • на выводе присутствует напряжение менее 1,0 В (примерно) (для плат 3,3 В).

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

Определение режимов цифровых выводов: INPUT, INPUT_PULLUP и OUTPUT

Цифровые выводы могут использоваться как (вход), (подтянутый вход) или (выход). Изменение вывода с помощью меняет его электрическое поведение.

Выводы, настроенные как входы ()

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

Если вы настроили вывод на вход и считываете состояние кнопки, когда кнопка находится в разомкнутом состоянии, входной вывод будет «висеть в воздухе», что приведет к непредсказуемым результатам. Чтобы обеспечить правильное считывание, когда кнопка (ключ) разомкнута, необходимо использовать резистор, подтягивающий вывод либо к шине питания, либо к земле. Назначение этого резистора – подтянуть вывод к известному состоянию, когда ключ разомкнут. Обычно выбирается резистор 10 кОм, так как он является достаточно маленьким, чтобы надежно предотвратить «повисание вывода в воздухе», и в то же время достаточно большим, чтобы не потреблять слишком большой ток, когда ключ замкнут.

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

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

Выводы, настроенные как входы с подтягивающим резистором ()

Микроконтроллер ATmega на Arduino имеет внутренние подтягивающие резисторы (резисторы, которые подключены к шине питания внутри микроконтроллера), к которым у вас есть доступ. Если вы предпочитаете использовать их вместо внешних подтягивающих резисторов, то можете использовать аргумент в функции .

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

Выводы, настроенные как выходы ()

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

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