Общие принципы работы с Python
Для дальнейшей разработки программы управления satprowler я решил перейти на язык программирования Python. Причины такого изменения следующие:
- В Python можно программировать отдельные потоки, поэтому возможно параллельное программирование.
- Плагины спутникового ресивера Enigma Linux написаны на Python. Если в будущем я захочу, чтобы мой позиционер взаимодействовал с приемником, нужно будет написать такой плагин. Так что я бы все равно не стал избегать программирования на Python.
- Python переживает бурную эволюцию. Это стал очень модный язык, вошедший в сознание широкой публики. Поэтому можно предположить, что возможный будущий пользователь моего проекта овладеет основами Python.
Я также знаю несколько причин, по которым переход на Python — не лучшая идея. Как сторонник классических языков программирования Паскаль или C++, я не могу принять некоторые «упрощения» Python, которые, на мой взгляд, существенно усложняют написание программ. В основном в области поиска и исправления ошибок. Вторая причина заключается в том, что частый выпуск новых версий Python усложняет обратную совместимость написанных программ. Трудно сказать, как будет выглядеть Python через несколько лет. Но прогресс невозможно остановить.
Для использования Python не обязательно выбирать компьютер Raspberry Pi. 40-контактный разъем GPIO по-прежнему важен для обеспечения достаточного количества линий для связи с позиционером. Так что можно использовать Raspberry Pi 3 или что-нибудь новее. Но процесс запуска Raspberry Pi немного изменился со времени моих первых статей.
В качестве операционной системы я по-прежнему использую Linux Raspbian, который сегодня называется просто Raspberry Pi OS. Его текущую версию можно скачать здесь. В настоящее время удобно использовать 64-битную версию, особенно в сочетании с более новыми Raspberry Pi 4 или 5. Для использования управления позиционером достаточно версии Lite. Для более старых версий Raspberry Pi 3 имело бы смысл использовать и 32-битную версию Legacy Lite, но я этого не пробовал.
Для загрузки ОС на SD-карту я использую программу Raspberry Pi Imager, на данный момент версия 1.8.5. Вы можете скачать это здесь. Здесь я обращаю внимание на весьма фундаментальное изменение по сравнению со старыми версиями ОС. Авторы значительно ужесточили меры безопасности. Таким образом, различные процедуры по запуску и запуску SSH-терминала после первой загрузки Raspberry Pi больше не работают. Для этого в Imager есть меню, где вы выбираете, что активировать и под каким паролем пользователя. Если вам не нужна копия ОС на вашем компьютере, Imager может сам загрузить ее из Интернета. В настоящее время я использую версию Raspios-bullseye-arm64-lite.img от 05.12.2023 (версия «Legacy»).
Рис. 1 - Настройки программы Imager
Я до сих пор использую терминал PUTTY для SSH с Raspberry Pi. Вы можете скачать это здесь. Данная программа также прошла свою разработку, поэтому рекомендую использовать последнюю версию. У старых есть проблемы с современным шифрованием. Сейчас я использую версию 0.76. Если вы не знаете IP-адрес Raspberry Pi в домашней сети, его можно узнать, например, с помощью программы IP-Scanner. Вы можете скачать это здесь. Я использовал версию 2.4.30. Вам не нужно его устанавливать, просто запустите. Вы можете узнать Raspberry Pi 3 по MAC-адресу, начинающемуся с цифр B8:27:EB... После успешного подключения выполняется первая настройка ОС.
sudo raspi-config
Здесь я обычно ставлю:
- 1 System Option, S5 Boot, B1 Console
- 5 Localization: L2 Change Timezone, Europe, Prague
- 5 Localization: L4 Change Wi-fi Country, CZ Czech Republic
- 6 Advanced Options, A1 Expand Filesystem
- и наконец <Finish>, reboot now? Yes
Следующие обновления являются стандартными для Linux. Последний раз я устанавливал их 4 марта 2024 года.
sudo apt-get update
sudo apt-get upgrade -y
sudo reboot
Python уже является частью ОС. Поэтому мы просто не можем выбрать, какую версию хотим использовать. Если нас интересует текущая версия, вводим команду:
python3
Это запустит интерпретатор Python, который распечатает информацию о текущей версии. Завершается комбинацией клавиш Ctrl+D. Моя текущая версия Python — 3.9.2.
Python может использовать современную обширную базу готовых библиотек. Управление этими библиотеками (установочными пакетами и зависимостями от других необходимых пакетов и обновлений) осуществляется программой PIP. Итак, обычно все начинается с его установки. Поскольку в нашем проекте мы будем использовать только несколько основных библиотек, нам не нужно использовать PIP и устанавливать пакеты вручную.
В качестве веб-сервера мы будем использовать готовый Flask Framework. Домашнюю страницу проекта вы можете найти здесь и Вы можете найти руководство пользователя здесь. Чтобы установить его и установить поддерживающие библиотеки, введите следующие команды:
sudo apt-get install python3-flask -y
sudo apt-get install python3-flask-socketio
Мы будем использовать библиотеку pigpio для связи с портами GPIO. Здесь мы установим его командой
sudo apt-get install python3-pigpio
Документацию для этой библиотеки можно найти здесь. Установка пакета запускает демон — отдельную программу, которая работает в фоновом режиме как служба. Этот демон называется pigpiod. Каждый раз при перезапуске Raspberry Pi его необходимо перезагружать. Этого можно добиться, отредактировав файл конфигурации /etc/rc.local, например, с помощью текстового редактора nano.
sudo nano /etc/rc.local
В конце перед командой exit 0 добавляем имя демона, т.е. pigpiod.
Рис. 2 - Постоянный запуск демона pigpiod
Сохраните файл комбинацией клавиш Ctrl+O и закройте редактор nano комбинацией клавиш Ctrl+X. Для уверенности перезапускаем Raspberry Pi в последний раз.
sudo reboot
Это делает Raspberry Pi готовым к запуску программы Python.
Мы будем общаться с Raspberry Pi через веб-сервер Flask. В этой программе есть свои правила, которым мы должны следовать. Первый — это структура каталогов. Для работы с каталогами и файлами я использую ftp-клиент Filezilla. Вы можете скачать это здесь. В настоящее время я использую версию 3.66.5. После подключения создаем подкаталог в каталоге /home/pi/ с названием нашего проекта, т.е. satprowler. Этот каталог должен содержать следующие подкаталоги:
- static для статических объектов
- static/css для стилей
- static/img для фотографий
- static/js для поддержки JavaScript
- template для html-страниц
По мере того, как мы просматриваем исходные тексты для конкретного проекта, они будут развернуты, включая все вспомогательные файлы, в этой структуре каталогов. Основная программа satprowler.py находится в основном каталоге satprowler. На самом деле это пошаговое руководство по запуску веб-сервера Flask с процедурами позиционера.
Рис. 3 – Структура каталогов проекта
На этом этапе мы уже могли заполнить структуру каталогов файлами текущего проекта.
Программу можно запустить двумя способами.
1) Временный запуск для тестов:
- При подключении терминала putty терминал автоматически устанавливает домашний каталог пользователя pi /home/pi/.
- Перейдите в подкаталог проекта с помощью команды
cd satprowler
- Запустите веб-сервер командой
python3 satprowler.py
Программа, запущенная таким образом, работает только до тех пор, пока не будет разорвано терминальное соединение putty или пока программа satprowler не будет завершена комбинацией клавиш Ctrl+C. Программа записывает на терминал все сообщения, включая сообщения об ошибках. Поэтому этот метод используется для тестирования и отладки программы.
2) Постоянный запуск программы
Чтобы программа работала постоянно и имела возможность общаться с ней в любое время, вам необходимо поступить следующим образом. Открываем файл конфигурации /etc/rc.local с помощью текстового редактора nano.
sudo nano /etc/rc.local
и пишем между строк pigpiod и Exit 0
cd /home/pi/satprowler/
python3 satprowler.py &
Сохраняем файл комбинацией клавиш Ctrl+O и закрываем редактор nano комбинацией клавиш Ctrl+X. После перезапуска Raspberry Pi программа запустится автоматически без необходимости использования терминала.
sudo reboot
Рис. 4 – Постоянно работающий веб-сервер
В настоящее время в некоторых дистрибутивах Linux файл rc.local постепенно заменяется другими механизмами. Поэтому в будущем возможно придется заменить описанный процесс автоматического запуска программы на настройку служб с помощью systemd.
Позиционер используется путем ввода IP-адреса вашего Raspberry Pi с портом, который прослушивает сервер, в веб-браузере любого компьютера.
http://192.168.xxx.xxx:8080
Вы должны увидеть главную страницу со всеми элементами управления.
Рис. 5 – Пример возможного веб-интерфейса позиционера
Проблемы, которые еще не решены:
Асинхронные функции JavaScript используются для взаимодействия между веб-браузером и сервером Flask. Исходные тексты некоторых функций расположены на сайтах авторов. Мне пока не удалось заставить их работать локально. Это означает, что для запуска программы требуется активное подключение к Интернету. Без него эти скрипты не работают.