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 = 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
von Hans-Joachim M. (mausbaer)


Lesenswert?

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?

von Mario M. (thelonging)


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)

von Daniel D. (Firma: Robotic Engineer) (daniel_dsouza)


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
}

von Loco M. (loco)


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.

von Rene K. (xdraconix)


Lesenswert?

Das schlimme ist, das Leute dann diese Rotz hier reinhauen ohne selbst 
mal drüber geschaut zu haben.

von Falk B. (falk)


Lesenswert?

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
Noch kein Account? Hier anmelden.