Хитрый RGB диод. Serial и Processing

Тема в разделе "Arduino & Shields", создана пользователем SMJepard, 17 авг 2014.

  1. SMJepard

    SMJepard Нуб

    Доброго времени суток. Решил научиться управлять Arduino с помощью ПК, и насколько мне стало понятно язык Processing лучше всего для этого подходит. Помогите, пожалуйста, осуществить проект.

    Теперь немного о сути проекта. Допустим, у меня есть вот такая палитра цветов HSV (приложена ниже). Я хочу сделать так, чтобы при каждом клике на ней, RGB светодиод зажигался соответствующим цветом.

    Собрал вот такую схему (приложена ниже).
    Код Арудино:
    Код (Text):
    #define redPin  9
    #define greenPin 11
    #define bluePin  10

    void setup() {
      Serial.begin(9600);

      pinMode(redPin, OUTPUT);
      pinMode(bluePin, OUTPUT);
      pinMode(greenPin, OUTPUT);
    }

    void loop() {
      int rval = 200, gval = 30, bval = 80;
      while (Serial.available() > 0) {
        rval = Serial.parseInt();
        gval = Serial.parseInt();
        bval = Serial.parseInt();
     
        if (Serial.read() == '\n') {
          analogWrite(redPin, rval);
          analogWrite(greenPin, gval);
          analogWrite(bluePin, bval);
        }
      }
    }
    Код на Processing:
    Код (Text):
    import processing.serial.*;

    PImage img;
    Serial port;

    void setup () {
      size(640,256);
      img = loadImage("hsv.jpg");
      port = new Serial(this, "COM4", 9600);
    }

    void draw() {
      background(0);
      image(img, 0, 0);
    }

    void mosePressed() {
      color c = get(mouseX, mouseY);
      String colors = int(red(c))+","+int(green(c))+","+int(blue(c))+"\n";
      print(colors);
      port.write(colors);
    }
    Вопросов несколько:
    1. В чем ошибка и как ее исправить?
    2. Почему, когда я ввожу в Мониторе порта Arduino, например, "123,20,30" (без кавычек) и нажимаю Enter, if-ветка не обслуживается? Попытался разобраться, как исправить проблему. Дело оказалось в том, что в таком случае Serial.read() == -1. Почему не '\n'?
     

    Вложения:

    • hsv.jpg
      hsv.jpg
      Размер файла:
      7,9 КБ
      Просмотров:
      848
    • scr3.PNG
      scr3.PNG
      Размер файла:
      101,9 КБ
      Просмотров:
      567
  2. ANV

    ANV Гуру

    Скорее всего парсер съедает перевод строки. Попробуйте поставить пробел после "30" и посмотрите что вернет Serial.read()
     
  3. SMJepard

    SMJepard Нуб

    Возвращает 32. Это и есть ascii код пробела
     
  4. SMJepard

    SMJepard Нуб

    Нашел ошибки.
    Код (Text):
    void mousePressed()
    Однако ответ на вопрос 2 таки хотелось бы услышать
     
  5. acos

    acos Официальный гик Администратор

    Это зависит от настроек монитора порта. Только '\n' в конце строки будет только если в мониторе порта справа внизу выбрана опция «Новая строка»
     
  6. altex

    altex Гик

    Код (Text):

      while (Serial.available() > 0) {
        rval = Serial.parseInt();
        gval = Serial.parseInt();
        bval = Serial.parseInt();

        if (Serial.read() == '\n') {
          analogWrite(redPin, rval);
          analogWrite(greenPin, gval);
          analogWrite(bluePin, bval);
        }
      }
    Вопрос к знатокам. Разве не нужно перед каждым вызовом Serial.parseInt() или Serial.read() ждать while (Serial.available() > 0) пока появятся данные в принимающем буфере?
     
  7. geher

    geher Гуру

    Необязательно.
    Насколько я помню, при попытке считывания из последовательного порта в случае, когда в буфере ничего не наблюдается, функция завершается, возвращая соответствующее значение.
    При этом read возвращает -1, а parseInt ждет время, заданное в setTimeout и если не дожидается ничего, возвращает 0.