====== Lab 02 ====== ===== Exercise Objectives ===== * Introduce WOKWI environment * Program various program to control GPIO pins ===== WOKWI ===== * Open website [[https://wokwi.com/]] * Sign up (with Google account) or select Raspberry Pi Pico from available [[https://wokwi.com/pi-pico|templates]] * Start coding :-) * [[https://drive.google.com/file/d/1ZiCN4bv86OIdtsjvK9UiwqSEIroXmxKz/view?usp=drive_link|video]] ==== Traffic lights ==== You can begin from the scratch of inspire yourself from some existing [[https://wokwi.com/projects/380280942145427457|project]]. === Tasks === * Connect three (different colors) LEDs to some pins. Be aware, that some of pins are GND. * Create the object to control Pins * Write program to toggle all LEDs * Update program to simulate traffic lights using delays * Update program to simulate traffic lights using timer (and state machine) ---- === Code to control three LEDs === from machine import Pin import time # create object to control the pin led1 = Pin(0, Pin.OUT) led2 = Pin(1, Pin.OUT) led3 = Pin(2, Pin.OUT) leds = [led1, led2, led3] while True: for i in leds: i.toggle() time.sleep_ms(1000) === Code using state machine and timer === from machine import Pin, Timer import time # objects to control GPIO pins led1 = Pin(0, Pin.OUT) led2 = Pin(1, Pin.OUT) led3 = Pin(2, Pin.OUT) # global variable to keep status of machine status = 0 # object to control Timer timer = Timer() def state(X): if X == 0: led1.on(); led2.off(); led3.off() elif X == 1: led1.on(); led2.on(); led3.off() elif X == 2: led1.off(); led2.off(); led3.on() elif X == 3: led1.off(); led2.on(); led3.off() def next_state(timer): global status state(status % 4) status = status + 1 timer.init(freq=1, mode=Timer.PERIODIC, callback=next_state) === Debouncing a pin input === A pin used as input from a switch or other mechanical device can have a lot of noise on it, rapidly changing from low to high when the switch is first pressed or released. This noise can be eliminated using a capacitor (a debouncing circuit). It can also be eliminated using a simple function that makes sure the value on the pin is stable. The following function does just this. It gets the current value of the given pin, and then waits for the value to change. The new pin value must be stable for a continuous 20ms for it to register the change. You can adjust this time (to say 50ms) if you still have noise. from machine import Pin, Timer def on_pressed(timer): print('pressed') def debounce(pin): # Start or replace a timer for 50ms, and trigger on_pressed. timer.init(mode=Timer.ONE_SHOT, period=50, callback=on_pressed) # Register a new hardware timer. timer = Timer(0) # Setup the button input pin with a pull-up resistor. button = Pin(0, Pin.IN, Pin.PULL_UP) # Register an interrupt on rising button input. button.irq(debounce, Pin.IRQ_RISING) === Matrix keyboard (4x4) === {{ :courses:be2m37mam:labs:m370e.jpg?400 |}} {{ :courses:be2m37mam:labs:m370e_2.jpg?400 |}} {{ :courses:be2m37mam:labs:m370e_3.jpg?400 |}}