Peruutustutka Picolla

Comments Off on Peruutustutka Picolla

RPi Picon kanssa voi tehdä pieniä projekteja ja kokeiluja, sensoreilla ja ilman. Törmäsin jo aikoja sitten ledivalo nauhan ohjelmointiin, se tehtiin käyttäen tavallista Raspberrya. Picon tultua markkinoille on ledi valot taas nousseet pintaan. Ledit yhdistettynä ultraääni sensoriin, voidaan tehdä vaikka peruutustutka. Valot kertovat etäisyyden objektiin, vihreä on kaukana ja punainen on liian lähellä tai jo osuma.

Ultraäänen ja valon lisäksi voisi tietysti olla myös summeri, joka varoittaa lähestyvästä kontaktista. Täysin luotettava tämä ei ole! Mutta hauska tapa oppia Python ohjelmointia.

Picon kanssa työskennellessä käytetään Thonny kehitysympäristöä. Koodia voi tehdä millä tahansa editorilla, mutta Thonnyn avulla koodi pystytään ajamaan suoraan Picolle. Arduino laitteilla on sama toimintaperiaate, käytetään Arduinon kehitysympäristöä joka samalla tallentaa tiedoston laitteelle.

Aloitaan liittämällä ultraäänisensori ja ledinauha Picoon. Tähän projektiin voisi käyttää yksittäisiä ledejä, tässä tapauksessa on käytetty pätkä RGB-ledinauhaa. Tehdään ensin hyvin yksinkertainen ratkaisu, jossa käytetään perusvärejä punainen, vihreä ja sininen. Myöhemmin voidaan kokeilla onnistuisiko liukuvärien toteuttaminen, se vaatii jo enemmän perehtymistä. Windows koneelle MicroPython Thonny koodi editorin/kehitysympäristön voi ladata osoitteesta; https://thonny.org/

Linux koneelle Thonny koodi editorin voi asentaa helposti, python pip asennustyökalun avulla; https://koodinkutoja.com/raspberry-pico-testing-with-ultrasonic-sensor-and-led-light-strip-thonny-code-editor/

from machine import Pin, PWM
import utime

pulse = Pin(3, Pin.OUT)
receiver = Pin(2, Pin.IN, Pin.PULL_DOWN)

pwm1 = PWM(Pin(16))   # PUNAINEN
pwm2 = PWM(Pin(17))   # SININEN
pwm3 = PWM(Pin(18))   # VIHREA

MIN = 9999999
MID = 5000000
MAX = 0000010

pwm1.freq(100)
pwm1.duty_ns(MIN)
pwm2.freq(100)
pwm2.duty_ns(MIN)
pwm3.freq(100)
pwm3.duty_ns(MIN)


def Kysy_etaisyys():
    AanenNopeus_mm = 0.343
    pulse.low()
    utime.sleep_us(20)
    pulse.high()
    utime.sleep_us(10)
    pulse.low()
    exitLoop = False
    laskuri = 0
    
    while receiver.value() == 0 and exitLoop == False:
        laskuri = laskuri + 1
        kysely_aika = utime.ticks_us()
        
        if laskuri > 3000 : exitLoop == True
    
    while receiver.value() == 1 and exitLoop == False:
        laskuri = laskuri + 1
        vastaanotettu_kaiku_aika = utime.ticks_us()
        if laskuri > 3000 : exitLoop == True
    
    if exitLoop == True: #We failed somewhere
        return 0
    else:
        etaisyys = ((vastaanotettu_kaiku_aika - kysely_aika) * AanenNopeus_mm) / 2
        return etaisyys

while True:
    etaisyys = Kysy_etaisyys()

    print("etaisyys esineeseen: ", etaisyys, "mm")
    if etaisyys > 1500:
        pwm1.duty_ns(MIN)  # Punainen
        pwm2.duty_ns(MIN)  # Sininen
        pwm3.duty_ns(MAX)  # Vihrea   LED loistaa valoa.
        
    elif etaisyys > 100 and etaisyys < 1500:    
        pwm1.duty_ns(MIN)  # Punainen
        pwm2.duty_ns(MAX)  # Sininen  LED loistaa valoa.
        pwm3.duty_ns(MIN)  # Vihrea
        
    elif etaisyys > 0 and etaisyys < 100:
        pwm1.duty_ns(MAX)  # Punainen LED loistaa valoa.
        pwm2.duty_ns(MIN)  # Sininen
        pwm3.duty_ns(MIN)  # Vihrea       
                   
    utime.sleep(0.50)