Raspberry Pi Simulation Erweiterungskarte

Der Raspberry Pi-Mikrocomputer ist seit langem in das Leben von Geeks, Systemadministratoren, Programmierern und Elektronikingenieuren eingetreten. Es ist kostengĂŒnstig und fĂŒr seine Klasse relativ leistungsfĂ€hig. Mit integrierten E / A-Ports kann es verschiedene Aufgaben bewĂ€ltigen und die Benutzeranforderungen erfĂŒllen. Nachdem ich einen Raspberry Pi gekauft hatte, wollte ich etwas, um externe GerĂ€te einzuschalten, zu messen und zu verwalten. Derzeit wird eine große Anzahl von Erweiterungskarten verkauft, wie hierSie können Breadboards mit DrĂ€hten fĂŒr Rapid Prototyping verwenden, aber ich bevorzuge es, GerĂ€te fĂŒr bestimmte Aufgaben selbst herzustellen. Zum ersten Mal habe ich nicht fĂŒr alle AusgĂ€nge einen zweireihigen Kamm verwendet, sondern mich auf mehrere E / A-Ports, SPI, I2C und UART-Bus beschrĂ€nkt. Ich habe den Raspberry Pi mit den ZieldrĂ€hten fĂŒr das Prototyping von "Mama-Mama" verbunden.

Bild

In diesem Zusammenhang wurde eine Reihe von drei Prototyping-Boards entwickelt, von denen eines das einfachste ist, das ich in diesem Artikel diskutieren werde.

Also was ich brauchte:

  • Arbeiten Sie mit GPIO mit Ein- und AusgĂ€ngen.
  • Lastmanagement;
  • Anschluss von Temperatursensoren am 1-Draht-Bus;
  • Spannungsmessung;
  • Echtzeituhr;
  • Überwachung und Steuerung eines externen GerĂ€ts ĂŒber den RS485-Bus;
  • Separate Stromversorgung fĂŒr Erweiterungskarte;

GemĂ€ĂŸ der obigen Liste wurde eine elektrische Schaltung entwickelt:
Bild
→ Eine Schaltung aus einem hochauflösenden Speicher

Die Schaltung verwendet eine Transformatorstromquelle mit zwei Ausgangswicklungen. Die erste Wicklung arbeitet mit einem linearen Spannungsregler mit einem 5-V-Ausgang, um den RS485-Treiberchip und die Echtzeituhr mit Strom zu versorgen. Die zweite Wicklung dient zur Stromversorgung elektromagnetischer Relais und zur Montage mit Darlington-Transistoren.

Der DS18B20-Temperatursensor wird mit +3,3 V von der Raspberry Pi-Karte gespeist. Die Karte verfĂŒgt ĂŒber einen Anschluss zum Anschließen externer DS18B20-Sensoren. Die gleiche Spannung wird fĂŒr den ADC angelegt und die Pegel mit einer Echtzeituhr abgeglichen. Die Schaltung verwendet vier Tasten S1-S4, um alle Aktionen zu steuern, die auf einem niedrigen Logikpegel arbeiten. Zur Steuerung der Lasten wird die Transistorbaugruppe DD1 ULN2003 mit eingebauten Schutzdioden verwendet. Die Relais K1 und K2 sind mit den Stiften 16, 15 der Transistoranordnung verbunden, die LEDs zur Anzeige sind mit den Stiften 14-12 verbunden, die Stifte 11, 10 sind zum Verbinden mit externen GerĂ€ten gemĂ€ĂŸ dem Schema mit einem gemeinsamen Kollektor oder zusĂ€tzlichen Relais mit einer Spannung von +12 V der Wicklung ausgelegt.

Zur Spannungsmessung werden zwei KanĂ€le eines 10-Bit-ADC DD3 MCP3008 mit SPI-Schnittstelle und Tiefpassfilter verwendet. Der analoge Knoten wird primitiv fĂŒr akademische Zwecke oder zum schnellen Debuggen erstellt. Wenn sich die Frage nach der qualitativen Messung eines analogen Signals stellt, mĂŒssen Sie die digitale und analoge Masse entkoppeln und eine externe Spannungsreferenzquelle verwenden. Alternativ kann der analoge Teil wie folgt ausgefĂŒhrt werden:



Es muss nur der TTL → LVTTL-Pegelwandler am SPI-Bus verwendet werden.

Der Echtzeit-Takt DD4 wird auf dem DS1307-Chip hergestellt, und der Quarzresonator Q1 bei 32,768 kHz wird zum Takten verwendet. Eine in die Platine eingelötete 3-Volt-Lithiumbatterie wird zur Stromversorgung des RAM-Chips der Uhr verwendet. Die Mikroschaltung wird ĂŒber einen 5V-3,3V-Pegelwandler, der an den MOS-Transistoren VT2, VT3 hergestellt ist, ĂŒber den I2C-Bus mit dem Raspberry Pi verbunden (CAD verwendet Verbindung zu Leitungen ohne explizite Verbindung).

Als UART → RS485-Treiber wurde der DD2 ST485-Chip verwendet. Schaltungslösungen unter Verwendung des Transistors VT1 ermöglichten es, einen separaten Ausgang zur Steuerung des Transceivers aufzugeben. Es wechselt nur in den Sendemodus, wenn der UART Daten sendet, der Rest der Zeit befindet sich ST485 im Empfangsmodus. Der Transceiver-Steuerbefehl wird vom Kollektor des Transistors VT1 entfernt.

ZusĂ€tzlich zur Konvertierung der Schnittstellen erfĂŒllt dieses Schema auch die Funktion, die LVTTL-Pegel der UART Raspberry Pi-Schnittstelle mit den TTL-Pegeln des ST485-Treibers abzugleichen. Das vom Kollektor des Transistors VT1 aufgenommene Signal zieht den Pegel am DI-Eingang auf 5 V, und der Widerstand R16 und die Zenerdiode VD8 begrenzen den Pegel vom Ausgang R0 auf 3,3 V. Achten Sie nicht auf den Widerstand R11, er blieb wĂ€hrend des Debuggens im Stromkreis. RS485 wird mit dem ModBus RTU-Protokoll bei 115200 Baud getestet.

Dementsprechend wurde eine Leiterplatte weiterentwickelt:



3D-Modelle der Leiterplatte



Foto des fertigen GerÀts und Arbeit mit der Erweiterungskarte:







Eine Variante des Verbindungsschemas mit externen GerÀten:


Um die Knoten der Erweiterungskarte zu ĂŒberprĂŒfen, habe ich einige Skripte in Python verwendet (ich kenne diese Sprache nicht, habe ich durch Ausprobieren geschrieben und dabei die Codes von Spezialisten parallel betrachtet).
Um die Spannung von einem Potentiometer zu messen, das an die ADC-KanÀle angeschlossen ist, habe ich ein einfaches geschrieben Skript:

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



Das folgende Skript wurde fĂŒr die Arbeit mit DS18B20-Thermometern verwendet:

DS18B20 Python-Quelle

# 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)


Ich habe auch die Einstellungen in Raspbian dokumentiert:

GerÀte konfigurieren
— 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


Die Leiterplatte wurde dringend benötigt, deshalb habe ich sie selbst mit LUT-Technologie und ein paar Stunden Freizeit hergestellt. Um die Arbeit zu erleichtern und Zeit zu sparen, wurde die Leiterplatte einseitig mit SteckbrĂŒcken von MGShV 0.5 hergestellt. DipTrace-Schaltungs- und Leiterplattendesign, Testquellcodes, Liste der Komponenten und Lernprogramm mit Befehlen zur Konfiguration im
Repository .

PS: Im Video unten wird das allererste Simulationsboard verwendet. Es wurde in 20 Minuten auf einem Steckbrett mit Tasten und LEDs zusammengebaut. Die folgenden Versionen wurden auf seiner Basis angezeigt:

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


All Articles