1

ハードコーディングせずに、いつでもいくつかのピンを制御するルールを追加および削除できるようにするために、arduino 用のプログラムを作成したいと考えています。たとえば、次のようなルールです。

pin1=HIGH かつ pin2=LOW の場合、pin3=HIGH

私はこれになりたい:

if(pin1 == HIGH && pin2 == LOW){
   digitalWrite(pin3, HIGH);
}

コマンドラインを介して文字列としてルールを渡すとしましょう。この文字列をルールに変換するにはどうすればよいですか? このようなことは可能ですか?

4

3 に答える 3

1

あなたが求めていることは可能ですが、あなたの側で多くの作業が必要です。


アプローチ 1 (大きく考える):

あなたが探しているのは、PAL (プログラマブル アレイ ロジック) および CPLD (複雑なプログラマブル ロジック デバイス) がどのように動作するかと同等のソフトウェア実装です。この記事を読むと、これがハードウェアでどのように行われるかについていくつかのアイデアが得られます。

PLD に関するウィキペディアの記事

PAL は、一連の入力と出力の間に任意の組み合わせ論理規則を作成できます。つまり、AND、OR、NOT の論理式として表現できるものはすべてプログラムできます。入力を論理ゲートに接続し、次に出力に接続する一連のヒューズを「焼く」ことによってプログラムされます。これらのデバイスにアップロードされるのは、0 と 1 のセットだけです。

ヒューズを表すために、0 と 1 の配列を使用してソフトウェアでそのようなことを実装できます。ハードコードは配列に対して実行され、出力を計算します。アレイに正しいヒューズをロードする方法を開発する必要があります。

PAL をプログラムする一般的な方法は、言語 VHDL を使用することです。この言語のコンパイラは、あなたのような式を受け取り、それを PAL が使用できる AND、OR、NOT のセットに変換します。検索すると、この言語に関する無限の議論が得られます。たとえば、次のようになります。

VHDL チュートリアル

テキスト入力を受け取り、ヒューズを決定するコンパイラを作成する必要があります。いくつかの重要なタスクを実行することになります。

  • ドメイン固有の言語パーサー ( ANTLR をお勧めします)、

  • PAL コンパイラ (自分でこれを行うことはお勧めできません)、および

  • PALをエミュレートするArduinoコード。

VHDL と PAL に相当するものを独自に作成する頃には、プロト ボードに PAL チップを配置するだけで完了したと考えるでしょう。


アプローチ 2 (より実用的):

同じ結果を得る簡単な方法は、真理値表です。真理値表は、論理式のセットに相当します。真理値表を実装するには、論理式を入力ケースごとに 1 行の表に変換します。出力を駆動する 2 つの入力の真理値表の例を次に示します。

IN1  IN2  OUT
0    0    1
0    1    0
1    0    1
1    1    1

このような真理値表の実装のコードは次のようになります。

const int IN1 = 6;
const int IN2 = 7;
const int OUTA = 13;

byte table[4] = {1, 0, 1, 1};

void loop() {
  int in1;
  int in2;
  byte outbit;
  size_t ix;
  //
 in1 = digitalRead(IN1);
 in2 = digitalRead(IN2);
 ix = in2 * 2 + in1;
 outbit = table[ix];
 digitalWrite(OUTA, outbit);
}

論理規則の完全な表現は、4 バイトの配列です。新しい出力方程式を「プログラム」するには、特定の方程式に対して「0 0 1 0」を送信して、4 つの値の新しいセットを送信するだけです。プログラムは値のリストを受け取り、テーブル配列に格納します。新しい値/ルールが保存されるとすぐに、出力の機能が変更されます。

このタイプのプログラマブル ロジックは、テーブルを保存するのに十分な RAM があれば実現可能です。入力が 4 つの場合は 16 個の値が必要で、5 個の場合は 32 個しか必要ありません。


あなたの質問は、エレクトロニクス設計の重要なポイントを提起します。適切な問題に対して適切なデバイスを選択する必要があります。コードが常に優れている、または簡単であるとは限りません。ハンマー ネイル トラップを回避します (唯一のツールがハンマーの場合、すべての問題は釘のように見えます)。PAL/CPLD とマイクロコントローラは強力な組み合わせです。

于 2013-06-08T05:43:58.097 に答える
1

2 番目のコード:

if(pin1 == HIGH && pin2 == LOW){
   digitalWrite(pin3, HIGH);
}

IDE によってマシン コードにコンパイルされます。次に、そのマシンコードが Arduino にアップロードされて実行されます。

したがって、このような文字列を送信することはできません

if pin1=HIGH and pin2=LOW then pin3=HIGH

プログラムがそれを目的の形式に変換した後、完全なIDEとコンパイラーがArduino側にないためです。そして、C++ コンパイラ ツール チェーンは大きく、数十メガバイトにもなります。Arduinoにはそのための場所はありません。

できること: ルール用の単純な言語を発明し、そのためのインタープリターを開発して、Arduino で実行します。

おそらく、車輪を再発明する必要もありません.AVR CPUで実行されている単純なBASICインタープリターをGoogleで検索し、それらの1つを適応させます。

于 2013-06-07T19:16:12.963 に答える
0

@jdr5ca が言及した真理値表のアプローチに追加するには、arduino で使用されるコントローラーと ardiuno ライブラリの使用を理解することをお勧めします。

ピン 0 ~ 7 はポート D で、ピン 8 ~ 15 はポート B です。各ポートは 3 つのシングル バイト レジスタとして表されます。PORT_ は出力/バイアス抵抗、PIN_ は入力状態、DDR_ は方向です。コードを呼び出すとdigitalRead(pin)、ピンがどの範囲にあるかを確認し、PIN_そのポートを読み取り、値をビットシフトしてマスクして、そのピンの状態だけを示します。一度に 1 つのピンを読み取るには便利ですが、複数のピンを読み取る場合よりも便利ではありません。

したがって、256 エントリの真理値表を作成すると、レジスタをピンにデコードしてから再度エンコードするのではなく、入力 0 ~ 7 の値からピン 8 ~ 15 の出力を 1 行で書き込むことができます。

byte table[256] = {0};

void loop() {
   PORTB = table[PIND];
}

次に、シリアルから読み取る何かを追加し、その場で新しい値をテーブルにロードできます。

于 2013-06-11T12:52:44.083 に答える