Введение
Довольно редко, но метко приходится использовать в проектах 1-wire термометры DS18B20. Они весьма дешевы, подключаются по одному проводу (не считая земли и питания), а главное — цифровые. То есть, просто выдают температуру в готовом виде без необходимости танцев с бубном над каким-нибудь АЦП с калибровкой.
Но если для использования этих датчиков на малинке достаточно прописать строчку в конфиге и перезагрузиться, то у Репки с этим всё не так очевидно: нужно пересобирать дерево устройств, он же Device Tree, далее для краткости DT. В целом, статья будет небольшой, на пару глав, но никто не уйдет обиженным :) И те, кто не боится пересобирать DT, и те, кто хочет просто «нажать одну кнопку». Правда последним придется использовать Ansible, но мы его уже обсуждали в прошлой статье, так что есть смысл изучить этот прекрасный инструмент автоматизации.
1. Что менять в DTB
С пересборкой DTB под свои нужды мы уже встречались в статье про подключение дисплея. По тому же образу и подобию вы можете добавить следующие куски кода в DTS-файле (я стандартно использовал sun50i-h5-repka-pi3-alt-1ghz.dts):
- Ищете строчку
reg_vcc3v3: vcc3v3 {
- Вставляете перед ней блок
onewire: onewire {
compatible = "w1-gpio";
pinctrl-names = "default";
pinctrl-0 = <&w1_pa7_pins>;
gpios = <&pio 0 7 0>; /* PA7 */
status = "okay";
};
- Ищете строчку
&pio {
- Вставляете после нее
w1_pa7_pins: w1-pa7-pins {
pins = "PA7";
function = "gpio_in";
};
После пересборки DTB (опять же, см. статью про дисплей), нужно заменить файл /boot/sun50i-h5-repka-pi3.dtb (не забываем про бекап!) и перезагрузиться.
Вот и в принципе и всё. Хотите немного автоматизации?
2. Ansible — то же самое, но без боли и страданий
В прошлой статье мы достаточно подробно разобрали, кто такой ансибл и что с ним делать, очень советую ознакомиться, заодно будет повод накатить систему с нуля, чтобы точно всё заработало.
Итак, будем исходить из того, что у вас свежая прошивка на Репке, версия платы 1.3 (на других тоже должно работать). Так же предполагается, что у вас есть к ней ssh-доступ, а на компьютере установлен Ansible.
Теперь:
source ~/.venv/ansible/bin/activate
git clone https://git.1qq.su/repka-pi-pub/ansible-roles.git repka-ansible-roles
Далее заходим в repka-ansible-roles и там создаем файл hosts.yml
all:
hosts:
repka-pi:
ansible_host: 192.168.100.151
ansible_user: root
ansible_ssh_pass: 123
Вместо 192.168.100.151 вставляете ip-адрес Репки.
Теперь выполняете:
ansible-playbook repka_1wire.yml -i hosts.yml
И просто ждете. После успешного выполнения, можно перезагрузиться и проверить, что получилось.
3. Подключаем, проверяем
Зайдите в Репку по ssh и выполните команду:
dmesg | grep wire
Если всё прошло гладко, то выдаст сообщение:
В данном случае мы переопределили пин gpio7 (PA7):
Почему именно его? В данном случае, как думается, выбор пина не особенно принципиален (главное, чтобы это был GPIO), но мне захотелось сохранить максимальную схожесть с мануалом для малинки (например, с сайта circuitbasics.com):
Теперь подключаем датчик в соответствии с этой схемой (резистор 5-10 кОм) и делаем в консоли
ls -l /sys/bus/w1/devices
Выдаст список девайсов. Нам нужен НЕ-мастер. В примере ниже это 28-0623915fdabf
Теперь пробуем прочитать температуру:
cat /sys/bus/w1/devices/28-0623915fdabf/w1_slave
Видно, что t=25500, или, если поделить на 1000, то 25.5 градусов.
Заключение
Как видно, подключение 1-wire к Репке не так уж и сложно. Надо просто привыкнуть к такой сущности, как «дерево устройств». Тем не менее, глупо отрицать удобство настройки в малинке и было бы здорово, если бы команда Репки рассмотрела возможность реализации «оверлеев», когда можно компилировать отдельные (опциональные) части дерева устройств и подключать их через какой-нибудь config.txt.
Пожелание по отдельным веткам дерева устройств понятно, будем работать в этом направлении.
Спасибо, будем очень ждать!