Плата для моделирования на Raspberry Pi

Уже давно микрокомпьютер Raspberry Pi вошел в жизнь гиков, системных администраторов, программистов и электронщиков. Недорогой и относительно мощный для своего класса, со встроенными портами ввода/вывода, он может справиться с различными задачами и удовлетворить потребности пользователя. Купив Raspberry Pi мне захотелось что-нибудь по включать, измерить, по управлять внешними устройствами. На данный момент продается большое количество плат расширения например как здесь, можно использовать Breadboard с проводами для быстрого прототипирования, но я предпочитаю делать устройства самостоятельно, для конкретных задач. Для первого раза я не стал использовать двухрядную гребенку под все вывода, а ограничился несколькими портами ввода/вывода, шиной SPI, I2C и UART. Соединял Raspberry Pi с таргетом проводами для макетирования «мама-мама». Кстати, по поводу защит линий и тд. особо не парился ибо эта плата только для работы на столе, что бы отлаживать код.

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

Итак, что мне было необходимо:

Работа с GPIO как со входами так и с выходами;
Управление нагрузкой;
Подключение датчиков температуры по шине 1-Wire;
Измерение напряжения;
Часы реального времени;
Контроль и управление внешним устройством по шине RS485;
Отдельный источник питания для платы расширения;

Согласно вышеприведенному списку была разработана схема электрическая принципиальная:

Схема из хранилища с высоким разрешением

В схеме используется трансформаторный источник питания(у меня просто на тот момент были остатки от одного проекта, трансформаторы ТПГ-2) с двумя выходными обмотками. Первая обмотка работает на линейный стабилизатор напряжения с выходом 5В, для питания микросхемы драйвера RS485 и часов реального времени. Вторая обмотка используется для питания электромагнитных реле и сборки с транзисторами Дарлингтона.

Температурный датчик DS18B20 питается от +3.3В с платы Raspberry Pi, на плате предусмотрен разъем для подключения внешних датчиков DS18B20, это же напряжение берется для АЦП и согласования уровней с часами реального времени. В схеме использованы четыре кнопки S1-S4 для управления какими-либо действиями, работают по низкому логическому уровню. Для управления нагрузками используется транзисторная сборка DD1 ULN2003 со встроенными защитными диодами. К выводам 16, 15 транзисторной сборки подключены реле K1 и K2, к выводам 14-12 подключены светодиоды для индикации, выводы 11, 10 предназначены для подключения к внешним устройствам по схеме с общим коллектором или дополнительных реле с напряжением обмотки +12В.

Для измерения напряжения используется два канала 10 битного АЦП DD3 MCP3008 с интерфейсом SPI, со входным НЧ фильтром. Аналоговый узел сделан примитивно, для академических целей или быстрой отладки. Если встанет вопрос о качественном измерении аналогового сигнала, придется развязать цифровую и аналоговую землю, использовать внешний источник опорного напряжения. Как вариант, аналоговую часть можно сделать так:

Только необходимо будет использовать преобразователь уровней TTL → LVTTL на шине SPI.

Часы реального времени DD4 выполнены на микросхеме DS1307, для тактирования используется кварцевый резонатор Q1 на 32,768 КГц. Для питания RAM микросхемы часов используется литиевая батарея на 3 вольта, впаянная в плату. Микросхема подключается через преобразователь уровней 5В-3,3В выполненных на МДП-транзисторах VT2, VT3 к Raspberry Pi по шине I2C (В САПР использовано подключение к линиям без явной связи).

В качестве драйвера UART → RS485 использована микросхема DD2 ST485. Схемное решения с применением транзистора VT1 позволило отказаться от отдельного выхода для управления приемопередатчиком. Он переключается в режим передачи, только когда UART передает данные, остальное время ST485 находится в режиме приема. Команда управления приемопередатчиком снимается с коллектора транзистора VT1.

Помимо преобразования интерфейсов, данная схема также выполняет функцию согласования уровней LVTTL интерфейса UART Raspberry Pi с уровнями TTL драйвера ST485. Сигнал снятый с коллектора транзистора VT1 подтягивает уровень на входе DI до 5В, а резистор R16 и стабилитрон VD8 ограничивают уровень с выхода R0 до 3,3В. Не обращайте внимание на резистор R11, он остался в схеме при отладке. RS485 испробован с протоколом ModBus RTU на скорости 115200 бод.

Соответственно далее была разработана печатная плата:

Фото готового устройства и работа с платой расширения:



Вариант схемы соединения с внешними устройствами:

Для проверки узлов платы расширения я использовал пару скриптов на языке python (я этот язык не знаю, писал методом проб и ошибок, параллельно подглядывая в коды специалистов)
Для измерения напряжения от потенциометра подключенного к каналам АЦП я написал простой скрипт:


#!/usr/bin/python

# Example program to read data from MCP3008 10 bit ADC

import spidev
import time
import os
 
# Open SPI bus
spi = spidev.SpiDev()
spi.open(0,0)
 
# Function to read SPI data from MCP3008 chip
# Channel must be an integer 0-7
def ReadChannel(channel):
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data
 
# Function to convert data to voltage level,
# rounded to specified number of decimal places.
def ConvertVolts(data,places):
  volts = (data * 3.3) / float(1023)
  volts = round(volts,places)
  return volts
 
# Define sensor channels
first_channel = 0
second_channel  = 1
 
# Define delay between readings
delay = 5

print "------------------------------------------------------"
 
while True:
 
  # Read the first channel data
  first_level = ReadChannel(first_channel)
  first_channel_volts = ConvertVolts(first_level,2)
 
  # Read the second channel data
  second_level = ReadChannel(second_channel)
  second_channel_volts = ConvertVolts(second_level,2)
  
 
  # Print out results
  print "------------------------------------------------------"
  print("First ADC channel: {} ({}V)".format(first_level,first_channel_volts))
  print("Second ADC channel : {} ({}V)".format(second_level,second_channel_volts))
 
  # Wait before repeating loop
  time.sleep(delay)

Для работы с термометрами DS18B20 использован следующий скрипт:

# Example program to read data from DS18B20
# This code taken from
# https://kropochev.com/?go=all/raspberry-pi-and-onewire-sensor/

import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '10*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f

while True:
    print(read_temp())
    time.sleep(1)


Печатная плата была нужна в срочном порядке, поэтому изготавливал сам, используя ЛУТ технологию и пару часов свободного времени. Дабы облегчить труд и сэкономить время, печатную плату сделал одностороннюю с перемычками из МГШВ 0,5. Проект схемы и печатной платы в DipTrace, тестовые исходные коды, перечень комплектующих и туториал с командами для конфигурации в
репозитории.
PS: в приведенном ниже видеоролике используется самая первая плата для моделирования, она была собрана на макетной плате с кнопками и светодиодами за 20 минут, на базе нее появились следующие версии:

  • +2
  • 17 июля 2017, 15:00
  • Jman

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.