1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Туториал Связь Arduino и Processing, через Serial

Тема в разделе "Processing", создана пользователем Валерий, 4 янв 2016.

  1. Валерий

    Валерий Живет здесь

    Сообщения:
    9
    Симпатии:
    11
    Покажу простой пример связи ардуино и пк. Для этого будем использовать Processing(2.0.1 32 битная версия, Serial не может в 64), Arduino IDE, сама платка и потенциометр.

    Подключение.. ну прям предельно простое
    [​IMG]
    Код для Arduino IDE:

    Код:
    int potPin = 0; // указываем порт, куда подцепили потенциометр
    
    void setup()
    {
    Serial.begin(9600);  // запускаем наш сериал
      
      
    }
    void loop()
        {
         int val = map(analogRead(potPin), 0, 1023, 0, 255); // гуглим "arduino map". С пина получаем 0-1023, на выходе необходимо 0-255, сразу обрабатываем с помощью мк(можно и в процессинге было) и записываем в переменную val
         Serial.println(val); //выводим в порт значение переменной val. Обрати внимание! Serial.println а не print. т.к. в таком случае выводится необходимый нам '\n'
         delay(50);
        }
    Загружаем этот код на наш контроллер, и переходим к процессингу.

    Код для Processing:


    Код:
    import processing.serial.*;
    Serial port;
    float input = 0;
    
    void setup()
    {
    size(400, 400);
    port = new Serial(this, "COM3", 9600); //активируем наш порт
    port.bufferUntil('\n');//считываем значение строки до символа '\n' - это переход на новую строку
    }
    
    void draw() // основной цикл отрисовки
    {
    background(0,input,0);//догадались что будет делать input?
    float rect = map(input, 0, 255, 0, 370);
    rect(15,200,rect,30);
     
    }
    
    void serialEvent (Serial port)
    {
     
    input = float(port.readStringUntil('\n')); //считываем с порта значение и записываем в переменную input
     
     
    }
    1. Загружаем код на ардуино
    2. Подключаем к пк
    3. Запускаем код в processing
    4. Крутим потенциометр
    5. Крутим потенциометр
    6. Офигеваем
    DenisD, Buba_Chkhadze, monitorrr и ещё 1-му нравится это.
     
    : arduino, processing, serial
  2. monitorrr

    monitorrr В доску свой

    Сообщения:
    331
    Симпатии:
    94
    Род занятий:
    инженер сервиса
    Адрес:
    Алматы
    Доброго времени суток!
    Попробовал адаптировать под кнопку. Жмем кнопку и получаем градацию 0-64-128-192-255-0.
    Схема подключения:
    Кнопка.jpg Кнопка1.jpg
    Результат:
    777777777777777777.jpg
    хотел видео выложить - ютуб чет сегодня тупит.
    Выложил файл для FLProg - мигаем фоном.rar
    Код сгенерированый в FLProg:

    Код:
    bool _gtv1 = 0; //сброс
    bool _bounse1S = 0;
    bool _bounse1O = 0;
    unsigned long _bounse1P = 0UL;
    bool _count1I = 0;
    int _count1P = 0;
    int _mux1;
    int _stou1;
    bool _bounseInput8S = 0;
    bool _bounseInput8O = 0;
    unsigned long _bounseInput8P = 0UL;
    void setup()
    {
    Serial.begin(9600);
    pinMode(8, INPUT);
    digitalWrite(8, HIGH);
    
    _bounseInput8O =  digitalRead(8);
    }
    void loop()
    {
    bool  _bounceTmp8 =  (digitalRead (8));
    
    if (_bounseInput8S)
        {
         if (millis() >= (_bounseInput8P + 40))
             {_bounseInput8O= _bounceTmp8; _bounseInput8S=0;}
         }
    else
        {
         if (_bounceTmp8 != _bounseInput8O )
             {_bounseInput8S=1; _bounseInput8P = millis();}
          }
    
    
    
    bool  _bounceTmp1 = _bounseInput8O;
    
    if (_bounse1S)
        {
         if (millis() >= (_bounse1P + 40))
             {_bounse1O= _bounceTmp1; _bounse1S=0;}
         }
    else
        {
         if (_bounceTmp1 != _bounse1O )
             {_bounse1S=1; _bounse1P = millis();}
          }
    
    if (_bounse1O)
       {
       if (! _count1I) 
          {
           _count1P = _count1P+1;
           _count1I = 1;
          }
       }
    else
       {
       _count1I=0;
       }
    if (_gtv1) _count1P = 0;
    if((_count1P) == 0) {_mux1 = 0;}
    if((_count1P) == 1) {_mux1 = 64;}
    if((_count1P) == 2) {_mux1 = 128;}
    if((_count1P) == 3) {_mux1 = 192;}
    if((_count1P) == 4) {_mux1 = 255;}
    _gtv1 =  _count1P  >=  5;
    if (1){if(!(( _mux1)==(_stou1))){Serial.println(_mux1);}} _stou1 = _mux1;
    
    
    
    
    }
    Ну и для тех кто не хочет качать FLProg скрин блок схемы:
    процессинг.jpg

    В коде примера от Процессинга поменял только номер СОМ порта - у меня 18.
    В целом все понятно, в примере мы с Ардуино отправляем данные на ПК.
    Жду примера отправки команд на Ардуино.

    Вложения:

    Валерий нравится это.
  3. monitorrr

    monitorrr В доску свой

    Сообщения:
    331
    Симпатии:
    94
    Род занятий:
    инженер сервиса
    Адрес:
    Алматы
    Вопрос: как быть если я захочу скомпилировать в процессенге исполнительный файл, там жестко указан мой СОМ порт, а я запущу на другом компе, где процессинга нет.
  4. Валерий

    Валерий Живет здесь

    Сообщения:
    9
    Симпатии:
    11
    Интересный вопрос. Надо подумать)
    может что то вроде этого использовать:

    Код:
    // I know that the first port in the serial list on my mac
    // is Serial.list()[0].
    // On Windows machines, this generally opens COM1.
    // Open whatever port is the one you're using.
    String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
    myPort = new Serial(this, portName, 9600); 
    Либо поочерёдно отправлять ping на каждый порт и ждать pong ))
  5. monitorrr

    monitorrr В доску свой

    Сообщения:
    331
    Симпатии:
    94
    Род занятий:
    инженер сервиса
    Адрес:
    Алматы
    Доброго времени суток!
    Обязательно вечером попробую.
    Только смущает одно обстоятельство, вычитал в одном из примеров:
    Код:
    import processing.serial.*;
    Serial port; // Создание объекта класса Serial
    float val; // Данные, полученные из последовательного порта
    void setup() {
    size(440, 220);
    // [U]Важное замечание[/U]:
    // Первым последовательным портом, указанном в Serial.list()
    // должна быть ваша Arduino. Если это не так, удалите // в
    // в следующей строке. Запустите скетч заново и просмотрите
    // список последовательных портов. Затем запишите вместо 0
    // между символами [ и ] номер порта, к которому подключена
    // ваша плата Arduino.
    //println(Serial.list());
    String arduinoPort = Serial.list()[0];
    port = new Serial(this, arduinoPort, 9600);
    }
    void draw() {
    if (port.available() > 0) { // Если данные доступны,
    val = port.read(); // они считываются в val
    val = map(val, 0, 255, 0, height); // Преобразование величины
    }
    rect(40, val-10, 360, 20);
    }
    На самом процессинге нашел несколько примеров, там везде так, без указания номера COM порта:
    Код:
    // Read data from the serial port and change the color of a rectangle
    // when a switch connected to the board is pressed and released
    import processing.serial.*;
    Serial port;                             // Create object from Serial class
    int val;                                 // Data received from the serial port
    void setup() {
      size(200, 200);
      frameRate(10);
      // Open the port that the board is connected to and use the same speed (9600 bps)
      port = new Serial(this, 9600);
    }
    
    void draw() {
      if (0 < port.available()) {         // If data is available,
        val = port.read();                   // read it and store it in val
      }
      background(255);                       // Set background to white
      if (val == 0)  {                       // If the serial value is 0,
        fill(0);                             // set fill to black
      } else {                               // If the serial value is not 0,
        fill(204);                           // set fill to light gray
      }
      rect(50, 50, 100, 100);
    }
    
    Немного порыл на форуме самого процессинга:
    Plug & play serial communication
    Думаю то что нужно. Скачал библиотеку, а подключить не смог.
  6. monitorrr

    monitorrr В доску свой

    Сообщения:
    331
    Симпатии:
    94
    Род занятий:
    инженер сервиса
    Адрес:
    Алматы
    В моем случае сработал вот такой вариант:
    Код:
    String portName = Serial.list()[1];
    port = new Serial(this, portName, 9600);
    у меня на компе под №0 - реальный СОМ1
    11111111111.jpg
    Мне вот что подумалось - со всеми приложениями с которыми мне приходилось работать СОМ порт автоматически не выбирался. Думаю делать автоматическое определение СОМ порта не такая и простая задача.
    Как реализовать на процессинге выбор СОМ порта:
    333333333333333.jpg 444444444444444444.jpg 55555555555555555555555.jpg 6666666666666666.jpg
    например такие, сделал несколько скринов.
    Валерий нравится это.

Поделиться этой страницей