Лабораторные работы на 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 кОм.
Установка ПО
import Adafruit_DHT...sensor = Adafruit_DHT.DHT22pin = 10humidity, 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).
Программный код
#Librariesimport RPi.GPIO as GPIOimport time#GPIO Mode (BOARD / BCM)GPIO.setmode(GPIO.BCM)#set GPIO PinsGPIO_TRIGGER = 18GPIO_ECHO = 24#set GPIO direction (IN / OUT)GPIO.setup(GPIO_TRIGGER, GPIO.OUT)GPIO.setup(GPIO_ECHO, GPIO.IN)def distance():# set Trigger to HIGHGPIO.output(GPIO_TRIGGER, True)# set Trigger after 0.01ms to LOWtime.sleep(0.00001)GPIO.output(GPIO_TRIGGER, False)StartTime = time.time()StopTime = time.time()# save StartTimewhile GPIO.input(GPIO_ECHO) == 0:StartTime = time.time()# save time of arrivalwhile GPIO.input(GPIO_ECHO) == 1:StopTime = time.time()# time difference between start and arrivalTimeElapsed = StopTime - StartTime# multiply with the sonic speed (34300 cm/s)# and divide by 2, because there and backdistance = (TimeElapsed * 34300) / 2return distanceif __name__ == '__main__':try:while True:dist = distance()print ("Measured Distance = %.1f cm" % dist)time.sleep(1)# Reset by pressing CTRL + Cexcept 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В"
- желтый - сигнальный
К GPIO 17 подключается управляющий провод сервопривода наклона, к GPIO 27 сервопривод поворота. Дополнительно для защиты выводов Raspberry Pi можно использовать резистор 1кОм.
NB! Если Вы также будете использовать
отдельные источники питания для Raspbery Pi и сервоприводов, обязательно
соедините их земли, в противном случае электроника может выйти из
строя. В данном случае земля от внешнего источника питания для
сервоприводов подключена к выводу земли (возле GPIO 17) на Raspberry Pi.
Откалибруем сервоприводы. Для этого откроем терминал на Raspberry и запустим редактор Python 3 с правами от суперпользователя (нужно для работы с GPIO):
sudo python3Python 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. Датчик влажности почвы
Датчик влажности почвы
Результат работы: Включение красного диода при мокрой почве и зелёного при сухой.
Выходное напряжение датчика варьируется в зависимости от количества воды, содержащейся в почве.
- Если почва влажна – выходное напряжение уменьшается
- Если почва суха – выходное напряжение увеличивается
На выходе будет цифровой сигнал (D0) – LOW или HIGH,
в зависимости от содержания воды в почве. То есть, если влажность почвы
превысит определенное пороговое значение, модуль вернет значение LOW, а если нет – HIGH. Пороговое значение для цифрового сигнала настраивается при помощи потенциометра.