Управляйте определенным выводом на плате Arduino Uno, используя pyserial - PullRequest
3 голосов
/ 03 сентября 2011

У меня есть код Python, который отправляет шаблон, в котором должен мигать индикатор. (Скажем, например, 101010. Шаблон может меняться при каждом запуске кода). когда он выполняет это бесконечно, я хочу, чтобы прерывание (снова посылаемое кодом Python) сохраняло текущие условия источников света (скажем, он запускает 1 из последовательности) и выполняло определенную задачу, такую ​​как выключение источников света на 10 секунд и затем возобновите последовательность. Один из способов сделать это - прервать программу, установив высокий уровень на выводе прерывания. Вопрос в том, может ли это сделать высокий / низкий уровень, контролируемый писериалом. Таким образом, простой псевдокод будет:

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.***

}

*/

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

КОД ДЛЯ ФАСАДА ПИТОНА:

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) Существует ли способ активировать «отключение ISR» в зависимости от состояния вывода (в данном случае это вывод 2, который является выводом INT0) без использования физического переключателя, присутствующего на выводе. Следовательно, программное обеспечение должно управлять состоянием контакта.

2) Можно ли выполнять операции, указанные в комментариях к функциям затемнения?

3) В коде Python возможно только один раз отправить данные (т. Е. Шаблоны, быстро) и заставить arduino выполнять шаблон бесконечным образом без повторной отправки данных командой serial.write. Следовательно, избегая цикла while(1) после ser.isOpen().

1 Ответ

0 голосов
/ 04 сентября 2011

Посмотрите на это:

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

Это то, что я собрал на стороне Arduino, чтобы выдавать произвольные команды, такие как переключение высокого / низкого уровня, установка уровня ШИМ и т. Д.Он работает как по последовательному, так и по сети, хотя на данный момент это сенсорная ошибка на стороне сети.

Чтобы использовать его, поместите код на свой arduino, а затем просто напишите скрипт на python (или любой другой язык, который можетиспользуйте последовательное соединение) для подключения через последовательное соединение, а затем сообщите ему, что вы хотите сделать, например, DIGW 1 HIGH и т. д.

Также посмотрите: https://github.com/ajfisher/arduino-django-visualiser, где я использую вариантэтой библиотеки для управления некоторыми светодиодами, основанными на некоторых вещах, происходящих в Django - это в большей степени основано на Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...