Уже давно микрокомпьютер Raspberry Pi вошел в жизнь гиков, системных администраторов, программистов и электронщиков. Недорогой и относительно мощный для своего класса, со встроенными портами ввода/вывода, он может справиться с различными задачами и удовлетворить потребности пользователя. Купив Raspberry Pi мне захотелось что-нибудь по включать, измерить, по управлять внешними устройствами. На данный момент продается большое количество плат расширения например как здесь, можно использовать Breadboard с проводами для быстрого прототипирования, но я предпочитаю делать устройства самостоятельно, для конкретных задач. Для первого раза я не стал использовать двухрядную гребенку под все вывода, а ограничился несколькими портами ввода/вывода, шиной SPI, I2C и UART. Соединял Raspberry Pi с таргетом проводами для макетирования «мама-мама».
В связи с этим был разработан ряд из трех плат прототипирования, об одной из них, самой простой я расскажу в этой статье.
Итак, что мне было необходимо:
- Работа с GPIO как со входами так и с выходами;
- Управление нагрузкой;
- Подключение датчиков температуры по шине 1-Wire;
- Измерение напряжения;
- Часы реального времени;
- Контроль и управление внешним устройством по шине RS485;
- Отдельный источник питания для платы расширения;
Согласно вышеприведенному списку была разработана схема электрическая принципиальная:
→ Схема из хранилища с высоким разрешением
В схеме используется трансформаторный источник питания с двумя обмотками. Первая обмотка работает на линейный стабилизатор напряжения с выходом 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 бод.
Соответственно далее была разработана печатная плата:
Вариант схемы соединения с внешними устройствами:
Для проверки узлов платы расширения я использовал пару скриптов на языке phyton (я этот язык не знаю, писал методом проб и ошибок, параллельно подглядывая в коды специалистов)
Для измерения напряжения от потенциометра подключенного к каналам АЦП я написал простой скрипт:
#!/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)
# 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)
Также я задокументировал настройки в Raspbian:
— 1 Wire settings:
— Raspbian wheezyEnter command in console:
pi@raspberrypi~$ sudo modprobe w1-gpio
pi@raspberrypi~$ sudo modprobe w1_thermThen check sensor in system:
pi@raspberrypi ~ $ sudo ls /sys/bus/w1/devices/w1_bus_master1/You can see the tabel below entered comman and
there you should find HEX like 28-000002da8328;
This is DS18B20 address;Next read the data from DS18B20 sensor using command:
pi@raspberrypi ~ $ cat /sys/bus/w1/devices/w1_bus_master1/28-000002da8328/w1_slaAnd you are going see temperature in console like:
6f 01 4b 46 7f ff 01 10 67: crc=67 YES
6f 01 4b 46 7f ff 01 10 67 t=22937t=22937 — you should divide this number on 1000 and you will have temperature in Celsius;
— Raspbian Jezzy
Enter command:
pi@raspberrypi~$ sudo nano /boot/config.txtOn next step you should write in config file
dtoverlay=w1-gpio,gpiopin=4
dtoverlay=w1-gpio-pullupThen you should reboot your raspberry Pi;
— I2C Real Time Clock settings:
— Update your system if it needed and install i2c-tools:
pi@raspberrypi~$ sudo apt-get update
pi@raspberrypi~$ sudo apt-get -y upgrade
pi@raspberrypi~$ sudo apt-get i2c-tools:Enter command:
pi@raspberrypi~$ sudo nano /etc/modules
Add these lines:
i2c-bcm2708
i2c-dev
rtc_ds1307Comment one line in file:
pi@raspberrypi~$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
Add # Symbol in beginning of lineblacklist i2c-bcm2708
________________________________________________________
Reboot system;
Enter command:
pi@raspberrypi~$ sudo lsmodYou will see lines like:
rtc_ds1307 7715 0
i2c_dev 5277 0
i2c_bcm2708 4719 0
________________________________________________________Get DS1307 address:
pi@raspberrypi~$ sudo i2cdetect -y 1You will see table in console:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — -- — -- — -- — -- — -- — -- — 10: — -- — -- — -- — -- — -- — -- — -- — --
20: — -- — -- — -- — -- — -- — -- — -- — --
30: — -- — -- — -- — -- — -- — UU — -- — --
40: — -- — -- — -- — -- — -- — -- — -- — --
50: — -- — -- — -- — -- — -- — -- — -- — --
60: — -- — -- — -- — -- 68 — -- — -- — -- — 70: — -- — -- — -- — --In address 0x3b some device without driver and 0x68 perhaps DS1307 clock address.
Enter command:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_deviceRead clock:
pi@raspberrypi~$ sudo hwclock -rSet time:
pi@raspberrypi~$ sudo hwclock -w
Set system time from RTC:
pi@raspberrypi~$ sudo hwclock -sAutomatic RTC start;
Add lines in /etc/rc.local fileecho ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock -s
Before last line in file looks like:exit 0
— Uart settings:
— Back up files:
cp /boot/cmdline.txt /boot/cmdline.bak
cp /etc/inittab /etc/inittab.bakDelete «console=ttyAMA0,115200» и «kgdboc=ttyAMA0,115200» lines from configuration file:
pi@raspberrypi~$ nano /boot/cmdline.txtComment last line looks like «T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100: in /etc/inittab file: using # symbol:
pi@raspberrypi~$ nano /etc/inittab
Печатная плата была нужна в срочном порядке, поэтому изготавливал сам, используя ЛУТ технологию и пару часов свободного времени. Дабы облегчить труд и сэкономить время, печатную плату сделал одностороннюю с перемычками из МГШВ 0,5. Проект схемы и печатной платы в DipTrace, тестовые исходные коды, перечень комплектующих и туториал с командами для конфигурации в
репозитории.
PS: в приведенном ниже видеоролике используется самая первая плата для моделирования, она была собрана на макетной плате с кнопками и светодиодами за 20 минут, на базе нее появились следующие версии:
Автор: Jmann