1. ПрограмиранеPythonКакво е I2C? Основи за програмиране на Python за Raspberry Pi

От Алън Шович, Джон Шович

Първото нещо, което трябва да знаете за I2C е, че всяко устройство в I2C шината има адрес. Например сензорът за температура и влажност HDC1080, който лесно можете да направите, има адрес 0x40. Какво означава "0x" на този адрес? Това означава, че числото, което следва, е в шестнадесетична нотация, база 16 вместо база 10 (нашата нормална система за номериране).

За да разберем този интерфейс, нека разгледаме какво е шина I2C. I2C шина често се използва за комуникация с чипове или сензори, които са на една и съща платка или са разположени физически близо до процесора. I2C е разработен за първи път от Phillips (сега NXP Semiconductors).

За да заобиколите проблемите с лицензирането (които до голяма степен са изчезнали), често автобусът ще се нарича TWI (Two Wire Interface). SMBus, разработен от Intel, е подмножество от I2C, което дефинира по-стриктно протоколите. Съвременните I2C системи вземат политики и правила от SMBus, като понякога поддържат и двете с минимална необходима конфигурация. Както Arduino, така и Raspberry Pi поддържат шината I2C.

I2C осигурява добра поддръжка за бавни, близки периферни устройства, които трябва да се адресират само от време на време. Например, устройството за измерване на температура обикновено се променя само много бавно и така е добър кандидат за използването на I2C, докато камерата ще генерира много данни бързо и потенциално често се променя.

I2C използва само две двупосочни линии с отворен дренаж (open-drain означава, че устройството може да издърпа ниво надолу към земята, но не може да изтегли линията до Vdd. Оттук и името open-drain. Следователно изискване на I2C bus е, че и двете линии Това е важна област и неправилното издърпване на линиите е първата и най-често срещана грешка, която правите, когато за пръв път използвате I2C шина.

Платката Pi2Grover съдържа 10K Ohm резистори за теглене, така че не трябва да се притеснявате за това. Двете линии са SDA (серийна линия за данни) и SCL (серийна линия на часовника). Има два типа устройства, които можете да свържете към I2C шина: Главни устройства и Подчинени устройства. Обикновено имате едно основно устройство (в нашия случай Raspberry Pi) и множество подчинени устройства, всяко със своя индивидуален 7-битов адрес.

Програмиране на Python и I2c

Когато се използва в Raspberry Pi, Raspberry Pi действа като главен и всички други устройства са свързани като подчинени.

Протоколът I2C използва три типа съобщения:

  • Цифрово единично съобщение, при което капитанът записва данни в роб Цифрово единично съобщение, при което капитанът чете данни от роб Цифрови комбинирани съобщения, при които главният човек издава поне две четения и / или записва на един или повече роби

За щастие за вас, по-голямата част от сложността на работа с I2C шината е скрита от драйверите и библиотеките на Python.

Проучване на I2C на Raspberry Pi

За да използвате шината I2C на Raspberry Pi, трябва да се уверите, че тя е активирана в операционната система. Вижте този урок от Adafrui9t за това как да направите точно това.

Правилно ли сте го направили? Лесният начин да проверите за това е да въведете следната команда в прозореца на терминала:

I2cdetect -y 1

Ако се върне:

-bash: i2cdetect: командата не е намерена

Тогава не сте активирали вашата I2C шина. Повторете урока, за да го поправите.

От друга страна, ако се върне:

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: - - - - - - - - - - - - -
10: - - - - - - - - - - - - - - -
20: - - - - - - - - - - - - - - -
30: - - - - - - - - - - - - - - -
40: - - - - - - - - - - - - - - -
50: - - - - - - - - - - - - - - -
60: - - - - - - - - - - - - - - -
70: - - - - - - - -

Тогава сте успели! Обърнете внимание, че всички тирета означават, че няма сензори на I2C шината. На следващо място ще добавите един прост.

Сега, нека поговорим за това как да комуникираме с I2C устройства в Python.

Разговор с I2C устройства с Python

За да говорите с I2C устройство, трябва да имате такова в шината. Един добър начин да започнете е сензорът за температура и влажност HDC1080. (Можете да получите един от тези евтини сензори на store.switchdoc.com или на amazon.com.

HDC1080 сензор за температура и влажност

Забележка: Ако купите такъв на Amazon, ще ви е необходим кабел за кръпка женски до Grove. SwitchDoc Labs HDC1080 вече се предлага с Grove конектор. Ще ви е необходим и Pi2Grover Raspberry Pi-to-Grove конвертор, който също е достъпен на store.switchdoc.com или на amazon.com.

Сега нека инсталираме сензора HDC1080 I2C на нашия Raspberry Pi. Следвай тези стъпки:

HDC1080
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: - - - - - - - - - - - - -
10: - - - - - - - - - - - - - - -
20: - - - - - - - - - - - - - - -
30: - - - - - - - - - - - - - - -
40: 40 - - - - - - - - - - - - - -
50: - - - - - - - - - - - - - - -
60: - - - - - - - - - - - - - - -
70: - - - - - - - -

Спомняте ли си 0x40 адреса на HDC1080? Там е в изхода по-горе.

След това ще използвате Python, за да отчетете температурата и влажността от този сензор.

Температура и влажност на отчитане от I2C устройство, използващо Python

Използването на Python библиотеки е от ключово значение за продуктивността при писане на Python приложения. Тук ще използвате SDL_Pi_HDC1080_Python3, достъпен на github.com.

За да прочетете температурата и влажността, изпълнете следните стъпки:

  1. Първо, създайте директория в основната си директория: CD mkdir I2CТемпература cd I2CTemperature Сега сте в директорията на I2CTemperature. Преди да разгледате Python кода за отчитане на вашата температура, инсталирайте библиотеката на нашия Raspberry Pi. Това правите, като „клонирате“ библиотеката, разположена на github.com, като използвате следната команда във вашия терминален прозорец: git clone https://github.com/switchdoclabs/SDL_Pi_HDC1080_Python3.git Тук git clone клонира git хранилището, разположено на адреса и го копира във вашия Raspberry Pi. Ако въведете ls в прозореца на терминала, ще видите следния изход: Използвайки nano (или любимия си текстов редактор), отворете файл, наречен temperatureTest.py и въведете следния код:
импортиране на sys
sys.path.append ( "./ SDL_Pi_HDC1080_Python3)
време за внос
импортиране на SDL_Pi_HDC1080
# Основна програма
отпечатате
print ("")
печат ("Прочетете температура и влажност от HDC1080 с помощта на шина I2C")
print ("")
hdc1080 = SDL_Pi_HDC1080.SDL_Pi_HDC1080 ()
докато вярно:
печат ("-----------------")
print ("Температура =% 3.1f C"% hdc1080.readTemperature ())
печат ("Влажност =% 3.1f %%"% hdc1080.readHumidity ())
печат ("-----------------")
time.sleep (3.0)

Сега четете данни за околната среда от устройство I2C. Вашият Raspberry Pi е свързан с реалния свят.

Опитайте този експеримент. Духайте върху сензорната платка HDC1080 и гледайте как влагата се повишава! Ще видите нещо подобно:

Прочетете температура и влажност от HDC1080 с помощта на I2C шина
-----------------
Температура = 24,2 С
Влажност = 32,9%
-----------------
-----------------
Температура = 24,2 С
Влажност = 32,9%
-----------------
-----------------
Температура = 24,2 С
Влажност = 32,9%
-----------------

Разбиване на програмата Python

Първият ред импортира библиотеката на Python sys:

импортиране на sys

Следващият ред казва на Python да търси директорията SDL_Pi_HDC1080_Python3 под текущата ни директория, за да може да намери библиотеката ни:

sys.path.append ( "./ SDL_Pi_HDC1080_Python3)

Още внос:

време за внос
импортиране на SDL_Pi_HDC1080

Това изявление създава hdc1080 обекта и го инициализира:

# Основна програма
отпечатате
print ("")
печат ("Четене на температура и влажност от HDC1080 с помощта на I2C шина")
print ("")
hdc1080 = SDL_Pi_HDC1080.SDL_Pi_HDC1080 ()

Тези изявления четат температурата и влажността и ги отпечатват на прозореца на терминала. Забележка: Виждате, че цялата сложност на използването на I2C устройство е скрита чрез използването на библиотеката HDC1080:

докато вярно:
печат ("-----------------")
print ("Температура =% 3.1f C"% hdc1080.readTemperature ())
печат ("Влажност =% 3.1f %%"% hdc1080.readHumidity ())

Спите за три секунди и след това повторете:

печат ("-----------------")
time.sleep (3.0)

Сега, когато имате тази програма, можете да добавите към нея всякакви неща, като например включване на червен светодиод, ако стане прекалено горещо, или включване на син светодиод, ако стане студено.

Можете дори да настроите температурата и влажността си, като използвате библиотеката Twitter Python.