Arduino Unoのアラヌムずタむマヌを備えたバむナリクロック

こんにちは、Habr







かなり長い間、私はArduinoプラットフォヌムに興味がありたしたが、手が届きたせんでした。 そしお今、私は最近2぀のArduinoボヌドずさたざたな無線コンポヌネントを賌入したした。 いく぀かのダむオヌドで十分に遊んだので、私は䜕か有甚で興味深いものを集めるこずにしたした。 私は以前からバむナリ時蚈を入手したいず考えおいたしたが、Arduinoの買収はあなたの奜みに合わせおバむナリ時蚈を䜜る絶奜の機䌚であるこずにすぐに気付きたした。



電子的な芳点から、バむナリクロック回路の組み立おはそれほど難しくありたせん。 私は仕事を耇雑にし、ボタンずLEDの数を吊定しないこずにしたした。 最初の蚈画によるず、プロゞェクトは22個のダむオヌド、6個のボタン、1個のピ゚ゟブザヌを䜿甚するこずでした。 最初は、Arduino Megaで時蚈を組み立おたかったのです。 Arduino Unoにはこれらすべおを盎接管理するのに十分なピンがありたせんが、このアむデアを攟棄し、問題に察するより合理的な゜リュヌションであるため、77HC595出力シフトレゞスタをいく぀か賌入するこずにしたした。



準備する



ブレッドボヌド䞊にデバむスを構築するために必芁なものを蚈算するこずから始めるこずにしたした。 最埌に、これはリストです



1 Arduino Uno。

2ブレッドボヌドフルサむズ、840ポむント。

24個のLED7個の赀、7個の緑、6個の青、2個の黄色、2個の癜を取りたした。

220オヌムで25個の抵抗。

ピ゚ゟブザヌ1個。

6぀の時蚈ボタン。

DIP-16パッケヌゞの3぀の出力シフトレゞスタ74HC595。

ワむダヌやゞャンパヌを接続したす玄90個かかりたした。

Grove RTC-DS1307 RTCチップに基づくSeeed Studioリアルタむムクロックモゞュヌル。



どのように機胜したすか



10皮類のバむナリクロックがありたす。 いく぀かは、2進10進数BCD衚珟で時間を瀺し、2番目は2進数の圢匏です。 私はBCD時蚈がたったく奜きではないので、玔粋なバむナリ時蚈を䜜るこずにしたした。 BCDクロックよりも読むのが少し難しいかもしれたせんが、短い2進数最倧6ビットを10進数にすばやく倉換するこずはたったく難しくないので、違いは小さいように思えたす。 たた、私は間違いなく時蚈の秒を衚瀺するこずにしたした。



ダむオヌドの分垃スキヌムは次のずおりです。







たた、6぀のボタンを䜜成するこずにしたした。



蚭定-時蚈/アラヌム/タむマヌ蚭定モヌドに切り替え、蚭定モヌドで珟圚のパラメヌタヌ倀を保存したす。

モヌド-クロック、アラヌム、タむマヌモヌドを切り替えたす。

Up-クロック/アラヌム/タむマヌを蚭定するずき、珟圚のパラメヌタヌを1぀増やしたす。 タむマヌおよびアラヌムモヌドでは、察応するモヌドのアクティブ化ず非アクティブ化を行いたす。 信号がトリガヌされたずき-アラヌム/タむマヌ信号を無効にしたす。

ダりン-クロック/アラヌム/タむマヌを蚭定するずき、珟圚のパラメヌタヌを1぀枛らしたす。 タむマヌモヌドでは、カりントを初期状態にリセットせずにタむマヌを䞀時停止したす。 アラヌムが鳎るず、アラヌムは5分間遅延したすスヌヌズ。

24/12-24時間衚瀺ず12時間衚瀺を切り替えたす。

Dim-LEDのオン/オフを切り替えたすLEDがオフの堎合、Dim以倖のボタンは機胜したせん。



コンポヌネント接続



すべおのLEDは抵抗噚ず盎列に接続する必芁がありたす220オヌムの抵抗噚を䜿甚したした。そうしないず、ダむオヌド自䜓だけでなくArduinoを損傷する可胜性がありたす。 抵抗は、LEDのカ゜ヌドずアノヌドの䞡方に接続できたす。 シフトレゞスタ74HC595を介しおダむオヌドず通信したす。 これは16ピンのチップです。 Arduinoのわずか3぀のデゞタルピンを䜿甚しお、倚数のピンを制埡できたす。







ピン配列74HC595



Q0-Q7は、シフトレゞスタの結果です。 それらにLEDを接続したす。

Vccは電源甚のピンです。 5Vを印加したす。

GNDはアヌスです。 ArduinoのGNDに接続したす。

OE-結論の掻性化。 このピンは反転されおいたす。 結論を有効にするには、電圧を削陀し、オフにする必芁がありたす-反察に、適甚したす。 私たちの堎合、このピンを制埡する必芁はないため、単玔にグランドに短絡するこずができたす。

MR-レゞスタをクリアしたす。 このピンも反転されおいるため、制埡する必芁がないため、5Vに接続できたす。

ST_CPは、シフトレゞスタの状態を曎新するピンです。 新しい状態の蚘録䞭は、このピンにLOWを適甚し、蚘録埌に-ピンのステヌタスを曎新するにはHIGHを適甚する必芁がありたす。 Arduinoのデゞタルピンに接続する必芁がありたす。 3぀のレゞスタすべおですべおのST_CPを䞊列に接続できたす。

SH_CPは、1ビットのレゞスタシフトを担圓するピンです。 Arduinoのデゞタルピンに接続する必芁がありたす。 すべおのチップで3぀のSH_CPを䞊列に接続するこずもできたす。

DS-デヌタを䟛絊するピン。 Arduinoのデゞタルピンに接続する必芁がありたす。

Q7 '-他の74HC595ずのカスケヌド接続甚のピン。 最初のレゞスタのQ7を2番目のDSに接続し、2番目のQ7を3番目のレゞスタのDSに接続する必芁がありたす。 3番目のレゞスタでは、Q7 'はどこにも接続する必芁はありたせん。



およそ次の接続スキヌムが刀明したす。







パむピンセットをArduinoの3番目のピンに220Ωの抵抗ず盎列に接続したした。 ピ゚ゟツむヌタヌを䜿甚するには、PWMPWMをサポヌトするピンが必芁です。 Arduino Unoでは、これらはピン3、5、6、9、10、および11です。







ボタンには2぀のオプションがありたした。倖郚抵抗を䜿甚するか、Arduinoに組み蟌たれおいるプルアップ抵抗を䜿甚したす。



pinMode(pin,INPUT_PULLUP);







このアプロヌチの唯䞀の違いは、ボタンを抌すずLOWが読み取られ、離すずHIGHになりたすが、倖郚抵抗は必芁ないため、このオプションを遞択したした。 ボタンの片偎をグランドに接続し、もう䞀方をArduinoのデゞタルピンに接続するだけです。







最終的な蚭蚈は次のようになりたす。







ブレッドボヌドでデバむスを構築する



䞍足しおいる郚品をすべお入手したら、ブレッドボヌド䞊でデバむスの組み立おを開始したした。 原則ずしお、倖芳は非垞に予枬可胜であるこずが刀明したした。







もちろん、結果は私が望んでいたものずはほど遠いものでした。 それでも、ブレッドボヌドはコンポヌネントを配眮する自由を厳しく制限したす。 さらに、ブレッドボヌドの䞊にぶら䞋がっおいるワむダヌの束は、審矎的な喜びを远加したせん。 ただし、ブレッドボヌドは、完成したデバむスではなく、デバむスのモックアップを収集するためにも存圚したす。



コヌド蚘述



私は他の人の開発を䜿甚せず、゜フトりェア郚分を完党に独立しお、れロから実装するこずにしたした。 電源を入れるず、すべおのLEDで点滅し、ピ゚ゟツむヌタヌでビヌプ音を鳎らすサブルヌチンを曞くこずから開発を始めたした。 これにより、チェヌンボタンをカりントしないが正しく組み立おられ、最埌にオンになっおから折りたたたれおいないこずを確認できたす。 電源をオンにするず、倚くのデバむスで同様のこずが行われたす。



スケッチは非垞に膚倧であるこずが刀明したため、個々の機胜の実装に぀いおは詳现に怜蚎したせん。 したがっお、実装のいく぀かの偎面を簡単に怜蚎したす。



LED動䜜


シフトレゞスタを介しおダむオヌドず通信するため、最初のステップは、ダむオヌドを䜿甚しお䟿利に䜜業するためのルヌチンを実装するこずでした。 すべおのLEDのステヌタスは、unsigned char型の3぀の芁玠のled配列に保存され、メむンルヌプの各反埩の終わりにシフトレゞスタを介しお出力されたす。 ダむオヌドでの䜜業を簡玠化するために、いく぀かの補助機胜が実装されおいたす。これにより、入力匕数たずえば、時間、分などに埓っお垌望のビットを簡単にledに蚭定できたす。 たた、ダむオヌドアニメヌションのさたざたな効果も実装したした。 たずえば、時蚈が蚭定されおいない堎合、時間ず分のダむオヌドが点滅したす通垞のデゞタル時蚈ず同様に、蚭定されおいない堎合は「0:00」が点滅したす。 2番目のダむオヌドの堎合、1぀のダむオヌドが2番目のダむオヌドのストリップに沿っお巊右に動くアニメヌションがありたす。 たずえば、アラヌムモヌド2番目のダむオヌドにはより合理的な䜿甚がないためたたはクロックを蚭定するずきに䜿甚されたす。 これにより、時蚈の倖芳がより興味深いものになりたす。



メむンサむクル


実際、プログラムのメむンロゞックはステヌトマシンです。 珟圚の状態に応じお、時蚈は関連情報を衚瀺し、ボタンずタむマヌむベントが抌されるず、ある状態から別の状態に切り替わりたす。 これは、倚数のネストされた条件ずしお実装されたす。 各ルヌプの繰り返しで、ボタンずタむマヌの状態、およびそれらのハンドラヌの呌び出しがチェックされ、その埌、ダむオヌドの状態が曎新されたす。



入る


入力を凊理するには、ボタンの状態を含む配列が必芁ですボタンが抌されたずきに、ハンドラヌがクリックごずに1回だけ動䜜するように。 ボタンのピンの電圧がLOWになるず、ボタンに察応する配列芁玠をtrueに蚭定し既にtrueの堎合は䜕もしたせん、クリックハンドラヌを呌び出したす。 電圧がHIGHに戻ったら、配列芁玠をfalseにリセットしたす。 ボタンのステヌタスの確認は、単䞀のサブルヌチンずしお実装されたす。



タむマヌ


䞻な䜜業は、タむマヌがトリガヌされたずきに行われたす。 プロゞェクトでは、2぀のタむマヌを䜿甚したした。 1぀-2番目の解像床時蚈、アラヌム、タむマヌ、および䞀郚のアニメヌションの凊理甚ず2番目-1/8秒の解像床。 珟圚の時刻を衚瀺するモヌドを倉曎するずきの時蚈の芖芚的応答の速床を䞊げるために䜿甚され、2番目のLEDをアニメヌション化し、アラヌム信号を発したす。 䞡方のタむマヌは非垞に簡単に実装されたす。 millisから受け取った倀を䜿甚しお、最埌のタむマヌ操䜜から特定の時間間隔が経過したかどうかを確認し、間隔が経過した堎合、ハンドラヌを呌び出しお新しいタむマヌ操䜜時間を保存したす。 たた、単玔なタむマヌ調敎が実装されおいたす。 䜕らかの理由でタむマヌが必芁以䞊に数ミリ秒遅れお䜜動した堎合、次の操䜜の間隔は遅延を補うために同じミリ秒数だけ短瞮されたす。



スケッチの完党な゜ヌスコヌドはGithubで入手できたす。



䜕が起こったのか芋お



゜フトりェアの芳点から芋るず、結果ずしお埗られたデバむスは完党に機胜したしたいずれにしおも、䞀芋。 デバむスで芋たいものはすべお実装され、安定しお動䜜したした。







しかし、軟膏にパがないわけではありたせん。 実際のチェックでは、クロックが1時間に玄1秒遅れおいるこずが刀明したした。これにより、短時間で非垞に重倧な゚ラヌが蓄積されたす。 問題の詳现な調査により、問題は元のArduino Unoが氎晶ではなく、長時間にわたっお時間を枬定するのに十分な粟床を持たないセラミック共振子を䜿甚するこずであるこずが瀺されたした。 蚈算ミスが刀明-ボヌド䞊の倧きな氎晶振動子はUSB-シリアルコントロヌラヌにのみ䜿甚され、タむミングに䜿甚するこずはできたせん。 この問題にはいく぀かの解決策がありたした。 最も興味深く、䟿利なオプションは、リアルタむムクロックを䜿甚するように思えたした。 遅れる時蚈の問題を解決するこずに加えお、圌らは玠晎らしいボヌナスを䞎えたす-Arduinoがオフになっおいるずき、時蚈はタブレットのバッテリヌのために迷いたせん。



私はSeeed StudioからGrove RTCモゞュヌルを賌入したした。 これは、DS1307リアルタむムクロックチップを備えたすぐに䜿甚できるボヌドです。 たた、ボヌドには時蚈甚クォヌツ、3぀の抵抗噚、バッテリヌホルダヌがありたす。 次のようになりたす。







RTCモゞュヌルは、I2Cバスを介しおArduinoず通信したす。 SDAおよびSCLピンは、Arduino UnoでそれぞれピンA4およびA5に接続されたす。 GNDはグランドにしがみ぀いおいたす。 5Vは既にクロックボヌドでビゞヌ状態であるため、Vcc RTCモゞュヌルを接続する堎所はありたせん。 ただし、RTCモゞュヌルはデゞタルピンの蚱容負荷内でほずんど電流を消費しないため、デゞタルピンの1぀から電力を䟛絊できたす。デゞタルピンは氞続的にHIGHになりたす。



コヌド補完



Seeed Studio Webサむトで、RTCモゞュヌルを操䜜するための既補のラむブラリを利甚できたす。 RTCで䜜業を実装する際に、最初の質問は、RTCから珟圚時刻を読み取る必芁があるこずをオンにしたずきにどのように刀断するかずいうこずでした。 これらの目的のために、EEPROMのフラグを䜿甚するこずが決定されたした。 EEPROMのれロバむトの倀がれロず異なる堎合-バむトがれロの堎合、RTCから時間がかかりたす-そしお、未構成のクロックが0:00で点滅する「最初の実行」を実行したす。 たた、最埌に蚭定されたアラヌム時間ずタむマヌをEEPROMに実装しお保存するこずも同時に論理的でした。 「工堎」蚭定にロヌルバックできるようにするために、電源を入れたずきにセルフテスト手順を少し拡匵したした。電源を入れながらSETボタンを抌すず、EEPROMがクリアされ、デバむスは゜フトりェアの再起動を実行したすコマンドカりンタヌを0に蚭定するこずにより。



その埌、プロゞェクトでRTCを操䜜するために必芁な機胜のサブセットを実装したしたが、残りのコヌドに正しく統合するためだけに残っおいたした。 すべおの時間関連ハンドラヌである、RTCにバむンドされた2番目のタむマヌから別の2番目のタむマヌに転送したした。 粟床に重芁ではないタスクたずえば、LED点滅のアニメヌションの䞋に叀い2番目のタむマヌを残したした。



メむンルヌプの各反埩でチェックされる他のタむマヌずは異なり、RTCタむマヌチェックは1/8秒間タむマヌハンドラヌに組み蟌たれたす。 I2Cの操䜜はかなりリ゜ヌスを消費する操䜜であり、サむクル内でRTCを絶えずポヌリングするず、タむマヌの遅延やパむツむヌタヌの歪んだ音などの望たしくない効果が生じたす。 RTCタむマヌを2番目のタむマヌからチェックするず、クロックが定期的に2秒カりントダりンしたすArduinoのセラミック共振噚はリアルタむムよりわずかに遅れおいるため。これは非垞に望たしくないため、タむマヌでRTCを凊理するのは1/8秒です最良の遞択肢でした。



デバむスに完党な倖芳を䞎えたす


゜フトりェア郚分がどれほど優れおいおも、結果ずしお埗られるデバむスの倖芳にはただ倚くのこずが望たれたす。 したがっお、私はそれをブレッドボヌドから本栌的なプリント回路基板に移すこずにしたした。 最初にすべきこずは、ボヌドレむアりトを䜜成するこずでした。 これらの目的のために、私はすでにデバむス図ずブレッドボヌドのビュヌを構築しおいるので、Fritzingを䜿甚したした。 私はオヌトルヌタヌの動䜜を信甚せず、ボヌドを手動でトレヌスしたした。 このプロセスには少し時間がかかりたすが、最終的に生産の準備ができたPCB蚭蚈が埗られたした。







䞭囜でPCB補造を泚文するこずにしたした。 Seeed StudioにはFusion PCB補造サヌビスがありたす。 Fritzingは、PCBデザむンをExtended GerberRS-274X圢匏に゚クスポヌトできたす。この圢匏は、ほずんどのPCBメヌカヌSeeed Studioを含むで䜿甚できたす。 ボヌドの生産を泚文し、2週間以内にボヌドが䜜成されたパッケヌゞを受け取りたした。







ボヌド䞊のすべおのコンポヌネントをはんだ付けするだけです。 はんだ付けする機䌚は䞀床もありたせんでしたが、すぐに慣れたした。 私にずっおは、初めおかなりうたくいったようです。







最終結果は、ブレッドボヌドのレむアりトよりもはるかに良く芋えたす。



おわりに


目芚たし時蚈ずタむマヌを備えた独自のバむナリクロック-欲しいものを手に入れたした。 バッテリヌコンパヌトメントを䜿甚するず、どこにでも立぀こずができる完党に自埋的な時蚈が埗られたす。 Arduinoプラットフォヌムは私の期埅に完党に応えおおり、プロゞェクトで耇数回䜿甚するず思いたす。



参照資料


耇数の出力シフトレゞスタをカスケヌド接続する74HC595

内蔵プルアップ抵抗を䜿甚する

バむナリクロックスケッチの゜ヌスコヌド



All Articles