PYTHON
Інтерфейс на Python для роботи з модулем камери Raspberry Pi | Заняття 11
Веб-бот на Python | Заняття 15-16
Використання блокнота Jupyter | Заняття 2
Використання сенсорів з інтерфейсом I2C з Raspberry Pi | Заняття 21-22
Використання ШІМ та створення графічного інтерфейсу для керування світлодіодами | Заняття 5-6
Дослідження плати розширення Pioneer600 | Заняття 18-19
Зв’язок з Raspberry Pi через UART з використанням Python | Заняття 23
Керуємо кроковим двигуном за допомогою Python | Заняття 10
Керування двигуном постійного струму, використовуючи Python і Raspberry Pi | Заняття 7
Керування сервоприводом за допомогою сценарію Python | Заняття 9
Класи в Python та керування двома двигунами з Raspberry Pi | Заняття 8
Короткий довідник з Python
Куховарська книга Raspberry Pi для програмістів на Python
Навчання згорткової нейронної мережі з Keras | Заняття 4
Підключення сенсорів з інтерфейсом 1-Wire до Raspberry Pi | Заняття 20
Підраховуємо трафік в Mikrotik RouterBoard за допомогою скрипта Python
Перетворення тексту в мову з Raspberry Pi | Заняття 14
Початок роботи з платою розширення ARPI600 | Заняття 17
Починаємо працювати з Keras | Заняття 3
Починаємо програмувати на Python для Raspberry Pi | Заняття 1-2
ДОСЛІДЖЕННЯ ПЛАТИ РОЗШИРЕННЯ PIONEER600 | ЗАНЯТТЯ 18-19
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: ІЧ приймач
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)
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
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()
# -*- 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 для завершення роботи.
Натисніть 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()
# -*- 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 для завершення роботи.
Натисніть 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)
# -*- 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
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)
# -*- 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 для завершення роботи.
Натисніть 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)
# -*- 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
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)
# -*- 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
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();
# -*- 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
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()
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
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()
# -*- 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!
Немає коментарів:
Дописати коментар