В предыдущей статье мы считывали показания датчика DS18B20 без использования драйверов, написав собственную программу на C++. В этой статье мы попробуем настроить 1-Wire драйвер и, с его помощью, получить температуру с DS18B20, подключенного к Orange Pi PC.
Операционная система Armbian 5.35 (Ubuntu 16.04) имеет драйвер для работы с 1-Wire устройствами, а именно с датчиком температуры DS18B20. По умолчанию этот драйвер отключён и по этому нужно его настроить.
О наличии этого драйвера в других операционных системах (не Armbian) я не знаю, не проверял.
Настройка драйвера 1-Wire
- Для начала сделайте резервную копию script.bin, чтобы, в случае чего, вы смогли вернуть обратно все настройки:
sudo cp /boot/script.bin /boot/script.bak
- Преобразуйте бинарный файл script.bin в редактируемый файл fex:
bin2fex /boot/script.bin /boot/script.fex
- Теперь отредактируйте файл script.fex с помощью утилиты nano:
nano /boot/script.fex
- Найдите раздел [w1_para] и отредактируйте строки w1_used и gpio:
[w1_para] w1_used = 1 gpio = 20
где gpio — это номер пина по колонке BCM. Чтобы узнать, где и какой пин находится, выполняем gpio readall. В моём случае BCM=20, т.е. 37-й физический пин.
- Сохраните и закройте файл:
Ctrl X, Y (Yes), Enter
- Преобразуйте измененный script.fex в script.bin:
sudo fex2bin /boot/script.fex /boot/script.bin
- Отредактируйте файл /etc/modules с помощью утилиты nano:
nano /etc/modules
- Добавьте следующие строки:
w1-sunxi w1-gpio w1-therm
- Сохраните и закройте файл:
Ctrl X, Y (Yes), Enter
- Перезагрузите систему:
reboot
Схема подключения датчика DS18B20 к Orange Pi PC
Считывание температуры с датчика DS18B20
После перезагрузки выполняем команду:
dmesg | grep -E 'w1|wire'
вы должны получить примерно такой результат:
root@orangepipc:~# dmesg | grep -E 'w1|wire' [ 5.375196] W1_SUNXI: Added w1-gpio on GPIO-20 [ 5.379420] Driver for 1-wire Dallas network protocol.
Это означает, что драйвер 1-wire настроен на 20-й пин.
Чтобы увидеть все подключённые датчики выполняем:
ls -al /sys/bus/w1/devices
У меня два датчика, 28-000005464e04 и 28-00000547cabb:
root@orangepipc:~# ls -al /sys/bus/w1/devices total 0 drwxr-xr-x 2 root root 0 Dec 3 19:59 . drwxr-xr-x 4 root root 0 Dec 3 19:59 .. lrwxrwxrwx 1 root root 0 Dec 3 20:02 28-000005464e04 -> ../../../devices/w1_bus_master1/28-000005464e04 lrwxrwxrwx 1 root root 0 Dec 3 20:02 28-00000547cabb -> ../../../devices/w1_bus_master1/28-00000547cabb lrwxrwxrwx 1 root root 0 Dec 3 19:59 w1_bus_master1 -> ../../../devices/w1_bus_master1 root@orangepipc:~#
Температура и crc записаны в файле w1_slave каждого датчика и, чтобы узнать её, выводим на экран содержимое этого файла:
cat /sys/bus/w1/devices/28-000005464e04/w1_slave
результат:
61 01 4b 46 7f ff 0f 10 02 : crc=02 YES 61 01 4b 46 7f ff 0f 10 02 t=22062
Добрый день
orange pi one. стоит образ armbian от orangepi pc (на сайте написано что они подходят)
uname -a
4.14.70-sunxi #265 SMP Wed Sep 19 10:01:19 CEST 2018 armv7l GNU/Linux
cat /etc/modules
w1-sunxi
w1-gpio
w1-therm
gpio-sunxi
script.bin в нем нет, но в armbian-config нашел включение 1ware
после чего:
1
dmesg | grep -E ‘w1|wire’
[595233.277311] w1_master_driver w1_bus_master1: Attaching one wire slave 00.cd3400000000 crc 21
[595233.284890] w1_master_driver w1_bus_master1: Family 0 for 00.cd3400000000.21 is not registered.
[595259.558238] w1_master_driver w1_bus_master1: Attaching one wire slave 00.2d3400000000 crc c8
[595259.565671] w1_master_driver w1_bus_master1: Family 0 for 00.2d3400000000.c8 is not registered.
[595321.800421] w1_master_driver w1_bus_master1: Attaching one wire slave 00.ad3400000000 crc 44
[595321.807568] w1_master_driver w1_bus_master1: Family 0 for 00.ad3400000000.44 is not registered.
….
и таких записей с разным slave и src еще сотни полторы. Все начинаются с 0
ls -al /sys/bus/w1/devices
total 0
drwxr-xr-x 2 root root 0 Oct 28 06:02 .
drwxr-xr-x 4 root root 0 Oct 28 05:48 ..
lrwxrwxrwx 1 root root 0 Oct 28 06:03 00-1d3400000000 -> ../../../devices/w1_bus_master1/00-1d3400000000
lrwxrwxrwx 1 root root 0 Oct 28 06:03 00-ed3400000000 -> ../../../devices/w1_bus_master1/00-ed3400000000
lrwxrwxrwx 1 root root 0 Oct 28 05:48 w1_bus_master1 -> ../../../devices/w1_bus_master1
при этом датчик подключен один (к 37 ноге)
и id иногда сменяются. бывает что их 3
ни в одной папке нет файла w1_slave
Поможете разобраться?
В ядре linux 4.14 Вам не нужно редактировать файл
fex
, но файл/boot/armbianEnv.txt
и добавлять строки:Подключите пины данных устройств к PB20 (это 37-й) gpio и продолжайте, как Kernel 3.4.
Материалы
https://docs.armbian.com/User-Guide_Allwinner_overlays/#example-bootarmbianenvtxt-contents
http://linux-sunxi.org/1-Wire#Linux_kernel_4.14
В orange Pi One нет столько gpio
поставил pin=PB4
что соответсвует 7 на железке
но всё ранво проблема как у Сергея.
:root@orangepione:~# uname -a
Linux orangepione 4.19.38-sunxi #5.85 SMP Wed May 8 14:20:48 CEST 2019 armv7l GNU/Linux
root@orangepione:~# dmesg | grep -E ‘w1|wire’
[ 4.951522] Driver for 1-wire Dallas network protocol.
[ 4.983972] gpio-110 (onewire@0): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 6.836926] w1_master_driver w1_bus_master1: w1_search: max_slave_count 64 reached, will continue next search.
[ 53.531830] w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
[ 53.535548] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
root@orangepione:~#
Проверяется всё очень легко, находим схему платы, в данном случае — это Orange Pi One

http://linux-sunxi.org/images/7/7e/ORANGE_PI-ONE-V1_1.pdf
и находим раздел Ext Port (это последняя страница), а тут есть CON3 DIP40-254, т.е. GPIO гребёнка:
и видим, что выводы общего назначения у нас следующие: PA7, PA8, PA9, PA10, PA20, PA21, PD14, PC4 и PC7. Должен быть ещё и PWM1, что соответствует 7-му пину, но, думаю, у него другая роль.
Интересно ведь в readAll данные пины идут для SPI
форматирование корявое, но скрин не могу залить 🙁
если правилльно понял то допустим если я хочу использовать PA20, то мне в armbianEvn написать :
param_w1_pin=PB11 ?
Попробуйте написать PA20 так, как указано на схеме, если не пойдёт, тогда я попробую сделать на своей плате и отпишусь попозже.
А.С. Если хотите добавить картинку, тогда вставьте адрес/url с расширением jpg png или bmp и картинку будет видно. Ещё можно использовать тэг < pre >, чтобы вставить текст из терминала
А у вас точно Orange Pi One? Гребёнка на One на 40 выводов, а вы, мне кажется, установили не правильную версию WiringPi или у вас Orange Pi Zero?
у меня именно One, видимо неправильно установил Wiring. Хотя не думал, что его можно как-то неправильно установить. Попробую переставить.
Смотри тут: Установка и настройка WiringOP/WiringPi на Orange Pi PC тебе нужно для H3
Cпасибо, переставил Wiring и поставил на PD14. Все работает!
После перезагрузки всё работает точно так-же:
чтобы увидеть все подключённые датчики:
и температура:
Linux orangepipcplus 4.19.20-sunxi #5.75
С датчиком разобрался — работает, но есть один вопросик :
Вы случаем не знаете как переключить разрешение датчика
на 10-11 битное преобразование, а то он похоже на 9 битах.
А вы при какой температуре это выяснили? Просто я не проверял при больших и отрицательных температурах
При комнатной, у вас кстати примером выше тоже похоже — 20750, т.е. точность 0.25 градуса.
И кстати он предложил подключить датчик на 110 порт (PD14) и на другие не соглашался.
Менять разрешение я никогда не пробовал, почему-то об этом не подумал.
Я посмотрел исходники и обнаружил, что меняется с помощью функции
но нужно как-то её вызывать, но ещё не разобрался как.
https://elixir.bootlin.com/linux/latest/source/drivers/w1/slaves/w1_therm.c
Я во всяких никсах и программировании не очень, так что если вам удастся придумать как — будет вам большой респект 😉
Я постараюсь найти решение этой проблемы и дополню статью, в случае успеха.
Да и кстати в начале темы все ок (где температура t=22062, т.е. 22.062 °C.) т.е. преобразование с большим разрешением, интересно почему. Другая версия драйвера ?
показываются не все цифры, только 3, реальные данные вот эти: 22.0625
По опыту общения с 18b20 насколько я понял все просто
9бит -точность 0.25
10 — 0.1
11-0.01
Ну да, просто вот вопрос, почему на Kernel 3.4. идет преобразование наверно 12 бит, а на 4.14 — 10 бит.
Как установить разрешение DS18B20 на Armbian / Версия ядра Linux 4.x
На ядре 3.4.x можно только получить температуру с DS18B20. В новой версии ядра Linux 4.x немного исправлены тайминги, достигнута стабильная работа датчиков в режиме паразитного питания, а также добавлена опция изменения разрешения.
Теперь вы можете легко установить разрешение 9, 10, 11 или 12 бит с помощью простой команды:
Соответственно при снижении разрешения значительно уменьшается время отклика сенсора с 1100 мс (с 12 бит) до 125 мс (с 9 бит).
Если у вас версия ядра ниже 4.x, тогда вы получите следующую ошибку:
https://forum.armbian.com/topic/3276-help-wanted-changing-resolution-of-ds18b20-on-orange-pi/
https://forum.armbian.com/topic/1558-w1-therm-driver-modifications/
https://raspberrypi.stackexchange.com/questions/71563/how-to-set-precision-of-ds18b20-via-w1-therm
https://github.com/raspberrypi/linux/blob/rpi-4.9.y/Documentation/w1/slaves/w1_therm
Может просто со старого какой-нить файлик вытащить и переставить на новый?
Я пока не могу дать ответ на этот вопрос, вечером попробую экспериментировать, сейчас у меня нет доступа к апельсинке
На orange pi pc после установки свежего armbian 21.05.1
просто запускаем armbian-config -> System -> Hardware
в самом низу чекаем w1-gpio
сохраняем, получаем предложение перезагрузки и после чего
на PD14 получаем данные.
В node-red узел node-red-contrib-sensor-ds18b20
сразу читает данные с этого пина.
В ядре 5.10.34-sunxi:
в /boot/armbianEnv.txt
добавляем:
overlays=w1-gpio
param_w1_pin=PA20
param_w1_pin_int_pullup=1
инфа отсюда: https://docs.armbian.com/User-Guide_Allwinner_overlays/
canada prescriptions