Skocz do zawartości

Raspberry Pi Pico, Pythona - odczyt iButton - pastylka DS1990A?


R-Off

Pomocna odpowiedź

@R-Off To się nazywa iButton, dopisałem ci w temacie.

Dallas działa z 1wire, równie dobrze mógłbyś wziąć czujnik temperatury czy jakieś inne urządzenie i zrobić z tego iButton.

Działa to na zasadzie zasilania pasożytniczego. iButton ma tylko masę i linię sygnałową służącą też do zasilania. Na wiki masz więcej i nawet przykłady takich przycisków w różnych formach.

Co do szczegółów to dokumentacja odpowie. Na samym poczatku masz info:

image.thumb.png.04aaabc3a0f80b03dd85260f5b09b207.png

Do 5ms czas odczytu, 64b numer. Musisz go odczytać, a żeby to wiedzieć musisz w masterze magistrali 1-wire przesłuchiwać linie i w momencie wykrycia odczytać adres urządzenia i wć zapytania o odczyt konkretnego obszaru pamięci iButtona.

Tu masz info co oznacza te 64b, w praktyce kod urządzenia to 48b:

image.thumb.png.0eb9d4e354e8f853ee50d8d1980768b0.png

A w najprostszym przypadku tu masz adres do odczytu:

image.thumb.png.a10f960cd6c120d99118d4938409171f.png

Ciekawy temat, jak uda ci się coś zdziałać to daj znać 🙂 

Link do komentarza
Share on other sites

Tutaj masz bibliotekę onewire.py:

# 1-Wire driver for MicroPython
# MIT license; Copyright (c) 2016 Damien P. George

import _onewire as _ow


class OneWireError(Exception):
    pass


class OneWire:
    SEARCH_ROM = 0xF0
    MATCH_ROM = 0x55
    SKIP_ROM = 0xCC

    def __init__(self, pin):
        self.pin = pin
        self.pin.init(pin.OPEN_DRAIN, pin.PULL_UP)

    def reset(self, required=False):
        reset = _ow.reset(self.pin)
        if required and not reset:
            raise OneWireError
        return reset

    def readbit(self):
        return _ow.readbit(self.pin)

    def readbyte(self):
        return _ow.readbyte(self.pin)

    def readinto(self, buf):
        for i in range(len(buf)):
            buf[i] = _ow.readbyte(self.pin)

    def writebit(self, value):
        return _ow.writebit(self.pin, value)

    def writebyte(self, value):
        return _ow.writebyte(self.pin, value)

    def write(self, buf):
        for b in buf:
            _ow.writebyte(self.pin, b)

    def select_rom(self, rom):
        self.reset()
        self.writebyte(self.MATCH_ROM)
        self.write(rom)

    def scan(self):
        devices = []
        diff = 65
        rom = False
        for i in range(0xFF):
            rom, diff = self._search_rom(rom, diff)
            if rom:
                devices += [rom]
            if diff == 0:
                break
        return devices

    def _search_rom(self, l_rom, diff):
        if not self.reset():
            return None, 0
        self.writebyte(self.SEARCH_ROM)
        if not l_rom:
            l_rom = bytearray(8)
        rom = bytearray(8)
        next_diff = 0
        i = 64
        for byte in range(8):
            r_b = 0
            for bit in range(8):
                b = self.readbit()
                if self.readbit():
                    if b:  # there are no devices or there is an error on the bus
                        return None, 0
                else:
                    if not b:  # collision, two devices with different bit meaning
                        if diff > i or ((l_rom[byte] & (1 << bit)) and diff != i):
                            b = 1
                            next_diff = i
                self.writebit(b)
                if b:
                    r_b |= 1 << bit
                i -= 1
            rom[byte] = r_b
        return rom, next_diff

    def crc8(self, data):
        return _ow.crc8(data)

(A raczej wygodniejszy adapter 😄)

Akurat tutaj musiałbyś wykorzystać funkcję SearchROM (biblioteka była tworzona pod czujniki temperatury), 

  1. reset
  2. writebyte(33h)
  3. readbyte() [8 razy] - pierwszy to kod rodziny, 6 to unique id, ostatni to  crc

I resztę sobie przetwarzasz (m/w tak to powinno działać, nie piszę w Pythonie, a OneWire używam raz na ruski rok).

Edytowano przez H1M4W4R1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.