Mục lục:

Hộp đồ ngốc cổ điển: 10 bước
Hộp đồ ngốc cổ điển: 10 bước

Video: Hộp đồ ngốc cổ điển: 10 bước

Video: Hộp đồ ngốc cổ điển: 10 bước
Video: Quảng cáo đáng sợ...| KTSnew 2024, Tháng mười một
Anonim
Hộp đồ ngốc cổ điển
Hộp đồ ngốc cổ điển

Tôi tìm thấy một chiếc tivi di động Magnavox cũ từ năm 1984 đang nằm trên kệ tại cửa hàng tiết kiệm địa phương của tôi. Tôi tự nghĩ, "oh NEAT!" Sau khi kiểm tra kỹ hơn, tôi nhận thấy thẻ giá 15 đô la trên đó, vì vậy tôi quyết định mang nó về nhà và làm một cái gì đó có gai từ nó. Tôi nhớ mình đã xem đi phát lại khi còn nhỏ của tất cả các tác phẩm kinh điển tuyệt vời với màu đen trắng rực rỡ và muốn biến điều này thành hiện thực một lần nữa.

Vấn đề là không còn các trạm analog ngoài đó nữa, và điều này hoàn toàn không có khả năng thực hiện bất kỳ giải mã ATSC nào hoặc bất kỳ giải mã kỹ thuật số nào. Tôi đã nhận thấy sự hiện diện của kết nối AV ở bên cạnh và có một số pi mâm xôi nằm xung quanh, vì vậy tôi quyết định bắt tay vào một cuộc phiêu lưu để tìm ra cách tôi có thể truyền trực tuyến các kênh đến đây. Tôi cũng muốn làm cho nó trông sắc nét. Tôi sẽ không chạy nó trên 9 pin D-cell, vì vậy tôi có thể ẩn rpi trong ngăn chứa pin cùng với một loạt các tính năng bổ sung khác.

Bước 1: Nhận danh sách IPTV tốt

Nhận danh sách IPTV tốt
Nhận danh sách IPTV tốt

Danh sách IPTV hàng ngày có tuyển chọn tuyệt vời các đài iptv miễn phí được tổ chức theo quốc gia. Chọn quốc gia bạn chọn và tải xuống tệp m3u.

Đối với phần mềm có trong này, m3u là một định dạng cần thiết. Bạn có thể đọc thêm về các chi tiết cụ thể của định dạng tại đây.

Bước 2: Thử nghiệm mã sơ bộ

Mã python mà chúng ta sẽ viết phân tích cú pháp tệp m3u thành một danh sách các trạm.

#! / usr / bin / python3

nhập quy trình con từ sys import argv class Trạm: def _init _ (self): self.channel = 0 self.name = '' self.address = '' channel_list = với open ('./ us-m3uplaylist-2020-08- 17-1.m3u ',' r ') as m3u: i = 0 for line in m3u: if line.startswith (' # EXTINF '): this = Station () this.name = line.split (', ') [1] line = next (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1 process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. address])

Hãy phá vỡ điều này.

#! / usr / bin / python3

Điều này cho bash biết rằng chúng tôi sẽ sử dụng python3 để diễn giải tệp này.

nhập quy trình con từ sys import argv

Chúng tôi sẽ cần mô-đun quy trình con để khởi chạy phiên bản vlc của chúng tôi và chúng tôi sẽ cần argv để chọn kênh nào chúng tôi sẽ khởi chạy vlc vào.

class Trạm: def _init _ (self): self.channel = 0 self.name = '' self.address = ''

Điều này xác định một lớp được gọi là Trạm. Mỗi kênh sẽ có số kênh, tên của kênh được lấy từ tệp m3u và địa chỉ của kênh đó đang phát trực tuyến từ đâu.

channel_list =

Đây là danh sách sẽ lưu trữ tất cả các kênh được phân tích cú pháp từ tệp m3u.

với open ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') là m3u: i = 0 cho dòng trong m3u: if line.startswith ('# EXTINF'): this = Trạm () this.name = line.split (',') [1] line = next (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1

Vòng lặp này mở danh sách phát m3u và nhập dữ liệu. các dòng tệp m3u mà chúng tôi quan tâm bắt đầu bằng #EXTINF, Điều này cho biết mục nhập mới vào tệp danh sách phát. Giá trị quan tâm tiếp theo là tên, nằm trên cùng dòng với #EXTINF, nhưng có dấu phẩy giữa chúng. Dòng sau của m3u cụ thể này là địa chỉ của dòng. Có một trình lặp "i" được sử dụng để đếm xem đó là kênh nào. Vòng lặp này lặp lại toàn bộ tệp m3u và điền vào channel_list với các đài.

process = subprocess. Popen (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. address])

thư viện quy trình con cho phép python gọi các quy trình (chương trình) và trả về PID (ID quy trình). Điều này cho phép python có thể quản lý việc khởi chạy và đóng chương trình một cách "chính xác" mà không cần điền vào tệp lịch sử hoặc cho phép chạy mã tùy ý hơn với các lệnh gọi "hệ thống" chung. Mỗi phần tử của mảng được sử dụng làm đối số cho Popen như được nhập trong dòng lệnh.

vlc --loop --intf dummy - địa chỉ toàn màn hình

Lệnh trên là những gì mong muốn được chạy, với tùy chọn --loop khắc phục một số vấn đề với việc tạm dừng luồng trong khi tải phần tiếp theo (các vấn đề về m3u8 kỳ lạ), --intf dummy khởi động vlc mà không có giao diện, chỉ có màn hình, --fullscreen khởi chạy video ở chế độ toàn màn hình (KHÔNG CÓ CÁCH!) và địa chỉ là địa chỉ của luồng. Như bạn có thể thấy trong mã, chúng tôi đang cung cấp địa chỉ từ số kênh của danh sách, được cung cấp trong thời gian chạy thông qua câu lệnh argv. Lưu tệp này dưới dạng tv_channels.py, thay đổi vị trí danh sách phát trong tệp python để trỏ đến danh sách phát của bạn và bạn có thể chạy mã như sau:

python tv_channels.py

Bước 3: Thêm GPIO

Thêm GPIO
Thêm GPIO
Thêm GPIO
Thêm GPIO

Sơ đồ cho thấy hai chân GPIO được sử dụng cho các nút và mỗi chân có một điện trở kéo lên để giữ cho chân GPIO được kéo cao sau khi nhấn nút. Mã được xác định trước đó có thể được tinh chỉnh để làm cho hoạt động liền mạch hơn một chút bằng cách thêm khả năng GPIO. Điều này cho phép chúng tôi thay đổi kênh bằng các nút, thay vì bàn phím và các câu lệnh argv, giống như truyền hình thực tế.

Điều đầu tiên cần lưu ý là tôi đã định nghĩa tivi là một lớp học. Để trở thành một chiếc tivi, chúng ta cần phải ở trên một kênh hiện tại, có một danh sách các kênh có thể và có khả năng thay đổi các kênh. Trong ví dụ này, phương pháp thay đổi kênh duy nhất sẽ là di chuyển danh sách kênh lên và chuyển danh sách kênh xuống. Khi kênh được quyết định, chúng tôi sẽ phải bắt đầu VLC trên kênh mà chúng tôi muốn xem.

#! / usr / bin / python3

từ lúc nhập quy trình con nhập ngủ từ sys import argv từ gpiozero import Nút lớp Trạm: def _init _ (self): self.channel = 0 self.name = '' self.address = '' self.process = '' class Tivi: def _init _ (self, filename): self.current_channel = 0 self.channel_list = self.build_channel_list (filename) self.start_channel () def build_channel_list (self, filename): with open (filename, 'r') as m3u: i = 0 cho dòng trong m3u: if line.startswith ('# EXTINF'): this = Station () this.name = line.split (',') [1] line = next (m3u) this.address = line. strip () this.channel = i self.channel_list.append (this) i = i + 1 def channel_up (self): self.current_channel = self.current_channel + 1 if self.current_channel> len (self.channel_list): self. current_channel = len (self.channel_list) self.start_channel () def channel_down (self): self.current_channel = self.current_channel - 1 nếu self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): try: self.process. kill () ngoại trừ: pass print ('kênh bắt đầu% d'% self.current_channel) self.process = subprocess. Popen (['vlc', '-q', '--loop', '--intf', ' dummy ',' --fullscreen ', self.channel_list [self.current_channel].address]) this = Tivi ('./ us-m3uplaylist-2020-08-17-1.m3u ') channel_UP = Nút (18) channel_DN = Nút (23) trong khi True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Việc lặp lại mã này có khá nhiều cải tiến. bây giờ nó đã sử dụng một mô-đun có tên là gpiozero được yêu cầu bởi raspberry pi để dễ dàng truy cập chức năng của các chân GPIO

sudo apt-get install python3-gpiozero

hoặc

sudo pip cài đặt gpiozero

Như đã thấy trong mã của tôi, tôi đã chọn GPIO 18 và GPIO 23 cho kênh TĂNG và kênh XUỐNG. Thư viện gpiozero có một lớp đẹp dành cho các chức năng của các nút cho when_pressed, is_pressed, when_held, v.v. Điều này làm cho nó khá dễ dàng. Tôi đã chọn khi_pressed, đề cập đến một hàm gọi lại để chạy khi tín hiệu này được phát hiện.

Thay đổi lớn cuối cùng là đưa tùy chọn '-q' vào lệnh gọi quy trình con VLC. Điều này chỉ đơn giản là chạy vlc mà không cần tất cả đầu ra đến thiết bị đầu cuối để giữ cho nó không bị lộn xộn để chúng ta có thể xem các câu lệnh in thông tin trong mã.

Bước 4: Tích hợp phần cứng để trông sắc nét

Tích hợp phần cứng để trông sắc nét
Tích hợp phần cứng để trông sắc nét
Tích hợp phần cứng để trông sắc nét
Tích hợp phần cứng để trông sắc nét
Tích hợp phần cứng để trông sắc nét
Tích hợp phần cứng để trông sắc nét

Tôi chưa tìm ra cách tôi muốn thực hiện điều này và nó sẽ là một giải pháp duy nhất cho từng mẫu TV đang được sử dụng. Tôi cần phải suy nghĩ kỹ về điều này và thăm dò xung quanh TV để tìm nguồn điện tốt cho pi khi tôi nhét máy tính vào bên trong ngăn chứa pin lớn. Tôi cũng đã cân nhắc việc sử dụng các nút đồng hồ để chọn kênh, vì chúng đã được đặt rất đẹp trên TV và đồng hồ vẫn không hoạt động. Tôi sẽ đăng nhiều hơn khi tôi tìm thấy một giải pháp tốt, nhưng đây là nơi mà dự án của tôi sẽ khác biệt rất nhiều so với những người khác. Tận hưởng tích hợp IPTV giống như TV thực!

Bước 5: Pi Power

Pi Power
Pi Power

Đối với mẫu TV mà tôi tìm thấy, nó yêu cầu nguồn điện 12V. Tôi đã thăm dò xung quanh bảng, nhưng không thấy bất kỳ bộ điều chỉnh nguồn rõ ràng nào cho 5V, vì vậy nơi rõ ràng nhất để có được nguồn điện ổn định là trên bảng mạch nơi đầu nối thùng cho 12V đi vào. Có một vấn đề rõ ràng với điều này. chúng tôi không muốn xào số pi, vì vậy chúng tôi sẽ cần một bộ điều chỉnh công suất. Tôi đã chọn MP2315 Step-Down Power Converter. Nó rẻ và dễ sử dụng. Chúng tôi sẽ hàn đầu vào 12VDC từ đầu nối thùng trên PCB với chân IN + và GND của bộ chuyển đổi, và VO + với chân 2 trên Raspberry Pi, cũng như GND.

TRƯỚC KHI hoàn thành việc này, hãy đảm bảo cấp nguồn cho bộ chuyển đổi và đảm bảo rằng nguồn 5V thích hợp đang đi ra khỏi đầu ra. Tôi đã chọn tùy chọn đơn giản nhất với điện áp có thể điều chỉnh được bằng dây cứng. Tông đơ sẽ điều chỉnh điện áp, vì vậy tôi đã xem đầu ra điện áp bằng đồng hồ vạn năng khi tôi điều chỉnh tông đơ bằng tuốc nơ vít.

Bước 6: Tích hợp sức mạnh

Tích hợp sức mạnh
Tích hợp sức mạnh
Tích hợp sức mạnh
Tích hợp sức mạnh
Tích hợp sức mạnh
Tích hợp sức mạnh

Sau khi tìm hiểu xung quanh TV, người ta quyết định rằng nơi tốt nhất để lấy điện là từ cực âm của đầu nối thùng và công tắc BẬT / TẮT TV, có nghĩa là chúng ta có thể bật và tắt các luồng với TV, thay vì vậy liên tục cấp nguồn cho pi bằng cách kéo trực tiếp từ đầu nối thùng.

Các dây được hàn vào và đưa dọc theo mặt bên của PCB bên cạnh vỏ cho đến khi chúng chạm đến mặt sau của thiết bị, nơi chúng được đưa qua một lỗ ở phía sau ngăn chứa pin. Khi chúng đã được đưa qua, chúng tôi có thể chuẩn bị các đầu của cáp và hàn chúng xuống bộ điều chỉnh điện. Tôi đã điều chỉnh nó cho 5V để cấp nguồn cho các chân tiêu đề pi và hàn vào nó để chúng tôi có thể chạy các jumper cái đến cái từ bộ điều chỉnh nguồn trực tiếp đến bộ tiêu đề GPIO của pi. Điều này thường không được khuyến nghị, vì số pi thường được cấp nguồn thông qua UBS, có bộ điều chỉnh nội tuyến để điều chỉnh 5V, nhưng vì nguồn điện đã được điều chỉnh nên nó sẽ ổn.

Có một số tiếng ồn trên các đường dây âm thanh khi thực hiện việc này, bởi vì có một vòng lặp nối đất trong hệ thống. Tôi đã thử nhiều điểm nguồn và điểm nối đất trên bảng với hy vọng có một câu trả lời dễ dàng, nhưng không tìm thấy bất kỳ câu trả lời nào. Tôi cũng đã hàn cáp microUSB vào bộ điều chỉnh chế độ đã chuyển đổi để xem liệu việc buộc nguồn qua bộ điều chỉnh bên trong của pi có giải quyết được vấn đề hay không. Nó đã không. Giải pháp sẽ là trong một số máy biến áp cách ly nối đất âm thanh. Chúng được đặt hàng thay vì được chế tạo, bởi vì chúng rẻ và được đóng gói độc đáo. Bạn có thể chọn chúng từ hầu hết các cửa hàng hoặc phòng ban âm thanh tự động. Đây là những gì tôi đã chọn.

Bước 7: Giải pháp nút dài hạn

Giải pháp nút dài hạn
Giải pháp nút dài hạn
Giải pháp nút dài hạn
Giải pháp nút dài hạn

Không nghi ngờ gì nữa, các nút sẽ không nằm trên breadboard, vì vậy cần phải có một giải pháp lâu dài hơn. Tôi lấy một số protoboard cũ và ném mạch cùng với một số chân tiêu đề để dễ dàng truy cập tín hiệu. Đây là nơi mà mọi người sẽ có quan điểm khác nhau về cách gắn hoặc gắn các nút. Tôi đang chọn cách gắn chúng lên và chỉ cần gắn chúng vào khung sao cho tay cầm xoay qua màn hình để mang theo không gây trở ngại. Hãy thoải mái xây dựng thiết kế bằng cách thêm một vỏ máy in 3d giúp lắp ráp trơn tru, sử dụng đai ốc và bu lông, chất kết dính ưa thích, tích hợp các nút nguyên bản, bất cứ điều gì. Miễn là nó hoạt động, không có bất kỳ câu trả lời sai nào.

Chúng sẽ được gắn bên ngoài vỏ và Raspberry Pi sẽ được giấu bên trong ngăn chứa pin rất rộng, vì vậy sẽ cần phải có một lỗ nhỏ được khoan để cho phép cáp đi ra ngăn chứa pin.

Bước 8: Kiểm tra độ vừa vặn lần cuối

Kiểm tra độ vừa vặn cuối cùng
Kiểm tra độ vừa vặn cuối cùng

Tất cả các thiết bị cần được kiểm tra vừa vặn lần cuối để xem chính xác vị trí của tất cả các lỗ cần được tạo ra trên khung xe và các lỗ kích thước nào, v.v. cần được thực hiện. Ngoài ra, cần xem xét vị trí đặt các thành phần để dễ dàng kết nối và truy cập. Tóm lại, hãy đảm bảo mọi thứ phù hợp với nơi bạn nghĩ trước khi bạn làm hỏng dự án của mình một cách không thể sửa chữa và phải giải quyết vấn đề.

Bước 9: Tích hợp cuối cùng

Tích hợp cuối cùng
Tích hợp cuối cùng
Tích hợp cuối cùng
Tích hợp cuối cùng
Tích hợp cuối cùng
Tích hợp cuối cùng

Giờ đây, tất cả phần cứng đều ở nơi cần thiết và tất cả đều vừa khít như một con bọ trong tấm thảm. Hãy cắt mọi thứ! Tôi đã xác định được một vị trí trên ngăn chứa pin nơi tôi có thể luồn dây cáp AV ra ngoài bằng cách sử dụng một vết lõm nhỏ trong nhựa. Tôi hạ nó xuống bằng máy mài để bàn. Nó thực hiện công việc khá ngắn. Tôi đã sử dụng máy mài dremel để mài bớt nhựa để làm cho nó trở nên khá vừa vặn với dây cáp.

Thành phần cuối cùng là bộ chọn kênh. Tôi đã khoan một lỗ nhỏ trên ngăn chứa pin và luồn dây cáp tiêu đề ra khỏi nó lần lượt. Các nút đã được kết nối với nhau và tôi gắn protoboard vào khung nhựa bằng hai nửa khóa dán được dán sẵn. Tôi hiểu rằng có khoảng 1200 cách tốt hơn để làm điều này, nhưng cách này đã hiệu quả và tôi đã có mọi thứ mình cần trong tay.

Bước 10: Tận hưởng IPTV cổ điển của bạn

Thưởng thức IPTV cổ điển của bạn
Thưởng thức IPTV cổ điển của bạn
Thưởng thức IPTV cổ điển của bạn
Thưởng thức IPTV cổ điển của bạn
Thưởng thức IPTV cổ điển của bạn
Thưởng thức IPTV cổ điển của bạn

Đó là về tiền nó lên. Tìm các chương trình và xem vui vẻ. Tuy nhiên, đừng ngồi quá gần. Bạn sẽ thối não của bạn!

Có rất nhiều chỗ để cải thiện dự án này, vì vậy hãy thực hiện nó theo bất kỳ hướng nào bạn muốn, nhưng thật vui khi đi được xa đến mức này. Đối với tôi, tôi chạy điều này từ cronjob khi khởi động lại, vì vậy stdout không nắm bắt các thông báo từ tập lệnh python. Tôi muốn sửa lỗi này để tôi biết mình đang xem kênh nào. Một bổ sung tốt khác là một dongle bàn phím không dây trên Pi. Điều này sẽ cho phép bạn thay đổi mạng wifi nếu bạn rời khỏi nhà với TV. Bất kể. đó là một dự án thú vị và tôi không thể chờ đợi để bắt đầu dự án tiếp theo.

Đề xuất: