Почему номера выводов диаграмм и кода отличаются друг от друга?
Если я поищу в Google "номера выводов arduino nano", все результаты покажут, что номер вывода D2 равен 5. Но это не сработало. Я поискал несколько примеров кодов, и они были 3 для D3 и 5 для D5 и т. Д. Итак, в кодах вывод для Dn
равен n
. Тогда каковы же числа на этих диаграммах?
@Damn Vegetables, 👍11
Обсуждение3 ответа
В каждой таблице данных микросхем (а также плат Arduino) используются 2 различных способа обозначения выводов:
- Подсчет физических контактов в том порядке, в каком они указаны на выбранной упаковке чипа
- Ссылка на контакты по их функции
Первый способ предназначен только для указания конкретных положений выводов снаружи, например, когда вы строите фактическую схему. Это также включает в себя специальные контакты, такие как Vcc, GND и сброс. На эти выводы не может ссылаться код (это не имело бы большого смысла). Кроме того, микроконтроллер внутри своей упаковки не знает, в какой упаковке он застрял у производителя. Каждая упаковка имеет разный порядок ввода и форм-фактор. Таким образом, этот подсчет имеет смысл только в контексте размещения этой конкретной упаковки чипа в схему (например, где находится Vcc, где заземление и где мне нужно подключиться к этому конкретному цифровому контакту), но нет смысла использовать для кода внутри контроллера.
Для ссылки на контакты внутри контроллера (он же в коде) мы используем функцию контактов. На Arduino у вас есть в основном цифровые и аналоговые контакты, которыми можно управлять. Поэтому для удобства новичков (на которых ориентирована платформа Arduino) цифровые и аналоговые контакты просто пронумерованы. Это цифры, которые обычно записываются только на плате Arduino. Таким образом, D2 означает третий цифровой вывод внутри платформы Arduino. A0-это первый аналоговый вывод. То, где этот pin физически расположен на плате, не представляет интереса для кода, и код не знает фактического местоположения. Для кода это всего лишь третье оборудование для цифрового вывода и так далее.
TL;DR: Для построения схемы мы должны указать положения выводов (например, где находится Vcc, где заземление), чтобы правильно подключить чип/микроконтроллер. Но внутренний код не знает, где находятся физические контакты, и фактическое местоположение также может зависеть от упаковки. Поэтому внутри мы используем другую систему подсчета, основанную на функции вывода. Способ подсчета цифровых и аналоговых контактов в Arduino просто скрывает сложность для новичка. В качестве справки цифры также напечатаны на самой плате Arduino.
На случай, если вы захотите заглянуть поглубже в кроличью нору:
На самом деле микроконтроллер имеет различное аппаратное обеспечение для различных встроенных функций. Например: Аналоговые контакты могут использоваться АЦП (аналого-цифровой преобразователь) для измерения аналогового напряжения. Но у каждого из них также есть цифровое оборудование для ввода и вывода, как и у любого другого цифрового вывода. Большинство выводов микроконтроллера являются многоцелевыми. Код должен решить, какое оборудование должно быть подключено к соответствующим контактам. Когда я использую pinMode(2, ВЫХОД)
, я говорю микроконтроллеру подключить третье оборудование цифрового выхода к соответствующему физическому контакту. Когда я использую analogRead(A1)
, я говорю ему подключить второй аналоговый канал АЦП к соответствующему контакту и считывать аналоговое напряжение через АЦП.
Это означает, что код знает только аппаратное обеспечение функции и что оно может быть подключено к соответствующим контактам (независимо от того, какие эти контакты находятся во внешнем мире). Нумерация цифровых и аналоговых выводов-это всего лишь дополнительный уровень абстракции, чтобы скрыть сложность от новичков. На самом деле код управляет аппаратными функциями с помощью специальных регистров функций (SFR). Это специальные части памяти, которые физически подключены к соответствующему оборудованию в микроконтроллере. Для оборудования цифрового вывода контакты сортируются по группам до 8 контактов. Эти группы называются портами и пронумерованы символами. Когда вы смотрите на этот вывод Arduino Nano, вы видите, что вывод Arduino D2 также называется PD2, что означает третий вывод порта (считая с нуля). Вывод Arduino D8 также называется PB0, поэтому первый вывод PortB. Такие функции, как pinMode ()
, digitalWrite()
и digitalRead ()
, просто манипулируют SFR для нужного порта, чтобы установить соответствующий контакт. Обратитесь к Документации по манипулированию портами, чтобы узнать, как это сделать самостоятельно. Для начинающих просто проще использовать маркировку на плате - контактный номер Arduino - вместо того, чтобы напрямую связываться с портами и их SFR.
Может быть, было бы яснее сказать все четыре уровня в начале: 1) Номер вывода платы прорыва, которые здесь пронумерованы 1-30 2) Имя Arduino для вывода, например D3 3) Имя таблицы микроконтроллера для вывода, например PA4 4) Номер вывода пакета микроконтроллера, @jpa
Дополнительная абстракция предназначена не только для того, чтобы облегчить жизнь новичкам. Как отмечает @RedGrittyBrick в своем ответе, это делает код более переносимым. В меньшей степени это также делает код более читабельным, хотя некоторые могут с этим не согласиться. А если вы используете одну из коммерческих плат, где контакты помечены этикетками Arduino, то, конечно, проще подсоединить провода к нужному контакту., @Llaves
Почему выводы диаграмм и кода отличаются друг от друга?
Потому что разработчики Arduino решили повторно использовать название "pin" для программируемых сигнальных линий чипа, несмотря на то, что оно более распространено и уже используется для обозначения любого выступающего внешнего подключения к устройству.
Существует по крайней мере четыре способа ссылки на контакты на любой плате Arduino:
- Порядок расположения платы: Простой числовой порядок (1,2,3 ...) физического расположения контактов на печатной плате против часовой стрелки от конца USB (или какого-либо произвольного конца)
- Arduino-имя: Имена, используемые в исходном коде Arduino и/или аннотации на шелкографии печатной платы (D1,D2 ... A0,A1 ...).
- IC-порядок: Простой числовой порядок соответствующего вывода на IC в соответствии с нумерацией, используемой в паспорте производителя.
- Имя функции IC: Имена функций, доступных на выводе (СБРОС, VCC, INT0,PB0,PB1, PB2...), как описано в спецификации IC.
Например:
Контакт печатной платы Nano# | Имя Arduino | Pin ATmega328 TQFP# | Контакт ПОГРУЖЕНИЯ ATmega328# | Функция ATmega328 |
---|---|---|---|---|
1 | D13 | 17 | 19 | PB5, SCK, PCINT5 |
2 | 3В3 | N/A | N/A | N/A |
3 | ссылка | 20 | 21 | АРЕФ |
4 | A0 | 23 | 23 | PC0, ADC0, PCINT8 |
5 | A1 | 24 | 24 | PC1, ADC1, PCINT9 |
и т.д. |
Существует множество различных плат Arduino и подобных Arduino, Которые используют ATmega328, некоторые используют различные пакеты ATmega328 (DIP, TQFP и т. Д.) С различным расположением выводов. Многие по-разному размещают физические контакты печатной платы. Вот почему не существует фиксированной связи "один к одному", и отчасти поэтому среда разработки Arduino предоставляет свои собственные упрощенные имена, которые она пытается последовательно и переносимо применять к различным микроконтроллерам.
(c) PigHixx без разрешения.
- Arduino Nano использует контакты SPI в качестве контактов ввода-вывода? а еще можно сделать ISP?
- Почему некоторые контакты Arduino Nano (D3, D4, A3, A4, A6, A7) не могут быть установлены на высокий уровень?
- Цифровые входные контакты на arduino nano со стандартными firmata и pyfirmata всегда «Нет»
- Выход 3,3 В при установке вывода на высокий уровень
- Невозможно использовать аналоговые контакты в качестве цифровых входов
- Проблема с использованием выводов A4 и A5 для ввода и вывода I2C
- Использую nRF2401, и в передатчике и приемнике Rx не мигает, а Tx мигает; почему Rx не мигает?
- Конфликтующие контакты между библиотекой PCM и динамиком и NRF24L01
вы имеете в виду физические контакты модуля? ... они начинаются с 1 и оборачиваются вокруг, @jsotola