Вложений: 2
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(800, 600);//размер окна
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; // Размер большой кнопки по вертикали
x = 17; // Х начальная координата кнопки "DIM"
y = 472; // y начальная координата кнопки "DIM"
x1= 167; // Х начальная координата кнопки "MENU"
y1= 472; // y начальная координата кнопки "MENU"
x2= 321; // Х начальная координата кнопки "MUTE"
y2= 472; // y начальная координата кнопки "MUTE"
x3= 471; // Х начальная координата кнопки "HW/CITY"
y3= 472; // y начальная координата кнопки "HW/CITY"
x4= 170; // Х начальная координата кнопки "VOL_UP"
y4= 395; // y начальная координата кнопки "VOL_UP"
x5= 321; // Х начальная координата кнопки "VOL_DOWN"
y5= 395; // y начальная координата кнопки "VOL_DOWN"
x6= 682; // Х начальная координата кнопки "ПИТАНИЕ"
y6= 435; // y начальная координата кнопки "ПИТАНИЕ"
image(bs,0,0); // Нарисовать в окне все кнопки ненажатыми
}
void draw()
{
if( mousePressed)
{
// Если кнопка нажата (lock==1) грузим соответствующую картинку, пишем в порт данные и
// выставляем lock=0 (кнопка без фиксации нажатия)
// Проверка нажатия в области "DIM"
if (mousePressed && (mouseX >= x && mouseX <= x + w1 && mouseY >= y && mouseY <= y + h1))
{
if(lock==1){image(dw, 0, 0);port.write('1'); // Однократная посылка данных в порт
}
lock=0;
}
// Проверка нажатия в области "MENU"
if (mouseX >= x1 && mouseX <= x1 + w1 && mouseY >= y1 && mouseY <= y1 + h1)
{
if(lock==1){image(dw1, 0, 0);port.write('3'); // Однократная посылка данных в порт
}
lock=0;
}
// Проверка нажатия в области "MUTE"
if (mouseX >= x2 && mouseX <= x2 + w1 && mouseY >= y2 && mouseY <= y2 + h1)
{
if(lock==1){image(dw2, 0, 0);port.write('5'); // Однократная посылка данных в порт
}
lock=0;
}
// Проверка нажатия в области "HW/CITY"
if (mouseX >= x3 && mouseX <= x3 + w1 && mouseY >= y3 && mouseY <= y3 + h1)
{
if(lock==1){image(dw3, 0, 0);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(dw4, 0, 0);
}
lock=0;
}
// Проверка нажатия в области "VOL_DOWN"
if (mouseX >= x5 && mouseX <= x5 + w1 && mouseY >= y5 && mouseY <= y5 + h1)
{
port.write('b'); // Непрерывно шлет данные в порт при нажатой кнопке
delay (50);
if(lock==1){image(dw5, 0, 0);
}
lock=0;
}
// Проверка нажатия в области "ПИТАНИЕ"
if (mouseX >= x6 && mouseX <= x6 + w6 && mouseY >= y6 && mouseY <= y6 + h6)
{
if(lock==1){image(dw6, 0, 0);port.write('d'); // Однократная посылка данных в порт
}
lock=0;
}
}
if(!mousePressed){
if(lock==0){image(bs, 0, 0);lock=1;
}
}
}
Здесь (и в экзешнике!) под Ардуину отведет 5 СОМ. Если у вас иначе - просто поправьте на нужный и перекомпилируйте *.exe
На всякий случай - в procissing`е: File - Export Application - Export. Файл будет в папке application.windows (ежели вы, конечно, делали его под винды ;) )
В интерфейсе семь кнопок: пять из них без фиксации нажатия и отправкой в порт одной команды, две - тоже без фиксации, но при длительном нажатии на них долбящих в порт одну команду непрерывно (думаю, все понимают, как работают кнопки регулировки громкости - а это они и есть).
Поизучав содержимое void setup, нетрудно разобраться в том, как можно вообще изменить графику интерфейса, камня на камне не оставив от того, что сделал я для себя (SkinEditor вам в помощь ;) ).
Со своей стороны еще раз выражаю искреннюю благодарность Chip`у и AlexNS за помощь в работе над проектом.
Успехов всем!
Re: RoadRunner Plugin и Arduino
Можно посмотреть на твою прошивку для Arduino под эту програмулину?
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(ledPin2, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(redPin, OUTPUT); // sets the pins as output
// initialize the pushbutton pin as an input:
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin7, INPUT);
analogWrite(redPin, redLEDValue);
// turn LED on:
digitalWrite(ledPin2, HIGH); // Первое включение системы
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin1);
// Если питание подано, формируется импульс сброса с задержкой 2 сек:
if (buttonState == HIGH) {
// turn LED on:
delay(2000); // пауза на сброс теста for a 2 second (подбирается вручную)
digitalWrite(ledPin5, HIGH); // Импульс сброса 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(ledPin2, HIGH); // Включение питания
}
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(ledPin5, HIGH); // Импульс сброса 1 сек
delay(1000);
}
else {
}
// Если импульс сброса сформирован, переход к рабочему циклу
while (digitalRead(buttonPin2) == HIGH) {
work();
}
}
}
void work(){
digitalWrite(ledPin5, LOW); // Снятие импульса сброса
// Выбор режима 1 короткое/длинное нажатие:
if (Serial.available()) //если есть принятый символ,
{
val = Serial.read(); // то читаем его и сохраняем в val
if (val == '1') {
// turn LED on:
digitalWrite(ledPin4, HIGH);
delay(1000); // Короткое нажатие (Реж.1)
digitalWrite(ledPin4, LOW); // set the LED off
}
else {
// turn LED off:
digitalWrite(ledPin4, LOW);
}
if (val == '3') {
// turn LED on:
digitalWrite(ledPin4, HIGH);
delay(3000); // Длинное нажатие (Реж.1)
digitalWrite(ledPin4, LOW); // set the LED off
}
else {
// turn LED off:
digitalWrite(ledPin4, LOW);
}
// Выбор режима 2 короткое/длинное нажатие:
if (val == '5') {
// turn LED on:
digitalWrite(ledPin5, HIGH);
delay(1000); // Короткое нажатие (Реж.2)
digitalWrite(ledPin5, LOW); // set the LED off
}
else {
// turn LED off:
digitalWrite(ledPin5, LOW);
}
if (val == '7') {
// turn LED on:
digitalWrite(ledPin5, HIGH);
delay(3000); // Длинное нажатие (Реж.2)
digitalWrite(ledPin5, LOW); // set the LED off
}
else {
// turn LED off:
digitalWrite(ledPin5, LOW);
}
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(ledPin2, LOW);
delay(1000); //
digitalWrite(ledPin2, LOW); // set the LED off
}
else {
}
}
}
РД изначально управлялся двумя кнопками (длинное и короткое нажатие на каждой), ну и регулировка громкости, совмещенная с вкл/выкл. Из-за того, что планируется скрытая установка, все управление пришлось выносить на тач, плюс сволочной режим самотестирования по включению... Теперь все это обойдено ;)
Работа связки оттестирована на макете (РД заменен пока на имитатор его узлов) - вроде все пашет, как и хотелось бы.