Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'KiCad'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 6 wyników

  1. Co, jeśli wizytówka oprócz danych kontaktowych od razu mogła pokazywać umiejętności? Ciekawym projektem który w przyszłości można było by pokazać dla potencjalnego pracodawcy jest właśnie wizytówka PCB. Inspiracje do stworzenia własnej wersji dostałem po przejedzeniu różnych projektów innych osób ( https://hackaday.com/tag/pcb-business-card/) właśnie takiej płytki i stwierdziłem ze musze zrobić własną wersje. Głównymi założeniami było dobranie takich elementów które są małe żeby całość była mała. Elementy na płytce to elementy SMD w większości w obudowie 0605 więc naprawdę małe. Na płytce znajduje się macierz diod Led 8x8 sterowanych przez dwa rejestry przesuwne 74HC595 których wartości ustawia mikrokontroler STM32L010F4P. Płytka jest zasilana z baterii CR2032. Przez to w jaki sposób została skonstruowana elektronika czyli jeden rejestr odpowiada za kolumny a drugi wiersze, żeby wyświetlić grafikę na tym sztucznym ekraniku potrzebne jest napisanie multipleksowania. Jesteśmy tak naprawdę w stanie sterować diodami tylko na jednym wierszu w danym momencie, ale przez przełączenie się bardzo szybkie pomiędzy wieszamy ludzkie oko nie jest w stanie zobaczyć przełączanie i widzi samą grafikę. // struktura na podstawie której są wyświetlane grafiki const uint8_t displayColumns[] = { 0b01111110, 0b10000001, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b10000001, 0b01111110, }; // Funkcja do kumunikacji z 2 rejestrami przesuwnymi void shiftOut(uint8_t dataRow, uint8_t dataCol) { for (int i = 7; i >= 0; i--) { HAL_GPIO_WritePin(DATA_PIN_GPIO_Port, DATA_PIN_Pin, (dataCol & (1 << i)) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(CLOCK_PIN_GPIO_Port, CLOCK_PIN_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(CLOCK_PIN_GPIO_Port, CLOCK_PIN_Pin, GPIO_PIN_RESET); } for (int i = 7; i >= 0; i--) { HAL_GPIO_WritePin(DATA_PIN_GPIO_Port, DATA_PIN_Pin, (dataRow & (1 << i)) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(CLOCK_PIN_GPIO_Port, CLOCK_PIN_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(CLOCK_PIN_GPIO_Port, CLOCK_PIN_Pin, GPIO_PIN_RESET); } HAL_GPIO_WritePin(LATCH_PIN_GPIO_Port, LATCH_PIN_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(LATCH_PIN_GPIO_Port, LATCH_PIN_Pin, GPIO_PIN_RESET); } // Pętla main programu/Mulitplexing while (1) { displayShift = 0b00000001; for(i=0;i<8;i++) { shiftOut(displayShift,~displayColumns[i]); displayShift = displayShift << 1; HAL_Delay(1); } } Płytka jest na tyle mała ze mieści się do portfela. Można też na niej uruchamiać różne animacje a nawet proste gry, ograniczeniami jest pamięć STM32L0. Poniżej jedna z animacji które można zaimplementować.
  2. W Internecie znajdziemy wiele skryptów Pythona ułatwiających rozmieszczenie komponentów na płytkach PCB w KiCad. Niestety w większości wypadków w ogóle nie działają pod wersją 8. Bazowy szkic jest na stronie PCB Python Bindings - Simple Plugin Example Znalezienie w Internecie aktualnych rozwiązań zajęło mi trochę czasu, postanowiłem podzielić się więc z Wami postem. Plugin umieszczamy w stosownym folderze. Po każdej zmianie kodu trzeba pamiętać o Odświeżeniu Pluginów z poziomu menu, o ile w momencie edycji KiCad jest uruchomiony. Proste przemieszczenie komponentów: import pcbnew board = pcbnew.GetBoard() def move_component(move_name, x, y): move_component = board.FindFootprintByReference(move_name) if move_component: vector = pcbnew.VECTOR2I_MM(x, y) move_component.SetPosition(vector) pcbnew.Refresh() print(f"Component {move_name} moved to {vector}") else: print(f"Component {move_name} not found") def move_component_relative(reference_name, move_name, x, y): move_component = board.FindFootprintByReference(move_name) reference_component = board.FindFootprintByReference(reference_name) if reference_component and move_component: shift_vector = pcbnew.VECTOR2I_MM(x, y) reference_position = reference_component.GetPosition() new_position = reference_position+shift_vector move_component.SetPosition(new_position) pcbnew.Refresh() print(f"Component {move_name} moved to {new_position}") else: print(f"Component {move_name} not found") class PlaceComponent(pcbnew.ActionPlugin): def defaults(self): self.name = "Place Component" self.category = "Modify PCB" self.description = "Place a component by name at a specified location" def Run(self): move_component_relative("D1", "D2", 26, 0) move_component("U1", 80, 88) # Register the plugin PlaceComponent().register() NIEOPTYMALNE (niepotrzebnie przenosi ścieżki do kolejnej linijki po przekątnej, zamiast "wężykiem"), przykładowe rozmieszczenie komponentów: import pcbnew board = pcbnew.GetBoard() def move_component(move_name, x, y): print('vector ' + str(x) + " " + str(y)) move_component = board.FindFootprintByReference(move_name) if move_component: vector = pcbnew.VECTOR2I_MM(x, y) move_component.SetPosition(vector) pcbnew.Refresh() print(f"Component {move_name} moved to {vector}") else: print(f"Component {move_name} not found") def move_component_relative(reference_name, move_name, x, y): print('vector ' + str(x) + " " + str(y)) move_component = board.FindFootprintByReference(move_name) reference_component = board.FindFootprintByReference(reference_name) if reference_component and move_component: shift_vector = pcbnew.VECTOR2I_MM(x, y) reference_position = reference_component.GetPosition() new_position = reference_position+shift_vector move_component.SetPosition(new_position) pcbnew.Refresh() print(f"Component {move_name} moved to {new_position}") else: print(f"Component {move_name} not found") def rearrangeComponents(): width = 3.5 height = 3.5 x_margin = 7 y_margin = 3.5 line = 0 number_led = 1 for i in range(0, 9): if i == 0 or i == 8: count = 2 for j in range(count): move_component_relative("D1", "D"+str(number_led), (width+x_margin)*j*5, (height+y_margin)*i) number_led += 1 #pygame.draw.rect(screen, WHITE, (initial_x+(width+x_margin)*j*5, initial_y+(height+y_margin)*i, width, height)) #all_leds += 1 else: if i%2 == 1: count = 4 initial_spacing = width+x_margin else: count = 3 initial_spacing = 2*width+x_margin+(x_margin-width)/2 for j in range(count): move_component_relative("D1", "D"+str(number_led), (width+x_margin)*j+initial_spacing, (height+y_margin)*i) number_led += 1 #pygame.draw.rect(screen, WHITE, (initial_x+(width+x_margin)*j+initial_spacing, initial_y+(height+y_margin)*i, width, height)) class PlaceComponent(pcbnew.ActionPlugin): def defaults(self): self.name = "Place Component" self.category = "Modify PCB" self.description = "Place a component by name at a specified location" def Run(self): rearrangeComponents() #move_component_relative("D1", "D2", 26, 0) #move_component("U1", 80, 88) # Register the plugin PlaceComponent().register() Dzięki modułowi pygame przyspieszymy testowanie kolejnych iteracji algorytmu. import pygame import sys pygame.init() screen = pygame.display.set_mode((580, 620)) pygame.display.set_caption("Shooting lights") BLACK = (0, 0, 0) GREEN = (0, 255, 0) WHITE = (255, 255, 255) initial_x = 10 initial_y = 10 width = 35 height = 35 x_margin = 70 y_margin = 35 line = 0 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # Fill the screen with black screen.fill(BLACK) #all_leds = 0 for i in range(0, 9): if i == 0 or i == 8: count = 2 for j in range(count): pygame.draw.rect(screen, WHITE, (initial_x+(width+x_margin)*j*5, initial_y+(height+y_margin)*i, width, height)) #all_leds += 1 else: if i%2 == 1: count = 4 initial_spacing = width+x_margin else: count = 3 initial_spacing = 2*width+x_margin+(x_margin-width)/2 for j in range(count): pygame.draw.rect(screen, WHITE, (initial_x+(width+x_margin)*j+initial_spacing, initial_y+(height+y_margin)*i, width, height)) #all_leds += 1 #print(all_leds) #pygame.draw.rect(screen, GREEN, (initial_x, initial_y, width, height)) # Update the display pygame.display.flip() # Quit pygame pygame.quit() sys.exit() Możemy skorzystać z wxPython (Tkinter nie chciał się uruchomić z poziomu KiCada), by za pomocą GUI, na żywo edytować parametry pracy. import pcbnew import wx #https://techoverflow.net/2023/05/13/how-to-show-wx-dialog-message-in-kicad-pcbnew-plugin/ #sudo dnf install python3-wxpython4* board = pcbnew.GetBoard() width = 3.5 height = 3.5 x_margin = 7 y_margin = 3.5 def move_component(move_name, x, y): print('vector ' + str(x) + " " + str(y)) move_component = board.FindFootprintByReference(move_name) if move_component: vector = pcbnew.VECTOR2I_MM(x, y) move_component.SetPosition(vector) pcbnew.Refresh() print(f"Component {move_name} moved to {vector}") else: print(f"Component {move_name} not found") def move_component_relative(reference_name, move_name, x, y): print('vector ' + str(x) + " " + str(y)) move_component = board.FindFootprintByReference(move_name) reference_component = board.FindFootprintByReference(reference_name) if reference_component and move_component: shift_vector = pcbnew.VECTOR2I_MM(x, y) reference_position = reference_component.GetPosition() new_position = reference_position+shift_vector move_component.SetPosition(new_position) pcbnew.Refresh() print(f"Component {move_name} moved to {new_position}") else: print(f"Component {move_name} not found") def rearrangeComponents(): line = 0 number_led = 1 for i in range(0, 9): if i == 0 or i == 8: count = 2 for j in range(count): move_component_relative("D1", "D"+str(number_led), (width+x_margin)*j*5, (height+y_margin)*i) number_led += 1 #pygame.draw.rect(screen, WHITE, (initial_x+(width+x_margin)*j*5, initial_y+(height+y_margin)*i, width, height)) #all_leds += 1 else: if i%2 == 1: count = 4 initial_spacing = width+x_margin else: count = 3 initial_spacing = 2*width+x_margin+(x_margin-width)/2 for j in range(count): move_component_relative("D1", "D"+str(number_led), (width+x_margin)*j+initial_spacing, (height+y_margin)*i) number_led += 1 #pygame.draw.rect(screen, WHITE, (initial_x+(width+x_margin)*j+initial_spacing, initial_y+(height+y_margin)*i, width, height)) class PlaceComponentGUI(pcbnew.ActionPlugin): def defaults(self): self.name = "Place Component GUI" self.category = "Modify PCB" self.description = "Place a component by name at a specified location" def Run(self): app = wx.App(False) frame = MyForm() frame.Show() app.MainLoop() # Register the plugin PlaceComponentGUI().register() class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Move components", size=(400, 400)) panel = wx.Panel(self, wx.ID_ANY) sizer = wx.BoxSizer(wx.VERTICAL) # Reference component x_margin_label = wx.StaticText(panel, label="x_margin:") self.x_margin_input = wx.TextCtrl(panel) global x_margin self.x_margin_input.SetValue(str(x_margin)) sizer.Add(x_margin_label, 0, wx.ALL, 5) sizer.Add(self.x_margin_input, 0, wx.ALL | wx.EXPAND, 5) y_margin_label = wx.StaticText(panel, label="y_margin:") self.y_margin_input = wx.TextCtrl(panel) global y_margin self.y_margin_input.SetValue(str(y_margin)) sizer.Add(y_margin_label, 0, wx.ALL, 5) sizer.Add(self.y_margin_input, 0, wx.ALL | wx.EXPAND, 5) move_button = wx.Button(panel, label="Move") move_button.Bind(wx.EVT_BUTTON, self.on_move) sizer.Add(move_button, 0, wx.ALL | wx.CENTER, 5) panel.SetSizer(sizer) def on_move(self, event): global x_margin global y_margin x_margin = float(self.x_margin_input.GetValue()) y_margin = float(self.y_margin_input.GetValue()) rearrangeComponents() Reimplementacja funkcji, która już istnieje w menu kontekstowym komponentu: import pcbnew import wx #https://techoverflow.net/2023/05/13/how-to-show-wx-dialog-message-in-kicad-pcbnew-plugin/ #sudo dnf install python3-wxpython4* board = pcbnew.GetBoard() def move_component(move_name, x, y): print('vector ' + str(x) + " " + str(y)) move_component = board.FindFootprintByReference(move_name) if move_component: vector = pcbnew.VECTOR2I_MM(x, y) move_component.SetPosition(vector) pcbnew.Refresh() print(f"Component {move_name} moved to {vector}") else: print(f"Component {move_name} not found") def move_component_relative(reference_name, move_name, x, y): print('vector ' + str(x) + " " + str(y)) move_component = board.FindFootprintByReference(move_name) reference_component = board.FindFootprintByReference(reference_name) if reference_component and move_component: shift_vector = pcbnew.VECTOR2I_MM(x, y) reference_position = reference_component.GetPosition() new_position = reference_position+shift_vector move_component.SetPosition(new_position) pcbnew.Refresh() print(f"Component {move_name} moved to {new_position}") else: print(f"Component {move_name} not found") class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Move components", size=(400, 400)) panel = wx.Panel(self, wx.ID_ANY) sizer = wx.BoxSizer(wx.VERTICAL) # Reference component ref_label = wx.StaticText(panel, label="Reference component:") self.ref_input = wx.TextCtrl(panel) sizer.Add(ref_label, 0, wx.ALL, 5) sizer.Add(self.ref_input, 0, wx.ALL | wx.EXPAND, 5) move_label = wx.StaticText(panel, label="Move component:") self.move_input = wx.TextCtrl(panel) sizer.Add(move_label, 0, wx.ALL, 5) sizer.Add(self.move_input, 0, wx.ALL | wx.EXPAND, 5) shift_label = wx.StaticText(panel, label="Shift vector:") sizer.Add(shift_label, 0, wx.ALL, 5) x_label = wx.StaticText(panel, label="X:") self.x_input = wx.TextCtrl(panel) sizer.Add(x_label, 0, wx.ALL, 5) sizer.Add(self.x_input, 0, wx.ALL | wx.EXPAND, 5) y_label = wx.StaticText(panel, label="Y:") self.y_input = wx.TextCtrl(panel) sizer.Add(y_label, 0, wx.ALL, 5) sizer.Add(self.y_input, 0, wx.ALL | wx.EXPAND, 5) move_button = wx.Button(panel, label="Move") move_button.Bind(wx.EVT_BUTTON, self.on_move) sizer.Add(move_button, 0, wx.ALL | wx.CENTER, 5) panel.SetSizer(sizer) def on_move(self, event): ref = self.ref_input.GetValue() move = self.move_input.GetValue() x_shift = float(self.x_input.GetValue()) y_shift = float(self.y_input.GetValue()) print(f"Reference: {ref}, Move: {move}, X shift: {x_shift}, Y shift: {y_shift}") move_component_relative(ref, move, x_shift, y_shift) class DialogExamplePlugin(pcbnew.ActionPlugin): def defaults(self): self.name = "Move components GUI" #self.category = "A descriptive category name" self.description = "GUI interface to arrangement components" self.show_toolbar_button = False def Run(self): app = wx.App(False) frame = MyForm() frame.Show() app.MainLoop() DialogExamplePlugin().register() Warto uruchomić KiCada z poziomu linii poleceń. Dzięki temu będziemy mieli podgląd w terminalu do tego, co wypisywane jest funkcją print(). Jeśli zainstalowaliśmy aplikację pod Linuksem z poziomu Flatpaka: flatpak run org.kicad.KiCad Przykładowy efekt pracy:
  3. Dzień dobry, czy wie ktoś jak używać kalkulatora szerokości ścieżek na płytce drukowanej? Z góry dziękuję za odpowiedzi!
  4. Witam, chciałbym wykonać PCB na laminacie światłoczułym jednostronnym. Nie wiem jak umieścić a raczej jak wydrukować wzór PCB tak aby Arduino nano znajdowało się w lewym górnym rogu a złącze USB było skierowane na zawnatrz płytki. WSZYSTKIE elementy obwodu chciałbym aby znajdowały się na tej stronie gdzie nie ma wytrawionych ścieżek. Z góry dziękuję za pomoc.
  5. Płytka prototypowa AVR Witam mam dla was do zaprezentowana płytkę prototypową z mikrokontrolerem AVR w obudowie DIP40. Zaprezentowany układ został wykonany dla osób zaczynających zabawę z mikrokontrolerami AVR. Płytka PCB ma wymiary 132mm x 69mm. Został wykonany w programie KiCad. Schemat umieszczony poniżej składa się z Płytki dwuwarstwowej Mikrokontrolera AVR DIP40 Wyświetlacza 7-segmentowego Wyświetlacza LCD HD44780 Dwóch mostków H w jednej obudowie 5 przycisków przycisków 1. Obok mikrokontrolera są umieszczone jego wyprowadzenia. Do obu wyświetlaczy wyprowadzenia umieściłem obok goldpinów Portu A dla LCD oraz Portu C dla 7-segmentowego (odpowiedzialnego za załączenie segmentów) Umożliwia to łatwe połączenie używając zworek. Każdy podłączony układ ma doprowadzone zasilanie. 2. Mikrokontroler AVR – Płytka przystosowana jest do mikrokontrolerów AVR w obudowie DIP40. Nie wyposażyłem układ w programator. Lecz zastosowałem złącze ISP 10-pinowe. Programator to koszt ok 20 pln. Podłączyłem do układu zewnętrzny rezonator kwarcowy w obudowie HC-49 przy montażu należy pamiętać o przylutowaniu adaptera. Daje to możliwość zamiany taktowania procka. 3. Wyświetlacz 7-segmentowy jest to element ze wspólną anodą Jest to układ który ma już wyprowadzone i połączone segmenty i anody poszczególnych cyfr. Do obsługi wyświetlacza wykorzystywane są piny wyprowadzone przy Porcie C (segmenty) oraz obok wyświetlacza (Anody). Segmenty posiadają również rezystory 220 Ω. Można również zastosować wyświetlacz ze wspólną katodą ale należy pamiętać o tym pisząc program. 4. Wyświetlacz LCD HD44780 nie występuje on w prezentowanym układzie ma on wyprowadzenia na PCB. Jest możliwa jedynie komunikacja 4-bitowa, która oszczędza na ilości potrzebnych połączeń między mikrokontrolerem a ekranem. Wykorzystać można wiele rozmiarów wyświetlaczy. Najczęstszym jest 1602 który posiada dwa wiersze oraz 16 kolumn. Czyli 32znaki. Jest też możliwość podłączenia ekranu 2004 i zależność kolumn i wierszy jest identyczna jak w opisywanym wcześniej ekranie. Pod ekranem jest miejsce na zworkę RW która odpowiada za komunikacje zwrotną z LCD do mikrokontrolera. Nie korzystając z tej opcji należy przełączyć pomiędzy RW a GND. Obok zworki RW jest miejsce na przylutowanie potencjometru do ustawienia kontrastu. 5. Mostek H jest to element do pełnej obsługi silników. Układ L293D jest w obudowie DIP 16. Układ ten pozwala sterować w pełni (prędkość, kierunek obrotów) dwoma silnikami DC. Można również podłączyć opisywany układ do silnika krokowego bipolarnego. Dzięki wyprowadzeniom można wykorzystać zewnętrzne napięcie przystosowane do danego silnika. W każdym z silników możemy decydować o prędkości obrotowej wykorzystując złącze PWM oraz kierunkiem przy użyciu wejść 1A, 2A lub 3A, 4A (np. 1A Vcc , 2A GND -> obroty w prawo) 6. Ostatnim opisywanymi elementami są przyciski. Są one podjęte a stałe do GND a drugie końce wyprowadzeń są podłączone do złączy goldpinowych. Projekty które można zrealizować na omawianym PCB Migotanie diodami LED (należy pamiętać o podłączeniu co najmniej jednego wyprowadzenia Anod do GND) Sterowaniem Wyświetlaczem LED 7 segmentowym (multipleksacja) Obsługa wyświetlacza LCD Sterowanie silnikami DC w wykorzystaniem PWM Sterowanie silnikiem krokowym bipolarnym obsługa klawiszy (sprawdzenie stanu na pinie) Obecny układ jest pierwszą wersją po której nastąpią poprawki. W kolejnych etapach rozwoju chciałbym dodać osobne diody LED podpięte na stałe do 5V lub GND wraz z rezystorami. Dołączyć dwa moduły jednym jest ekspander pinów pracujący na magistrali TWI (I2C) oraz moduł termometru cyfrowego DS18B20 połączonego za pomocą komunikacji 1-wire. Poprawić układ PCB (układ ścieżek, wymianę obudów na inne). Zachęcam do zadawania pytań, pisania sugestii oraz krytyki w celu dalszego rozwoju. W załączniku dołączam plik rar z wszystkimi plikami KiCad'a.Board 1.rar Pozdrawiam
  6. Idea działania Komora jonizacyjna, to urządzenie składające się z dwóch elektrod do których doprowadzane jest stałe napięcie, co powoduje powstanie pola elektrycznego w jej środku. Gdy kwant promieniowania "uderzy" w atom gazu znajdującego się w komorze, "rozbija" go na dwa jony (dodatni i ujemny), które są przyciągane do elektrod (dodatni do ujemnej i vice versa). Mierząc prąd płynący między dodatnią, a ujemną elektrodą, będzie on proporcjonalny do ilości tych jonów, zaś to będzie proporcjonalne do mierzonego promieniowania. Utrudnieniem jest, że wspomniane prądy są małe, więc wymagają dużego wzmocnienia, co zaś wymaga m.in. starannego filtrowania zasilania, oraz ekranowania, by urządzenie się nie wzbudzało. Poniżej znajduje się schemat blokowy prezentowanego rozwiązania. Część elektroniczna Pierwotnie do wytworzenia napięcia polaryzującego, miałem w planach użycie przetwornicy, jednak okazało się, że napięcie 12V z baterii jest wystarczające. Sygnał z komory trafia do wzmacniacza transimpedancyjnego, w pętli sprzężenia znajdują się szeregowo dwa rezystory o wartości aż 50G. Połączenie owych rezystorów, elektrody komory jonizacyjnej i nóżki wzmacniacza musi być wykonane w powietrzu, by uniknąć pasożytniczych rezystancji. Poniżej znajduje się render w KiCADie, oraz rzeczywiste urządzenie (wiem, fotka jest dość niskiej jakości). Część programistyczna Sygnał analogowy trafia do przetwornika ADC, i jest zbierany przez procek - tu użyłem dość mało popularnego STM8. Zaskoczeniem było dla mnie, że GCC nie obsługuje tych procesorów, zaś poświęcony im SDCC nie umie wycinać z binarki funkcji, które nie są używane! Do komunikacji z hardwarem użyłem stdperiph. Komunikacja z światem zewnętrznym jest jednokierunkowa (urządzenie wysyła pomiary co kilka sekund) za pomocą UARTa. Założeniem było, by urządzenie można było pozostawić same sobie i zdalnie je flashować, czy też pobierać z niego dane. W skrócie, wolę programować leżąc w łóżku, niż garbiąc się nad stołem pełnym kabli :) Zostało to zrealizowane przez dodanie Raspberry Pi, do której podpięty jest zarówno programator, jak i przelotka UART/USB. Soft na procka napisałem w C. Pobieranie danych po stronie maliny jest wykonywane przez skrypt w Pythonie, dane są wizualizowane skryptem w R. Użyłem R, mimo, że Python też ma biblioteki do tworzenia wykresów, bo bardzo podobają mi się wykresy w R. Dokumentacja powstała w LATEXie. Całość dostępna jest na GitHubie - zapraszam do odwiedzenia Wyniki Poniżej znajdują się dane pomiarowe zebrane za pomocą urządzenia.
×
×
  • Utwórz nowe...