XODを使用したコードフリーLCDメニュー生成
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 |
アプリとオンラインサービス
|
このプロジェクトについて
Arduino開発ボードに電力を供給するプロセッサは、おじいちゃんのマイクロコントローラではありません。これらのプロセッサは、深刻な処理能力を備えており、さまざまな種類の物理ハードウェアとセンサーを同時に監視および制御するために使用できます。 Arduino用のXODグラフィカルプログラミングIDEは、ラピッドプロトタイピングハードウェア設計のタスクを簡素化できますが、システムが複雑になるにつれて、ユーザー制御と情報管理の問題があります。論理的な方法でそれを制御します。専用のボタンとスイッチは単純なプロジェクトで機能しますが、すぐにそれらを配置する論理的な方法(またはエンクロージャーに配置する場所)がなくなります。多くのデザインでは、この種のフィードバックを提供するために何らかのタイプのディスプレイを使用しています。設定の編集と調理時間の入力を可能にする小さな画面。あいまいな設定にアクセスするには「メニューダイビング」が多すぎるとユーザーエクスペリエンスが損なわれる可能性がありますが、メニュー方式のインターフェイスはあらゆる種類のプロジェクトにとって現実のものです。
マイクロコントローラー用のCまたはC ++でメニューベースのインターフェイスを開発するためのソフトウェアフレームワークは、多くの場合、学習曲線が急であり、すべてが他のすべてと相互作用することが多いため、設計を迅速に変更するのが難しい場合があります。このプロジェクトの目標は、XODグラフィカルプログラミング環境を使用して、ドラッグアンドドロップ/ WYSIWYGスタイルのインターフェイスを使用して、Arduino互換のマイクロコントローラープロジェクトのメニュー方式のインターフェイスを迅速にプロトタイプ化する機能を提供することでした。生成されたメニュー構造の出力および入力パラメーターはモジュール式で汎用的であり、さまざまな入力ソース(スイッチ、ボタン、エンコーダー)で使用でき、幅広い入力ソースに供給できる一連のプレーンテキスト出力を生成できる必要があります。この例で使用されている複数行のテキストLCDモジュールを含む、XODでサポートされているさまざまな表示タイプ。
このプロジェクトで使用されているXOD環境に慣れていない場合は、まずxod.ioでそのプロジェクトのチュートリアルを確認してください。
簡単な動機付けの例のスケッチのスクリーンショットを次に示します。このXODパッチ図をセクションごとに見ていき、すべてがどのように組み合わされるかを説明します。 <図>
- メニュー コントローラーインターフェースセクション
XODのパッチ編集画面の右側には、降順で接続された4つのノードがあります。上から順に、最初にアナログ入力タイプのノードがあります。これは、Arduinoのアナログ入力ポートの1つに接続するために選択されています。私のテストでは、16x2 LCD /キーパッドシールドが接続されたATMega3288ビットプロセッサを搭載したArduinoUnoを使用しました。シールドのキーパッドはシールドピンを介してArduinoの「A0」アナログ入力に接続され、ハードウェアはさまざまなレベルの電圧を生成して、パッドのボタンが押されていることをArduinoに通知します。
Arduinoスケッチに直接接続しないキーパッドの「リセット」ボタン以外に、このタイプのディスプレイシールドには、上、下、左、右の4つの方向ボタン「選択」ボタンがあります。アナログ入力ノードによってダウンフィードされる2番目のノードには、個々のキーに対応するさまざまな電圧をデコードし、押されたボタンに応じてパルスタイプのトリガーを出力するコードが含まれています。 「タイムアウト」入力が提供されるため、XOD開発者はLCDシールドキーパッドのデバウンスタイムアウトを調整して、特定のアプリケーションのボタンまたはスイッチタイプに合わせて誤ったトリガーを回避できます。
下の3番目のノードは、メニューコントローラータイプのノードです。このノードには、コントロールパネルからパルスタイプのトリガーを受け入れ、メニューツリーをナビゲートし、メニューツリーの状態更新を生成する選択を行うユーザーのロジックを処理するコードが含まれています。
現在実装されているように、単一の数値タイプの入力を受け入れます。これは、ユーザーが外部コントロールから変更できる任意のパラメーター、たとえば、変更可能なパラメーターを表すポテンショメーターまたはコントロールパネルのダイヤルです。メニューコントローラが「起動」入力へのパルスを受信して特定のリーフタイプメニューを選択すると、左側のメニューツリーで、ユーザーが現在表示している画面のノードが独自にパルスを出力します。出力し、パラメータ変更も送信します。 Arduinoの電源を入れたときにディスプレイにスプラッシュ画面を生成するために使用できる2つの文字列入力もあります。
そのノードの後には、XOD環境標準ライブラリのストック16x2 LCDコントローラモジュールがありますが、モジュールを使用できる任意のタイプのディスプレイを使用して、ここに出力テキストを表示できます。
- メニューツリーセクション
スケッチのスクリーンショットの上部にはツリーのような構造があり、コンパイルされ、ツリーの最終出力「ルート」がそれを受け入れるメニューコントローラ入力にルーティングされると、図のようにナビゲート可能なメニューが自動的に生成されます。グラフィカルデザイナー。現在実装されているのは、3種類のメニューツリーノードです。「リーフ」タイプのメニュー(オレンジ色の入力ポートのない最後のサブメニュー)は、ユーザーが制御できるアクションまたはパラメーターを表し、「ブランチ」タイプのメニューはユーザーが複数の子サブメニューから選択できる入力と出力の両方、およびサブメニューがグループ化されてブランチタイプのメニューの入力に入力される「連結」タイプのメニューの両方で、オプション。このノードのセットをどのように接続するかは、図からある程度自明であることが望まれます。
「ブランチ」タイプのメニューが表示されているときに「呼び出し」を選択すると、リーフタイプのメニューのように出力が生成されるのではなく、関連するサブメニューグループに移動します。サブサブメニュー、サブサブサブメニューなどが可能です!複雑な構造を実装できますが、主に特定のArduinoモデルのプロセッサで使用可能なRAMおよびフラッシュメモリリソースによって制限されます。
- 出力 セクション
この例では、出力セクションは、リーフタイプのメニューがArduinoの出力ピンを介して外部ハードウェアに接続する場所です。各リーフタイプのメニューには、バスを介してそれぞれのフリップフロップに接続し、関連するデジタル出力ピンのオンとオフを切り替えるパルスタイプの出力があります。このような配置は、外部リレーやLEDの制御に使用できますが、パルス出力は非常に一般的であり、リーフタイプのメニュー画面にアクセスするときに[起動]を選択したときに生成される出力パルスは、次のような多くのタスクを実行するために使用できます。メニューコントローラのパラメータタイプの入力ポートからのパラメータデータが将来の使用のために保持される内部XODバッファタイプノードを更新します。
- 現在の既知の問題
このノードのセットはテスト済みであり、Arduino Unoをそのまま使用しても問題なく動作するはずですが、このプロジェクトの期限までに解決されなかった問題がいくつか残っています。現在、スケッチをコンパイルするには、ツリーのどこかにブランチタイプのメニューが必要ですが、ほとんどのプロジェクトでは少なくとも1つは必要になるでしょう。メニューコントローラへの「トップ」メニュー入力は、インターフェイスのタイトル画面に戻ることを目的としており、現在実装されていませんが、次のリビジョンでは簡単な機能になるはずです。
メニューコントローラノードでは4行表示がサポートされていますが、4行のテキスト入力を備えたリーフタイプのメニューインターフェイスはまだ作成されていません。このユーティリティのメモリオーバーヘッドを削減するために多大な努力が払われていますが、XODトランスパイラーが現在定数文字列を格納する方法は、RAMオーバーヘッドが非常に低い場合には最適ではなく、メニューベースのインターフェイスには大量のテキストが含まれる傾向があります。このプロジェクトでは、回避策が開発され、より長い文字列が貴重なプログラムRAMを消費しないようにするために、一連のフラッシュ文字列タイプのノードがパッチに追加されました。うまくいけば、これはXOD環境のアップデートで対処されるでしょうが、回避策は今のところ問題ありません。
フラッシュ文字列タイプのノードを使用するのはそれほど面倒ではありませんが、プログラムメモリに格納された新しい文字列ごとにパッチとコードを複製し、ノード自体に含まれるC ++コードをクリックして出力文字列を編集する必要があります。
<図>
リーフノードとブランチノードの「ID」入力にはまだ機能がありません。サブメニューの各セットに関連付けられたID番号を順番に配置して、ユーザーが一連のディスプレイでの位置を追跡できるようにするとよいと考えられますが、C ++でこれをコーディングする方法についてさらに検討する必要があります。自動的に発生します。
- 継続作業
さらなるバグテストと、ARMなどのAVR / ATmegaデバイス以外の他のArduinoデバイスでのテストを行う必要があります。メニューノードタイプの現在のセットは、入力と出力の種類が増えるはずですが、いくらか制限されています。実行時にツリーコンポーネントを相互接続/連結するのではなく、コンパイル時のメタプログラミングを増やし、フラッシュメモリにできるだけ多くのデータを格納することで、RAMのオーバーヘッドを削減する作業を継続します。
2/19 / 19-2番目の例。
この2番目のスケッチのスクリーンショットの例は、メニューコントローラーを使用して、コントローラーへの入力として外部値または内部値を取得し、現在および以前の値を目的のメニューページに表示し、新しい値を選択してバッファーに保存する方法を示しています。
<図>右側では、メニューコントローラノードに「クロック」ノードから供給されるカウンタの出力が供給されています。ただし、これは、任意の種類の内部データ値、またはアナログ入力に接続されたポテンショメータなどの外部値である可能性があります。カウンターの出力も文字列フォーマットノードに送信され、いくつかの表示テキストと連結されて、メニューページが表示されたときにコントローラーがLCDの2行目に受信している現在の値を示します。
リーフメニュー「A」の「呼び出された」および「param」出力は、XOD標準ライブラリから「バッファ」ノードに送信されます。次に、バッファの出力は、XODスケッチのフィードバックループを分割するために必要な「defer」ノードを除いて、以前と同様の配置に戻されます。バッファに保存されている値は、LCDの最初の行に表示されます。
メニューコントローラーノードがキーパッドコントローラーから「呼び出し」トリガーパルスを受信すると、A-outノードは、向こうのメニューコントローラーからのパラメーター入力値(この場合は向流値)と「呼び出された」トリガーを出力します。バッファの更新ルーチンをアクティブにし、新しいパラメータをバッファに保存するパルス。その後、表示は自動的に更新され、新しく保存された値が反映されます。
次に、バッファの出力ポートを他の任意の数のノードにルーティングして、ユーザーが選択した新しいデータ値を反映するように動作を変更することもできます。
<図>
コード
- XODメニューシステムライブラリ
XODメニューシステムライブラリ C / C ++
https://xod.io/libs/bitrex/xod-menu-system-11XOD環境内の[ファイル]-> [ライブラリの追加...]オプションから、bitrex / xod-menu-systemをスケッチライブラリブラウザに追加します。
プレビューなし(ダウンロードのみ)。
回路図
XODIDEを使用して直接開く製造プロセス