Ich war mir nie des mir bekannten Fernbedienungsmechanismus für Fernseher und Klimaanlagen bewusst, aber ich lernte den Mechanismus für die Verwendung der Infrarot-Fernbedienung in der elektronischen Arbeit. Ich habe auch versucht zu überprüfen, wie die Kommunikation tatsächlich mit Raspeye erfolgt.
** Was ich benutzt habe **
Erstens gibt es ungefähr drei Kommunikationsformate für die Infrarotfernbedienung.
Da die diesmal verwendete Fernbedienung im NEC-Format war, werden wir uns darauf konzentrieren.
Im NEC-Format ist T = 562 [μs] eine Zeiteinheit. Die Daten '0' und '1' werden auf diese Weise dargestellt.
Und die gesamte Kommunikation ist grob in vier Codes unterteilt.
Lassen Sie uns nun tatsächlich einen Raspeltorte verwenden und prüfen, ob dies der Fall ist.
Wir werden die Infrarot-Fernbedienung mit der Bezeichnung Car mp3 analysieren, die häufig in elektronischen Arbeitsstarter-Kits enthalten ist. <img width="150" alt="carMp3.jpg ", src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551611/1c27be81-e637-922e-e676-f516271f3ba6.jpeg "> Zuerst machen wir eine Schaltung.
Das diesmal verwendete Infrarot-Empfängermodul ist VS1838B. Die Pins von VS1838B befinden sich links OUT, GND in der Mitte und VCC rechts. Da die minimale VCC 2,7 V und die maximale 5,5 V beträgt, schließen Sie sie an 3,3 V an, ohne einen Widerstand einzufügen. Verbinden Sie diesmal OUT mit PIN 21.
Dies ist der Quellcode, der die Zeit (μs) ausgibt, wenn das Signal EIN / AUS ist.
irAnalysis.py
import RPi.GPIO as GPIO
import time
IR_PIN = 21
def timeMeasure():
maxTime = 1 #sec
prevState = GPIO.input(IR_PIN)
startTime = time.perf_counter()
while time.perf_counter() - startTime < maxTime:
nowState = GPIO.input(IR_PIN)
if nowState != prevState:
endTime = time.perf_counter()
elapsedTime = (endTime - startTime) * 1000000 #microsec
return round(elapsedTime)
return None
def analysis():
GPIO.setmode(GPIO.BCM)
GPIO.setup(IR_PIN, GPIO.IN)
GPIO.wait_for_edge(IR_PIN, GPIO.BOTH)
try:
while True:
elapsedTime = timeMeasure()
if elapsedTime is None:
break
else:
print(elapsedTime)
except KeyboardInterrupt:
GPIO.cleanup(IR_PIN)
GPIO.cleanup(IR_PIN)
if __name__ == '__main__':
analysis()
Ich habe das vorherige Programm ausgeführt und auf der Infrarot-Fernbedienung die Nummer 0 gedrückt. Da die Fernbedienung im NEC-Format war, überprüfen Sie die Ausgabe, während Sie sie mit dem Format vergleichen.
Zunächst können Sie im NEC-Format zuerst den Lesercode erhalten.
Weil T 562 μs beträgt 16T ist 16*562=8992(μs)
8T 8*562=4496(μs) Es wird.
Die ersten beiden Ausgabezeilen sehen folgendermaßen aus.
python
9338
4294
Die Werte liegen nahe beieinander.
Als nächstes kommt der benutzerdefinierte Code.
'0': 1T EIN, 3T AUS Wenn EIN 562 μs und AUS 562 μs ist
'1': 1T EIN, 1T AUS Wenn EIN 562 μs und AUS 1686 μs ist
Diesmal lautet der benutzerdefinierte Code also 0000 0000 1111 1111.
Ab der dritten Zeile bis zur Mitte der Ausgabe
python
484 #'0'
461
543 #'0'
478
546 #'0'
478
543 #'0'
480
545 #'0'
486
548 #'0'
471
538 #'0'
479
546 #'0'
478
544 #'1'
1604
546 #'1'
1596
544 #'1'
1600
544 #'1'
1600
536 #'1'
1602
544 #'1'
1601
485 #'1'
1578
496 #'1'
1596
Als nächstes kommt der Datencode.
Der Datencode lautet 0110 1000, gefolgt von der invertierten 1001 01111.
python
520 #'0'
466
529 #'1'
1587
328 #'1'
1543
335 #'0'
426
449 #'1'
1589
527 #'0'
468
512 #'0'
442
463 #'0'
460
------Von hier aus umkehren--------
521 #'1'
1573
506 #'0'
467
539 #'0'
484
532 #'1'
1586
460 #'0'
438
527 #'1'
1603
479 #'1'
1575
464 #'1'
1588
Es scheint, dass 1T, 71T, 16T, 4T zuerst wiederholt werden und dann 1T, 172T, 16T, 4T wiederholt werden. Dies unterscheidet sich ein wenig vom Format, kann jedoch für jedes Produkt unterschiedlich sein.
python
472
40106
9203
2024
---------------
234
96804
9194
2128
----Wiederholung----
466
96856
9161
2097
----Wiederholung----
451
96858
9212
2168
Es wurde festgestellt, dass die Kommunikation gemäß dem NEC-Format durchgeführt wurde, obwohl die numerischen Werte mit Ausnahme des Wiederholungscodes geringfügig unterschiedlich waren.
Recommended Posts