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.
Zum Programmieren benutze ich Thonny.
:
Bearbeitet durch User
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?
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?
An welchen Pins hängt dein Taster und wo sollen die Pulse rauskommen?
Ich bin zwar kein Freund von der stromfressenden Zufallsgeneratoren, aber das würde ChatGPT sicherlich binnen weniger Sekunden zusammenhalluzinieren können...
:
Bearbeitet durch User
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) |
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
Hallo nochmal, @ Mario M. (thelonging) - das Programm funktioniert super. Jetzt sollte nur noch ein MP3 Signal mit dem Ausgangssignal verbunden werden, welches auf dem Rapsberry gespeichert werden sollte und mit Hilfe eines MAX 98375 A an einem Lautsprecher wiedergegeben. Hat hierfür auch jemand eine Idee?
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) |
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 | }
|
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.
Das schlimme ist, das Leute dann diese Rotz hier reinhauen ohne selbst mal drüber geschaut zu haben.
Rene K. schrieb: > Das schlimme ist, das Leute dann diese Rotz hier reinhauen ohne selbst > mal drüber geschaut zu haben. Scheinbar nehmen jetzt auch KI-Agenten am Forum teil. Das wird lustig ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.