Tarjeta de expansión de simulación Raspberry Pi

Durante mucho tiempo, la microcomputadora Raspberry Pi ha entrado en la vida de geeks, administradores de sistemas, programadores e ingenieros electrónicos. Económico y relativamente potente para su clase, con puertos de E / S incorporados, puede hacer frente a diversas tareas y satisfacer las necesidades del usuario. Después de comprar una Raspberry Pi, quería algo para encender, medir y administrar dispositivos externos. Actualmente se están vendiendo una gran cantidad de tarjetas de expansión, como aquí, Puede usar la placa de pruebas con cables para la creación rápida de prototipos, pero prefiero hacer dispositivos por mi cuenta, para tareas específicas. Por primera vez, no utilicé un peine de dos filas para todas las salidas, sino que me limité a varios puertos de E / S, SPI, I2C y bus UART. Conecté la Raspberry Pi con los cables de destino para la creación de prototipos "mamá-mamá".

imagen

En este sentido, se desarrolló una serie de tres tableros de prototipos, uno de ellos, el más simple que discutiré en este artículo.

Entonces, lo que necesitaba:

  • Trabaja con GPIO con entradas y salidas;
  • Gestión de carga;
  • Conexión de sensores de temperatura en el bus de 1 cable;
  • Medida de voltaje;
  • Reloj de tiempo real;
  • Monitoreo y control de un dispositivo externo a través del bus RS485;
  • Fuente de alimentación separada para tarjeta de expansión;

Según la lista anterior, se ha desarrollado un circuito eléctrico:
imagen
Un circuito de un almacenamiento de alta resolución

El circuito utiliza una fuente de alimentación de transformador con dos devanados de salida. El primer devanado opera en un regulador de voltaje lineal con una salida de 5V, para alimentar el chip controlador RS485 y el reloj en tiempo real. El segundo devanado se utiliza para alimentar relés electromagnéticos y ensamblar con transistores Darlington.

El sensor de temperatura DS18B20 funciona con + 3.3V de la placa Raspberry Pi, la placa tiene un conector para conectar sensores externos DS18B20, se toma el mismo voltaje para el ADC y los niveles correspondientes con un reloj en tiempo real. El circuito usa cuatro botones S1-S4 para controlar cualquier acción que opere a un nivel lógico bajo. Para controlar las cargas, se utiliza el conjunto de transistor DD1 ULN2003 con diodos de protección incorporados. Los relés K1 y K2 están conectados a los pines 16, 15 del conjunto del transistor, los LED para indicación están conectados a los pines 14-12, los pines 11, 10 están diseñados para conectarse a dispositivos externos de acuerdo con el esquema con un colector común o relés adicionales con un voltaje de bobinado de + 12V.

Para medir el voltaje, se utilizan dos canales de un ADC DD3 MCP3008 de 10 bits con una interfaz SPI, con un filtro de paso bajo de entrada. El nodo analógico está hecho primitivamente, con fines académicos o para una depuración rápida. Si surge la pregunta sobre la medición cualitativa de una señal analógica, tendrá que desacoplar la tierra digital y analógica, use una fuente de referencia de voltaje externo. Alternativamente, la parte analógica se puede hacer de la siguiente manera:



solo será necesario usar el convertidor de nivel TTL → LVTTL en el bus SPI.

El reloj DD4 en tiempo real está hecho en el chip DS1307, y el resonador de cuarzo Q1 a 32.768 kHz se usa para la sincronización. Se utiliza una batería de litio de 3 voltios soldada en la placa para alimentar el chip RAM del reloj. El microcircuito se conecta a través de un convertidor de nivel de 5V-3.3V hecho en los transistores MOS VT2, VT3 a la Raspberry Pi a través del bus I2C (CAD usó la conexión a líneas sin conexión explícita).

Como controlador UART → RS485, se utilizó el chip DD2 ST485. Las soluciones de circuito que usan el transistor VT1 permitieron abandonar una salida separada para controlar el transceptor. Cambia al modo de transmisión solo cuando el UART está transmitiendo datos, el resto del tiempo ST485 está en modo de recepción. El comando de control del transceptor se elimina del colector del transistor VT1.

Además de convertir las interfaces, este esquema también cumple la función de hacer coincidir los niveles LVTTL de la interfaz UART Raspberry Pi con los niveles TTL del controlador ST485. La señal tomada del colector del transistor VT1 eleva el nivel en la entrada DI a 5V, y la resistencia R16 y el diodo Zener VD8 limitan el nivel desde la salida R0 a 3.3V. No preste atención a la resistencia R11, permaneció en el circuito durante la depuración. RS485 se prueba con el protocolo ModBus RTU a 115200 baudios.

En consecuencia, se desarrolló aún más una placa de circuito:



Modelos en 3D de la placa de circuito impreso



Foto del dispositivo terminado y trabajo con la placa de expansión:







Variante del esquema de conexión con dispositivos externos:


para verificar los nodos de la placa de expansión, utilicé un par de scripts en python (no sé este idioma, escribí por prueba y error, mirando los códigos de especialistas)
Para medir el voltaje de un potenciómetro conectado a los canales ADC, escribí un simple guión:

Fuente de Python MCP3008
#!/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)



El siguiente script se usó para trabajar con termómetros DS18B20:

Fuente de Python 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)


También documenté la configuración en Raspbian:

Configurar dispositivos
— 1 Wire settings:
— Raspbian wheezy

Enter command in console:
pi@raspberrypi~$ sudo modprobe w1-gpio
pi@raspberrypi~$ sudo modprobe w1_therm

Then 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_sla

And 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=22937

t=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.txt

On next step you should write in config file
dtoverlay=w1-gpio,gpiopin=4
dtoverlay=w1-gpio-pullup

Then 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_ds1307

Comment one line in file:
pi@raspberrypi~$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
Add # Symbol in beginning of line

blacklist i2c-bcm2708
________________________________________________________
Reboot system;
Enter command:
pi@raspberrypi~$ sudo lsmod

You will see lines like:
rtc_ds1307 7715 0
i2c_dev 5277 0
i2c_bcm2708 4719 0
________________________________________________________

Get DS1307 address:
pi@raspberrypi~$ sudo i2cdetect -y 1

You 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_device

Read clock:
pi@raspberrypi~$ sudo hwclock -r

Set time:
pi@raspberrypi~$ sudo hwclock -w
Set system time from RTC:
pi@raspberrypi~$ sudo hwclock -s

Automatic RTC start;
Add lines in /etc/rc.local file

echo 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.bak

Delete «console=ttyAMA0,115200» «kgdboc=ttyAMA0,115200» lines from configuration file:
pi@raspberrypi~$ nano /boot/cmdline.txt

Comment last line looks like «T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100: in /etc/inittab file: using # symbol:
pi@raspberrypi~$ nano /etc/inittab


La placa de circuito se necesitaba con urgencia, así que la hice yo mismo usando la tecnología LUT y un par de horas de tiempo libre. Para facilitar el trabajo y ahorrar tiempo, la placa de circuito se hizo unilateral con puentes de MGShV 0.5. Diseño de circuito DipTrace y PCB, códigos fuente de prueba, lista de componentes y tutorial con comandos para la configuración en el
repositorio .

PD: en el video a continuación, se utiliza la primera placa de simulación, se ensambló en una placa de pruebas con botones y LED en 20 minutos, las siguientes versiones aparecieron sobre su base:

Source: https://habr.com/ru/post/es401089/


All Articles