Papan Ekspansi Simulasi Raspberry Pi

Untuk waktu yang lama, komputer mikro Raspberry Pi telah memasuki kehidupan Geeks, administrator sistem, programmer dan insinyur elektronik. Murah dan relatif kuat untuk kelasnya, dengan port I / O bawaan, dapat mengatasi berbagai tugas dan memenuhi kebutuhan pengguna. Setelah membeli Raspberry Pi, saya ingin sesuatu untuk menghidupkan, mengukur, dan mengelola perangkat eksternal. Sejumlah besar kartu ekspansi saat ini sedang dijual, seperti di sini, Anda dapat menggunakan papan tempat memotong roti dengan kabel untuk pembuatan prototipe cepat, tetapi saya lebih suka membuat perangkat sendiri, untuk tugas-tugas tertentu. Untuk pertama kalinya, saya tidak menggunakan sisir dua baris untuk semua output, tetapi membatasi diri pada beberapa port I / O, SPI, I2C, dan bus UART. Saya menghubungkan Raspberry Pi dengan kabel target untuk membuat prototipe "ibu-ibu."

gambar

Dalam hal ini, serangkaian tiga papan prototipe dikembangkan, tentang salah satunya, yang paling sederhana yang akan saya bahas dalam artikel ini.

Jadi yang saya butuhkan:

  • Bekerja dengan GPIO dengan input dan output;
  • Manajemen beban;
  • Koneksi sensor suhu pada bus 1-Kawat;
  • Pengukuran tegangan;
  • Jam waktu nyata;
  • Pemantauan dan kontrol perangkat eksternal melalui bus RS485;
  • Catu daya terpisah untuk kartu ekspansi;

Menurut daftar di atas, sirkuit listrik telah dikembangkan:
gambar
β†’ Sirkuit dari penyimpanan resolusi tinggi

. Sirkuit ini menggunakan sumber daya transformator dengan dua belitan keluaran. Gulungan pertama beroperasi pada regulator tegangan linier dengan output 5V, untuk memberi daya pada chip driver RS485 dan jam waktu-nyata. Gulungan kedua digunakan untuk menyalakan relay dan perakitan elektromagnetik dengan transistor Darlington.

Sensor suhu DS18B20 didukung oleh + 3.3V dari papan Raspberry Pi, papan memiliki konektor untuk menghubungkan sensor DS18B20 eksternal, tegangan yang sama diambil untuk ADC dan level yang cocok dengan jam waktu nyata. Sirkuit ini menggunakan empat tombol S1-S4 untuk mengontrol tindakan apa pun yang beroperasi pada tingkat logika rendah. Untuk mengontrol beban, unit transistor DD1 ULN2003 dengan dioda pelindung bawaan digunakan. Relay K1 dan K2 terhubung ke pin 16, 15 dari unit transistor, LED untuk indikasi terhubung ke pin 14-12, pin 11, 10 dirancang untuk terhubung ke perangkat eksternal sesuai dengan skema dengan kolektor umum atau relay tambahan dengan tegangan belitan + 12V.

Untuk mengukur tegangan, dua saluran ADC DD3 MCP3008 10-bit dengan antarmuka SPI, dengan input filter low-pass digunakan. Node analog dibuat secara primitif, untuk tujuan akademis atau untuk debugging cepat. Jika muncul pertanyaan tentang pengukuran kualitatif sinyal analog, Anda harus memisahkan tanah digital dan analog, gunakan sumber referensi tegangan eksternal. Atau, bagian analog dapat dilakukan sebagai berikut:



Hanya diperlukan untuk menggunakan konverter level TTL β†’ LVTTL pada bus SPI.

Jam real-time DD4 dibuat pada chip DS1307, dan kuarsa resonator Q1 pada 32,768 kHz digunakan untuk clocking. Baterai lithium 3 volt yang disolder ke papan digunakan untuk menyalakan chip RAM jam. Microcircuit terhubung melalui konverter level 5V-3.3V yang dibuat pada transistor MOS VT2, VT3 ke Raspberry Pi melalui bus I2C (CAD menggunakan koneksi ke saluran tanpa koneksi eksplisit).

Sebagai driver UART β†’ RS485, chip DD2 ST485 digunakan. Solusi rangkaian menggunakan transistor VT1 diizinkan untuk meninggalkan output terpisah untuk mengendalikan transceiver. Ia beralih ke mode transmisi hanya ketika UART mentransmisikan data, sisa waktu ST485 dalam mode terima. Perintah kontrol transceiver dihapus dari kolektor transistor VT1.

Selain mengubah antarmuka, skema ini juga melakukan fungsi mencocokkan level LVTTL dari antarmuka UART Raspberry Pi dengan level TTL dari driver ST485. Sinyal yang diambil dari pengumpul transistor VT1 menarik level pada input DI ke 5V, dan resistor R16 dan dioda Zener VD8 membatasi level dari output R0 ke 3.3V. Jangan memperhatikan resistor R11, itu tetap di sirkuit selama debugging. RS485 diuji dengan protokol ModBus RTU pada 115200 baud.

Oleh karena itu, papan sirkuit dikembangkan lebih lanjut:



Model 3D papan sirkuit tercetak



Foto perangkat jadi dan bekerja dengan papan ekspansi:







Varian dari skema koneksi dengan perangkat eksternal:


Untuk memeriksa node dari papan ekspansi, saya menggunakan beberapa skrip dengan python (saya tidak tahu bahasa ini, saya menulis dengan cara coba-coba, mengintip kode spesialis)
Untuk mengukur tegangan dari potensiometer yang terhubung ke saluran ADC, saya menulis sederhana skrip:

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



Skrip berikut digunakan untuk bekerja dengan termometer DS18B20:

Sumber python DS18B20
Kode yang digunakan dari situs
# 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)


Saya juga mendokumentasikan pengaturan dalam Raspbian:

Konfigurasikan perangkat
β€” 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


Papan sirkuit sangat dibutuhkan, jadi saya membuatnya sendiri menggunakan teknologi LUT dan beberapa jam waktu luang. Untuk memudahkan pekerjaan dan menghemat waktu, papan sirkuit dibuat satu sisi dengan jumper dari MGShV 0,5. Rangkaian DipTrace dan desain PCB, kode sumber uji, daftar komponen dan tutorial dengan perintah untuk konfigurasi dalam
repositori .

PS: dalam video di bawah ini, papan simulasi pertama digunakan, itu dirakit di papan tempat memotong roti dengan tombol dan LED dalam 20 menit, versi berikut muncul berdasarkan:

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


All Articles