W dniu 21.05.2025 r. braliśmy udział w comiesięcznym spotkaniu miłośników programowania w języku python. Co mamy wspólnego z pythonem? Niewiele 😉 Ale tematyką główną było programowanie elektroniki – hobbystyczne roboty i drony. Skorzystaliśmy z zaproszenia i było super! Plan 73 edycji PyStoka był następującY:
Roboty Sztucznie Inteligentne – Nikodem Bartnik
Drony, Python vs Podstawa programowa – Adam Jurkiewicz;
Zgarnij książki, licencje Jetbrains oraz Rpi Pico 2 W;
Światłolub ma oczy… fotorezystory! Ale Arduino nie odczytuje rezystancji, tylko napięcia. Dlatego wykorzystujemy dzielnik napięcia według schematu:
Analizujemy prosty dzielnik napięcia, wykorzystywany do odczytu wartości z czujnika za pomocą Arduino. Napięcie odczytywane na pinie A0 będzie dane wzorkiem V_A0 (kolor czarny na obrazku powyżej). Celem jest znalezienie takiej wartości rezystora stałego (R_fixed), która zapewni najlepsze rozróżnienie między warunkami jasnymi a ciemnymi, tak aby Arduino mogło najlepiej wykrywać różnicę. Chcemy:
Zmierzyć opory R_foto w warunkach jasnych i ciemnych – miernik (multimetr)
Obliczyć V_A0 dla różnych wartości R_fixed w dwóch przypadkach: jasno i ciemno
Określić różnicę napięć (ΔV)
Przeskalować tę różnicę do zakresu analogRead() Arduino (0–1023)
Narysować odpowiednie wykresy, aby określić, która wartość rezystora działa najlepiej
Mierzymy opór czujnika w warunkach jasnych i ciemnych – następnie definiujemy stałe: napięcie wejściowe (5V) oraz opór czujnika w warunkach jasnych i ciemnych warunkach.
import matplotlib.pyplot as plt # Stałe V_in = 5 # Napięcie wejściowe w woltach R_sensor_light = 60 # Opór czujnika w jasności (kiloomy) R_sensor_dark = 180 # Opór czujnika w ciemności (kiloomy)
Przygotowujemy tablice (czyli listy w języku Python) do przechowywania wyników dla każdej testowanej wartości rezystora.
# Listy do przechowywania wyników R_fixed_values = list(range(1, 1000)) V_out_light_values = [] V_out_dark_values = [] delta_V_values = []
Przechodzimy pętlą przez wartości R_fixed (od 1 do 999 kiloomy) i obliczamy:
Napięcie wyjściowe, gdy czujnik jest w jasności (V_out_light)
Napięcie wyjściowe, gdy czujnik jest w ciemności (V_out_dark)
Różnicę napięć między tymi dwoma wartościami (delta_V)
Rysujemy napięcie wyjściowe dla warunków jasnych i ciemnych oraz „cieniujemy” obszar między dwiema funkcjami napięcia. To pokazuje w którym miejscu i jak bardzo zmienia się sygnał z czujnika.
# Wykres 1: V_out dla jasności i ciemności plt.figure(figsize=(10, 5)) plt.plot(R_fixed_values, V_out_light_values, '--b', label='V_out (Jasność)') plt.plot(R_fixed_values, V_out_dark_values, '--r', label='V_out (Ciemność)')
# Wypełnienie obszaru między dwiema krzywymi where_condition = [dark > light for dark, light in zip(V_out_dark_values, _out_light_values)] plt.fill_between(R_fixed_values, V_out_light_values, V_out_dark_values,where=where_condition,color='gray', alpha=0.3, label='Obszar ΔV') plt.title('Napięcie wyjściowe dzielnika w warunkach jasnych i ciemnych') plt.xlabel('R_fixed (kiloomy)') plt.ylabel('V_out (V)') plt.legend() plt.grid(True) plt.tight_layout() plt.show()
Rysujemy różnicę napięć (ΔV) i zaznaczamy rezystor, który daje największe rozdzielenie sygnału
Mapujemy różnicę napięć ΔV do skali analogRead() Arduino (0–1023)
# Szukanie najlepszej wartości R_fixed pod względem różnicy odczytu ADC delta_ADC_values = [(v / V_in) * 1023 for v in delta_V_values] max_delta_ADC = max(delta_ADC_values) max_adc_index = delta_ADC_values.index(max_delta_ADC) optimal_R_adc = R_fixed_values[max_adc_index]
Rysujemy ΔV przeskalowaną do zakresu analogRead oraz zaznaczamy rezystor dający największą różnicę odczytu cyfrowego
Trwa szlifowanie kodu… a raczej tworzenie go tak, by działał poprawnie 😉 Okazuje się bowiem, że w różnych miejscach testowanej podłogi jest różne oświetlenie (zastane) – o dziwo! 😀 Wbite na sztywno wartości odczytane z czujników nie pracują 😉 Na tym właśnie polega ta zabawa! Rozwiązanie? aktualizować światło zastane co 1s? Tak działa jeden zespół. Drugi kombinuje z hardware – wprowadza jakąś przeszkodę blokującą światło zastane – ciekawe, co z tego wyjdzie.
Zawody
Jeśli sterowanie będzie działać, to sprawdzimy to w ekstremalnej sytuacji- postawimy dwie przeszkody, będzie trzeba je objeżdźać – kręcąc tzw. ósemki. Zmierzymy czas trzech okążeń i się okaże, który zespół jest lepszy 😉