События‎ > ‎

АЦП MCP3008 и Raspberry PI

Отправлено 28 мар. 2013 г., 12:38 пользователем Олег Евсегнеев   [ обновлено 28 мар. 2013 г., 12:43 ]
АЦП MCP3008 для RaspberryPI
В отличие от Arduino, mbed и даже TI Launch Pad, известная ныне платформа Raspberry PI не имеет ни одного аналогового входа! Вы можете себе это представить? Ведь очевидно, что такой полноценный микрокомпьютер может стать основной для многих проектов, которые ныне принято делать на том же Arduino. Просто нонсенс... 

Ну да ладно, надеюсь в будущих версиях "малины" АЦП всё-таки появится, а пока мы решим эту проблему с помощью внешнего устройства MCP3008. Этот чип мы купили в количестве 20 штук на adafruit.com по $4 за штуку. Наверное можно было найти и дешевле, но мы били сильно ограничены по срокам. Ведь этот АЦП используется в базовом курсе робототехники, который мы проводим в Уральской Компьютерной Школе.

Основные характеристики Microchip MCP3008

  • разрядность - 10бит;
  • каналов - 8;
  • шина - SPI;
  • питание - 2.7-5.5

Описание выводов чипа

Распиновка MCP3008
  • CH0 - CH7 - восемь каналов для подключения аналоговых датчиков;
  • Vdd - напряжение питания 2.7-5.5В;
  • Vref - опорное напряжение;
  • AGnd, DGnd - земля;
  • CLK, Dout, Din, CS - линии шины SPI.

Для примера, рассмотрим подключение потенциометра к Raspberry PI.

Схема подключения MCP3008 к RaspberryPI


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

Что касается программы, то для доступа к MCP3008 через SPI я использовал функцию readadc из туториала Adafruit. Однако, для удобства я оформил эту функцию как метод класса ADC. Представленная ниже программа, каждую секунду выводит в консоль значение от 0 до 1023, которое соответствует текущему положению потенциометра.

MCP3008 + RaspberryPI

from RPi import GPIO

from MCP3008 import ADC

from time import sleep


# pin_clk - линия Clk

# pin_cs - линия CS

# pin_miso - линия Dout

# pin_mosi - линия Din

adc = ADC( pin_clk=7, pin_cs=24, pin_miso=8, pin_mosi=25 )


while True:

   raw_pot = adc.read(0)    # показания нулевого канала

   print ‘%d’ % raw_pot

   sleep(1)

В общем, MCP3008 оказался очень простым в использовании. Рекомендую его и для Arduino проектов, в которых предполагается обработка большого числа аналоговых сигналов. И конечно, для Raspberry PI.

Полезные ссылки


Comments