В зависимости от модели платы Arduino имеют несколько цифровых выводов, аналоговых входов и цифровых линий с широтно-импульсной модуляцией (ШИМ). Тем не менее, Raspberry Pi имеет только цифровые линии. Один из способов считывания аналогового сигнала – использование аналого-цифровых преобразователей (АЦП). MCP3008 является одним из самых популярных среди них. MCP3008 использует SPI для связи с Raspberry Pi и обеспечивает восемь контактов для аналогового ввода.

В этом уроке мы покажем вам, как подключить MCP3008 к Raspberry Pi.
Raspberry Pi представляет собой одноплатынй компьютер и является более мощным, чем большинство моделей Arduino, благодаря большей оперативной памяти, встроенным функциям Wi-Fi и Bluetooth и мощному процессору. Он также поставляется с 40 выводами GPIO, но имеет несколько дополнительных интерфейсов I2C, SPI и UART. Более новые версии Raspberry Pi также включают в себя два порта Micro HDMI.

Создание прототипа на основе Raspberry Pi можно упростить с помощью переходника Raspberry Pi Cobbler, сократив время и предотвратив вероятность короткого замыкания с помощью макетной платы. Все, что вам нужно сделать, это подключить один конец к Raspberry Pi, и вы можете получить доступ к Raspberry Pi GPIO, включая контакты I2C и SPI.
LDR, также известный как фоторезистор / фотоэлемент / фотопроводник, представляет собой тип резистора, который имеет переменное сопротивление, которое изменяется в зависимости от интенсивности света, падающего на него. Когда свет падает на резистор, сопротивление меняется.

MCP3008 представляет собой высокопроизводительный 10-разрядный аналого-цифровой преобразователь с низким энергопотреблением и применяется для встраиваемых приложений, таких как сбор данных, измерительные приборы, промышленные ПК, многоканальные регистраторы данных, робототехника, управление двигателями, промышленная автоматизация, интеллектуальные системы, датчики, портативные приборы и домашняя медицинская техника.

Давайте определим основные контакты нашего АЦП MCP3008. Мы будем использовать контакты VDD, VREF, AGND, CLK, DOUT, DIN, CS/SHDN, DGND и CH0. MCP3008 имеет восемь каналов. В зависимости от вашего эксперимента или количества датчиков, которые вы хотите использовать для разных проектов, вы можете использовать все эти каналы. В этом уроке мы будем использовать один.

Далее разместите всю электронику на макетной плате. Мы будем использовать контакт 3 на GPIO, а также заземление, SPI (MOSI, MISO, SCLK) и контакт 5 для CS. Таблица подключений следующая:

Далее подключите датчик LDR. Один вывод LDR поступает на линию питания 3,3 В, а второй вывод подключается к выводу CH0 MCP3008, который затем подключается к заземлению резистором 10 кОм. Далее представлена полная принципиальная схема подключения, показывающая все наши соединения.

Теперь перейдем к программной части. На Raspberry Pi должна быть установлена последняя версия Raspbian. Выполните следующие команды, чтобы убедиться, что ваши установочные пакеты обновлены.
sudo apt-get update -y
sudo apt-get upgrade –y
Теперь установите следующие зависимости для вашего проекта. PIP или установщик пакетов Python можно использовать для установки пакетов из индекса пакетов Python и других индексов. Установите его с помощью следующей команды:
sudo apt-get установить python3-pip
Далее устанавливаем adafruit-blinka:
sudo pip3 установить adafruit-blinka
Для использования MCP3008 необходимо установить библиотеку CircuitPython для аналого-цифровых преобразователей серии MCP3xxx:
sudo pip3 install adafruit-circuitpython-mcp3xxx
Со всеми зависимостями, загруженными для библиотек, необходимых в этом проекте, мы можем использовать пример кода Python, предоставленный Adafruit для считывания значений датчика LDR через MCP3008. Обратите внимание, что этот код написан на CircuitPython, разработанном Adafruit. CircuitPython основан на языке программирования Python, но с широкой поддержкой аппаратных устройств.
import os
import time
import busio
import digitalio
import board
import adafruit_mcp3xxx.mcp3008 as MCP
from adafruit_mcp3xxx.analog_in import AnalogIn
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
cs = digitalio.DigitalInOut(board.D22)
mcp = MCP.MCP3008(spi, cs)
chan0 = AnalogIn(mcp, MCP.P0)
print('Raw ADC Value: ', chan0.value)
print('ADC Voltage: ' + str(chan0.voltage) + 'V')
last_read = 0
tolerance = 250
def remap_range(value, left_min, left_max, right_min, right_max):
left_span = left_max - left_min
right_span = right_max - right_min
valueScaled = int(value - left_min) / int(left_span)
return int(right_min + (valueScaled * right_span))
while True:
trim_pot_changed = False
trim_pot = chan0.value
pot_adjust = abs(trim_pot - last_read)
if pot_adjust > tolerance:
trim_pot_changed = True
if trim_pot_changed:
set_volume = remap_range(trim_pot, 0, 65535, 0, 100)
print('Volume = {volume}%' .format(volume = set_volume))
set_vol_cmd = 'sudo amixer cset numid=1 -- {volume}% > /dev/null' \
.format(volume = set_volume)
os.system(set_vol_cmd)
last_read = trim_pot
time.sleep(0.5)
Сохраните загруженный код в текстовом файле с расширением .py (example.py) и запустите его из терминала: python example.py. Чтобы успешно запустить программу, убедитесь, что вы находитесь в том же каталоге в терминале.
© digitrode.ru