afn4v
afn4v
73 просмотров0 комментариев

Инструкция по включению шины 1-Wire на RepkaPi 3 (без пересборки Device Tree)

Потребовалось подключить датчик температуры DALLAS 18B20 (DS18B20) к RepkaPi 3, стандартная конфигурация платы не поддерживает такую шину «из коробки», для активации шины нужно модифицировать и пересобрать дерево устройств.

Такой способ мне не подходил, тогда обратился в группу telegram за помощью. Общими силами нашли решение, за что всем причастным огромное спасибо, а именно Serj GSG и Andrey Danin.

Решение - оверлеи, позволяющие динамически изменять и дополнять дерево устройств. Ниже поэтапная инструкция, как включить 1-Wire с помощью оверлеев.

  1. Создайте файл /root/onewire.dts с содержимым ниже (смените пин на свой, если требуется):

    /dts-v1/;
    /plugin/;
    
    / {
    	compatible = "allwinner,h5";
    
    	fragment@0 {
    		target = <&pio>;
    		__overlay__ {
    			w1_pa7_pins: w1-pa7-pins {
    				pins = "PA7";
    				function = "gpio_in";
    			};
    		};
    	};
    
    	fragment@1 {
    		target-path = "/";
    		__overlay__ {
    			onewire {
    				compatible = "w1-gpio";
    				pinctrl-names = "default";
    				pinctrl-0 = <&w1_pa7_pins>;
    				gpios = <&pio 0 7 0>;
    				status = "okay";
    			};
    		};
    	};
    };
    
  2. Установите компилятор:

    sudo apt-get install device-tree-compiler
    
  3. Выполните команду:

    dtc -I dts -O dtb -o onewire.dtbo onewire.dts
    
  4. Скопируйте полученный файл onewire.dtbo в /boot/overlays

  5. Откройте в редакторе файл /boot/repkaEnv.txt и допишите в overlays onewire, сохраните.

  6. Перезагрузите репку.


Вариант функции на Python для чтения показаний датчика DS18B20:

def read_temperature() -> float | None:
	base_dir = '/sys/bus/w1/devices'
	for entry in os.listdir(base_dir):
		if re.match(r'^28-.*$', entry):
			with open(f'{base_dir}/{entry}/w1_slave', 'r') as f:
				lines = f.readlines()
				if len(lines) == 2:
					if re.match(r'^.+YES$', lines[0]):
						search = re.search(r't=(\d+)', lines[1])
						if search:
							return float(search.group(1)) / 1000.0
	return None


Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Темы

Навигация

ВойтиРегистрация