Projekt to interaktywny sposób nauki modulacji szerokości impulsów (PWM) na platformie ESP8266. Za pomocą prostego interfejsu z wyświetlaczem, potencjometrem i przyciskami, użytkownik może eksperymentować z regulacją wypełnienia i częstotliwości sygnału. Dodatkowo wbudowana obsługa serwomechanizmu, buzzer'a i diody LED umożliwia praktyczne zastosowanie pojęć PWM, tworząc dynamiczne doświadczenia edukacyjne
Do zbudowania projektu potrzebujemy:
- - ESP8266
- - Potencjometru
- - Wyświetlacza OLED 128x64px
- - 2 przycisków
- - kabelków połączeniowych
- - 2 płytek uniwersalnych
- - Buzzera
- - Diody LED + rezystora 220ohm
- - Serwomechanizmu
Komputer PC ze środowiskiem Arduino.
Projekt prezentuje praktyczne zastosowanie modulacji szerokości impulsów, czyli PWM (ang. pulse-width modulation), stanowiącej ważny element nauki o sterowaniu sygnałem elektrycznym. Za pomocą intuicyjnego interfejsu, składającego się z wyświetlacza, potencjometru i przycisków, użytkownik ma możliwość regulacji zarówno wypełnienia, jak i częstotliwości sygnału.
Program umożliwia również korzystanie z predefiniowanej funkcji sterowania serwomechanizmem. Serwomechanizm, skonfigurowany z częstotliwością 50Hz i wypełnieniem do ~10%, jest dostosowany do standardowych ustawień serw, co ułatwia eksperymentowanie z jego działaniem.
Poza serwomechanizmami projekt zachęca do eksploracji innych komponentów, takich jak buzzer czy dioda LED. Dzięki zmianom ustawień można eksperymentować z różnymi dźwiękami generowanymi przez buzzer lub regulować jasność świecenia diody LED, co stanowi interesującą obserwację dla uczniów. To praktyczne doświadczenie z PWM pozwala zrozumieć jego zastosowania w sterowaniu różnymi rodzajami urządzeń elektronicznych.
from machine import Pin,I2C, ADC, PWM
import time
import ssd1306
pwm = PWM(Pin(15))
adc = ADC(0)
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128,64,i2c)
Btn1 = Pin(12, Pin.IN, Pin.PULL_UP)
Btn2 = Pin(13, Pin.IN, Pin.PULL_UP)
btn1 = False
serwo = True
Ufreq = 10
Uduty = 10
height = 64
width = 128
def single_pwm(x, y, width1, height1, procent):
if(procent > 100):
oled.fill_rect(x, y,width1,height1,1)
elif(procent<1):
oled.line(x, y+height1, x+width1, y+height1, 1)
else:
oled.line(x, y+height1,x,y,1)
oled.line(x, y, x + int(procent*width1/100),y,1)
oled.line(x + int(procent*width1/100), y+height1,x + int(procent*width1/100),y,1)
oled.line(x + int(procent*width1/100), y+height1, x+width1, y+height1, 1)
oled.fill_rect(x,y,int(procent*width1/100),height1,1)
def wyswietl_pwm_serwo(duty):
oled.rect(0,0,width, 40,1)
single_pwm(0, 5, 40, 20, duty)
single_pwm(40,5,40,20,duty)
single_pwm(80,5,40,20,duty)
single_pwm(120,5,40,20,duty)
oled.text('Wypelnienie:'+str(int(duty))+'%', 1,30,1)
def wyswietl_pwm(duty, freq):
oled.rect(0,0,width, 40,1)
single_pwm(0, 5, 40, 20, duty)
single_pwm(40,5,40,20,duty)
single_pwm(80,5,40,20,duty)
single_pwm(120,5,40,20,duty)
oled.text('W='+str(int(duty))+'% '+ 'F='+str(int(freq))+'Hz', 1,30,1)
def menu_element(s, x, y, width1, height1):
oled.rect(x,y,width1,height1,1)
oled.text(s,x,int(y+height1/4),1)
def menu(s1,s2):
menu_element(s1,0,50,46,14)
menu_element(s2,46,50,82,14)
def info_serwo():
oled.rect(0,0,width,height,1)
oled.text('Serwo dzialaja',1,2,1)
oled.text('w zakresie wype-',1,10,1)
oled.text('lnienia 0%~10%.',1,20,1)
oled.text('Ograniczenie',1,30,1)
oled.text('programu do 12%',1,40,1)
while True:
if(Btn1.value() == 0):
btn1 = not btn1
if(Btn2.value() == 0):
serwo = not serwo
oled.fill(0)
if(serwo):
if(btn1==True):
menu('Serwo', '')
info_serwo()
else:
if(adc.read()*100/1023>12):
oled.text('Ograniczenie',1,40,1)
else:
pwm.duty(adc.read())
pwm.freq(50)
menu(' Info', ' Sandbox')
wyswietl_pwm_serwo(100*(adc.read()/1023))
else:
wyswietl_pwm(Uduty, Ufreq)
pwm.duty(int(Uduty*1023/100))
pwm.freq(Ufreq)
if(btn1==True):
menu(' Freq', ' Serwo')
Uduty = int(100*adc.read()/1023)
else:
Ufreq = int(1000*adc.read()/1023)
menu(' %', ' Serwo')
oled.show()
time.sleep(0.1)
pwm.deinit()