مجلس التوسع محاكاة التوت بي

لفترة طويلة ، دخل الكمبيوتر الصغير Raspberry Pi حياة المهووسين ومسؤولي النظام والمبرمجين والمهندسين الإلكترونيين. غير مكلفة وقوية نسبيًا لفئتها ، مع منافذ الإدخال / الإخراج المدمجة ، يمكنها التعامل مع المهام المختلفة وتلبية احتياجات المستخدم. بعد أن اشتريت Raspberry Pi ، أردت شيئًا لتشغيل الأجهزة الخارجية وقياسها وإدارتها. يتم بيع عدد كبير من بطاقات التوسيع حاليًا ، مثل هنا، يمكنك استخدام اللوح مع الأسلاك للنماذج الأولية السريعة ، لكنني أفضل أن أصنع الأجهزة بمفردي ، لمهام محددة. لأول مرة ، لم أستخدم مشطًا من صفين لجميع المخرجات ، لكنني اقتصرت على العديد من منافذ الإدخال / الإخراج و SPI و I2C و UART bus. لقد قمت بتوصيل Raspberry Pi بالأسلاك المستهدفة للنموذج الأولي "mom-mom".

الصورة

في هذا الصدد ، تم تطوير سلسلة من ثلاث لوحات للنماذج الأولية ، حول واحدة منها ، أبسط ما سأناقشه في هذه المقالة.

ما احتاجه:

  • العمل مع GPIO مع كل من المدخلات والمخرجات ؛
  • إدارة الأحمال ؛
  • توصيل أجهزة استشعار درجة الحرارة في ناقل 1-Wire ؛
  • قياس الجهد
  • ساعة الوقت الحقيقي
  • مراقبة ومراقبة جهاز خارجي عبر ناقل RS485 ؛
  • مصدر طاقة منفصل لبطاقة التوسع ؛

وفقًا للقائمة أعلاه ، تم تطوير دائرة كهربائية:
الصورة
دائرة من وحدة تخزين عالية الدقة

تستخدم الدائرة مصدر طاقة محول بلفي خرج. يعمل الملف الأول على منظم جهد خطي مع خرج 5 فولت ، لتشغيل رقاقة سائق RS485 والساعة في الوقت الحقيقي. يتم استخدام اللفة الثانية لتشغيل المرحلات الكهرومغناطيسية والتجميع مع ترانزستورات دارلينجتون.

يتم تشغيل مستشعر درجة الحرارة DS18B20 + 3.3V من لوحة Raspberry Pi ، وتحتوي اللوحة على موصل لتوصيل مستشعرات DS18B20 الخارجية ، ويتم أخذ نفس الجهد ل ADC ومستويات مطابقة مع ساعة الوقت الحقيقي. تستخدم الدائرة أربعة أزرار S1-S4 للتحكم في أي إجراءات تعمل على مستوى منطق منخفض. للتحكم في الأحمال ، يتم استخدام مجموعة الترانزستور DD1 ULN2003 مع الثنائيات الواقية المدمجة. ترتبط المرحلات K1 و K2 بالدبابيس 16 و 15 من مجموعة الترانزستور ، وترتبط مؤشرات LED للإشارة بالدبابيس 14-12 ، والدبابيس 11 و 10 مصممة للاتصال بالأجهزة الخارجية وفقًا للمخطط مع جامع مشترك أو مرحلات إضافية بجهد متعرج + 12 فولت.

لقياس الجهد ، يتم استخدام قناتين من 10 بت ADC DD3 MCP3008 مع واجهة SPI ، مع مرشح تمرير تمرير منخفض. العقدة التناظرية مصنوعة بشكل أساسي ، لأغراض أكاديمية أو لتصحيح سريع. إذا ظهر سؤال حول القياس النوعي للإشارة التناظرية ، فسيتعين عليك فصل الأرضية الرقمية والتناظرية ، واستخدام مصدر مرجعي خارجي للجهد. بدلاً من ذلك ، يمكن إجراء الجزء التمثيلي على النحو التالي:



سيكون من الضروري فقط استخدام محول مستوى TTL → LVTTL في ناقل SPI.

يتم تصنيع ساعة الوقت الحقيقي DD4 على شريحة DS1307 ، ويستخدم مرنان الكوارتز Q1 بتردد 32.768 كيلوهرتز لتسجيل الوقت. يتم استخدام بطارية ليثيوم 3 فولت ملحومة في اللوحة لتشغيل رقاقة ذاكرة الوصول العشوائي على مدار الساعة. يتم توصيل الدائرة المصغرة عن طريق محول مستوى 5V-3.3V مصنوع على ترانزستورات MOS VT2 و VT3 إلى Raspberry Pi عبر ناقل I2C (يستخدم CAD الاتصال بالخطوط دون اتصال صريح).

كمشغل UART → RS485 ، تم استخدام شريحة DD2 ST485. سمحت حلول الدوائر باستخدام الترانزستور VT1 بالتخلي عن خرج منفصل للتحكم في جهاز الإرسال والاستقبال. يتحول إلى وضع الإرسال فقط عندما يقوم UART بإرسال البيانات ، والباقي من الوقت يكون ST485 في وضع الاستقبال. تتم إزالة أمر التحكم في جهاز الإرسال والاستقبال من جامع الترانزستور VT1.

بالإضافة إلى تحويل الواجهات ، يؤدي هذا المخطط أيضًا وظيفة مطابقة مستويات LVTTL لواجهة UART Raspberry Pi مع مستويات TTL لبرنامج التشغيل ST485. تسحب الإشارة المأخوذة من جامع الترانزستور VT1 المستوى عند إدخال DI إلى 5V ، ويحد المقاوم R16 و Zener diode VD8 من المستوى من الإخراج R0 إلى 3.3V. لا تنتبه إلى المقاوم R11 ، فقد بقي في الدائرة أثناء التصحيح. تم اختبار RS485 مع بروتوكول ModBus RTU عند 115200 باود.

وبناءً على ذلك ، تم تطوير لوحة الدوائر بشكل أكبر:



نماذج ثلاثية الأبعاد للوحة الدوائر المطبوعة



صورة للجهاز النهائي والعمل مع لوحة التوسيع:







البديل لمخطط الاتصال مع الأجهزة الخارجية:


للتحقق من عقد لوحة التوسعة ، استخدمت زوجًا من النصوص البرمجية في الثعبان (لا أعرف هذه اللغة ، كتبت بالتجربة والخطأ ، والنظر في رموز المتخصصين)
لقياس الجهد من مقياس الجهد المتصل بقنوات ADC ، كتبت بسيطة البرنامج النصي:

مصدر 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)



تم استخدام البرنامج النصي التالي للعمل مع موازين الحرارة DS18B20:

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)


لقد وثقت أيضًا الإعدادات في Raspbian:

تكوين الأجهزة
— 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


كانت هناك حاجة ماسة إلى لوحة الدوائر الكهربية ، لذلك قمت بنفسي باستخدام تقنية LUT وساعتين من وقت الفراغ. من أجل تسهيل العمل وتوفير الوقت ، تم صنع لوحة الدائرة من جانب واحد مع وصلات من MGShV 0.5. دائرة DipTrace وتصميم PCB ، رموز مصدر الاختبار ، قائمة المكونات والبرنامج التعليمي مع أوامر للتكوين في
المستودع .

ملاحظة: في الفيديو أدناه ، تم استخدام أول لوحة محاكاة ، تم تجميعها على لوحة توصيل بأزرار ومصابيح LED في 20 دقيقة ، ظهرت الإصدارات التالية على أساسها:

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


All Articles