Ich denke, die meisten von euch kennen diese billigen RGB-Strip-Controller mit IR-Fernbedienung. Ich versuche, es über fest verdrahtetes gpio von raspberry3 zu steuern, indem ich einfach den IR-Empfänger austausche.
aus
|ir remote|.......>...|IR-LED GP3 µc|
Zu
|rpi GPIO out|----->----|in GP3 µc|
Ich habe diese Informationen zu der Box gefunden:
12 V In
SMD5050 RGB Strip 4Wire
SOT23 NFET, max 3A
IR Sensor CHQB, 3Wire
8bit 8pin µc with 5V TTL Logic
at least 3x PWM
maybe PIC12F617
Pinbelegung auf diesem µc:
GND - XX - 5V
GP5 - XX - GP0 - B Out
GP4 - XX - GP1 - R Out
IR IN - GP3 - XX - GP2 - G Out
http://ww1.microchip.com/downloads/en/DeviceDoc/41388A.pdf
Ist es möglich?!
1. Steuerung über kabelgebundenen GP3 (IR)-Port?
2. direkt an den NFET anschließen (Q1-Q3 auf dem Bild)?
Beides ist möglich.
IR, zuerst benötigen Sie ein IR-Empfänger-Setup. Nehmen Sie das von der Fernbedienung eingehende Signal auf. Dann richten Sie eine einfache IR-LED-Schaltung ein, die von einem Transistor / FET gesteuert wird, der von GPIO gesteuert wird. Senden Sie die gewünschten Befehle. Es ist nicht pseudoseriell, die Codes sind eher NEC (vielleicht RC5, aber NEC ist einfacher und häufiger). Eine beliebige Anzahl von IR-RPi-Fernbedienungsprojekten bei Google hilft dabei.
Den festen Draht entfernen Sie den vorhandenen IC. Verwenden Sie einen Pegelumsetzer, da 3,3 V wahrscheinlich nicht ausreichen werden, um den VGS-Schwellenwert für einen angemessen niedrigen Widerstand von Drain-Source, RDS (on), zu überschreiten. Diese Verschiebung kann ein einfacher npn-Transistor sein, aber Sie müssen Ihre Logik im RPI-Code umkehren.
Ja, Sie könnten den IR-Empfänger umgehen. Es ist, wie Sie erwarten, ein Demodulator, der die 38-kHz-Trägerwelle (oder so) entfernt und die Daten weiterleitet. Ich glaube, es sollte ein aktives hohes Signal durch einen Pull-up sein. Dadurch können Sie die Abschnitte LED-Sender und IR-Empfänger überspringen. Da die Leitung einen 5-V-Pullup haben sollte, benötigen Sie lediglich einen einfachen NPN-Transistor, um den Pegel von 3,3 V auf 5 V zu verschieben. Auch hier wird die Logik invertiert, sodass eine logische 1 am RPI ein logisches Low am MCU-Eingang wäre. Sie müssen sicherstellen, dass nur die Daten unmoduliert gesendet werden.
sudo modprobe lirc_rpi softcarrier=0
Die Softcarrier- Option ist deaktiviert, um die Trägerwelle zu eliminieren, nur verfügbar auf lirc_rpi afaik, also hast du Glück gehabt.
Dies hängt von den Besonderheiten des verwendeten IR-Empfängers ab. Ein Bild von der Rückseite des Boards würde helfen. Sie sollten die Daten des IR-Empfängers trennen, um Interferenzen zu vermeiden.
(1) Ersetzen von IR-Durchgangsdraht
Ich hatte kein Glück, es zum Laufen zu bringen. Während Raspberry/Lirc die IR-Signale von der Fernbedienung erkannt hat, passiert nichts, wenn ich diese Daten per Kabel an den GP3 des µc sende. Gute Nachrichten, dieser IR-Empfänger funktioniert auch mit Raspberry/Lirc.
Bitte lesen Sie die Antwort von @Passerby.
lircd.conf-Beispiel
# brand: /home/pi/lircd.conf
#
# -- it seems, this controller was built with many
# -- different commands. i ve got 5 at home and only two
# -- remotes/controllers are working with these commands
#
# usage irsend SEND_ONCE LED LED_ON
begin remote
name /home/pi/lircd.conf
name LED
bits 16
flags SPACE_ENC|CONST_LENGTH
eps 30
aeps 100
header 9029 4479
one 594 1651
zero 594 530
ptrail 592
repeat 9029 2239
pre_data_bits 16
pre_data 0xF7
gap 107958
toggle_bit_mask 0x0
begin codes
LED_ON 0xC03F
LED_OFF 0x40BF
LED_BRIGHT 0x00FF
LED_DARK 0x807F
LED_R 0x20DF
LED_G 0xA05F
LED_B 0x609F
LED_W 0xE01F
LED_FLASH 0xD02F
LED_STROBE 0xF00F
LED_FADE 0xC837
LED_SMOOTH 0xE817
LED_RB 0x48B7
LED_RG 0x28D7
LED_BG 0xA857
end codes
end remote
(2) Verbindung zum SOT23 N-FET
Python-Beispiel:
import time
import RPi.GPIO as GPIO
pinR = 27
pinG = 17
pinB = 22
pwmFreq = 200
GPIO.setmode(GPIO.BCM)
GPIO.setup(pinR, GPIO.OUT)
GPIO.setup(pinG, GPIO.OUT)
GPIO.setup(pinB, GPIO.OUT)
pr = GPIO.PWM(pinR, pwmFreq) # GPIO 27 frequency=200Hz
pg = GPIO.PWM(pinG, pwmFreq)
pb = GPIO.PWM(pinB, pwmFreq)
pr.start(0)
pb.start(0)
pg.start(0)
try:
while 1:
for dc in range(0, 101, 1):
pr.ChangeDutyCycle(dc)
pb.ChangeDutyCycle(dc)
pg.ChangeDutyCycle(dc)
time.sleep(0.02)
for dc in range(100, -1, -1):
pr.ChangeDutyCycle(dc)
pb.ChangeDutyCycle(dc)
pg.ChangeDutyCycle(dc)
time.sleep(0.02)
except KeyboardInterrupt:
pass
pr.stop()
pb.stop()
pg.stop()
GPIO.cleanup()
chmi
Passant
chmi
Passant
Passant