Creo que la mayoría de ustedes conocen estos controladores de tira rgb baratos con control remoto IR. Intento controlarlo a través de gpio cableado desde raspberry3, simplemente reemplazando el receptor de infrarrojos.
de
|ir remote|.......>...|IR-LED GP3 µc|
a
|rpi GPIO out|----->----|in GP3 µc|
Encontré esta información sobre la caja:
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
Asignación de pines en este µ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
¡¿Es posible?!
1. ¿controlar a través del puerto GP3 (IR) con cable?
2. ¿Conectándose directamente al NFET (Q1-Q3 en la imagen)?
Ambos son posibles.
IR, primero necesita una configuración de receptor IR. Grabe la señal entrante desde el control remoto. Luego configure un circuito LED IR simple controlado por un transistor/FET controlado por GPIO. Envía los comandos que quieras. No es pseudo serial, los códigos suelen ser NEC (Quizás RC5, pero NEC es más simple y más común). Cualquier cantidad de proyectos de control remoto IR RPi en Google ayudará.
El cable duro, retire el IC existente. Utilice un cambiador de nivel, ya que es probable que 3,3 V no sean suficientes para superar el umbral de VGS para obtener una resistencia de drenaje-fuente baja adecuada, RDS (encendido). Este cambio puede ser un simple transistor npn, pero requiere que invierta su lógica en el código RPI.
Sí, puede pasar por alto el receptor IR. Es como esperaba, un demodulador que elimina la onda portadora de 38 khz (más o menos) y pasa los datos. Creo que debería ser una señal alta activa a través de un pull-up. Esto le permite omitir las secciones del transmisor LED y el receptor IR. Dado que la línea debe tener un aumento de 5 V, todo lo que necesita es un transistor NPN simple para cambiar el nivel de 3,3 V a 5 V. Una vez más, la lógica se invierte, por lo que un 1 lógico en el RPI sería un lógico bajo en la entrada de la MCU. Debe asegurarse de que solo se envíen los datos, sin modular .
sudo modprobe lirc_rpi softcarrier=0
La opción Softcarrier deshabilitada para eliminar la onda portadora, solo está disponible en lirc_rpi afaik, así que tuviste suerte.
Esto depende de las especificaciones del receptor IR utilizado. Una foto del reverso del tablero ayudaría. Le conviene desconectar los datos de los receptores de infrarrojos para evitar interferencias.
(1) reemplazo de IR a través del cable
No tuve suerte para que funcionara. Si bien raspberry/lirc reconoció las señales de infrarrojos del control remoto, no sucede nada cuando envío estos datos por cable a la GP3 de la µc. Buenas noticias, este receptor IR también funciona con Raspberry/Lirc.
Lea la respuesta de @Passerby.
ejemplo lircd.conf
# 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) Conexión al SOT23 N-FET
ejemplo de pitón:
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()
chmee
Transeúnte
chmee
Transeúnte
Transeúnte