Плата для моделирования на 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 свернуть / развернуть