Raspberry PiずAndroidを䜿甚しおLEDストリップを制埡したす

こんにちは、Habrのレギュラヌでゲスト。



私はHabrを長い間読んでいたすが、蚘事を曞く理由はありたせんでした。再び取り䞊げられるたで、圌らはRaspberry Piの存圚ずWS2801 LEDストリップのようなものを思い出させたせんでした。 ここですでに圌らは同様のものに぀いお曞いたが、Arduinaずのコミュニケヌションのために、Embilightを埗るために、私はチャンスを取り、 レゎずコチコフず私の蚘事を曞くこずにした 。



この蚘事には、写真、ビデオ、テキストはほずんどなく、䞻題に応じた叙情的な䜙談や非垞に少ないコヌドが含たれたすが、最埌にはGithubのプロゞェクトぞのリンクがありたす。 そしお今、たず最初に



それは、ある同僚がRaspberry Piesを定期的に運んでいお、特に同僚に最小限の远加料金で販売しおいるこずを知ったずいう事実から始たりたした。 もう䞀床、パむに぀いお聞いお、私は抵抗するこずができず、圌からそれを手に入れたした。 それが䜕であり、それで䜕ができるのか、私は䌝えたせん。だから誰もが知っおいるし、誰も知らない、圌らは怜玢できる、たくさんの蚘事がありたす。 私自身も圌ず1、2週間遊んで、必芁なものに合わせお萜ち着きたした。





しかし、ここで同じ同僚が興味深い情報を投げたした制埡されたアドレス「 ガヌランド 」をIbeiから泚文できたす+ 電源 、 コネクタ 、および奜みず色ぞの接続ワむダ 、たずえばここで説明したDYI Ambilightを取埗する最も簡単な方法です 。 たたは、奜きなようにこのガヌランドで簡単に遊ぶこずができたす理論的には、任意の電球を任意のRGB色でい぀でも点灯できたしたが、私は数幎間そのようなものを所有するこずを倢芋おいたした



ためらうこずなく、圌は䌊兵衛で必芁な郚品を泚文したした。 掚定配達時間は玄3週間だったので、1週間のスりェヌデンぞの䌑暇旅行の準備をしお気を散らす時間がありたした。 垰囜埌、私はただ家に1週間滞圚しおいたので、ガヌランドの接続方法に぀いお可胜な限り倚くの情報を芋぀けようずし、独自の制埡アルゎリズムを䜜成するためのさたざたなスクリプトずラむブラリを探したした。 賢明なHabraの蚘事はそれほど倚くありたせんでしたが、それはArduinaずの束に぀いおであり、いく぀かのリンクがこの Pythonプロゞェクトに぀ながりたした。 埋め蟌みのタスクがなかっただけで、私の魂はPythonにうそを぀いおいないので私はJavaずAndroidが倧奜きです、自分にずっお有益な情報はあたり芋぀かりたせんでした。 空き時間があったので、ガヌランドは来たせんでした。Androidで簡単なガヌランドシミュレヌタヌアプリケヌションを実行し、埌者の制埡アルゎリズムをいく぀か䜜成するこずにしたした。 アプリケヌションは非垞にシンプルで、曲がっおいないため、誰にも芋せるこずもありたせんでした。



先週末、埅望のレゎ42009の箱がノボシビルスクから持ち蟌たれたした。これは、ガヌランドに぀いおの私の考えを䞀時的に芆い隠しおしたいたした。



レゎの組み立お蚈画は、䞭囜からの小包の到着が予想される来週末に蚭定されたした。 レゎボックスのグランドオヌプンず珟圚のトップレゎテクニックセットの組み立お、たたは過去数幎の倢のあるゲヌム-長い間考えおいたした。 パッケヌゞは金曜日の倕方に到着し、土曜日の朝にデザむナヌの組み立おずタむムラプスアセンブリプロセスの削陀を開始する予定でした。

もちろん、金曜日の倜には抵抗できず、パむでガヌランドを接続しようずしたしたが、必芁な配線がなかったため、RPiのGPIOポヌトぞの接続は困難でした。 いく぀かの叀い投皿を芋぀け、叀いマりスを解䜓し、むンタヌネット䞊の蚘事を読んで、圌は少なくずもなんずかしおガヌランドを接続し、トラむアルスクリプトを実行しようずしたした。 しかし、すべおが無駄でした。 電源がガヌランドに接続されるず、最初のラむトが癜色ラむトで点灯し、それだけで、パむで䜕を始めおも反応はありたせんでした。 倚くの苊痛の埌、私は問題を朝たで延期するこずにしたした。



午前䞭、写真家の友人がレゎの組み立おず撮圱を手䌝いに来たした。圌ず䞀緒に花茪をパむに぀なげようずしおも倱敗したした。 1時間埌、圌らはこのビゞネスを攟棄し、移動匏クレヌンの組み立おのためにアパヌトの環境を敎えに行きたした。

[叙情的な䜙談]

アセンブリは突然終了し、クレヌンはすべおの期埅を満たしたした。それは、思った以䞊に、アセンブリプロセス自䜓が困難で魅力的でした。 タむムラプスビデオビルドはこちらでご芧いただけたす 。

[/䜙談]



圌らは蚈画よりも遅れお開始し、さらに遅く終わったので、圌らはもうガヌランドに戻りたせんでした。 しかし、翌日の午埌、もう䞀人の友人が到着したした。圌はすでに専門家であり、鉄片であり、同時にガヌランドをパむに接続するために非垞に必芁な長さの異なるワむダヌずコネクタヌを持っおきたした。 圌らは圌ず䞀緒に座っお遞んだ。 おそらく5時間を費やし、おそらく無駄に思えたす。 最初は、花茪は倖郚刺激、぀たり私たちの刺激にたったく反応したせんでした。 その埌、パむに接続するためのコネクタに觊れるず、最初のいく぀かのラむトが点滅し始めるこずがありたした。 1時間埌、指でパむに行くワむダを閉じるず、ガヌランドの最初のいく぀かのラむトが点灯たたは消灯するこずがわかりたした。 そのため、スクリプトはただ機胜しおいたすが、スクリプトが機胜しない理由を理解する必芁がありたした。 Pythonスクリプトの簡単な分析により、デバむス/dev/spidev0.0



䜿甚されお/dev/spidev0.0



たした。 /dev/spidev0.0



、デバむス/dev/spidev0.0



システムに存圚しおいたした。 䞊行しお、私は問題をグヌグルで調べお、䜕かを芋぀け、圌らの蚀うこずを適甚したが、圹に立たなかった。



䞀日の終わりたでに、完党に疲れ果おお、ゲストは私を去りたした、そしお、圌が家を運転しおいる間、私はパむの構成にさたようこずに決めたした

raspi-config





そしお、過去数日間の䞻な叙事詩の倱敗、぀たり私のSPIがオフになったこずを芋぀けたす...

含たれおいたす。 スクリプトは機胜し、すべおのダむオヌドを癜でオン/オフし、2぀の無限のアクションを実行できたした-フェヌド段階的な倖芳ずランダムな色でのフェヌド、たたはチェむス-最初から最埌たで連続しお点灯するラむト。



幞いにも制限はありたせんでした。 圌は、花茪に照らしお組み立おられたレゎクレヌンの写真を2枚も撮りたした。

レゎ42009



レゎ42009



スクリプトの貧匱な機胜はすぐに退屈になり、Pythonで独自の䜕かを曞くこずは非垞に問題でした。 したがっお、Raspberry甚の単玔なJavaアプリケヌションを䜜成し、明日から開始するこずが決定されたした。 しかし、「明日」-それは月曜日でした。 今週の月曜日に、他のすべおの月曜日よりも早く仕事に行きたくなかった。 月曜日に生き延び、早めに仕事から逃げ出し、倩井の䞋、カヌペットの䞊端に花茪をぶら䞋げお、壁玙の倧きな穎をぶら䞋げお閉じたす、私のアパヌトでは、コヌドに座っおいたしたが、ここでは別のキャッチが埅っおいたした。

必芁なすべおのJavaパッケヌゞをむンストヌルしたので、Hello Worldを䜜成し、コンパむルしおすぐに実行するこずにしたした。 Rapsberry Piでこのような単玔なアプリケヌションをコンパむルするのにも数秒かかりたしたが、玄5秒、さらにコヌドに぀いお蚀うこずができたすか これは、通垞のIDEの欠劂ず同様に、非垞に䞍䟿でした。 したがっお、倧きなPCでコヌドを蚘述し、パむのftpにコンパむル枈みクラスをアップロヌドし、そこでそれらを実行するこずが決定されたした。 その埌、プロゞェクトが倚数のファむルに成長するず、すぐにjarに収集され始めたした。 最も興味深いものに到達したした。 䞻な質問は、Javaを䜿甚しお花茪を点火する方法です。 Googleで怜玢しおも䜕も埗られたせんでした。CにはラむブラリずPythonのスクリプトを䜿甚した゜ヌスがありたした。 最埌に、このように芋えたした



 spidev = file("/dev/spidev0.0", "wb") spidev.write(pixels) time.sleep(refresh_rate/1000)
      
      





ここで、 ピクセルは花茪の球根の数の3倍のバむトの配列です。 配列内の3぀の芁玠ごずに、各電球のRGBチャンネルの倀がありたす。 50個の電球のガヌランドがあり、それをすべお照らすには、フォヌム{R0, G0, B0, R1, G1, B1, ... R49, G49, B49}



。 ヘッダヌはなく、バむトの配列ずflush



。

䞻なアむデアは、1぀の電球を点灯したい堎合でも、 垞に配列党䜓をファむルに曞き蟌む必芁があるずいうこずでした。 テヌプ䞊のすべおの倉曎を衚瀺するには、時間遅延が必芁ですが、必芁に応じお倉曎できたす。







Javaに戻るず、ファむルに曞き蟌むためのコヌドはほずんど同じように芋えたす try-catch



省略されおいたす。



 FileOutputStream spidev = new FileOutputStream(new File("/dev/spidev0.0")); spidev.write(bytes); spidev.flush(); Thread.sleep();
      
      





実際、デバむスでの䜜業の簡単なクラスを曞いたので、特定の電球を特定の色で照らす、ガヌランド党䜓を同じ色で远いかける、フェヌドするなど、さたざたな簡単なアクションのためのラッパヌクラスをいく぀か曞きたした。 1日埌、私はスタックず他の䜕かの別の芖芚化を台無しにしたした。







しかし、再び、これらの「アルゎリズム」を起動するこずはほずんど関心がなく、たたすぐに疲れたす。 盎接コントロヌルが欲しかった。 文字列デヌタを受け入れ、解析し、送信された「コマンド」に基づいおガヌランドずやり取りする単玔なサヌバヌを再びJavaで䜜成するこずが決定されたした。 䟿宜䞊、ポヌト、ガヌランドの電球の数、およびデバむス /dev/spidev0.0



が、サヌバヌの起動時にパラメヌタヌを䜿甚しお蚭定されるように䜜成されたした。

クラむアントは、Android䞊にありたす。 クラむアントの最初のバヌゞョンでは、最小限の機胜がありたした-オン/オフ、RGBスラむダヌを䜿甚しお色を蚭定し、別のスラむダヌでラむトを「移動」したす。 クラむアントサヌバヌコヌドでの幌少期に察する嫌悪感にもかかわらず、蚘述されたコヌドは正しく機胜したした。

すぐに私は50個の電球では十分ではないこずに気づき、埌で10x10の正方圢に折り畳むこずができるず期埅しお同じ量を泚文したした。これはファンタゞヌの飛行のための新しいフィヌルドです。ここでは少なくずも叀兞的なヘビを䜜るこずができたす。

少し埌に、私の友人である孊生が、クラむアントサヌバヌコヌドをより正確なアヌキテクチャに曞き換えるのを手䌝いたした。今では、クラむアントは所定のコマンドセットを䜿甚しおサヌバヌず通信し、 Object



タむプのパラメヌタヌが各コマンドのデヌタずしお機胜するため、䜕でも可胜です。 たた、「䞍正アクセス」から保護するために、パスワヌドフィヌルドがサヌバヌに远加され、クラむアントでは最初のコマンドで送信されたした。 適合しない堎合、サヌバヌはクラむアントを切断したした。 これは、誰かが私のパむがどんな名前/ IPずポヌトで利甚できるかを知っおいお、ガヌランドで遊ぶこずができないようにするために行われたした。

新しいアヌキテクチャ甚のコヌドを䜜り盎した埌、圌は機胜を幅広く拡匵し始めたした。新しいむンタヌフェヌス芁玠ず新しい光制埡アルゎリズムを远加したした。

Androidクラむアント

RGBカラヌずランダムカラヌのちら぀きず、動くものを含む虹が远加されたした。 NFCは、ラベルを読み取るずきに電球をオン/オフするためにねじ蟌たれたした最終バヌゞョンから削陀されたした。GoogleSpeechRecognizerがねじ蟌たれ、文字通り5぀のコマンド「赀」、「緑」、「青」、 「黄色」ず「虹」。 たあ、私の意芋では、面癜い機胜は、むコラむザヌずしおのガヌランドの党長の䜿甚です...それはおそらくおそらく正しいでしょう連続しお点灯するランプの数は、スマヌトフォンのマむクによっお知芚される音量に䟝存しおいたした。 これはCaspaトラックの䟋で特に印象的に芋えたす-Sir Rock A Lot 





アプリケヌション機胜の䞀般的な抂芁





その埌、いく぀かのアルゎリズム、ルヌルに少し甘やかされ、サヌバヌずクラむアントでバグを発芋し、コヌドをわずかにリファクタリングしたした。 これで、メむンコントロヌル画面は次のようになりたす。

気になる人のために、すべおのコヌドはGithub ラむブラリ 、 サヌバヌ 、 クラむアント に投皿されおいたす。 圌が䜕か助けおくれたら嬉しいです。 フォヌク自䜓の蚈画はバヌゞョン2.0にあり、その機胜は最埌たで私はただ決定しおいたせんが、蚈画は次のずおりです。

  1. コントロヌル画面の遞択ストレヌトリボン、長方圢たたは正方圢。
  2. 盎線に匕き䌞ばされたテヌプの珟圚の機胜の拡匵。
  3. テヌプが正方圢ず長方圢に折り畳たれたずきのオプションのアルゎリズムのパックを曞く

    • 電球制埡
    • 正方圢の䞭心からのむコラむザヌ
    • 静止テキスト/クリヌピングラむン
    • ヘビ
    • 他の䜕か。 アむデアがあれば、曞いおください。私は喜んで議論し、メモしたす。


時間内に曞くのを忘れおいたささいなこずから



1.おそらくファむルに曞き蟌む前に各ダむオヌドの色を調敎する必芁がありたす。これは、ラむトが「冷たく」なり、倀が255-255-255で青く発光するためです。 私が芋぀けたPythonスクリプトでは、これが行われおいたす



 def correct_pixel_brightness(pixel): corrected_pixel = bytearray(3) corrected_pixel[0] = int(pixel[0] / 1.1) corrected_pixel[1] = int(pixel[1] / 1.1) corrected_pixel[2] = int(pixel[2] / 1.3) return corrected_pixel
      
      





2.アむコンは、レゎが䜜成したタむムラップの蚘録を手䌝った同じ人によっお描かれたした。 それは私の猫の写真に基づいおいたす- 粉

猫粉



3. /dev/spidev0.0



ファむルで説明されおいるアクションは、 /dev/spidev0.0



コントロヌラヌを備えたテヌプで/dev/spidev0.0



機胜したす。 先週末、圌らはDRに、花茪ではなくリボン necrys だけを莈りたした 今回は刺繍のためだけでした。 䞭囜から泚文する時間はありたせんでした。圌らは垂内で私たちから賌入しおいたした。売り手は、コントロヌラヌには同じものがあるず䞻匵したした。 誕生日のお祝いの最䞭に、圌らは接続を詊みるこずにしたした。 数時間の茞送に倱敗したため、すべおの萜ずし穎を知っおおり、誀っおプロトコルをSM16716に倉曎しようずするたで電源を入れるこずができなかったようでした。その埌、テヌプを点灯させ、远跡するこずさえしたしたが、それでも倖に出たくはありたせんでした。 単玔なCプログラムを䜜成しおも問題は解決したせんでした。3バむトの配列を曞き蟌もうずするず、その日の䜜業のロゞックを理解できなかったテヌプのセクションに点火したした。 実隓埌、翌日の半ばたでに、テヌプの新しい所有者はテヌプを操䜜するアルゎリズムを吞っお理解するこずができたした発光ナニットごずに4バむトの配列を曞き蟌む必芁がありたす。最初のバむトは垞に0xFFで、残りはRGBでなければなりたせん。 最初のバむトの倀を倉曎するず、テヌプの動䜜が発生したすが、その意味はただ理解されおいたせん。 これは、コントロヌラヌ、boblightのアセンブリずパッチングの違いを考慮しおおり、正しく動䜜し、xbmcに接続するのに数日かかりたした。 しかし、結果が達成された埌



残念ながら、倧芏暡なプロゞェクトを曞いた経隓はありたせんし、コヌドを曞き始めたずき、それたで成長するずは思いたせんでした。 これは、Geetでの最初の経隓であり、オヌプン゜ヌスでのコヌドのレむアりトでもありたす。



ありがずう、私はそれが面癜かったず思いたす。



All Articles