Показано с 1 по 3 из 3
  1. #1
    Продвинутый Аватар для Pinin
    Регистрация
    04.01.2009
    Возраст
    59
    Сообщений
    213
    Вес репутации
    231

    По умолчанию RoadRunner Plugin и Arduino

    В ветке про центрифужный плагин прозвучала просьба сбацать что-то наподобие под RR. Поскольку в рамках своего проекта мне понадобилась такая фича и нашлись добрые люди, не погнушавшиеся помочь советом чайнику от программирования - выкладываю результат.

    В аттаче - экзешник и исходники: с минимальными доработками по месту любой может заточить интерфейс под себя , внешний вид интерфейса не изменился с тех пор.

    Листинг с комментами:

    PHP код:
    import processing.serial.*;   
    Serial port;  
    int x,y,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,w1,h1,w6,h6,lock;

    PImage bs;     // Все кнопки не нажаты 
    PImage dw;     // Все кнопки не нажаты, нажата "DIM" 
    PImage dw1;    // Все кнопки не нажаты, нажата "MENU" 
    PImage dw2;    // Все кнопки не нажаты, нажата "MUTE" 
    PImage dw3;    // Все кнопки не нажаты, нажата "HW/CITY" 
    PImage dw4;    // Все кнопки не нажаты, нажата "VOL_UP" 
    PImage dw5;    // Все кнопки не нажаты, нажата "VOL_DOWN" 
    PImage dw6;    // Все кнопки не нажаты, нажата "ПИТАНИЕ" 

    void setup() 

      
    port = new Serial(this"COM5"115200); // Прописываем COM-порт на котором у вас сидит Carduino 
       
      
    size(800600);//размер окна 
         
      
    bs loadImage("BG.jpg");             //загрузить все кнопки ненажатыми 
      
    dw loadImage("DIM_down.jpg");       //загрузить изображение с нажатой кнопкой "DIM" 
      
    dw1 loadImage("MENU_down.jpg");     //загрузить изображение с нажатой кнопкой "MENU" 
      
    dw2 loadImage("MUTE_down.jpg");     //загрузить изображение с нажатой кнопкой "MUTE" 
      
    dw3 loadImage("HW_down.jpg");       //загрузить изображение с нажатой кнопкой "HW/CITY" 
      
    dw4 loadImage("VOL_UP_down.jpg");   //загрузить изображение с нажатой кнопкой "VOL_UP" 
      
    dw5 loadImage("VOL_DOWN_down.jpg"); //загрузить изображение с нажатой кнопкой "VOL_DOWN" 
      
    dw6 loadImage("7_down.jpg");        //загрузить изображение с нажатой кнопкой "ПИТАНИЕ" 
      
    w1 140;      // Размер малой кнопки по горизонтали 
      
    h1 50;       // Размер  малой кнопки по вертикали 
      
    w6 100;      // Размер большой кнопки по горизонтали 
      
    h6 90;       // Размер большой кнопки по вертикали 
      
    17;        // Х начальная координата кнопки "DIM" 
      
    472;       // y начальная координата кнопки "DIM" 
      
    x1167;       // Х начальная координата кнопки "MENU" 
      
    y1472;       // y начальная координата кнопки "MENU" 
      
    x2321;       // Х начальная координата кнопки "MUTE" 
      
    y2472;       // y начальная координата кнопки "MUTE" 
      
    x3471;       // Х начальная координата кнопки "HW/CITY" 
      
    y3472;       // y начальная координата кнопки "HW/CITY" 
      
    x4170;       // Х начальная координата кнопки "VOL_UP" 
      
    y4395;       // y начальная координата кнопки "VOL_UP" 
      
    x5321;       // Х начальная координата кнопки "VOL_DOWN" 
      
    y5395;       // y начальная координата кнопки "VOL_DOWN" 
      
    x6682;       // Х начальная координата кнопки "ПИТАНИЕ" 
      
    y6435;       // y начальная координата кнопки "ПИТАНИЕ" 
      
    image(bs,0,0); // Нарисовать в окне все кнопки ненажатыми 
      



    void draw() 
    {   
      if( 
    mousePressed
       { 
         
    // Если кнопка нажата (lock==1) грузим соответствующую картинку, пишем в порт данные и
         // выставляем lock=0 (кнопка без фиксации нажатия)
        
         // Проверка нажатия в области "DIM" 
         
    if (mousePressed && (mouseX >= && mouseX <= w1 && mouseY >= && mouseY <= h1)) 
         {
         if(
    lock==1){image(dw00);port.write('1');  // Однократная посылка данных в порт
         
    }
         
    lock=0;
         }
              
         
    // Проверка нажатия в области "MENU" 
          
    if (mouseX >= x1 && mouseX <= x1 w1 && mouseY >= y1 && mouseY <= y1 h1
         {   
         if(
    lock==1){image(dw100);port.write('3');  // Однократная посылка данных в порт
         
    }
         
    lock=0;
         }
         
         
    // Проверка нажатия в области "MUTE" 
         
    if (mouseX >= x2 && mouseX <= x2 w1 && mouseY >= y2 && mouseY <= y2 h1
         {   
         if(
    lock==1){image(dw200);port.write('5');  // Однократная посылка данных в порт
         
    }
         
    lock=0;
         }  
         
         
    // Проверка нажатия в области "HW/CITY" 
         
    if (mouseX >= x3 && mouseX <= x3 w1 && mouseY >= y3 && mouseY <= y3 h1
         {   
         if(
    lock==1){image(dw300);port.write('7'); // Однократная посылка данных в порт
         
    }
         
    lock=0;   
         }  
         
    // Проверка нажатия в области "VOL_UP" 
         
    if (mouseX >= x4 && mouseX <= x4 w1 && mouseY >= y4 && mouseY <= y4 h1
         { 
          
    port.write('9');  // Непрерывно шлет данные в порт при нажатой кнопке
         
    delay (50); 
         if(
    lock==1){image(dw400);
         }
         
    lock=0;    
         }  
         
    // Проверка нажатия в области "VOL_DOWN" 
         
    if (mouseX >= x5 && mouseX <= x5 w1 && mouseY >= y5 && mouseY <= y5 h1
         {  
          
    port.write('b');  // Непрерывно шлет данные в порт при нажатой кнопке
          
    delay (50);
         if(
    lock==1){image(dw500);
         }
         
    lock=0;   
         }  
         
    // Проверка нажатия в области "ПИТАНИЕ" 
         
    if (mouseX >= x6 && mouseX <= x6 w6 && mouseY >= y6 && mouseY <= y6 h6
         {   
         if(
    lock==1){image(dw600);port.write('d');  // Однократная посылка данных в порт
         
    }
         
    lock=0;    
         }  
            
       }
    if(!
    mousePressed){
    if(
    lock==0){image(bs00);lock=1;
    }
    }
       

    Здесь (и в экзешнике!) под Ардуину отведет 5 СОМ. Если у вас иначе - просто поправьте на нужный и перекомпилируйте *.exe
    На всякий случай - в procissing`е: File - Export Application - Export. Файл будет в папке application.windows (ежели вы, конечно, делали его под винды )

    В интерфейсе семь кнопок: пять из них без фиксации нажатия и отправкой в порт одной команды, две - тоже без фиксации, но при длительном нажатии на них долбящих в порт одну команду непрерывно (думаю, все понимают, как работают кнопки регулировки громкости - а это они и есть).

    Поизучав содержимое void setup, нетрудно разобраться в том, как можно вообще изменить графику интерфейса, камня на камне не оставив от того, что сделал я для себя (SkinEditor вам в помощь ).

    Со своей стороны еще раз выражаю искреннюю благодарность Chip`у и AlexNS за помощь в работе над проектом.

    Успехов всем!
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	Export.jpg 
Просмотров:	262 
Размер:	53.4 Кб 
ID:	7489  
    Вложения Вложения

  2. #2
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    41
    Сообщений
    829
    Вес репутации
    390

    По умолчанию Re: RoadRunner Plugin и Arduino

    Можно посмотреть на твою прошивку для Arduino под эту програмулину?
    хороший модем должен качать пиво!
    Мой проект

  3. #3
    Продвинутый Аватар для Pinin
    Регистрация
    04.01.2009
    Возраст
    59
    Сообщений
    213
    Вес репутации
    231

    По умолчанию Re: RoadRunner Plugin и Arduino

    Легко!

    PHP код:
    /*
      Семь кнопок: 
      Вкл/Выкл питания нагрузки
      Режим 1 (короткое нажатие)
      Режим 1 (длинное нажатие)
      Режим 2 (короткое нажатие)
      Режим 2 (длинное нажатие)
      Громкость +
      Громкость -
     
     Питание на нагрузку подается либо при начальной инициализации системы, 
     либо программно (для вкл/выкл нагрузки без снятия питания со всей системы)
     По включению питания формируется импульс сброса самотестирования нагрузки. 
     Громкость выставляется в предустановленный уровень.
     
     The circuit:
     * Оптрон Режима 1  attached from pin 9 to ground 
     * Оптрон Режима 2  attached from pin 11 to ground
     * Оптрон Вкл/Выкл  attached from pin 7 to ground
     * Оптрон "Громкость"  attached from pin 10 to ground
     * pin 8 attached to pin 11   
     * pin 7 attached to pin 12
      
      ******************
     modified 22.01.2010
      */

    // constants won't change. They're used here to 
    // set pin numbers:
    const int buttonPin1 12;     // Вход с питания
    const int buttonPin2 8;      // Вход с формирователя сброса
    const int buttonPin7 6;      // Включение/выключение питания
    const int ledPin4 =  9;        // Управление 1 режимом
    const int ledPin5 =  11;       // Управление 2 режимом/Ипульс сброса теста
    const int ledPin2 =  7;        // Включение нагрузки
    const int redPin   10;       // Управление громкостью
    int val;


    // variables will change:
    int buttonState 0;         // variable for reading the pushbutton status
    int redLEDValue   50;      // Предустановленный уровень громкости

    void setup() {
      
    Serial.begin(115200);              //установка порта 
      // initialize the LED pin as an output:
      
    pinMode(ledPin2OUTPUT);
      
    pinMode(ledPin4OUTPUT); 
      
    pinMode(ledPin5OUTPUT);
      
    pinMode(redPinOUTPUT);   // sets the pins as output
        // initialize the pushbutton pin as an input:
      
    pinMode(buttonPin1INPUT);
      
    pinMode(buttonPin2INPUT);
      
    pinMode(buttonPin7INPUT);
      
    analogWrite(redPinredLEDValue);

        
    // turn LED on:    
        
    digitalWrite(ledPin2HIGH); // Первое включение системы
       
      // read the state of the pushbutton value:
      
    buttonState digitalRead(buttonPin1);

                
    // Если питание подано, формируется импульс сброса с задержкой 2 сек:
      
    if (buttonState == HIGH) {     
        
    // turn LED on: 
       
    delay(2000);                  // пауза на сброс теста for a 2 second (подбирается вручную)
        
    digitalWrite(ledPin5HIGH); // Импульс сброса 1 сек 
       
    delay(1000);  
      } 
      else {
      }
    }

    void loop() {
                
    // Если нагрузка уже инициалирована, переход в рабочую программу
      
    while (digitalRead(buttonPin1) == HIGH) {
         
    work(); 
       }
                 
    // Если нагрузка не инициалирована, переход в инициализацию
      
    while (digitalRead(buttonPin1) == LOW) {
         
    initial(); 
       }
    }
    void initial(){   
      
    delay(1000);                  // пауза на включение
       // Выбор режима Вкл/Выкл:
      
    if (Serial.available())          //если есть принятый символ, 
      
    {
        
    val Serial.read();            //  то читаем его и сохраняем в val  
       
      
    buttonState digitalRead(buttonPin7);
      
      if (
    val == 'd') {     
        
    // turn LED on:    
        
    digitalWrite(ledPin2HIGH); // Включение питания
         

      else {
          }
      
    // read the state of the pushbutton value:
      
    buttonState digitalRead(buttonPin1);

              
    // Если питание подано, формируется импульс сброса с задержкой 2 сек:
      
    if (buttonState == HIGH) {     
        
    // turn LED on: 
       
    delay(2000);                  // пауза на сброс теста for a 2 second (подбирается вручную)
        
    digitalWrite(ledPin5HIGH); // Импульс сброса 1 сек 
       
    delay(1000);  
      } 
      else {
      }

             
    // Если импульс сброса сформирован, переход к рабочему циклу
       
    while (digitalRead(buttonPin2) == HIGH) {
         
    work(); 
       }
    }
    }

    void work(){
      
    digitalWrite(ledPin5LOW); // Снятие импульса сброса
               
               // Выбор режима 1 короткое/длинное нажатие:
      
      
    if (Serial.available())          //если есть принятый символ, 
      
    {
        
    val Serial.read();            //  то читаем его и сохраняем в val 
      
      
      
    if (val == '1') {     
        
    // turn LED on:    
        
    digitalWrite(ledPin4HIGH); 
       
    delay(1000);                  // Короткое нажатие (Реж.1)
      
    digitalWrite(ledPin4LOW);    // set the LED off 
      

      else {
        
    // turn LED off:
        
    digitalWrite(ledPin4LOW); 
      }
      
      if (
    val == '3') {     
        
    // turn LED on:    
        
    digitalWrite(ledPin4HIGH); 
       
    delay(3000);                  // Длинное нажатие (Реж.1)
      
    digitalWrite(ledPin4LOW);    // set the LED off 
      

      else {
        
    // turn LED off:
        
    digitalWrite(ledPin4LOW); 
      }
                
    // Выбор режима 2 короткое/длинное нажатие:
      
      
    if (val == '5') {     
        
    // turn LED on:    
        
    digitalWrite(ledPin5HIGH); 
       
    delay(1000);                  // Короткое нажатие (Реж.2)
      
    digitalWrite(ledPin5LOW);    // set the LED off 
      

      else {
        
    // turn LED off:
        
    digitalWrite(ledPin5LOW); 
    }

      if (
    val == '7') {     
        
    // turn LED on:    
        
    digitalWrite(ledPin5HIGH); 
       
    delay(3000);                  // Длинное нажатие (Реж.2)
      
    digitalWrite(ledPin5LOW);    // set the LED off 
      

      else {
        
    // turn LED off:
        
    digitalWrite(ledPin5LOW); 
      }
      
      if (
    val == 'b' && redLEDValue 1){ // Уменьшение громкости

    redLEDValue -= 1// Red down
    }

      if (
    val == '9' && redLEDValue 255 ) {  // Увеличение громкости

    redLEDValue += 1// Red up
    }

    // analogWrite() expects 2 parameters, the object/pin and a value between 0 (off) and 255 (full on)
    analogWrite(redPin,   redLEDValue);   // Write current values to LED pins
    delay(50); 
      
      
              
    // Включение/выключение питания:
      
      
    if (val == 'd') {     
        
    // turn LED on:    
        
    digitalWrite(ledPin2LOW); 
       
    delay(1000);                  // 
      
    digitalWrite(ledPin2LOW);    // set the LED off 
      

      else {
      }
      }

    РД изначально управлялся двумя кнопками (длинное и короткое нажатие на каждой), ну и регулировка громкости, совмещенная с вкл/выкл. Из-за того, что планируется скрытая установка, все управление пришлось выносить на тач, плюс сволочной режим самотестирования по включению... Теперь все это обойдено

    Работа связки оттестирована на макете (РД заменен пока на имитатор его узлов) - вроде все пашет, как и хотелось бы.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •