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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.