Лабораторные работы на Raspberry PI

Site: TalTech Moodle
Course: Arukate süsteemide elementide projekteerimine ja väljatöötamine (Virumaa)
Book: Лабораторные работы на Raspberry PI
Printed by: Guest user
Date: Thursday, 21 November 2024, 10:12 PM

Description


1. LED. Светодиодный индикатор

Задание 1. Подключение LED диода

Результат работы: Мигание светодиодом

Подключение светодиода на GPIO17:

Для правильной работы прибора, в цепь следует добавить ограничивающий резистор (220Ом-470Ом).


Пример. Мигание светодиодом

from RPi import GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)  #Переключение 17ого контакта в режим вывода

sleep(3)                  #пауза 3 секунды
GPIO.output(17, True) #вывод логической единицы sleep(3) #пауза 3 секунды GPIO.output(17, False) #вывод логического нуля sleep(3) #пауза 3 секунды GPIO.output(17, True) #вывод логической единицы

GPIO.cleanup() #сброс всех выводов

Пример. Мигание светодиодом в цикле

from RPi import GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)  #Переключение 17ого контакта в режим вывода

while True:
    GPIO.output(17, True)
    sleep(0.5)
    GPIO.output(17, False)
    sleep(0.5)

GPIO.cleanup()

Добавим в программу еще одну конструкцию, которая позволит нам в любой момент прервать работу цикла с помощью комбинации клавиш Ctrl+C. При этом программа завершится в нормальном режиме и выполнит функцию cleanup.

from RPi import GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

try:
    while True:
        GPIO.output(17, True)
        sleep(0.5)
        GPIO.output(17, False)
        sleep(0.5)

except KeyboardInterrupt:
    print("program stop")

GPIO.cleanup()
Источник

2. PIR датчик

Задание 1. Подключение PIR датчика

Результат работы:
Выводим в консоль оповещение о движении.

Подключаем датчик:
Для соединения с микроконтроллером или напрямую с реле у HC-SR501 имеется три вывода: GND, OUT, VCC.

Программа

Можно покрутить настройки датчика и посмотреть как это отразится на его работе.

Задание 2. Управление диодом на основе датчика движения.

Результат работы:
Сделать систему автоматического включения диодаПри движении включается диод, через 5 секунд отключается.

3. Buzzer

Задание 1. Подключение PIR датчика

Результат работы:
Зуммер будет подавать звук в течение 3 секунд, а затем 2 секунды молчать.

Подключаем датчик:

Пример.

import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM)

GPActiveBuzzer = 24
GPIO.setup(GPActiveBuzzer_PIN, GPIO.OUT, initial= GPIO.LOW)

while True:     GPIO.output(GPActiveBuzzer_PIN,GPIO.HIGH) #Buzzer on     time.sleep(4) #pause for 4 seconds     GPIO.output(GPActiveBuzzer_PIN,GPIO.LOW) #Buzzer off     time.sleep(2) #pause for 2 seconds

Задание 2. Подключение зуммера и PIR датчика

Результат работы:
Выводим в консоль оповещение о движении и подаем сигнал.

Подключаем датчики:

4. Кнопка

Задание 1. Выключатель и LED диод

Результат работы: После запуска, программа переходит в режим ожидания. По нажатию кнопки, LED диод включается. А при отпускании, напротив ­ выключается.


Код:

import RPi.GPIO as GPIO #импорт библиотеки GPIO
GPIO.setmode(GPIO.BOARD) #"включение GPIO"
GPIO.setup(7, GPIO.OUT) #объявление порта 7 как выход
GPIO.setup(3, GPIO.IN) #объявление порта 3 как вход
while True: #бесконечный цикл
____if GPIO.input(3) == False: #если кнопка зажата
________GPIO.output(7, 1) #включаем светодиод
____else: #иначе
________GPIO.output(7, 0) #выключаем

Задание 2. Запуск и остановка проблескового маячка и серены кнопкой (самостоятельно)

Результат работы:  В схеме присутствуют две кнопки, светодиод и зуммер. После нажатии на кнопку, светодиод начинает мигать, а зуммер издавать периодический сигнал, до тех пор, пока не будет нажата вторая кнопка.

5. DHT22 - измерение температуры и влажности в помещении

Задание 1. Подключение датчика DHT22

Результат работы: Измерение температуры и влажности.

Подключаем датчик:
Используемые компоненты:
  • датчик DHT22
  • сопротивление на 4.7-10 кОм.
1. Питание (VCC) - от 3.3 до 6 В.
2. Вывод данных.
3. Не подключается.
4. Земля.
Между 1 и 2 выводами необходимо подключить резистор на 10 кОм

Внимание! Обязательно соблюдайте полярность подключения. В случае неправильного подключения датчик почти неминуемо выйдет из строя. Кроме того, при неправильном подключении пластиковый корпус датчик очень сильно нагреется и может обжечь вам руки. Будьте внимательны, не торопитесь!


Установка ПО
Для установки библиотеки которая работает с датчиками необходимо получить несколько пакетов:
sudo apt-get update
sudo apt-get install build-essential python-dev python-openssl

Следующим шагом необходимо загрузить библиотеку Adafruit Python DHT с Github:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT

И следующей командой устанавливаем:
sudo python setup.py install

Программный код
import Adafruit_DHT
...

sensor = Adafruit_DHT.DHT22
pin = 10
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

6. Ультразвуковой дальномер (HC-SR04)

Задание 1. Подключение датчика HC-SR04

Результат работы: Исправление ошибки в коде и измерение расстояния до предмета.

Подключаем датчик:

  • VCC - Pin 2 (VCC)
  • GND -  Pin 6 (GND)
  • TRIG  - Pin 12 (GPIO18)
  • 330Ω resistor - ECHO - Pin 18 (GPIO24) и 470Ω resistor - Pin6 (GND).
Важно. Выходной сигнал датчика (ECHO) на HC-SR04 рассчитан на 5В. Однако входной  сигнал на GPIO рассчитан на 3,3 В. Отправка сигнала 5V на этот незащищенный входной порт 3.3V может повредить контакты GPIO! Нам нужно будет использовать небольшую цепь делителя напряжения, состоящую из двух резисторов, чтобы снизить выходное напряжение датчика до того, с которым может справиться Raspberry Pi.

Программный код
#Libraries
import RPi.GPIO as GPIO
import time

#GPIO Mode (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
#set GPIO Pins
GPIO_TRIGGER = 18
GPIO_ECHO = 24

#set GPIO direction (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distance():
    # set Trigger to HIGH
    GPIO.output(GPIO_TRIGGER, True)
    # set Trigger after 0.01ms to LOW
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)
    StartTime = time.time()
    StopTime = time.time()
    # save StartTime
    while GPIO.input(GPIO_ECHO) == 0:
        StartTime = time.time()
    # save time of arrival
    while GPIO.input(GPIO_ECHO) == 1:
        StopTime = time.time()
    # time difference between start and arrival
    TimeElapsed = StopTime - StartTime
    # multiply with the sonic speed (34300 cm/s)
    # and divide by 2, because there and back
    distance = (TimeElapsed * 34300) / 2
    return distance

if __name__ == '__main__':
    try:
        while True:
            dist = distance()
            print ("Measured Distance = %.1f cm" % dist)
            time.sleep(1)
        # Reset by pressing CTRL + C
    except KeyboardInterrupt:
        print("Measurement stopped by User")
        GPIO.cleanup()

7. DS18B20

Задание 1. Подключение датчика DS18B20

Результат работы: Измерение температуры воды / почвы.


Установка датчика:

Следуйте приведенной выше схеме и выполните подключения:

  • Vcc ==> 3,3 В
  • Gnd ==> Gnd
  • Данные ==> GPIO 4 (по умолчанию для библиотеки)

Установка библиотеки Python:

Установка библиотеку Python, которая будет обрабатывать датчик:

sudo pip3 install w1thermsensor

Перед запуском скрипта проверьте, включен ли интерфейс «1-Wire» в вашем RPi (см. Ниже экран печати).

Включить интерфейсы

Не забудьте перезапустить свой RPi, после изменения его конфигурации

Тестирование датчика:

Для тестирования датчика можно использовать простой код Python:

from w1thermsensor import W1ThermSensor
ds18b20Sensor = W1ThermSensor()
tempExt = round(ds18b20Sensor.get_temperature(), 1)
print('External Temperature = {}*C'.format(tempExt))
Источник: ссылка

8. Сервопривод

Задание 1. Подключение сервопривода

Результат работы: Исправление ошибки в коде и измерение расстояния до предмета.

Подключаем сервоприводы:
Сервоприводы будут подключены к внешнему источнику питания 5В, а управляющий провод к Raspberry Pi. Цвета проводов у различных сервоприводов могут отличаться, в данном случае для SG90 распиновка следующая:
  • коричневый - "земля"
  • красный - "+5В"
  • желтый - сигнальный

К GPIO 17 подключается управляющий провод сервопривода наклона, к GPIO 27 сервопривод поворота. Дополнительно для защиты выводов Raspberry Pi можно использовать резистор 1кОм.

NB! Если Вы также будете использовать отдельные источники питания для Raspbery Pi и сервоприводов, обязательно соедините их земли, в противном случае электроника может выйти из строя. В данном случае земля от внешнего источника питания для сервоприводов подключена к выводу земли (возле GPIO 17) на Raspberry Pi.

Откалибруем сервоприводы. Для этого откроем терминал на Raspberry и запустим редактор Python 3 с правами от суперпользователя (нужно для работы с GPIO):

sudo python3

Python Shell:

>>> 

Импортируем модуль RPI.GPIO и называем его GPIO:

import RPi.GPIO as GPIO

Определите, какие схемы нумерации выводов хотите использовать (BCM или BOARD). Я провел этот тест с BOARD, поэтому используемые контакты были физическими (GPIO 17 это контакт 11 и GPIO 27 это контакт 13). Мне было легко их идентифицировать и не ошибиться во время теста (в финальной программе я буду использовать BCM). Выбираем:

GPIO.setmode(GPIO.BOARD) 

Определяем вывод сервопривода, который будет использоваться:

tiltPin = 11

Если хотите использовать схему BCM, последние 2 команды должны быть заменены на:

GPIO.setmode(GPIO.BCM)
tiltPin = 17

Теперь указываем, что этот вывод будет работать как выход:

GPIO.setup(tiltPin, GPIO.OUT) 

Настраиваем частоту, для SG90 нужно 50 Гц:

tilt = GPIO.PWM(tiltPin, 50)

Включаем генерацию сигнала ШИМ на выводе и задаём начальный коэффициент заполнения равный нулю:

tilt = start(0)

Теперь мы можем устанавливать различные значения коэффициента заполнения и наблюдать за движением сервопривода. Давайте начнем с 5% и посмотрим, что происходит:

tilt.ChangeDutyCycle(5)

Сервопривод перешел в "нулевое положение". Сервопривод продолжал вращаться, при задании заполнения вплоть до 3%. При задании заполнения 2% сервопривод оставался в том же положении. После чего начав задавать значения больше 2%, движение сервопривода в моём случае начало происходить при установке коэффициента заполнения более 3%. Итак, 3% - это минимальное заполнение (позиция "0 градусов") для этого сервопривода.

То же самое произошло и с максимальным коэффициентом заполнения. Для начала установлено 10%:

tilt.ChangeDutyCycle(10)

Затем задавались большие значения, сервопривод продолжал проворачиваться при установке коэффициента заполнения вплоть до 13%. Таким образом максимальный коэффициент заполнения для данного сервопривода это 13%, угол, на который проворачивается вал сервопривода составил примерно 180 градусов (но это в данном случае, в зависимости от сервопривода физический угол может оказаться и больше и меньше). Итак, в результате калибровки получены следующие данные:

0 градусов ==> заполнение 3%
90 градусов ==> заполнение 8%
180 градусов ==> заполнение 13%

После окончания калибровки останавливаем ШИМ и очищаем GPIO:

tilt=stop()
GPIO.cleanup()

Для второго сервопривода процедура калибровки аналогична.

Создадим файл "angleServoCtrl.py" скрипта на Python для выполнения тестов:

from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
def setServoAngle(servo, angle):
	pwm = GPIO.PWM(servo, 50)
	pwm.start(8)
	dutyCycle = angle / 18. + 3.
	pwm.ChangeDutyCycle(dutyCycle)
	sleep(0.3)
	pwm.stop()
if __name__ == '__main__':
	import sys
	servo = int(sys.argv[1])
	GPIO.setup(servo, GPIO.OUT)
	setServoAngle(servo, int(sys.argv[2]))
	GPIO.cleanup()

Функция setServoAngle(servo, angle) получает в качестве аргументов номер вывода GPIO, к которому подключен сервопривод и значение угла, в который сервопривод должен провернуться.

В консоли этот скрипт запускается так:

sudo python3 angleServoCtrl.py 17 45 

Вышеприведенная команда установит сервопривод, подключенный к GPIO 17, под углом 45 градусов.


Истоник: ссылка

9. Датчик влажности почвы

Датчик влажности почвы

Задание 1. Подключение датчика и написание кода

Результат работы: Включение красного диода при мокрой почве и зелёного при сухой.

Как это работает

Выходное напряжение датчика варьируется в зависимости от количества воды, содержащейся в почве.

  • Если почва влажна – выходное напряжение уменьшается
  • Если почва суха – выходное напряжение увеличивается
Soil-moisture-sensor.jpg

На выходе будет цифровой сигнал (D0) – LOW или HIGH, в зависимости от содержания воды в почве. То есть, если влажность почвы превысит определенное пороговое значение, модуль вернет значение LOW, а если нет – HIGH. Пороговое значение для цифрового сигнала настраивается при помощи потенциометра.

Moisture-sensor-fritzing.jpg