非芏範的回路ATtiny13の7セグメントむンゞケヌタヌ

単玔な方法を探しおいるのではありたせん。




画像



以前、それは私の最初の出版物で、Habrのナヌザヌの間で共鳎を匕き起こしたした。 停止しないこずにしたした。 ATtiny13から䞍可胜を絞り出し続けおいたす。 すぐに譊告したす。説明されおいる解決策は再び非暙準であり、誰かがinりや認知的䞍協和を匕き起こす可胜性がありたす「そしお、蚘事のポむントは䜕ですかどの芁玠を接続できるかを瀺したすか」。 さらに、そのような解決策も実際には非実甚的です。これに぀いおは、以䞋で詳しく説明したす。 しかし、暙準゜リュヌションが長い間知られおおり、それらに぀いお読むこずは必ずしも面癜くありたせんが、曞くこずは恩知らずです。



私はこの子䟛ATtiny13が本圓に奜きです。 圌は倚くの家庭問題を解決するのに十分な頭脳を持っおいたす照明を぀けお、換気をし、 ビヌルのために店に逃げたす 。 そしお、䟡栌はばかげおいたす。 ここにはほんの数本の足があり、ハンドルはたったくありたせん。 したがっお、足の䞍足の問題を解決するには、あらゆる皮類のトリックに行く必芁がありたす。



マむクロコントロヌラヌのプログラミングを研究する過皋でArduino環境では、誰にも蚀わないでください私は、倚くの人ず同様に、次のような超音波距離センサヌを接続するステップを通過したした。



画像



センサヌからコントロヌラヌに情報を送信する方法は䞍名誉であるため、ATtiny13はこれに簡単に察凊したす。 次に、シフトレゞスタを䜿甚しお7セグメントむンゞケヌタヌに情報を衚瀺する必芁がありたした。 ぀たり、衚瀺郚分のスキヌムはコントロヌラヌ自䜓の数倍でした。 その瞬間、私はあちこちで遊んで動きたした。



最近、私は、ティンカに割り圓おるのに圧倒的な仕事は他にあるだろうず思いたしたか 説明された䟋で圌女がただ凊理できなかったこず。 適応症に぀いお最初に思い出したこず。 しばらく前に、私はすでに同様のトピックに関する情報を探しおいたした。 それから私はそのような興味深い オプションを芋぀けたした。



写真
画像



コントロヌラヌの5フィヌトから21セグメント。 わあ あたり必芁ありたせん。2぀の暙識で十分で、さらに1぀のドット、合蚈15セグメントです。 そしお、4本の足で 次に、最倧13セグメントを取埗したすが、十分ではありたせん。 回路を芋るず、すぐに組み立おお詊しおみたいずいう芁望が生じたしたが、操䜜アルゎリズムを䜜成するのは簡単ではありたせん。 しかし、よく芋るず、あなたはそれが収集するのに圹立たないこずを理解したす、そのような7セグメントの動物は自然には存圚したせんほずんどの堎合。 もちろん䜜成できたすが、これは異なるレベルです。 その埌、アむデアはより良い時期たで延期されたした。



オフトピック統合ロゞックを持぀7セグメントむンゞケヌタヌがないのはなぜですか 開発者はどこを芋おいたすか むンストヌルず制埡の䟿利さ-2぀の電源レッグず31、2デヌタレッグ。 そしお結局のずころ、圌らは゜連にさえいた490IP1、490IP2。 2〜4桁の最も䞀般的なむンゞケヌタ内には、チップのマむクロ回路を配眮するための十分なスペヌスがあり、シフトレゞスタの䟡栌はケヌスずずもに0.064 cuです。 たあ。



そしお、私は再び考えたした、7セグメントむンゞケヌタヌで䜜業するための脚の数を枛らす方法 コントロヌラヌの出力は3぀の状態を取りたす実際には4ですが、今では重芁ではありたせん。 これを䜿甚する方法はありたすか LEDに関する2぀の状態が、茝くものではなく、茝くものずしおのみ解釈できる堎合、3぀ではもう少し興味深いものになりたす。 䜿甚方法はただわかりたせんが、次のスキヌムが思い浮かびたした。



画像



コントロヌラヌ出力がれロ状態の堎合、LEDは点灯したせんこれは明らかです。



出力がナニット状態の堎合、LEDが点灯したすが、これも理解できたす。



ただし、出力がたったく出力ではなく、入力に切り替えられた堎合、2぀の抵抗ずLED HL1の回路に電流が流れ、抵抗の接続点で玄5-1.7/2.2 + 1.5の電圧降䞋が生じたす* 1.5 + 1.7 = 3.0V。これは、VD1_R3_HL2回路に電流を流すには䞍十分です玄3.4 Vが必芁です。 VD1はツェナヌダむオヌドずしお䜿甚される远加のLEDです安定噚の方が正確です。したがっお、混乱しないように、LEDずは芋なしたせん。 マむクロコントロヌラ内郚でプルアップ抵抗がオンになっおいおも問題ありたせん。その抵抗20 kOhmは実際には状況に圱響したせん。 すぐにそのような定栌には至りたせんでしたが、その前にVD1ずしお通垞のダむオヌドを䜿甚しおみたしたが、同じ抵抗噚R1ずR2でも十分に機胜したす。 ただし、R2の方がR1の玄1.5倍倧きい方が良いです。 そしお、私は最も重芁なこずをほずんど忘れおいたした。説明されたすべおは、むンゞケヌタず远加のLEDの䞡方で赀色 LEDを䜿甚するこずによっおのみ可胜です。 極端な堎合、むンゞケヌタたたは远加のLEDを緑色に適甚できたす。 たた、4.5 V〜5 Vの䟛絊電圧で



最埌に䜕がありたすか 3぀の状態LEDなし0が点灯、HL11が点灯、たたはHL1ずHL22が点灯。 䞉元系に非垞に䌌おいたす。 ただし、HL1なしではHL2を点灯できたせん。これは芚えおおく必芁がありたす。 しかし今では、マむクロコントロヌラヌの4本の脚の助けを借りお、8個のLEDを制埡できたす私はそう思っおいたした。



次に、むンゞケヌタヌセグメントをペアに分割しようずしたした幌皚園のように男の子ず女の子。 䞻な条件は、各ペアでセグメントの1぀がそれ自䜓で茝くこずができないこずです、そのような差別。 ここに私が埗たものがありたす



画像



セグメントの4぀のペア。各倧文字で、支配的なセグメントが瀺されたす。これは単独で機胜し、2番目のセグメントはそれのみで機胜したす。 セグメント "a"が䞀床に2぀で攪拌され、だれも悪い点に達しおいないこずに気付くかもしれたせん。 それは人生のように芋えたす



ただし、これらのペアを䜿甚するず、ほがすべおの数倀を衚瀺できたす。



写真
画像



各ペアは、独自の色でペむントされたす。 気配りのある芖聎者は、デュヌスに䜕か問題があるこずに気付きたした。 今のずころこれに焊点を合わせたせん。 セグメントをグルヌプ化するためのオプションをいく぀か詊しおみたしたが、衚瀺されない方が良いでしょう。 たぶん誰かが提案するでしょう。 おそらく、ニュヌラルネットワヌクで凊理できたす。



実隓の第2段階では、アノヌドが共通のむンゞケヌタヌを䜿甚する必芁がありたした。 したがっお、最終的なスキヌムは次のずおりです。



スキヌム
画像



誰かが尋ねるかもしれたせん100オヌムの抵抗はどこに行きたしたか 正しく衚瀺された動的な衚瀺により、電流制限抵抗を省くこずができるこずは長い間知られおいたすそしお積極的に䜿甚されおいたす。 誀っお盎列に接続された2぀のLEDにコントロヌラヌの出力から電圧が垞に印加されおも、マむクロコントロヌラヌずLEDは通垞これに耐えたすが、電流はMC内の遷移抵抗によっお制限されたす。 そしお、抵抗噚に぀いおの詳现。 前のスキヌムに埓っおHL1を流れる最倧電流は玄2 mAであり、HL2を流れる最倧電流は25〜40 mAですおそらく、これらの数倀がどこから来たのかを埌で説明したす。 これは、異なるセグメントの光出力が異なるこずを意味したす。 ただし、動的な衚瀺が䜿甚されるため、セグメントの衚瀺時間が異なるため、これは簡単に解決できたす。



Arduino IDEのArduino Nanoで行ったすべおの実隓。 優れたプロトタむピングボヌドであり、ブレッドボヌドで心地よく、USB経由で問題なくフラッシュされたす。 䜕かが倱敗したしたか スケッチを修正し、すぐに新しいファヌムりェアをアップロヌドしたした。 そしお、コヌドをデバッグするず、ATtiny13のファヌムりェアに移動できたすが、それでも少し䜓の動きが必芁です。



ずころで、私はArduino環境でArduinoを䜿甚しおフラッシュしおいたす。これにより、間違ったヒュヌズでMKをロックする可胜性が実質的になくなり、はるかに簡単になりたす。



コヌドに数字の4を衚瀺する䟋を次に瀺したす。



pinMode(f_a, INPUT); //    f_a   digitalWrite(f_a, 1); //   F pinMode(d_e, OUTPUT); //    d_e   digitalWrite(d_e, 1); //     1,     D  E pinMode(b_a, INPUT); //    b_a   digitalWrite(b_a, 1); //   B pinMode(c_g, OUTPUT); //    c_g   digitalWrite(c_g, 0); //     0,   C,  G delayMicroseconds (150); // F, B, C, G c  150  pinMode(c_g, INPUT); //    c_g   digitalWrite(c_g, 1); //   G ,     delay (time_2); // F, B, C c  2 
      
      





原則ずしお、すべおはArduinoに粟通しおいないが、コントロヌラヌに぀いおは少し理解しおいる人にずっおも明確でなければなりたせん。 150マむクロ秒ず2ミリ秒の数倀は、セグメントの明るさによっお実隓的に遞択されたす。 最終的なコヌドでは、デバッグ䞭に倉曎できるように、個別の倉数に配眮する必芁がありたす。 これらの図から、1぀のペアの2぀のセグメントにたたがる電流の差の順序を近䌌的に決定するこずができたす。 Gセグメントは他のセグメントよりも玄13倍も明るく、同じ茝床を提䟛するため、このセグメントを流れる電流は他のセグメントよりも13倍倧きいず想定できたす。 実際、茝床の電流䟝存性は非線圢であるため、電流は25倍、぀たり50 mAになりたす。 このようなデュヌティサむクルを䜿甚するこずは、MKの出力にずっお非垞に安党です。 ずころで、図2の問題を解決するずき、この電流の違いが手にかかりたす。䞊で曞いたように、セグメントGはセグメントCでのみ照らすこずができたす。しかし、CずG 1を維持するために2ミリ秒、Gセグメントは完党な明るさで「動䜜」し、Cセグメントは同じ150マむクロ秒の間、わずかな時間しか点灯したせん。 ほが2぀になりたす。 したがっお、私は自分で確立したルヌルを砎るこずに成功したした。 絶望から䜕ができないのか。



そのため、MKの4本の足で人物を照らしたした。 実際、私は自分でこのステヌゞを逃し、すぐに2人のキャラクタヌを衚瀺したした。 これを行うには、パワヌプラスからむンゞケヌタビットの1぀の共通アノヌドの出力を切断し、MCの別のピンに接続し、他の攟電のアノヌドを次の出力既に6レッグに接続したす。 次に、最䞋䜍桁のアノヌドに1を蚭定し、最䞋䜍桁のディゞットを衚瀺し、次に最䞋䜍桁のアノヌドに1を蚭定し、最䞊䜍桁のディゞットを円で衚瀺したす。 この実隓はArduino Nanoで実斜したしたが、足は十分です。 初めおではなく、すべおのコヌドがデバッグされたした。 そしお、それはそうあるべきだった。



スキヌム
画像



アノヌドは順番に接続されおいるため、単玔な改良により、MKのもう1぀の出力を解攟できたす。 抂芁図は次のずおりです。



スキヌム
画像



合蚈5脚MKを䜿甚しお、2桁の数字を衚瀺したす。 この時点で、あなたはすでに赀ちゃんのATtinyで詊すこずができたす。 私がやった。 しかし、すぐではありたせん。 ATtiny13甚にArduino環境でコンパむルされたスケッチは、玄1.7 kBのメモリず1 kBの空き容量を占有したした。 サむズを小さくするには、ポヌトを盎接有効にする必芁がありたしたが、これは埌で行いたす。 ずころで、Arduinoでは、ATtinyで䜿甚するのず同じポヌトを䜿甚したした。非垞に䟿利です。 それらはすでに最埌の図に瀺されおいたす。 凊理埌、コヌドは1キロバむトを倱いたした。



ATtiny13の結果のコヌドは次のずおりです。



コヌド
 #define time_2 2 //    ,  #define time_3 150 //    ,  byte in1_; byte in2_; int disp_; int d_ = 0; void setup() { } void loop() { d_ = d_ + 1; if (d_ > 150) { //    150     1 d_ = 0; disp_ = disp_ + 1; if (disp_ > 99)(disp_ = 0); //   0  99 } in2_ = disp_ / 10; //     -    10 in1_ = disp_ % 10; //          10 } switch (in1_) { case 0: DDRB = B00001111; PORTB = B00010000; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 1: DDRB = B00000111; PORTB = B00000110; delay (time_2); break; case 2: DDRB = B00011111; PORTB = B00000010; delayMicroseconds (time_3); DDRB = B00010011; PORTB = B00010010; delay (time_2); break; case 3: DDRB = B00011011; PORTB = B00000110; delayMicroseconds (time_3); DDRB = B00000011; delay (time_2); break; case 4: DDRB = B00010101; PORTB = B00001110; delayMicroseconds (time_3); DDRB = B00000101; delay (time_2); break; case 5: DDRB = B00011011; PORTB = B00001100; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 6: DDRB = B00011111; PORTB = B00001000; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 7: DDRB = B00001111; PORTB = B00010110; delayMicroseconds (time_3); DDRB = B00000111; delay (time_2); break; case 8: DDRB = B00011111; PORTB = B00000000; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 9: DDRB = B00011011; PORTB = B00000100; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; } switch (in2_) { case 0: DDRB = B00001111; PORTB = B00010001; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 1: DDRB = B00000111; PORTB = B00000111; delay (time_2); break; case 2: DDRB = B00011111; PORTB = B00000011; delayMicroseconds (time_3); DDRB = B00010011; PORTB = B00010011; delay (time_2); break; case 3: DDRB = B00011011; PORTB = B00000111; delayMicroseconds (time_3); DDRB = B00000011; delay (time_2); break; case 4: DDRB = B00010101; PORTB = B00001111; delayMicroseconds (time_3); DDRB = B00000101; delay (time_2); break; case 5: DDRB = B00011011; PORTB = B00001101; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 6: DDRB = B00011111; PORTB = B00001001; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 7: DDRB = B00001111; PORTB = B00010111; delayMicroseconds (time_3); DDRB = B00000111; delay (time_2); break; case 8: DDRB = B00011111; PORTB = B00000001; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 9: DDRB = B00011011; PORTB = B00000101; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; } DDRB = B00011111;//   PORTB = B00011110; delay (5); }
      
      







䞊蚘のコヌドにより、ATtiny13は0から99を読み取るこずができたす。MKレッグを再割り圓おする可胜性を提䟛する方がより適切です。 プログラミングの達人は、コヌドを数回枛らすこずができたす AVRのHello Worldの最小制限はどこですか 。



MKが意識的なものを衚瀺するように、必芁な機胜をコヌドに远加できたす。 確かに、ティンキはすでにすべおの足を占有しおいたす。 入力/出力ポヌトずしお䜿甚できるリセットレッグもありたす。 しかし、それを䜿甚するこずは思ったより困難でした。 したがっお、私自身は「埌で」を残したす。 しかし、誰もが知っおいるわけではない興味深い機胜がありたす。 ADC0アナログ入力は同じレッグに出力され、機胜したす 確かに、その電圧が電源電圧の1/4未満になるず、MKはリセットモヌドになりたす。 しかし、1/4から䟛絊電圧たで、入力電圧を枬定するこずはかなり可胜です。 私はこれを利甚したした



コヌド
 #define time_2 2 //    ,  #define time_3 150 //    ,  byte in1_; byte in2_; int disp_; int d_ = 0; void setup() { } void loop() { d_ = d_ + 1; if (d_ > 50) { //   50 ... d_ = 0; disp_ = analogRead(A0) / 10; // ...   ,   10,    . if (disp_ > 99)(disp_ = 99); in2_ = disp_ / 10; //     -    10 in1_ = disp_ % 10; //          10 } switch (in1_) { case 0: DDRB = B00001111; PORTB = B00010000; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 1: DDRB = B00000111; PORTB = B00000110; delay (time_2); break; case 2: DDRB = B00011111; PORTB = B00000010; delayMicroseconds (time_3); DDRB = B00010011; PORTB = B00010010; delay (time_2); break; case 3: DDRB = B00011011; PORTB = B00000110; delayMicroseconds (time_3); DDRB = B00000011; delay (time_2); break; case 4: DDRB = B00010101; PORTB = B00001110; delayMicroseconds (time_3); DDRB = B00000101; delay (time_2); break; case 5: DDRB = B00011011; PORTB = B00001100; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 6: DDRB = B00011111; PORTB = B00001000; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 7: DDRB = B00001111; PORTB = B00010110; delayMicroseconds (time_3); DDRB = B00000111; delay (time_2); break; case 8: DDRB = B00011111; PORTB = B00000000; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 9: DDRB = B00011011; PORTB = B00000100; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; } switch (in2_) { case 0: DDRB = B00001111; PORTB = B00010001; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 1: DDRB = B00000111; PORTB = B00000111; delay (time_2); break; case 2: DDRB = B00011111; PORTB = B00000011; delayMicroseconds (time_3); DDRB = B00010011; PORTB = B00010011; delay (time_2); break; case 3: DDRB = B00011011; PORTB = B00000111; delayMicroseconds (time_3); DDRB = B00000011; delay (time_2); break; case 4: DDRB = B00010101; PORTB = B00001111; delayMicroseconds (time_3); DDRB = B00000101; delay (time_2); break; case 5: DDRB = B00011011; PORTB = B00001101; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 6: DDRB = B00011111; PORTB = B00001001; delayMicroseconds (time_3); DDRB = B00001001; delay (time_2); break; case 7: DDRB = B00001111; PORTB = B00010111; delayMicroseconds (time_3); DDRB = B00000111; delay (time_2); break; case 8: DDRB = B00011111; PORTB = B00000001; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; case 9: DDRB = B00011011; PORTB = B00000101; delayMicroseconds (time_3); DDRB = B00000001; delay (time_2); break; } DDRB = B00011111;//   PORTB = B00011110; delay (5); }
      
      







経隓によれば、むンゞケヌタヌを21たで枛らすこずができるのは、MKがリセットモヌドに切り替わり、玄25以䞊に戻ったずきに機胜し始めるこずです。 そのため、枬定入力にディバむダヌを䜿甚するず、25〜99ボルトの電圧を瀺すための非垞に間違った「むンゞケヌタヌ」を䜜成するこずができたす。



次に、実甚的なアプリケヌションに぀いお説明したす。 距離センサヌからのデヌタを衚瀺するずいう圓初のアむデアは、1぀のデゞタル入力が䞍足しおいるため、より良い時期たで延期されたした。 アむデアが来るたで、なぜ他にスキヌムを適甚できるのでしょうか。 もう1぀の泚意点収益性に疑問の䜙地はありたせん。 すべおのセグメントを完枈したずしおも、抵抗噚R2には2.5 mAの電流が流れ最初のスキヌムに埓っお、合蚈10 mAがむンゞケヌタに流れ、さらにトランゞスタの制埡により玄5が远加されたす。 蚀及しなかったが、ほがすべおのpnpのトランゞスタは近代的だ。



䟿宜に぀いお。 7぀のセグメントに出力する最も安䟡なオプションは、ATtiny13ず74HC595です。 2぀のSMDケヌスの費甚は玄0.50 cu 最も単玔なのはATmega8それだけです、抵抗噚はありたせん、それ以䞊、0.68 cuです たた、䞊蚘のオプションはATtiny、9個の抵抗、4個のLED、トランゞスタすべおSMDのコストです。これは玄0.46 cuです。 さらに、すべおをたずめるこずは、以前のバヌゞョンよりも耇雑です。



実際、私が芋る唯䞀のオプションは、あなたが完党なATtiny13を持っおいるかどうかですが、それでもあなたはATmegaの店に行く必芁がありたす。 7セグメントむンゞケヌタヌがデバむスの䞻芁な装食である堎合、このスキヌムはお勧めしたせん。衚瀺は完党ではなく、いく぀かの組み合わせでは、䞍芁なセグメントがわずかに匷調衚瀺されたす。 蚭定時に堎所の衚瀺が必芁な堎合があり、堎所自䜓が必芁な堎合がありたす。



䞀般に、私は数日間無駄に過ごしたした。



批刀に加えお、コヌドを改善しおスキヌムを簡玠化するための提案を埅っおいたす。 たたは、耇雑化するこずなく機胜を改善したした。 私が最も興味を持っおいるのは、ポむントを照らす方法です。これにより範囲が広がりたす。 しかし、関連する5぀から1぀の結論をリリヌスできれば、ロヌミングが可胜になりたす。



私の非暙準の゜リュヌションが誰かの利益になるずしたら、今はい぀かは嬉しいです。



UPDCharliplexingに぀いお知っおいたす 蚘事の冒頭で匕甚したサヌドパヌティのスキヌムは、Charliplexingです。 そしお、そこでCharliplexingが適切でない理由を曞きたした。

蚘事を斜めに読んだ堎合はコメントを曞かないでください。



All Articles