Generator sygnału PWM z testerem serwomechanizmów

Typ_projektu
microPython
Zdjecie główne
Obraz
Krótki opis projektu

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

Niezbędne elementy

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


 

Sprzęt

Komputer PC ze środowiskiem Arduino.

Opis projektu

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.

kod programu
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()
Schemat
Youtube
Tagi
PWM MicroPython Led Buzzer Oled