Programm für Rapsberry PI Pico mit RP2040

#7999263
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.

#7999276
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?

#7999307
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)
#7999308
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 = max(0, self.count - 1)     # Entprellung
12
            if self.count == 0:                     #
13
                self.state = False
14
        else:
15
            self.count = min(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
    if button.event:                # Liste abfragen
45
        for _ in range(outseq+1):
46
            led.on()
47
            sleep_ms(200)           # Ein-Dauer
48
            led.off()
49
            sleep_ms(200)           # Aus-Dauer
50
        sleep_ms(500)               # Pause zwischen den Sequenzen
51
        outseq = (outseq + 1) % 8
52
    else:
53
        sleep_ms(50)
: Bearbeitet durch User
#8001806
Lesenswert?

Entweder einen DFPlayer mini anschließen oder wenn die Qualität nicht so wichtig ist, mit AudioMP3 im Hintergrund als PWM ausgeben lassen. Die PWM muss man dann noch mit einem Tiefpass glätten, damit es keine Interferenzen mit der Class-D-Endstufe gibt. Die KI spuckt folgendes Beispiel aus:

1
import utime
2
import _thread
3
from audiomp3 import MP3Player
4
from audiopwm import AudioPWM
5

6
# Initialize PWM audio output on a pin (e.g., GPIO 0)
7
audio = AudioPWM(0)
8

9
# Function to play MP3 file
10
def play_mp3(file_path):
11
    player = MP3Player(audio, file_path)
12
    player.play()
13
    # Keep playing until the file ends
14
    while player.is_playing():
15
        utime.sleep(0.1)
16

17
# Run in a background thread
18
def background_play():
19
    play_mp3('yourfile.mp3')  # replace with your MP3 filename
20

21
# Start playback in a background thread
22
_thread.start_new_thread(background_play, ())
23

24
# Main program continues here
25
while True:
26
    print("Playing in background...")
27
    utime.sleep(5)
(Firma: Robotic Engineer) #8004520
Lesenswert?

This can be done with a simple counter that increases on every button press and resets after 8. Each time the button is pressed, the output is toggled as many times as the current counter value.

Here is a very basic MicroPython example for the Raspberry Pi Pico that should be easy to understand:

1
#define BUTTON_PIN 14
2
#define OUTPUT_PIN 15
3

4
int count = 0;
5
int lastButtonState = LOW;
6

7
void setup() {
8
pinMode(BUTTON_PIN, INPUT_PULLDOWN);
9
pinMode(OUTPUT_PIN, OUTPUT);
10
}
11

12
void loop() {
13
int buttonState = digitalRead(BUTTON_PIN);
14

15
// Detect rising edge (button press)
16
if (buttonState == HIGH && lastButtonState == LOW) {
17
count++;
18

19
if (count > 8) {
20
  count = 1;
21
}
22

23
// Activate output "count" times
24
for (int i = 0; i < count; i++) {
25
  digitalWrite(OUTPUT_PIN, HIGH);
26
  delay(200);
27
  digitalWrite(OUTPUT_PIN, LOW);
28
  delay(200);
29
}
30

31

32
}
33

34
lastButtonState = buttonState;
35
delay(50); // simple debounce
36
}
#8004532
Lesenswert?

Daniel D. schrieb:

Here is a very basic MicroPython example for the Raspberry Pi Pico that should be easy to understand:

[c] #define BUTTON_PIN 14 #define OUTPUT_PIN 15

int count = 0; int lastButtonState = LOW;

void setup() { pinMode(BUTTON_PIN, INPUT_PULLDOWN); pinMode(OUTPUT_PIN, OUTPUT); }

Oh oh, das ist also ein MicroPython Programm für den Pico? Du solltest deine KI neu kalibrieren, wenn es schon für NI nicht reicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren