Телефонуйте » (+38) 096 227 41 41

Pioneer600 – багатофункціональна плата розширення для одноплатного мінікомп’ютера Raspberry Pi (RPi). Характерною особливістю плати є підтримка моделей Raspberry Pi A+/B+/2B/3B.

На платі встановлені: роз’єм для підключення до інтерфейсу GPIO мікрокомп’ютера, світлодіоди – два користувачів, один – індикатор живлення, джойстик, зумер, базові компоненти. Міст USB-UART на основі CP2102 дозволяє керувати RPi через послідовний термінал. Для відображення інформації на платі встановлений OLED дисплей з діагоналлю 0.96''. Прецизійний годинник реального часу зібраний на мікросхемі DS3231 з інтерфейсом I2C. На платі встановлений тримач батареї резервного живлення RTC. 8-бітний АЦП/ЦАП зібраний на мікросхемі PCF8591 з інтерфейсом I2C. Доступ до перетворювача здійснюється через клемну колодку. Крім того, на платі є: сенсор тиску BMP180 з інтерфейсом I2C, мікросхема розширювача ліній вводу/виводу PCF8574, інфрачервоний приймач LFN0038K, роз’єми інтерфейсу 1-Wire, а також окремий роз’єм інтерфейсу для підключення різних сенсорів.

Параметри:

  • - підтримка Raspberry Pi A+/B+/2B
  • <Standard I/O> здвоєний LED, джойстик, зумер, базові компоненти
  • <USB TO UART> CP2102, керування RPi через послідовний термінал
  • <Display> 0.96-дюймовий OLED, велике слово на маленькому екрані
  • <RTC> DS3231, висока точність, доступний тримач для батареї резервного живлення
  • <AD/DA> PCF8591, 8-бітовий дозвіл, клемна колодка IO-інтерфейсу
  • <GPIO Expansion> PCF8574, більше GPIO, більше можливостей
  • <IR Control> LFN0038K, віддалене керування RPi
  • <Pressure Sensor> BMP180, вимірювання тиску повітря і температури
  • <1-WIRE> для підключення 1-Wire пристроїв, на платі є сенсор DS18B20
  • <Sensor Interface> - інтерфейс для підключення різних сенсорів
  •  

Елементи плати

1. Raspberry Pi GPIO інтерфейс: для підключення до Raspberry Pi
2. USB TO UART: керування RPi через послідовний термінал
3. АЦП/ЦАП інтерфейс IO: клемна колодка
4. 1-Wire інтерфейс: для підключення 1-Wire пристроїв типу DS18B20
5. Інтерфейс сенсорів: для підключення різних сенсорів
6. 0.96-дюймовий OLED: драйвер SSD1306, дозвіл 128×64, SPI інтерфейс
7. Зумер
8. CP2102: USB TO UART перетворювач
9. PCF8591: 8-бітовий АЦП/ЦАП, I2C інтерфейс
10. BMP180: сенсор тиску, I2C інтерфейс
11. PCF8574: мікросхема розширення I/O, I2C інтерфейс
12. DS3231: високоточна мікросхема RTC, I2C інтерфейс
13. Індикатор живлення
14. Світлодіоди користувача
15. Джойстик
16. LFN0038K: ІЧ приймач

Попередні налаштування

Як встановити всі необхідні бібліотеки ми розглянули в уроці 17.

Якщо всі необхідні конфігурації виконані, можна завантажити зразки програм з файлу: Pioneer600-Code.tar.gz та розпакувати їх у директорію /home/pi (ви також можете скопіювати їх на RPi зі свого диска). Деякі зразки програм можуть бути реалізовані різними способами: через бібліотеки bcm2835, wiringPi, sysfs, python тощо. Це означає, що ви можете реалізувати однакові функції, використовуючи різні бібліотеки. Бібліотеки bcm2835, wiringPi та python повинні бути встановлені на RPi до використання. У наступному уроці ми розглянемо, як підключити до плати розширення зовнішні сенсори.

Після установки бібліотек можна спробувати застосувати команду:

sudo chmod + x ім'я файлу

щоб надати програмі дозвіл на виконання.

Підключення плати розширення до RPi

Перед тим, як запускати програми, переконайтеся, що Pioneer600 підключено до RPi, а RPi підключено до джерела живлення через роз’єм мікроUSB. Без плати RPi програми не можуть бути використані на платі розширення.

Розглянемо приклади програм на Python, які дозволяють скористатися можливостями плати.

Високоточний годинник реального часу (RTC) на DS3231

Програмний код зберігається у файлі ds3231.py.

# -*- coding: utf-8 -*-
import smbus
import time
#адреса пристрою i2c
address = 0x68
register = 0x00
#сек хв години тиждень день місяць рік
NowTime = [0x00,0x00,0x18,0x04,0x12,0x08,0x15]
w  = ["SUN","Mon","Tues","Wed","Thur","Fri","Sat"];
#/dev/i2c-1
bus = smbus.SMBus(1)
def ds3231SetTime():
    bus.write_i2c_block_data(address,register,NowTime)

def ds3231ReadTime():
    return bus.read_i2c_block_data(address,register,7);

ds3231SetTime()
while 1:
    t = ds3231ReadTime()
    t[0] = t[0]&0x7F  #sec
    t[1] = t[1]&0x7F  #min
    t[2] = t[2]&0x3F  #hour
    t[3] = t[3]&0x07  #week
    t[4] = t[4]&0x3F  #day
    t[5] = t[5]&0x1F  #mouth
    print("20%x/%02x/%02x %02x:%02x:%02x %s" %(t[6],t[5],t[4],t[2],t[1],t[0],w[t[3]-1]))
    time.sleep(1)

Для запуска демонстраційної програми перейдіть в директорію ~/Pioneer600/DS3231/python і в термінальному режимі введіть команду:

sudo python ds3231.py

Термінал покаже наступну інформацію, як результат виконання команди:

2015/08/12 18:00:00 Wed
2015/08/12 18:00:01 Wed
2015/08/12 18:00:02 Wed
2015/08/12 18:00:03 Wed
2015/08/12 18:00:04 Wed

Натисніть Ctrl+C для завершення роботи.

Зміна стану світлодіодів користувача

Програмний код зберігається у файлі led.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

LED = 26

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)
try:
    while True:
        GPIO.output(LED,GPIO.HIGH)
        time.sleep(1)
        GPIO.output(LED,GPIO.LOW)
        time.sleep(1)
except:
    print("except")
    GPIO.cleanup()

Для запуска демонстраційної програми перейдіть в директорію ~/Pioneer600/LED/python і в термінальному режимі введіть команду:

sudo python led.py

В результаті виконання світлодіод LED1 почне мерехтіти.
Натисніть Ctrl+C для завершення роботи.

Завдання

Збільшіть частоту перемикання світлодіода до значення, коли мерехтіння стане непомітним.

Реалізація широтно-імпульсної модуляції (PWM)

Програмний код зберігається у файлі pwm.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
LED = 26
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)

p = GPIO.PWM(LED,50)
p.start(0)
try:
    while True:
        for dc in range(0,101,5):
            p.ChangeDutyCycle(dc)
            time.sleep(0.05)
        for dc in range(100,-1,-5):
            p.ChangeDutyCycle(dc)
            time.sleep(0.05)
except KeyboardInterrupt:
    pass
    p.stop()
    GPIO.cleanup()

Для запуска демонстраційної програми перейдіть в директорію ~/Pioneer600/LED/python і в термінальному режимі введіть команду:

sudo python pwm.py

В результаті виконання програми світлодіод LED1 змінює свою яскравість.
Натисніть Ctrl+C для завершення роботи.

Завдання

Задайте частоту імпульсів, знайдену в попередньому завданні, коли мерехтіння діоду стає непомітним, щоб отримати лише поступову зміну яскравості світлодіоду без його мерехтіння.

Організація роботи джойстика

Програмний код зберігається у файлі key.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

KEY = 20

GPIO.setmode(GPIO.BCM)
GPIO.setup(KEY,GPIO.IN,GPIO.PUD_UP)
print("Key Test Program")
while True:
    time.sleep(0.05)
    if GPIO.input(KEY) == 0:
        print("KEY PRESS")
        while GPIO.input(KEY) == 0:
            time.sleep(0.01)

Для запуска програми перейдіть в директорію ~/Pioneer600/KEY/python і в термінальному режимі введіть команду:

sudo python key.py

Натисніть центральну клавішу джойстика і термінал покаже наступну інформацію:

Key Test Program
KEY PRESS
KEY PRESS
KEY PRESS

Натисніть Ctrl+C для завершення роботи.

Розширення входів/виходів за допомогою мікросхеми PCF8574

Приклад 1. Керування світлодіодом LED2. Програмний код зберігається у файлі led.py:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import smbus
import time

address = 0x20

bus = smbus.SMBus(1)
while True:
    bus.write_byte(address,0xEF)
    time.sleep(0.5)
    bus.write_byte(address,0xFF)
    time.sleep(0.5)

Для запуска програми перейдіть в директорію ~/Pioneer600/PCF8574/python і в термінальному режимі введіть команду:

sudo python led.py

Світлодіод LED2 почне мерехтіти.
Натисніть Ctrl+C для завершення роботи.

Завдання

Порівняйте коди /LED/python/led.py і /PCF8574/python/led.py. Поясніть відмінності.

Приклад 2. Програмний код даного прикладу зберігається у файлі pcf8574.py:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import smbus
import time

address = 0x20

def beep_on():
    bus.write_byte(address,0x7F&bus.read_byte(address))
def beep_off():
    bus.write_byte(address,0x80|bus.read_byte(address))
def led_off():
    bus.write_byte(address,0x10|bus.read_byte(address))
def led_on():
    bus.write_byte(address,0xEF&bus.read_byte(address))

bus = smbus.SMBus(1)
print("PCF8574 Test Program !!!")
while True:
    bus.write_byte(address,0x0F|bus.read_byte(address))
    value = bus.read_byte(address) | 0xF0
    if value != 0xFF:
        led_on()
        beep_on()
        if (value | 0xFE) != 0xFF:
            print("left")
        elif (value | 0xFD) != 0xFF:
            print("up")
        elif (value | 0xFB) != 0xFF:
            print("dowm")
        else :
            print("right")
        while value != 0xFF:
            bus.write_byte(address,0x0F|bus.read_byte(address))
            value = bus.read_byte(address) | 0xF0
            time.sleep(0.01)
        beep_off()
        led_off()
    time.sleep(0.1)

Для запуска програми перейдіть в директорію ~/Pioneer600/PCF8574/python і в термінальному режимі введіть команду:

sudo python pcf8574.py

При натисканні джойстика в різних напрямках повинна збільшуватися яскравість світлодіоду LED2, зумер згенерує звук і на терміналі з’явиться наступна інформація:

PCF8574 Test Program !!!
up
left
down
right

Натисніть Ctrl+C для завершення роботи.

Вимірювання температури з сенсором DS18B20

Для використання програми з сенсором DS18B20, вам необхідно додати рядок dtoverlay=w1-gpio-pullup в кінці файла завантаження /boot/config.txt Raspberry Pi і перезапустити RPi, щоб зміни вступили в дію.

Програмний код зберігається у файлі ds18b20.py:

#!/usr/bin/python
# -*- coding:utf-8 -*-
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 + '28*')[0]
device_file = device_folder + '/w1_slave'
def read_rom():
    name_file=device_folder+'/name'
    f = open(name_file,'r')
    return f.readline()

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

print(' rom: '+ read_rom())
while True:
    print(' C=%3.3f  F=%3.3f'% read_temp())
    time.sleep(1)

Для запуска програми перейдіть в директорію ~/Pioneer600/DS18B20/python і в термінальному режимі введіть команду:

sudo python ds18b20.py

При виконанні програми термінал буде відображати наступну інформацію:

rom: 28-00000674869d
C=29.687 F=85.437
C=29.687 F=85.437
C=29.687 F=85.437

Натисніть Ctrl+C для завершення роботи.

Програма для керування від ІЧ-пульту

Програмний код зберігається у файлі irm.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

PIN = 18;

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN,GPIO.IN,GPIO.PUD_UP)
print('IRM Test Start ...')
try:
    while True:
        if GPIO.input(PIN) == 0:
            count = 0
            while GPIO.input(PIN) == 0 and count < 200:  #9ms
                count += 1
                time.sleep(0.00006)

            count = 0
            while GPIO.input(PIN) == 1 and count < 80:  #4.5ms
                count += 1
                time.sleep(0.00006)

            idx = 0
            cnt = 0
            data = [0,0,0,0]
            for i in range(0,32):
                count = 0
                while GPIO.input(PIN) == 0 and count < 15:    #0.56ms
                    count += 1
                    time.sleep(0.00006)
                
                count = 0
                while GPIO.input(PIN) == 1 and count < 40:   #0: 0.56mx
                    count += 1                               #1: 1.69ms
                    time.sleep(0.00006)
                
                if count > 8:
                    data[idx] |= 1<<cnt
                if cnt == 7:
                    cnt = 0
                    idx += 1
                else:
                    cnt += 1
            if data[0]+data[1] == 0xFF and data[2]+data[3] == 0xFF:  #check
                print("Get the key: 0x%02x" %data[2])
except KeyboardInterrupt:
    GPIO.cleanup();

Для запуска програми перейдіть в директорію ~/Pioneer600/IRM/python і в термінальному режимі введіть команду:

sudo python irm.py

Натискуйте клавіші на пульті ІЧ-пульта дистанційного керування і термінал повинен показувати код відповідної натиснутої клавіші.

IRM Test Start ...
Get the key: 0x0c
Get the key: 0x18
Get the key: 0x5e

Натисніть Ctrl+C для завершення роботи.

Робота з OLED-дисплеєм

Примітка: якщо демонстраційні файли WiringPi або Python будуть запущені після демонстрації BCM, OLED може не працювати належним чином. У цьому випадку вам доведеться перезавантажити Raspberry Pi і запустити програму знову, щоб відновити роботу OLED. Причиною може бути більш високий пріоритет бібліотек BCM, ніж WiringPi або Python.

Щоб використати програми python для керування OLED ми раніше інсталювали бібліотеку python-imaging (урок 17).

Програмний код демонстраційної програми зберігається у файлі oled.py

import spidev as SPI
import SSD1306
import time

import Image
import ImageDraw
import ImageFont
 
# Конфігурування виводів Raspberry Pi:
RST = 19
DC = 16
bus = 0
device = 0

# Дисплей 128x64 з інтерфейсом SPI:
disp = SSD1306.SSD1306(RST, DC, SPI.SpiDev(bus, device))

# Ініціалізація бібліотеки.
disp.begin()
 
# Clear display.
disp.clear()
disp.display()

# Створення пустого зображення, щоб малювати на ньому об’єкт.
# Переконайтеся, що створили зображення з параметром '1' для 1-бітового кольору.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))
 
# Отримуємо малюнок об’єкта, щоб відобразити його на основі
draw = ImageDraw.Draw(image)
 
# Малюємо чорний ящик, щоб очистити зображення.
draw.rectangle((0,0,width,height), outline=0, fill=0)
 
# Малюємо деякі фігури.
# Спочатку визначаємо деякі константи, які дозволять легко змінювати розміри фігур.
padding = 2
shape_width = 20
top = padding
bottom = height-padding
# Переміщуємо зліва направо, стежачи за поточним значенням х для малювання фігур.
x = padding
# Малюємо еліпс.
draw.ellipse((x, top , x+shape_width, bottom), outline=255, fill=0)
x += shape_width+padding
# Малюємо прямокутник.
draw.rectangle((x, top, x+shape_width, bottom), outline=255, fill=0)
x += shape_width+padding
# Малюємо трикутник.
draw.polygon([(x, bottom), (x+shape_width/2, top), (x+shape_width, bottom)], outline=255, fill=0)
x += shape_width+padding
# Малюємо X.
draw.line((x, bottom, x+shape_width, top), fill=255)
draw.line((x, top, x+shape_width, bottom), fill=255)
x += shape_width+padding
 
# Завантажуємо шрифт за замовчуванням.
font = ImageFont.load_default()
 
# Записуємо два рядки тексту.
draw.text((x, top),    'Hello',  font=font, fill=255)
draw.text((x, top+20), 'World!', font=font, fill=255)
 
# Показуємо зображення.
disp.image(image)
disp.display()

Для запуска програми перейдіть в директорію ~/Pioneer600/OLED/python і в термінальному режимі введіть команду:

sudo python oled.py

Запустіть наведені нижче демонстраційні програми для виведення зображень на дисплей:

sudo python dispchar.py
sudo python image.py
sudo python animate.py
sudo python waveshare.py

Завдання

Виведіть на дисплей спрощене зображення герба РТФ.

Використання UART для передачі даних

Примітка: послідовний порт RPi встановлений у режимі налагодження терміналу. Однак, щоб запустити цю демонстраційну програму, треба вимкнути функцію налагодження терміналу, а це означає, що ви не зможете більше налагоджувати RPi через послідовний порт. У цьому випадку ви повинні використовувати інші методи для налагодження RPi перед запуском даної програми. Наприклад, ви можете підключити зовнішній дисплей HDMI до RPi або використовувати SSH.

Програмний код зберігається у файлі uart.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
import serial

#ser = serial.Serial("/dev/ttyAMA0",115200)
ser = serial.Serial("/dev/ttyS0",115200)

print('serial test start ...')
ser.write("Hello World !!!\n")
try:
    while True:
        ser.write(ser.read())
except KeyboardInterrupt:
    if ser != None:
        ser.close()

Для запуска програми перейдіть в директорію ~/Pioneer600/UART/python і в термінальному режимі введіть команду:

sudo python uart.py

Завдання

Виведіть в термінальному режимі повідомлення Welcome to PTF!

Попереднє заняття - Наступне заняття

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс