Բովանդակություն:

Retro Idiot Box: 10 քայլ
Retro Idiot Box: 10 քայլ

Video: Retro Idiot Box: 10 քայլ

Video: Retro Idiot Box: 10 քայլ
Video: Киевский торт_Рассказ_Слушать 2024, Նոյեմբեր
Anonim
Retro Idiot Box
Retro Idiot Box

Ես գտա 1984 -ից մի հին Magnavox շարժական հեռուստատեսություն, որը նստած էր խանութի դարակների վրա `իմ տեղական մանրածախ խանութում: Ես ինքս ինձ մտածեցի. Հետագա ստուգումից հետո ես դրա վրա նկատեցի 15 դոլար գին, ուստի որոշեցի այն տուն տանել և դրանից ինչ -որ փխրուն բան պատրաստել: Հիշում եմ, թե ինչպես էի փառահեղ սև ու սպիտակի ոճով դիտում բոլոր մեծ դասականների երեխաները և ցանկանում էի դա նորից իրականություն դարձնել:

Խնդիրն այն է, որ այնտեղ այլևս անալոգային կայաններ չկան, և դա լիովին ի վիճակի չէ կատարել ցանկացած ATSC վերծանում կամ որևէ թվային վերծանում: Ես իսկապես նկատեցի կողային AV միացման առկայությունը և մի քանի ազնվամորու պի էր դրված, այնպես որ ես որոշեցի արկածախնդրության գնալ ՝ պարզելու, թե ինչպես կարող եմ ալիքներ ուղարկել դրան: Ես նույնպես ուզում եմ այն դարձնել սուր տեսք: Ես այն չեմ աշխատի 9-բջջային մարտկոցների վրա, այնպես որ կարող եմ թաքցնել rpi- ն մարտկոցի խցիկում ՝ բազմաթիվ այլ բարիքների հետ միասին:

Քայլ 1: Ստացեք լավ IPTV ցուցակ

Ստացեք լավ IPTV ցուցակ
Ստացեք լավ IPTV ցուցակ

IPTV Daily List- ն ունի անվճար iptv կայանների ֆանտաստիկ ընտրություն ՝ կազմակերպված ըստ երկրների: Ընտրեք ընտրված երկիրը և ներբեռնեք m3u ֆայլը:

Այս ծրագրաշարի համար m3u- ն անհրաժեշտ ձևաչափ է: Ձևաչափի առանձնահատկությունների մասին ավելին կարող եք կարդալ այստեղ:

Քայլ 2. Նախնական օրենսգրքի փորձ

Պիթոնի կոդը, որը մենք պատրաստվում ենք գրել, վերլուծում է m3u ֆայլը կայանների ցանկում:

#!/usr/bin/python3

ներմուծել ենթահամակարգ sys- ից import argv դասարան Կայան. def _init _ (self): self.channel = 0 self.name = "" self.address = "" channel_list = with open ('./ us-m3uplaylist-2020-08-) 17-1.m3u ',' r ') որպես m3u: i = 0 տողի համար m3u: if line.startswith ('#EXTINF '): this = Station () this.name = line.split (', ') [1] տող = հաջորդ (m3u) this.address = line.strip () this.channel = i channel_list.append (this) i = i + 1 process = subprocess. Penen (['vlc', '--loop', '--intf', 'dummy', '-ամբողջական էկրան', channel_list [int (argv [1])]. հասցեն])

Եկեք սա քանդենք:

#!/usr/bin/python3

Սա ասում է bash- ին, որ մենք կօգտագործենք python3- ը այս ֆայլը մեկնաբանելու համար:

ներմուծել ենթահամակարգ sys- ից import argv

Մեզ պետք կլինի ենթամշակման մոդուլը ՝ մեր vlc օրինակը գործարկելու համար, և մեզ անհրաժեշտ կլինի argv ՝ ընտրելու համար, թե որ ալիքով մենք vlc- ն գործարկելու ենք:

դասի կայարան ՝ def _init _ (self): self.channel = 0 self.name = "self.address ="

Սա սահմանում է դաս, որը կոչվում է Station: Յուրաքանչյուր ալիք կունենա ալիքի համար, ալիքի անունը վերցված է m3u ֆայլից և հասցե, որտեղից այդ ալիքը հոսում է:

ալիքների ցանկ =

Սա ցանկ է, որը կպահի m3u ֆայլից վերլուծված բոլոր ալիքները:

բաց ('./ us-m3uplaylist-2020-08-17-1.m3u', 'r') որպես m3u: i = 0 տողի համար 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

Այս հանգույցը բացում է m3u երգացանկը և կլանում տվյալները: մեզ հետաքրքրող m3u ֆայլի տողերը սկսվում են #EXTINF- ով, սա ցույց է տալիս երգացանկի ֆայլի նոր մուտք: Հետաքրքրության հաջորդ արժեքը անունն է, որը #EXTINF- ի նույն տողում է, բայց դրանց միջև ստորակետով: Այս կոնկրետ m3u- ի հետևյալ տողը հոսքի հասցեն է: Կիրառվող «i» - ն օգտագործվում է ՝ հաշվելու, թե որ ալիքն է: Այս հանգույցը կրկնում է m3u ամբողջ ֆայլը և լցնում ալիքների ցանկը կայաններով:

ընթացք = ենթապրոցես. Բացեք (['vlc', '--loop', '--intf', 'dummy', '--fullscreen', channel_list [int (argv [1])]. հասցեն])

ենթամշակման գրադարանը թույլ է տալիս python- ին կանչել գործընթացներ (ծրագրեր) և վերադարձնում PID (Process ID): Սա պիթոնին հնարավորություն է տալիս կառավարել ծրագրերի գործարկումն ու փակումը «ճիշտ» ՝ առանց պատմության ֆայլը լրացնելու կամ թույլ տալու ավելի կամայական կոդի գործարկում ընդհանուր «համակարգային» զանգերով: Պոպենի համար որպես արգումենտ օգտագործվող զանգվածի յուրաքանչյուր տարր նույնքան մուտքագրված է հրամանի տողում:

vlc -loop --intf dummy -ամբողջական էկրանով հասցեներ

Վերոնշյալ հրամանը այն է, ինչ ցանկալի է գործարկել, -loop տարբերակով ՝ հոսքի դադարով որոշ խնդիրներ շտկելիս, երբ հաջորդ հատվածները բեռնվում են (տարօրինակ m3u8 խնդիրներ), - սկսում է տեսանյութը լրիվ էկրանի ռեժիմում (ՈՉ !ԱՆ!), իսկ հասցեն հոսքի հասցեն է: Ինչպես տեսնում եք ծածկագրում, մենք տրամադրում ենք հասցեն ցուցակի ալիքի համարից, որը տրամադրվում է գործարկման ժամանակ argv հայտարարության միջոցով: Պահպանեք այս ֆայլը որպես tv_channels.py, փոխեք պիթոնի ֆայլի տեսացանկի վայրը ՝ ձեր տեսացանկին մատնանշելու համար, և կարող եք գործարկել ծածկագիրը հետևյալ կերպ.

python tv_channels.py

Քայլ 3: Ավելացնել GPIO

Ավելացնել GPIO
Ավելացնել GPIO
Ավելացնել GPIO
Ավելացնել GPIO

Սխեմատիկ պատկերը ցույց է տալիս կոճակների համար օգտագործվող երկու GPIO կապում, և դրանցից յուրաքանչյուրն ունի ձգման դիմադրություն, որը կպահի GPIO- ի քորոցը կոճակը սեղմելուց հետո: Նախկինում սահմանված կոդը կարող է ճշգրտվել ՝ գործողությունը մի փոքր ավելի անթերի դարձնելու համար ՝ ավելացնելով GPIO հնարավորությունը: Սա թույլ է տալիս մեզ փոխել ալիքը կոճակներով, այլ ոչ թե ստեղնաշարի և argv հայտարարություններով, ինչպես իրական հեռուստատեսության համար:

Առաջին բանը, որ պետք է նշել, այն է, որ ես ունեմ հեռուստատեսություն `որպես դասարան: Հեռուստատեսություն լինելու համար մենք պետք է լինենք ընթացիկ ալիքում, ունենանք հնարավոր ալիքների ցանկ և ունենանք ալիքները փոխելու հնարավորություն: Այս օրինակում ալիքների փոփոխման միակ մեթոդը կլինի ալիքների ցանկը վերև տեղափոխելը և ալիքների ցանկը ներքև տեղափոխելը: Երբ ալիքը որոշվի, մենք ստիպված կլինենք VLC- ն սկսել այն ալիքով, որը ցանկանում ենք տեսնել:

#!/usr/bin/python3

ժամանակից ներմուծում քնի ներմուծման ենթամշակման sys ներմուծում argv gpiozero ներմուծման կոճակի դաս կայան. _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 (filenname, 'r') as m3u: i = 0 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 if self.current_channel <0: self.current_channel = 0 self.start_channel () def start_channel (self): try: self.process. kill () բացառությամբ. dummy ',' --fullscreen ', self.channel_list [self.current_channel].հասցե]) սա = Հեռուստատեսություն ('./ us-m3uplaylist-2020-08-17-1.m3u ') channel_UP = Կոճակ (18) channel_DN = Button (23) while True: channel_UP.when_pressed = this.channel_up channel_DN.when_pressed = this.channel_down

Կոդի այս կրկնությունը բավականին բարելավումներ ունի: այն այժմ օգտագործում է gpiozero կոչվող մոդուլ, որը պահանջվում է ազնվամորու pi- ի կողմից ՝ GPIO կապում ֆունկցիոնալությունը հեշտությամբ մուտք գործելու համար

sudo apt-get տեղադրել python3-gpiozero

կամ

sudo pip տեղադրել gpiozero

Ինչպես երևում է իմ ծածկագրում, ես ընտրել եմ GPIO 18 և GPIO 23 համապատասխանաբար UP և DOWN ալիքների համար: Gpiozero գրադարանն ունի դասարան կոճակների գործառույթների համար, երբ այն սեղմված է, սեղմված է, երբ պահված է և այլն: Սա բավականին հեշտացնում է այն: Ընտրեցի երբ

Վերջին խոշոր փոփոխությունը «-q» տարբերակի ներառումն է VLC ենթածրագրի զանգում: Սա պարզապես գործարկում է vlc- ն ՝ առանց տերմինալի ամբողջ ելքի, որպեսզի այն պահի խառնաշփոթից, որպեսզի մենք կարողանանք տեսնել ծածկագրում տեղեկատվական տպագիր հայտարարությունները:

Քայլ 4: Ինտեգրեք սարքավորումները `ավելի սուր տեսք ունենալու համար

Ինտեգրեք սարքավորումները ՝ ավելի սուր տեսք ունենալու համար
Ինտեգրեք սարքավորումները ՝ ավելի սուր տեսք ունենալու համար
Ինտեգրեք սարքավորումները ՝ ավելի սուր տեսք ունենալու համար
Ինտեգրեք սարքավորումները ՝ ավելի սուր տեսք ունենալու համար
Ինտեգրեք սարքավորումները ՝ ավելի սուր տեսք ունենալու համար
Ինտեգրեք սարքավորումները ՝ ավելի սուր տեսք ունենալու համար

Ես չեմ հասկացել, թե ինչպես եմ ուզում դա անել, և դա յուրահատուկ լուծում կլինի օգտագործվող յուրաքանչյուր մոդելային հեռուստատեսության համար: Ես պետք է լավ մտածեմ այս մասին և հեռուստացույցի շուրջ փնտրեմ, որ պի համար լավ էներգիայի աղբյուր գտնեմ, երբ համակարգիչը սեղմեմ մարտկոցի հսկայական խցիկի ներսում: Ես նաև մտածեցի ալիքի ընտրության համար օգտագործել ժամացույցի կոճակները, քանի որ դրանք արդեն գեղեցիկ տեղադրված են հեռուստատեսության վրա, իսկ ժամացույցն ամեն դեպքում չի աշխատում: Երբ ես լավ լուծում գտնեմ, ավելի շատ կտեղադրեմ, բայց այստեղ իմ նախագիծը մեծապես կտարբերվի բոլորից: Վայելեք իրական հեռուստատեսության նման IPTV ինտեգրումը:

Քայլ 5: Pi Power

Pi Power
Pi Power

Իմ գտած մոդելային հեռուստատեսության համար այն պահանջում է 12 Վ էլեկտրամատակարարում: Ես զննեցի տախտակի շուրջը, բայց 5V- ի էներգիայի որևէ ակնհայտ կարգավորիչ չտեսա, այնպես որ կայուն էներգիա ստանալու ամենաակնհայտ վայրը տպատախտակն է, որտեղ 12 Վ -ի տակառի միակցիչը գալիս է: Դրա հետ կապված ակնհայտ խնդիր կա. մենք չենք ուզում տապակել pi- ն, ուստի մեզ էներգիայի կարգավորիչ է անհրաժեշտ: Ես ընտրել եմ MP2315 Step-Down Power Converter- ը: Այն կեղտոտ էժան է և օգտագործման համար պարզ: Մենք 12VDC մուտքագրումը կպչենք PCB- ի տակառի միակցիչից փոխարկիչի IN+ և GND կապանքներին, իսկ VO+ - ին ՝ Raspberry Pi- ի 2 -ին, ինչպես նաև GND- ին:

Դրանից առաջ, համոզվեք, որ միացրեք փոխարկիչը և համոզվեք, որ համապատասխան 5V- ը դուրս է գալիս ելքից: Ես ընտրեցի ամենապարզ տարբերակը `ամրացված կարգավորվող լարման հետ: Հարմարվողը կկարգավորի լարումը, այնպես որ ես դիտեցի լարման ելքը մուլտիմետրով, երբ հարմարվողը կարգավորեցի պտուտակահանով:

Քայլ 6: Ուժի ինտեգրում

Ինտեգրվող ուժ
Ինտեգրվող ուժ
Ինտեգրվող ուժ
Ինտեգրվող ուժ
Ինտեգրվող ուժ
Ինտեգրվող ուժ

Հեռուստացույցի շուրջը պտտվելուց հետո որոշվեց, որ էլեկտրաէներգիա խլելու լավագույն վայրը բարելի միակցիչի բացասականն է և հեռուստատեսության ON/OFF անջատիչը, ինչը նշանակում է, որ մենք կարող ենք միացնել և անջատել հոսքերը հեռուստատեսությամբ, այլ ոչ թե անընդհատ սնուցելով pi- ն ՝ ուղղակիորեն քաշելով տակառի միակցիչից:

Հաղորդալարերը կպցվեցին և սնուցվեցին պատյանի կողքին գտնվող PCB- ի կողքով, մինչև որ հասան սարքի հետևի մաս, որտեղ սնվեցին մարտկոցի խցիկի հետևի անցքից: Երբ նրանք սնվեն, մենք կարող ենք պատրաստել մալուխի ծայրերը և դրանք զոդել էներգիայի կարգավորիչին: Ես այն կարգաբերեցի 5 Վ լարման համար, որպեսզի սնուցի pi- ն և դրան ամրացնեմ վերնագրի քորոցները, որպեսզի մենք կարողանանք էգ կարգավորիչից իգական սեռի թռիչքներ կատարել անմիջապես pi- ի GPIO վերնագրերի հավաքածուի վրա: Սովորաբար դա խորհուրդ չի տրվում, քանի որ pi- ն, ընդհանուր առմամբ, էներգիա է ստանում UBS- ի միջոցով, որն ունի կարգավորիչ `5V- ը պայմանավորելու համար, բայց քանի որ հոսանքը արդեն կարգավորվում է, այն պետք է լավ լինի:

Աուդիո գծերի վրա որոշակի աղմուկ է բարձրանում, քանի որ համակարգում կա հիմքային հանգույց: Ես փորձեցի շատ ուժային և գրունտային կետեր ամբողջ տախտակի վրա ՝ հեշտ պատասխանի ակնկալիքով, բայց ոչ մեկը չգտա: Ես նաև միացրեցի microUSB մալուխը անջատված ռեժիմի կարգավորիչին ՝ տեսնելու, թե արդյոք pi- ի ներքին կարգավորիչների միջոցով հոսանքը ստիպելը կլուծի խնդիրը: Դա չեղավ: Լուծումը լինելու է ձայնային գրունտի մեկուսացման տրանսֆորմատորների մեջ: Սրանք ավելի շուտ պատվիրված էին, քան կառուցված, քանի որ դրանք էժան են և գեղեցիկ փաթեթավորված: Դուք կարող եք դրանք վերցնել ավտո աուդիո խանութների կամ բաժանմունքներից շատերից: Սա այն է, ինչ ես ընտրեցի:

Քայլ 7: Երկարաժամկետ կոճակի լուծում

Երկարաժամկետ կոճակի լուծում
Երկարաժամկետ կոճակի լուծում
Երկարաժամկետ կոճակի լուծում
Երկարաժամկետ կոճակի լուծում

Անկասկած, կոճակները չեն մնա սեղանի վրա, ուստի պետք է ավելի մշտական լուծում գտնել: Ես վերցրեցի մի հին նախատախտակ և միացանկը գցեցի վերնագրի որոշ կապերի հետ ՝ ազդանշաններին հասանելի դարձնելու համար: Այստեղ է, որ բոլորը տարբեր կարծիքներ կունենան կոճակները ամրացնելու կամ ամրացնելու վերաբերյալ: Ես ընտրում եմ դրանք նախատախտակի վրա դնել և ուղղակի ամրացնել դրանք շասսիին այնպես, որ բռնակը, որը պտտվում է էկրանի վրայով, չխանգարի: Ազատ զգալ դիզայնը `ավելացնելով 3d տպված պատյան, որը հարթեցնում է ամրացումը, օգտագործեք ընկույզներ և պտուտակներ, շքեղ սոսինձներ, ինտեգրված բնօրինակ կոճակներ, ինչ էլ որ լինի: Քանի դեռ այն աշխատում է, սխալ պատասխաններ չկան:

Դրանք կտեղադրվեն պատյանի արտաքին մասում, և Raspberry Pi- ն կպցվի մարտկոցների շատ ընդարձակ խցիկի ներսում, ուստի անհրաժեշտ կլինի մի փոքր անցք բացել, որը թույլ կտա մալուխներին դուրս գալ մարտկոցի խցիկից:

Քայլ 8: Վերջնական համապատասխանության ստուգում

Վերջնական համապատասխանության ստուգում
Վերջնական համապատասխանության ստուգում

Ամբողջ սարքավորումները պետք է ստուգվեն վերջին անգամ `ճշգրիտ տեսնելու համար, թե որտեղ են պետք անցքերը կատարել շասսիի վրա, և ինչ չափի անցքեր և այլն: Բացի այդ, պետք է հաշվի առնել, թե որտեղ տեղադրել բաղադրիչները `կապի և հասանելիության օպտիմալ հեշտության համար: Կարճ ասած, համոզվեք, որ ամեն ինչ տեղավորվում է այնտեղ, որտեղ կարծում եք, որ այն անուղղելիորեն վնասում է ձեր նախագիծը և ստիպված եք դուրս հանել բեկորը:

Քայլ 9. Վերջնական ինտեգրում

Վերջնական ինտեգրում
Վերջնական ինտեգրում
Վերջնական ինտեգրում
Վերջնական ինտեգրում
Վերջնական ինտեգրում
Վերջնական ինտեգրում

Այժմ ամբողջ սարքավորումն այնտեղ է, որտեղ անհրաժեշտ է, և ամեն ինչ նույնքան հարմար է, որքան գորգի սխալը: Եկեք կտրենք իրերը: Մարտկոցի խցիկի վրա ես գտա մի վայր, որտեղ ես կարող էի դուրս մղել AV մալուխները ՝ օգտագործելով պլաստիկի մեջ փոքր խորշ: Ես այն մանրացրեցի նստարանային սրիչով: Դա բավականին կարճ աշխատանք տվեց: Ես ավելի շատ պլաստմասսա մանրացնելու համար օգտագործեցի դրեմել, որպեսզի այն բավականին լավ տեղավորվի մալուխների համար:

Վերջին բաղադրիչը ալիքի ընտրիչն է: Ես մի փոքր անցք բացեցի մարտկոցի խցիկում և հեռացրի վերնագրի մալուխները դրանից մեկ առ մեկ: Կոճակները միացված էին իրար, և ես նախատախտակը ամրացրեցի պլաստիկ շասսիին ՝ երկու կիսավարտիքով սոսնձված թավշի երկու կեսով: Ես հասկանում եմ, որ դրա համար կար մոտ 1200 ավելի լավ եղանակ, բայց դա աշխատեց, և ես ունեի այն ամենը, ինչ ինձ պետք էր:

Քայլ 10: Վայելեք ձեր Vintage IPTV- ն

Վայելեք ձեր Vintage IPTV- ն
Վայելեք ձեր Vintage IPTV- ն
Վայելեք ձեր Vintage IPTV- ն
Վայելեք ձեր Vintage IPTV- ն
Վայելեք ձեր Vintage IPTV- ն
Վայելեք ձեր Vintage IPTV- ն

Դա մոտավորապես ամփոփում է: Գտեք շոուներ և զվարճացեք դիտելով: Այնուամենայնիվ, շատ մոտ մի նստեք: Ուղեղդ կփչացնես:

Այս նախագիծը բարելավելու շատ տեղ կա, այնպես որ այն տարեք այն ուղղությամբ, ինչ ցանկանում եք, բայց զվարճալի էր հասնել այստեղ: Ինչ վերաբերում է ինձ, ապա այն գործարկում եմ cronjob- ից reboot- ի ժամանակ, այնպես որ stdout- ը չի գրավում պիթոնի սցենարի հաղորդագրությունները: Ես կցանկանայի դա շտկել, որպեսզի իմանամ, թե որ ալիքում եմ: Մեկ այլ լավ հավելում է Pi- ի անլար ստեղնաշարի դոնգը: Սա թույլ կտա փոխել wifi ցանցը, եթե ձեր տնից հեռանաք հեռուստատեսությամբ: Անկախ նրանից: դա զվարճալի նախագիծ էր, և ես անհամբերությամբ սպասում եմ հաջորդի մեկնարկին:

Խորհուրդ ենք տալիս: