Выбрать главу

x3 = x1**10

print (x1,x2,x3)

Переменную также можно увеличить или уменьшить:

x1 += 1

x1 -= 10

print (x1)

Остаток от деления:

x2 = x1 % 6

print (x2)

Условия в Python кстати, задаются отступами, аналогично циклам:

x1 = 123

print (x1)

if x1 % 2 == 0:

print("x1 even number")

else:

print("x1 odd number")

Подсчитаем сумму элементов массива:

values = [1,2,3,5,10,15,20]

s = 0

for p in values:

s += p

print(s)

Также для этого можно воспользоваться встроенной функцией sum:

values = [1,2,3,5,10,15,20]

print(sum(values))

Пожалуй, этого не хватит чтобы устроиться на работу программистом, но вполне достаточно для понимания примеров в книге. Теперь вернемся к Raspberry Pi.

Примечание

У языка Python есть одна неприятная особенность - по умолчанию он “не знает” русской кодировки, ее нужно принудительно указывать в начале файла:

# -*- coding: utf-8 -*-

print "Русский текст"

Без этого интерпретатор выдаст ошибку. Поэтому чтобы не загромождать код и не писать # -*- coding: utf-8 -*- каждый раз в каждом примере, в дальнейших программах все комментарии будут писаться на английском.

4.4. GPIO: порты ввода-вывода

Знакомство с любой новой платой, мы начнем с уже традиционного - подключим светодиод. Тем более, что как можно увидеть, принципы по сути ничем не отличаются от Arduino. В этом, как и в любых следующих проектах, будем считать что Raspberry Pi включена и готова к работе, а доступ осуществляется через putty.

Наша первая схема будет совсем простой:

Принцип, как можно видеть, точно такой же - мы подключаем светодиод через токоограничительный резистор (кто забыл как это работает, может перечитать главу 1.4). Когда резистор подключен, включим Raspberry Pi и напишем код.

Если мы делаем такой проект первый раз, то сначала нужно поставить необходимые библиотеки. Введем команду sudo apt-get install python-rpi.gpio. GPIO - это general-purpose input/output, или “общие порты ввода вывода”, как раз то что нам нужно.

Запустим редактор для создания или редактирования файла, введем команду:

nano led_blink.py

Скопируем и вставим туда следующий код:

import RPi.GPIO as GPIO

import time

LedPin = 31 # GPIO6

# Setup

GPIO.setmode(GPIO.BOARD)

GPIO.setup(LedPin, GPIO.OUT)

# Loop

try:

while True:

      GPIO.output(LedPin, GPIO.HIGH) # led on

      time.sleep(1.0)

      GPIO.output(LedPin, GPIO.LOW) # led off

      time.sleep(1.0)

except KeyboardInterrupt: # Ctrl+C stop

pass

# Close

GPIO.cleanup()

Нажмем Ctrl+X для выхода из редактора, на вопрос сохранения файла нажмем Y (yes).

Теперь можно запустить программу, и мы увидим мигающий светодиод:

sudo python led_blink.py

Для завершения работы нажмем Ctrl+C, и мы вернемся обратно в командную строку.

Ура, программа работает! Разберем код программы подробнее.

- Строка import RPi.GPIO as GPIO указывает интерпретатору, что надо загрузить модуль RPi.GPIO и использовать его под названием GPIO (писать каждый раз RPi.GPIO было бы слишком длинно). Команда import time таким же способом загружает модуль time. Строка LedPin = 31 создает переменную с нужным номером вывода, тут все просто.

- Строка GPIO.setmode(GPIO.BOARD) указывает, какую нумерацию выводов мы будем использовать. Есть два варианта: GPIO.BOARD “говорит” о том, что будет использоваться сквозная нумерация выводов на плате. В этом случае пин имеет номер 31 (см. картинку на следующей странице). Второй вариант, GPIO.BCM задает нумерацию в номерах GPIO, в этом случае наш вывод 31 имел бы номер 6, т.к. он называется GPIO06. В принципе, практически все равно, какой способ использовать - вся эта путаница пошла от старых плат Raspberry Pi, которые имели меньшее число выводов. Главное, придерживаться какого-то одного стандарта и не путать одни номера с другими. Разумеется, если номер будет неправильный, светодиод не загорится.

На картинке показаны оба варианта нумерации выводов Raspberry Pi:

- Строки GPIO.output(LedPin, GPIO.HIGH) и GPIO.output(LedPin, GPIO.LOW) устанавливают нужный логический уровень “1” или “0”, что соответствует 0 или 3.3В, также как на плате ESP32. Функция time.sleep(1.0) делает паузу в 1 секунду.

- try..except - это незнакомая нам до этого конструкция, называемая обработчиком исключений. Цикл while True выполняется бесконечное число раз, но если пользователь нажмет Ctrl+C, то система пошлет программе исключение KeyboardInterrupt, в котором мы можем выполнить какой-то код. В данном случае кода нет, строка pass просто указывает на то, что нужно перейти на следующую строку.

- В завершении работы программы, функция GPIO.cleanup() освобождает ресурсы GPIO, и программа закрывается.