
ボタンを押すと、インジケーターに乱数が表示されます。 ここでチャンスとは何ですか、どこから来たのですか? すぐに秘密を教えましょう。 番号は、0、1、2などの順序で生成されます。 トリックはこれです:非常に高い脈拍数。 それらは非常に迅速に発行されるので、数字はインディケーター上の1つにマージされます。 そして、数字を推測することは絶対に不可能です!
次に、そのようなジェネレーターがどのように配置されているか、そしてそれを自分で組み立てる方法についてお読みください。
背景

現時点では、エレクトロニクスの基礎とArduinoでのプログラミングの2つのコースを積極的に開発しています。 各コースについて、ビデオ資料を作成し、ガイドラインを作成し、既製のセットを収集します。
Arduinoコースはすでに適切に設計されています。素晴らしいオンラインコースが準備されており、最近、自然科学技術部門でEdCrunch OOC賞を受賞しました。
しかし、エレクトロニクスの基礎に関する方向性には大きな展望があります。Arduinoほど有名で人気もありません。つまり、方法論の研究には大きな範囲があります。 たとえば、友好的なGoToCampスクールでは、Arduinoが長い間使用されていますが、「クリーン」な電子機器には誰も関与していません。 私は先輩と一緒に小さなマスタークラスを開催するよう招待されました。 その時点までに彼らがすでにArduinoに従事していたことは注目に値します。つまり、点滅するLEDからのすごい効果を期待する価値はありませんでした。 したがって、私はマスタークラスのプログラムを慎重に考え、結果についてさらに書きます。

キャンプ自体と私のイベントに関する写真レポートがサイト「Entertaining Robotics」に掲載されています。この資料では、技術的な詳細を少し明らかにしたいと思います。
私が持ってきたサイバーフィジックスセットから回路を収集しました。

「鉄」乱数ジェネレーターの仕組み
これが、私が作成することを提案した乱数ジェネレーターの図です(クリック可能):
複雑に見えますか? 実際、それはプログラマーの心に近いものです。 結局のところ、それは4つの別々の要素でできています-4つの機能のプログラムとして。 さらに、コンポーネントは単純に結合されます。1つの要素の出力が次の要素の入力にリダイレクトされます。

Linuxでプログラミングしたい人は、おそらくパイプの概念を覚えているでしょう-このような「パイプ」はダッシュ「|」で示され、多くの小さなプログラム(異なるプログラミング言語で書かれたものでも)から作業スクリプトをすばやく作成できます。 個人的に、私は単にこれらの「パイプ」を崇拝し、しばしばそれらを使用します。 配管工のマリオのように感じる
次に、このスキームの要素をより詳細に検討します。
パルス発生器
最も一般的なタイマー555は、パルスジェネレーターとして機能し、出力で、カウンターを「プッシュ」して値を加算する一連のパルスを生成します。
タイマーチップの内部構造は、初心者に説明するのは非常に簡単ではありません。 しかし、一方で、このチップは、「ブラックボックス」モードのようなプログラマーとして使用するのに非常に便利です。 555タイマーピン:

この図では、電源リード線は赤、入力は緑、出力は青です。 私はチップのピン配列を描くこの方法が好きで、英語版ウィキペディアからそれを取りました。
そして、このチップが私たちの回路で具体的にどのように使用されるかを次に示します。 複雑なことはありません-標準スキームによると、完全に標準的な方法で

タイマーの動作モードは、抵抗R1とR2、コンデンサC1の3つの要素で設定されます。

この式の値を代入するだけで(または、 計算が面倒な場合はオンライン計算機を使用して)、40 Hzの周波数、つまり1秒あたり40の振動を取得します。 したがって、期間は25ミリ秒であり、人間の目はインジケーターの数のこのような頻繁な変化に決して気付かないでしょう。
4番目のピンはリセットを担当し、逆モードで動作します。リセットを発生させるには、マイナスに閉じる必要があります。 したがって、プルアップ抵抗を介して、電源の「プラス」に接続され、「マイナス」のボタンを介して接続されます。 リセットボタンを押している間、タイマーは静止し、何も出力しません。この時点で、インジケーターの数字を賞賛できます。
カウンター
カウンターは非常に単純なもので、プログラミングのi変数のようなものです。 カウンターはそれ自体に数値を蓄積します、それだけです。 そして、増分パルスは外部パルスで発生します。 あなたはボタンに触れるだけでそれを行うことができます、または、私たちの場合のように、タイマーからすることができます。
カウンターチップは次のように配置されています。

- 数字は、出力Q1 ... Q4に2進数として出力されます
- 15番目の出力の信号(「クロック信号」)に従って、カウンタは1
- 10進モードでは、桁9の後、カウンターはリセットされ、0から再び開始します。
この回路では、カウンターも非常に簡単に接続されています。
- U / D入力(カウント方向)は電源の「プラス」に接続されているため、カウントは昇順になります。
- 結論PE(プリセット解像度)、J1 ... J4(カウンタープリセット用のデータ入力)、B / D(バイナリカウントモード)、CIおよびCO(転送入力および出力)はすべて、この回路で機能するため、グランドに接続されます。必要ありません
デコーダー
プログラミングとの類似性を再度説明すると、デコーダはライブラリ関数のようなもので、「標準の7セグメントインジケータ」タイプのオブジェクトの発光セグメントのセットに2進数を設定します。 マイクロコントローラを介してこれらすべてを自分で処方するオタクもいます。Arduinoと「純粋な」ATMegaの両方の例を見ました。 それをしないでください! このための特別な便利なチップもあります!

ここで最も重要なのは、2進数の入力(A、B、C、D)と出力( "a" ... "f")です。これらは同じ文字でマークされた対応するセグメントに直接接続されています。

サービス入り口:
- 指標テスト(LT)およびその消滅(Bl)の入力は「プラス」に設定されます
- 数値を「凍結」するための入力(LE)は「マイナス」です。
7セグメントインジケータ
ここではすべてが非常に簡単です。 共通カソードを備えた7セグメントインジケータが使用されます。

各LEDは、電流制限抵抗を介して接続されています。 抵抗器を節約し、1つの抵抗器のみで7セグメントを接続しようとする人もいます。この場合、インジケーターのドキュメントに特別な図があります。

左側は「健康な人をつなぐ」です。 各LEDは独自の抵抗器を介しています。 右側には「喫煙者接続」があり、抵抗器は1つだけです。 この規則に従わない場合、一部のLEDが他のLEDよりも電流が多くなるため、セグメントが不均一に発光します。
乱数ジェネレーター回路
以上です! 今、そのようなスキームを自分で組み立てたい人のために:

コンポーネントのリスト:
- タイマーIC NE555
- カウンターマイクロサーキットCD 4029
- CDデコーダーチップ4511
- 時計ボタン
- 7セグメント共通カソードインジケーター(例:キングブライトSC56-11SRWA)
- 電解コンデンサ10μF、25 V以上の動作電圧
- 1.2kΩ抵抗器:3個
- 560オーム抵抗:7個
- ジャンパー
- 無はんだブレッドボード
- バッテリー(この例では9ボルトですが、回路はより広い範囲でも機能します-5から12ボルトまで、抵抗を調整するだけです)
- バッテリーコネクター
組み立て図(クリック可能な写真):

なぜこれが必要なのですか?
多くの人が尋ねるかもしれません:なぜ「鉄」の乱数発生器が必要なのでしょうか? マイクロコントローラーを取り、プログラムするのは簡単ではありません...結局のところ、乱数ジェネレーターは誰もが知っている既成のソリューションです!
それから、仲間のグループで、フィールドロールプレイングゲーム「エイリアンアンダーザグラウンド」(当然、有名な映画に基づいて)の技術装備に参加した方法の話を思い出しました。 ゲームの重要な要素は懐中電灯でした。懐中電灯は、しばらくの間「オン」オフになって、ひどく絶望的な雰囲気を作り出しました。 小さな懐中電灯の場合、マイクロコントローラを備えた小さな回路基板が非常に小さくレイアウトされていたため、標準の乱数発生器ライブラリはプログラムとともにプログラムに適合しませんでした! 最適化する時間はありませんでした。マイクロコントローラーを交換することも不可能でした。
その結果、私は真剣に代替オプションに目を向けるようになりました-マイクロコントローラの自由に「ハング」する入力から値を取得するために、ADCから。 私もそれをテストしましたが、結果は完全にランダムではないことを覚えています(一部の値は他の値よりも頻繁に体系的に満たされました)が、ゲームのニーズには非常に適していました。 マイクロコントローラの腸から純粋に数学的な方法で擬似乱数を作成することは、外界から直接不確実性をとるよりも難しいことが判明したのは面白いです...
ハードウェア乱数ジェネレーターについては、Wikipediaの良い記事があります。
まとめ
GoToCampで行ったマスタークラスは、10代の高校生がすべての手順を詳細に説明し、10のより簡単なエントリーレベルのスキームの形で予備的な「負荷」を与えると、そのようなスキームを完全に組み立てて理解できることを示しました。

連中は、いくつかの単純なスキームを1つの複合体に組み合わせた重要な経験を得ました。 パルスジェネレータ、カウンタ、デコーダ、7セグメントインジケータを組み合わせて、1つの回路(乱数ジェネレータ)にしました。 小さな回路間の明確なインターフェースのおかげで、これがどれほど簡単に行われたかに注目してください。 最初の回路-パルス発生器-は出力に蛇行、つまり矩形信号を持っています。 この蛇行の周波数は、カウンターの速度を設定します。 カウンターは、バイナリコード言語でデコーダーと「通信」します。 そして、それは、7セグメントインジケーターに既に便利な形式でデータを転送します。

写真では-携帯電話のストップウォッチを使用して乱数発生器をテストします:)
このスキームのシンプルさと一貫性は、その中の超小型回路が最も簡単に適合するように選択されているという事実によるものです。 したがって、エンジニアとプログラマの両方の将来の結論は、コンポーネント間の相互作用をよく理解し、コンポーネントが互いに最も簡単で理解しやすい言語で「通信」できるように選択することです。
そして最も重要なこと-既製のソリューションと成功したプラクティスを学びましょう! 私たちの前にはすでに多くのことが発明されています。 すでに自信に満ちたarduinoや筋金入りのマイクロコントローラーであっても、デジタルエレクトロニクスのABCを学んでください。 なぜこれらのケースや他のケースが役に立つのか、あなたは決して知りません。

著者は、 サイバーフィジックス製品の開発者であるモスクワ物理技術研究所 (技術的創造性の開発を支援する方向)の技術技術センターの教育的および組織的作業の専門家であるTatyana Volkovaです。