В данной статье мы рассмотрим подключение модуля аналого-цифрового преобразования (АЦП) ADC0804 к плате Raspberry Pi. Зачем нужно АЦП? К примеру, у нас есть значение температуры, которое нужно передать в микроконтроллер. Как это сделать если микроконтроллеры оперируют только двоичными (цифровыми) данными? Для этого аналоговое значение температуры преобразуется в число в двоичном коде — эта операция и называется аналого-цифровым преобразованием.
Общие принципы работы ADC0804
Большинство современных микроконтроллеров имеют в своем составе собственные аналого-цифровые преобразователи (АЦП каналы), однако в плате Raspberry Pi собственных АЦП нет. Поэтому если вы хотите подключить к ней какие-нибудь аналоговые датчики, то вам будет необходим внешний АЦП, например, ADC0804.
Чип ADC0804 представляет собой микросхему, предназначенную для преобразования аналогового сигнала в 8-битные цифровые данные. В настоящее время это одна из самых популярных микросхем АЦП в бюджетном сегменте. Поскольку ее разрядность равна 8 бит, то на ее выходе мы можем получать значения от 0 до 255. Поскольку максимальное измеряемое ею напряжение составляет 5V, то, следовательно, одно ее цифровое значение равно шагу напряжения 19.5mV. На следующем рисунке представлена распиновка микросхемы ADC0804.
Модуль (микросхема) ADC0804 работает с напряжениями 5V, поэтому на своих логических выходах она также обеспечивает напряжение 5V. То есть уровню логической 1 на ее выходных контактах соответствует напряжение 5V. Но плата Raspberry Pi работает с уровнями напряжений +3.3V, поэтому на нее нельзя непосредственно подавать уровни +5V поскольку это может привести к повреждению платы. Поэтому для понижения уровня напряжения с +5V до +3.3V мы будем использовать схему резистивного делителя напряжения. Точнее сказать, мы с помощью этого делителя напряжения будем понижать уровень +5V до уровня +2.5V, который и будет подаваться на плату Raspberry Pi. То есть уровень +2.5V на входе Raspberry Pi будет обозначать логическую 1.
Более подробно о контактах ввода/вывода (GPIO) на плате Raspberry Pi вы можете прочитать в следующей статье.
Необходимые компоненты
- Плата Raspberry Pi 2 Model B или другая аналогичная (купить на AliExpress).
- Резистор 220 Ом или 1 кОм – 17 шт. (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Конденсатор 0,1 мкФ – 2 шт. (купить на AliExpress).
- Модуль ADC0804.
- Макетная плата.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Схема проекта
Схема подключения модуля АЦП ADC0804 к Raspberry Pi представлена на следующем рисунке.
На выходе модуля АЦП обычно присутствует множество различных шумов, поэтому для частичной фильтрации этих шумов мы использовали конденсатор емкостью 0.1 мкФ. Без этого конденсатора на выходах модуля АЦП могут наблюдаться значительные флуктуации напряжения.
В нашем проекте частота работы модуля АЦП ADC0804 задается с помощью RC-генератора – на представленной схеме он состоит из конденсатора C2 и резистора R20. Здесь важно отметить, что емкость конденсатора C2 можно уменьшить для того, чтобы повысить скорость АЦП. Но помните о том, что увеличение скорости АЦП приводит к уменьшению его точности. Поэтому, если для вашего приложения критически важна именно точность АЦП, а не его скорость, то в этом случае вам необходимо увеличить емкость конденсатора C2.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.
В программе нам первым делом необходимо подключить (импортировать) библиотеку для работы с контактами ввода/вывода. Также мы импортируем эту библиотеку RPi.GPIO под именем “IO” (то есть переименовываем ее для использования в программе), то есть далее в программе всегда, когда мы захотим обратиться к контактам ввода/вывода, мы будем использовать слово ‘IO’.
1 |
import RPi.GPIO as IO |
Иногда контакты ввода/вывода (GPIO pins), которые мы собираемся использовать в программе, могут выполнять другие функции. В этом случае во время исполнения программы мы будем получать предупреждения (warnings). Следующей командой мы укажем плате Raspberry Pi на то, чтобы она игнорировала эти предупреждения и продолжала исполнение программы.
1 |
IO.setwarnings(False) |
Мы можем обращаться к контактам ввода/вывода (GPIO pins) платы Raspberry Pi используя либо номер контакта на плате, либо его функциональный номер. Например, если смотреть распиновку контактов ввода/вывода платы Raspberry Pi, то можно увидеть, что в ней обозначение GPIO5 соответствует контакту PIN 29. То есть в зависимости от того, какой способ обращения к контактам мы выбрали, мы можем обращаться к рассмотренному контакту либо по номеру ‘29’, либо по номеру ‘5’. В данном проекте мы выберем способ обращения к контактам по их функциональным номерам, поэтому используем следующую команду:
1 |
IO.setmode (IO.BCM) |
Далее мы сконфигурируем 8 контактов платы Raspberry Pi в качестве цифровых входов – на них мы будем подавать значения с 8 выходных контактов модуля АЦП ADC0804.
1 2 3 4 5 6 7 8 |
IO.setup(4,IO.IN) IO.setup(17,IO.IN) IO.setup(27,IO.IN) IO.setup(22,IO.IN) IO.setup(5,IO.IN) IO.setup(6,IO.IN) IO.setup(13,IO.IN) IO.setup(19,IO.IN) |
Далее в программе мы будем проверять состояние контакта GPIO19. Если на этом контакте уровень high, то мы выполним действия, относящиеся к этому оператору IF. Если же на этом контакте уровень low, то действия внутри оператора IF выполняться не будут.
1 |
if(IO.input(19) == True): |
Следующей командой будет формироваться бесконечный цикл, внутри него все команды будут выполняться непрерывно.
1 |
While 1: |
После написания программы можно приступать к проверке работы схемы.
Тестирование работы проекта
После запуска программы на выполнение вы будете наблюдать на экране ‘0’, что будет обозначать 0 вольт на входе АЦП.
Если мы будем вращать ручку потенциометра, подключенного ко входу АЦП, то мы будем наблюдать изменения значений на экране. Данные на экране будут в виде скроллинга – то есть они непрерывно будут изменяться в зависимости от цифровых значений, получаемых платой Raspberry Pi.
Если мы повернем ручку потенциометра в среднее положение, то мы увидим на экране значения 128 как показано на следующем рисунке.
Для крайнего положения потенциометра (то есть значения напряжения на входе АЦП равного +5V), мы на экране компьютера увидим значения 255.
Исходный код программы
В коде программы имеются необходимые комментарии.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
import RPi.GPIO as IO # подключение библиотеки для работы с контактами ввода/вывода import time # подключение библиотеки для работы с задержками IO.setwarnings(False) # отключаем показ любых предупреждений x=1 b0 =0 # переменные типа integer для хранения 8 бит b1 =0 b2 =0 b3 =0 b4 =0 b5 =0 b6 =0 b7 =0 IO.setmode (IO.BCM) # мы будем программировать контакты GPIO по их функциональным номерам (BCM), то есть мы будем обращаться к PIN29 как ‘GPIO5’ IO.setup(4,IO.IN) # инициализируем GPIO4 в качестве цифрового входа IO.setup(17,IO.IN) IO.setup(27,IO.IN) IO.setup(22,IO.IN) IO.setup(5,IO.IN) IO.setup(6,IO.IN) IO.setup(13,IO.IN) IO.setup(19,IO.IN) while 1: # бесконечный цикл if (IO.input(19) == True): time.sleep(0.001) if (IO.input(19) == True): b7=1 # если на pin19 уровень high, то присваиваем b7 (bit7) значение true if (IO.input(13) == True): time.sleep(0.001) if (IO.input(13) == True): b6=1 # если на pin13 уровень high, то присваиваем b6 (bit6) значение true if (IO.input(6) == True): time.sleep(0.001) if (IO.input(6) == True): b5=1 # если на pin6 уровень high, то присваиваем b5 (bit5) значение true if (IO.input(5) == True): time.sleep(0.001) if (IO.input(5) == True): b4=1 # если на pin5 уровень high, то присваиваем b4 (bit4) значение true if (IO.input(22) == True): time.sleep(0.001) if (IO.input(22) == True): b3=1 # если на pin22 уровень high, то присваиваем b3 (bit3) значение true if (IO.input(27) == True): time.sleep(0.001) if (IO.input(27) == True): b2=1 # если на pin27 уровень high, то присваиваем b2 (bit2) значение true if (IO.input(17) == True): time.sleep(0.001) if (IO.input(17) == True): b1=1 # если на pin17 уровень high, то присваиваем b1 (bit1) значение true if (IO.input(4) == True): time.sleep(0.001) if (IO.input(4) == True): b0=1 # если на pin4 уровень high, то присваиваем b0 (bit0) значение true x = (1*b0)+(2*b1) x = x+(4*b2)+(8*b3) x = x+(16*b4)+(32*b5) x = x+(64*b6)+(128*b7) # переводим число из двоичного вида в десятичный print ( x) # выводим на экран значение с выхода АЦП b0=b1=b2=b3=b4=b5=b6=b7=0 # сбрасываем значения time.sleep(0.01) # задержка на 10ms |
2 ответа к “Использование АЦП в Raspberry Pi – руководство для начинающих”
«Для преобразования десятичных чисел в цифровые данные и применяется аналого-цифровое преобразование.»
Автор, ты чего курил??? Аналого-цифровое преобразование — преобразовании информации, содержащейся в аналоговом сигнале (а не каких-то там десятичных чисел), в цифровой код.
Хорошо, исправил. Видимо, введение к данной статье было переведено с помощью онлайн переводчика, поэтому и получился такой казус.