Forum: Mikrocontroller und Digitale Elektronik Programm für Rapsberry PI Pico mit RP2040


von Hans-Joachim M. (mausbaer)


Lesenswert?

Hallo
ich benötige ein Programm für einen Rapsberry PI Pico mit RP 2040. Das 
Programm sollte, wenn mit einem Taster ein Eingang angesteuert wird, 
einen Ausgang 1 mal betätigen. Beim zweiten Takt 2 mal, beim 3. 3 mal 
usw. bis zum 8. Takt 8 mal, dann wieder von vorne, d.h. beim 9. Takt 
wieder 1 mal. Da ich leider vom Programmieren so gut wie keine Ahnung 
habe, wäre ich für Hilfe sehr dankbar.

von Hans-Joachim M. (mausbaer)


Lesenswert?

Zum Programmieren benutze ich Thonny.

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Wie sollen die Zeiten von Impuls und Pause am Ausgang sein? Was soll 
passieren, wenn während der Pulsausgabe die Taste erneut gedrückt wird?

von Falk B. (falk)


Lesenswert?

Hans-Joachim M. schrieb:
> ich benötige ein Programm für einen Rapsberry PI Pico mit RP 2040. Das
> Programm sollte, wenn mit einem Taster ein Eingang angesteuert wird,
> einen Ausgang 1 mal betätigen. Beim zweiten Takt 2 mal, beim 3. 3 mal
> usw. bis zum 8. Takt 8 mal, dann wieder von vorne, d.h. beim 9. Takt
> wieder 1 mal.

Warum willst du dafür den RP2040 benutzen? Das geht zwar, ist aber 
maximal überdimensioniert. So wie wenn man mit einem 40t LKW zum 
Einkaufen fährt.

> Da ich leider vom Programmieren so gut wie keine Ahnung
> habe, wäre ich für Hilfe sehr dankbar.

Wie lang sollen die Einzelpulse sein? Wie lang die Pausen dazwischen?

von Andreas B. (bitverdreher)


Lesenswert?

Dazu reicht ein ATtiny 4

von Falk B. (falk)


Lesenswert?

An welchen Pins hängt dein Taster und wo sollen die Pulse rauskommen?

von Sebastian R. (sebastian_r569)


Lesenswert?

Ich bin zwar kein Freund von der stromfressenden Zufallsgeneratoren, 
aber das würde ChatGPT sicherlich binnen weniger Sekunden 
zusammenhalluzinieren können...

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Voila:
1
from machine import Pin
2
import time
3
4
# Pins definieren
5
input_pin = Pin(14, Pin.IN, Pin.PULL_DOWN)
6
output_pin = Pin(15, Pin.OUT)
7
8
# Konfiguration
9
pulse_count = 1
10
DEBOUNCE_MS = 50  # Zeit zum Entprellen in Millisekunden
11
12
def send_pulses(n):
13
    """Erzeugt n Pulse am Ausgang (100ms an, 100ms aus)."""
14
    for _ in range(n):
15
        output_pin.value(1)
16
        time.sleep_ms(100)
17
        output_pin.value(0)
18
        time.sleep_ms(100)
19
20
print("Programm läuft (Polling-Mode)...")
21
22
while True:
23
    # 1. Schritt: Prüfen, ob der Eingang auf HIGH geht
24
    if input_pin.value() == 1:
25
        # Software-Entprellung: Kurz warten und nochmal prüfen
26
        time.sleep_ms(DEBOUNCE_MS)
27
        
28
        if input_pin.value() == 1:
29
            # Gültiger Impuls erkannt!
30
            print(f"Impuls erkannt! Sende {pulse_count} Pulse...")
31
            send_pulses(pulse_count)
32
            
33
            # Zähler erhöhen und bei 9 zurücksetzen
34
            pulse_count += 1
35
            if pulse_count > 8:
36
                pulse_count = 1
37
            
38
            # Warten, bis der Eingang wieder LOW ist (Edge-Detection Ersatz)
39
            # Verhindert, dass ein langer Druck als mehrere Impulse zählt
40
            while input_pin.value() == 1:
41
                time.sleep_ms(10)
42
    
43
    # Kurze Pause für die CPU-Entlastung
44
    time.sleep_ms(10)

von Norbert (der_norbert)


Lesenswert?

Hans-Joachim M. schrieb:
> Hallo
> ich benötige ein Programm für einen Rapsberry PI Pico mit RP 2040. Das
> Programm sollte, wenn mit einem Taster ein Eingang angesteuert wird,
> einen Ausgang 1 mal betätigen. Beim zweiten Takt 2 mal, beim 3. 3 mal
> usw. bis zum 8. Takt 8 mal, dann wieder von vorne, d.h. beim 9. Takt
> wieder 1 mal. Da ich leider vom Programmieren so gut wie keine Ahnung
> habe, wäre ich für Hilfe sehr dankbar.

Versuch das hier mal:
1
#!/python
2
# vim: fileencoding=utf-8: ts=4: sw=4: expandtab:
3
4
from machine import Pin,Timer
5
from time import sleep_ms
6
7
class Button:
8
9
    def __timcb(self, tim):
10
        if self.b():
11
            self.count = min(0, self.count - 1)     # Entprellung
12
            if self.count == 0:                     #
13
                self.state = False
14
        else:
15
            self.count = max(self.count + 1, 5)     # Entprellung
16
            if self.count == 5:                     #
17
                if not self.state:                  # Eingabe erkannt
18
                    self.state = not self.state
19
                    self.events.append(1)           # In die Liste aufnehmen
20
21
    def __init__(self, gpio, ramp=10):
22
        self.b = Pin(gpio, Pin.IN, Pin.PULL_UP)
23
        sleep_ms(50)
24
        self.state = False
25
        self.count = 0
26
        self.events = []
27
        self.rampn = ramp
28
        self.tim = Timer(mode=Timer.PERIODIC, freq=1000, callback=self.__timcb)
29
30
    @property
31
    def event(self):
32
        if len(self.events):
33
            self.events.pop(0)
34
            return True
35
        return False
36
37
38
ramp = 5                            # Entprellung in Millisekunden
39
led = Pin(25, Pin.OUT)              # Ausgabe Pin
40
button = Button(24, ramp)           # Button gegen Ground/Masse
41
led.off()
42
outseq = 0
43
while True:
44
    sleep_ms(50)
45
    if button.event:                # Liste abfragen
46
        for _ in range(outseq+1):
47
            led.on()
48
            sleep_ms(200)           # Ein-Dauer
49
            led.off()
50
            sleep_ms(200)           # Aus-Dauer
51
        sleep_ms(500)               # Pause zwischen den Sequenzen
52
        outseq = (outseq + 1) % 8

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.