3

ライトが点滅する必要があるパターンを送信するpythonコードがあります(たとえば、101010など。コードが実行されるたびにパターンが異なる場合があります)。これを無限に実行しているとき、割り込み(再びpythonコードによって送信されます)を使用して、ライトの現在の状態を保存し(シーケンスの1つを実行しているとします)、ライトを10秒間オフにするなどの特定のタスクを実行し、その後、シーケンスを再開します。これを行う 1 つの方法は、割り込みピンを高くしてプログラムを中断することです。問題は、このハイ/ローの作成が pyserial によって制御されるかどうかです。したがって、単純な擬似コードは次のようになります。

コードの PYTHON 部分:

Read the sequence:
Send the sequence to the arduino board using pyserial.
while(1)
{
    Run a timer for 15 second.
    When the timer overflows interrupt the arduino.
}

コードの ARDUINO 部分:

Read the sequence 
while (1)
{
    keep repeating the sequence on the LED.
}

// if interrupted on pin2  // assuming pin2 has the interrupt procedure
// Pyserial has to enable the interrupt WITHOUT using a switch for enabling the pin.

ISR 
{
    Save the present state of execution.
    Turn off the LED.
 }

より良い理解のために:

私が持っていた疑問を示すために小さなコードを作成しました:

ARDUINO のコードは次のとおりです。

int ledpin1 = 13;

int speedy;

int patterns;

void setup()

{

  Serial.begin(9600);

  Serial.print("Program Initiated: \n");

  pinMode(ledpin1,OUTPUT);

  //activate the blackout ISR when a interrupt is achieved at a certain pin. In this case pin2 of the arduino

  attachInterrupt(0,blackout,CHANGE);

}

void loop()

{

  if (Serial.available()>1)

  {

    Serial.print("starting loop \n");

    patterns = Serial.read();

    patterns = patterns-48;

    speedy = Serial.read();

    speedy = (speedy-48)*1000;

    while(1)

    {

      patterns = !(patterns);

      Serial.print(patterns);

      digitalWrite(ledpin1,patterns);

      delay(speedy);

    }

  }

}

/*

void blackout()

{

  // ***Save the present state of the LED(on pin13)***

  Serial.print ("The turning off LED's for performing the python code\n");

  digitalWrite(ledpin,LOW);

  //wait for the Python code to complete the task it wants to perform, 

  //so got to dealy the completion of the ISR

  delay(2000);// delay the whole thing by 2 seconds

  //***Continue with the while loop by setting the condition of the light to the saved condition.***

}

*/

================================================== ================================

PYTHON FRONT のコードは次のとおりです。

import serial

import time

patterns=1

speedy=1

ser = serial.Serial()

ser.setPort("COM4")

ser.baudrate = 9600

ser.open()

def main():

    if (ser.isOpen()):

        #while(1):

        ser.write(patterns)

        ser.write(speedy)

        blackoutfunc()

        #ser.close()



def blackoutfunc():

    while(1):

        time.sleep(2)

        print "Performing operations as required"

================================================== =============================

今私が持っていた質問:

1)ピンに存在する物理スイッチを使用せずに、ピン(この場合はINT0ピンであるピン2)の状態に応じて「ブラックアウトISR」をアクティブにできる方法はありますか。したがって、ピンの状態はソフトウェアで操作する必要があります。

2) ブラックアウト機能のコメントに記載されている操作を実行することは可能ですか?

3) python コードでは、データ (つまり、パターン、高速) を 1 回だけ送信し、コマンドでデータを再度送信することなく、arduino にパターンを無限に実行させることができますserial.write。したがって、 のwhile(1)後のループを回避しますser.isOpen()

4

1 に答える 1

0

これを見てください:

https://github.com/ajfisher/arduino-command-server

これは、ピンの高/低の切り替えやPWMレベルの設定などの任意のコマンドを発行するためにArduino側でまとめたものです。現時点ではネットワーク側ではバグがありますが、シリアルとネットワークの両方で機能します。

それを使用するには、arduino にコードを配置し、Python スクリプト (またはシリアル接続を使用できる他の言語) を記述してシリアル接続を介して接続し、DIGW 1 HIGH などのように実行したいことを伝えます。

また、こちらもご覧ください: https://github.com/ajfisher/arduino-django-visualiserでは、このライブラリのバリエーションを使用して、Django で行われているいくつかの事柄に基づいていくつかの LED を制御しています - それはより重く Python ベースです。

于 2011-09-04T01:03:59.590 に答える