Grundlagenversuche RPi Pico    


Elektronik-Labor   Projekte   AVR 




Unser Amateurfunk-Ortsverband L05 hat wieder einen kleinen Programmierkurs für Teilnehmer ab 12 Jahren organisiert. Einige ältere Kollegen machen auch mit. Wir hatten ein erstes Treffen mit einer knappen Einführung und einigen HF-Experimenten. Nun arbeitet jeder für sich weiter. Einige der Ergebnisse werden hier gesammelt.

Aufzugsteuerung

Alex wollte zwei Kontrolllämpchen in einem Aufzug steuern. Der Benutzer kann auf einen Taster drücken.


Ganz einfach: Gedrückt grün, losgelassen rot

#Aufzug1
from machine import Pin
import time

p2= Pin(2, Pin.OUT)
p5= Pin(5, Pin.OUT)
p19 = Pin(19, Pin.IN, Pin.PULL_UP)

while True:
    if (p19.value()==0):
        p2.value(1)
        p5.value(0)
    else:
        p2.value(0)
        p5.value(1)
        

Der zweite Versuch war komplizierter. Der Aufzug steht immer unten. Wenn ich drücke, geht er hoch (grün). Wenn er da ist, lasse ich los und steige ein. Dann geht er wieder runter (rot) und bleibt da bis zum nächsten Schalterdruck.

#Aufzug2
from machine import Pin
import time

p2= Pin(2, Pin.OUT)
p5= Pin(5, Pin.OUT)
p19 = Pin(19, Pin.IN, Pin.PULL_UP)

while True:
    while (p19.value()==1):    #auf Taster warten
        time.sleep(0.1)
    while (p19.value()==0):    #gedrückt
        p2.value(1)            #grün
        p5.value(0)    
    time.sleep(1)            #wieder losgelassen
    p2.value(0)
    time.sleep(1)
    p5.value(1)                #rot
    time.sleep(5)
    p5.value(0)
       


Geschwindigkeitsmessung

Dietrich wollte die Geschwindigkeit von Autos messen. Er hat zwei Wegmarken im Abstand von ca. 50 m. Ein Taster wird so lange gedrückt, wie das Auto auf dieser Strecke ist. Das Programm berechnet dann die Geschwindigkeit.


Der im  Bild obere Taster steckt nur mit den beiden unteren Beinchen im Steckbrett und dient lediglich einem Reset des Pico. Der untere Taster an GPIO2 und 4 gegen GND dient zur Zeitmessung. Zur besseren Übersicht wurden alle GND-Pinne (3, 8, 13, 18) an Y gelegt.

#kmh.py
from machine import Pin
import time

led = Pin(25, Pin.OUT)
p2 = Pin(2, Pin.IN, Pin.PULL_UP)
p4 = Pin(4, Pin.IN, Pin.PULL_UP)
led.value(0)
while True:
    zeit=0
    strecke=44.70
    while p2.value()==0:
        time.sleep(0.1)
        zeit=zeit+0.1
    if zeit>0:
        geschwindigkeit=int(3.6*strecke/zeit)
        print (geschwindigkeit," km/h")



Das Programm wurde mit Thonny getestet. Eine genauere Mesung des Abstands zwischen zwei Kanaldeckeln auf der Strape ergab 44,70 m. Im Programm musste man den Dezimalpunkt verwenden: strecke=44.70.  Erste Mess-Versuchs-Reihe am offenen Fenster mit Blick auf die beiden Kanaldeckel in der Tempo-30-Zone vor unserer Tür mit folgendem Ergebnis:  46, 38, 31, 39, 43, 38. 34, 39, 36, 45, 37, 46, 38, 27, 36, 77 (!), 32, 49  km/h   -->   im Schnitt über diese vielleicht Viertelstunde:  40,61 km/h

Mit OLED-Display



Das Gerät wurde noch einmal verbessert und mit einem OLED-Display ausgestattet. Achtung, diese Displays haben unterschiedliche Pin-Belegungen. In diesem Fall konnten GND, SDA und SCL direkt angeschlossen werden. Nur ein Draht zu VCC war noch erforderlich. Im Display wird nun auch angezeigt, wie viele Autos zu schnell fahren. Und es wird die Durchschnittsgeschindigkeit vm berechnet.

#kmhDisplay2.py
from machine import Pin, I2C
import time
from ssd1306 import SSD1306_I2C

led = Pin(25, Pin.OUT)
rot = Pin(20, Pin.OUT)
gruen = Pin(28, Pin.OUT)
p2 = Pin(2, Pin.IN, Pin.PULL_UP)
p4 = Pin(4, Pin.IN, Pin.PULL_UP)
led.value(0)
i2c = I2C(0, scl=Pin(17),sda=Pin(16),freq=100000)
oled = SSD1306_I2C(128,64,i2c)

n30=0
n40=0
summe=0
mittel=0
anzahl=0
txt2=""
txt3=""
txt4=""
while True:
    zeit=0
    strecke=50
    while p2.value()==0:
        time.sleep(0.1)
        zeit=zeit+0.1
    if zeit>1:
        v=int(3.6*strecke/zeit)
        if v>35:
            n40=n40+1
            txt2= ">35: "+str(n40)
            rot.value(1)
            gruen.value(0)
        else:
            n30=n30+1
            txt3= "<=35: "+str(n30)
            rot.value(0)
            gruen.value(1)
        summe=summe+v
        anzahl=anzahl+1
        mittel=int(summe/anzahl*10)/10
        txt4=("vm: "+str(mittel))
        txt= str(v) + " km/h"
        print (v," km/h")
        oled.fill(0)
        oled.text(txt,5,0)
        oled.text(txt2,5,18)
        oled.text(txt3,5,30)
        oled.text(txt4,5,42)
        oled.show()



Inzwischen wird das Gerät überwiegend ohne den PC verwendet. Dazu reicht eine einfache Batterieversorgung mit 4,5 V.


Motorsteuerung


Heinz hat einen kleinen Gleichstrommotor aus einem CD-Laufwerk ausgebaut, der mit dem Pico immer wieder ein- und ausgeschaltet werden sollte. Als Grundlage diente das Beispiel-Blinkprogramm. Es hat sich gezeigt, dass der Vorwiderstand überbrückt werden musste, damit der Motor genügend Strom bekommt. Die parallel liegende LED blinkt weiterhin im gleichen Takt. Der Pico begrenzt den maximalen Strom auf ca. 20 mA und kann deshalb keinen Schaden nehmen. Der Motor läuft offensichtlich sehr sparsam.

#Port1.py
from machine import Pin
import time

led = Pin(25, Pin.OUT)
aus = Pin(2, Pin.OUT)

while True:
    led.value(1)
    aus.value(1)
    time.sleep(0.5)
    led.value(0)
    aus.value(0)
    time.sleep(0.5)

Das Programm wurde in main.py umbenannt und in den Pico geladen. Nun läuft es auch ohne Verbindung mit dem PC. Zur Stromversorgung dient eine externe Powerbank. Achtung, viele Powerbank-Modelle schalten sich nach kurzer Zeit ab, wenn der Strom zu gering ist.



Elektronik-Labor   Projekte   AVR