Часть 7

27.09.2011


Началось все с покупки нового сотого телефона. Впервые в жизни мне стало жалко в первые же дни играться с его прошивкой. А просто им пользоваться, как обычным телефоном, не совсем интересно. Я начал искать, каким образом можно его еще использовать (сразу почему-то подумалось про freeduino) и нашел вот этот ролик. Это меня сразу заинтересовало. Так как пульты управления в робототехнике — вещь полезная. Да и идея поработать с беспроводной связью меня тоже привлекла.
Был тщательно прочесан интернет на эту тему, найдены несколько интересных решений, которые и взяты за основу.

После чего нужно было докупать недостающие модули, и я отправился в свой любимый магазин, где меня уже принимают как родного, и купил:

XBee Shield v5 USB


и XBee-PRO с чип-антенной



Позже я понял, что надо было покупать все по две штуки, но в данный момент я этого еще не знал. Я спешил домой, Shield-ы нужно было еще доработать, кое-что припаять (как всегда взял Shield — а`ля, доделай сам). 
После пайки и установки модуля XBee-PRO мой Shield стал выглядеть так.


Для начала я собрал уже знакомую схему из трех светодиодов. 


Запустил arduino-0017 и составил следующий код.


int message = 0;
 
int redLEDPin = 9; 
int grLEDPin = 11;
int ylLEDPin = 10;
int redLED = 0;
int grLED = 0;
int ylLED = 0;

void setup() { 
Serial.begin(9600); //set serial to 9600 baud rate
}

void loop(){
if (Serial.available() > 0) { 
message = Serial.read(); 

if (message == ‘R’){ 
redLED = 255;
ylLED = 255;
grLED = 255;

}
if (message == ‘r’)
redLED = 0; 
ylLED = 0;
grLED = 0;
}


analogWrite(redLEDPin, redLED);
analogWrite(grLEDPin, grLED);
analogWrite(ylLEDPin, ylLED);
}



Идея в том, что когда вы вводите в окне мониторинга ‘ R ‘ и жмете Enter, все три светодиода включаются, а когда вводим ‘ r ‘ — они выключаются. И пока я планирую удаленно все включать одной кнопкой. 


Код взят и слегка изменен по этой ссылке.

Теперь мне нужно было превратить телефон в пульт с одной кнопкой. Для этого понадобится скачать TouchOSC редактор (скачать можно по ссылке). Хочу сразу отметить, что этот редактор позволяет создавать модули для программы TouchOSC, которая может работать не только на iPhone/IPod Touch и IPad, но и есть версии для Android. И существуют версии редакторов для OS X, для Windows и Linux, которые можно скачать там же.

Для создания модуля открыл программу (инсталляция не требуется). Щелкнул правой кнопкой мыши на черном поле и выбрал Toggle Button.


Оставил имя «toggle1». Сохранил под именем Button.

Затем через iTunes залил на телефон. В настройках TouchOSC на телефоне установил…

HOST 192.168.0.1 (IP компьютера к которому телефон будет подключатся) 
PORT (outgoing) 8000
PORT (incoming) 9000
LOKAL IP address 192.168.0.3 (это IP пропишется автоматически) 


Затем я скачал программу Processing (это можно сделать, если перейти по ссылке http://processing.org/download/) и использовал данный sketch http://www.sparkfun.com/images/ardu-proc/processing_code.zip.
Ничего не меняя, запустил на выполнение, нажав кнопку воспроизведения.


Processing и Arduino — редакторы очень схожие в интерфейсе и выглядят почти идентично.


А вот, что из этого получилось. С помощью телефона я уже мог управлять программой на компьютере.


И теоретически светодиоды на плате тоже должны были реагировать на команды, поступающие через USB порт, но этого не произошло 
Немного подумав, я добавил в код следующую строку:

println (Serial.list ()); 

и это позволило найти, где висит мой COM4.


Внес изменения в строку 
arduinoPort = new Serial(this, Serial.list()[0], 9600);

заменил на 
arduinoPort = new Serial(this, Serial.list()[1], 9600);

И УРА! ВСЕ ЗАРАБОТАЛО



И так у меня получилось с Iphon-а по беспроводной связи управлять объектом на компьютере, созданном с помощью программы Processing, а также я смог управлять включением и выключением светодиодов, подключенных к Freeduino (команды на Freeduino передаются по кабелю USB, которым Freeduino подключен к компьютеру).



Правда, возникает логичный вопрос, а зачем в этой схеме беспроводной модуль XBee-PRO? И как все работает в этом клипе?
В самом начале меня ввели в заблуждение характеристики модуля, а именно, рабочая частота 2,4 ГГц, потому я и решил, что с легкостью установлю связь на прямую Iphon —> XBee-PRO (это же Wi-Fi, думал я). Но это оказалось не так, и Iphon не хотел, естественно, видеть никакого XBee. Немного помучившись с настройками, я еще раз пересмотрел клип, и на 22 секунде понял, в чем разгадка. Модуля два!!! Один установлен на управляемой модели, а второй установлен в USB Shield и подключен к компьютеру. Все встало на свои места и я отправился покупать недостающие платы. Так как USB Shield я купил в самом начале, то в этот раз был куплен Shield попроще (соответственно, подешевле).


Теперь самое главное!

Прежде, чем что-либо делать, нужно произвести первоначальную прошивку, используя XBee — USB Shield. О чем я и расскажу в этом посте. 
Для начала на самой плате выставляем джамперы как на фотографии:


Далее для прошивки понадобится терминал (я скачал PuTTY ).
Запустив терминал, нужно в Session прописать COM порт, к которому подключен прошиваемый модуль, — у меня это COM5,


а затем в Terminal выставить Force on. 


После чего смело жмем Open и откроется окно терминала.


Для входа в режим прошивки нужно набрать +++ (три плюса) и дождаться Ок.
Далее прописываем 
Id модуля, нажимаем Enter в начале строки появится Ок.
Id модуля, с которым он будет общаться, нажимаем Enter, и в начале строки появится Ок
и PAN Id, на конце ставим запятую (ничего не нажимаем), и в конце строки появится Ок
и в заключении вводим WR и нажимаем Enter.
Все. Данный модуль прошит и можно прошивать другой (если не увидели в каком-либо случае Ок, набираем +++ и все начинаем заново)

вот как это выглядит:

для первого модуля 
+++
ATMY1000
ATDL1001
ATID1111,
WR
для второго модуля
+++
ATMY1001
ATDL1000
ATID1111,
WR



Для дальнейшей работы нужно установить джамперы на USB Shield следующим образом (с другой платой пока ничего не делаем!!!)

Теперь можно рассказать, как я добился возможности управлять переключением светодиодов с телефона по беспроводной связи (это можно увидеть в представленном клипе ниже).


Итак, для начала я изменил код загруженный на Freeduino Nano (см. Путешествие в страну Freeduino, часть 7.1). 
Открыв arduino-0017, изменил код следующим образом…


int message = 0; 
int redLEDPin = 9;
 
int grLEDPin = 11;
int ylLEDPin = 10;
int redLED = 0;
int grLED = 0;
int ylLED = 0;
void setup() {
 
Serial.begin(9600);
 
}

void loop(){
if (Serial.available() > 0) {
 
message = Serial.read();
 

if (message == ‘R’){
 
redLED = 255;
 
}
if (message == ‘r’){
 
redLED = 0;
 
}
if (message == ‘Y’){
 
ylLED = 255;
 
}
if (message == ‘y’){
 
ylLED = 0;
 
}
 
if (message == ‘G’){
 
grLED = 255;
 
}
if (message == ‘g’){
 
grLED = 0; // Set redLED to 0 (off)
}
Serial.flush();
}
 
analogWrite(redLEDPin, redLED);
analogWrite(grLEDPin, grLED);
analogWrite(ylLEDPin, ylLED);
}



Теперь каждым светодиодом можно управлять по отдельности. После загрузки кода на Freeduino Nano проверил как все работает, открыв окно мониторинга и вводя по очереди ‘R’ ‘G’ ‘Y’ ‘r’ ‘g’ ‘y’(см. Путешествие в страну Freeduino, часть 7.1).

Затем запустил TouchOSC редактор и создал новый модуль с именем Button1. И создал три кнопки управления под каждый светодиод. Загрузил модуль на телефон.


Затем открыл программу Processing и тоже подкорректировал прежний код. Так он стал выглядеть:


import oscP5.*; 
import netP5.*;
 
import processing.serial.*;
 

Serial arduinoPort;
 
OscP5 oscP5;
 

int redLED = 0;
 
int grLED = 0;
int ylLED = 0;
int [] led = new int [4];
 

void setup() {
size(100,300);
 
noStroke();
 
oscP5 = new OscP5(this,8000);
 
arduinoPort = new Serial(this, Serial.list()[1], 9600);
println (Serial.list ());
 
}

void oscEvent(OscMessage theOscMessage) {
 
String addr = theOscMessage.addrPattern();
 
if(addr.indexOf(«/1/toggle») !=-1){
 
int i = int((addr.charAt(9) )) — 0x30;
 
led[i] = int(theOscMessage.get(0).floatValue());
 
}
 
}

void draw() {
background(100);
 
if(led[1] == 0){
 
arduinoPort.write(«r»);
 
redLED = 0;
 
}
if(led[1] == 1){
 
arduinoPort.write(«R»);
 
redLED = 255;
 
}
fill(redLED,0,0);
 
ellipse(50, 50, 50, 50);
 

if(led[2] == 0){
 
arduinoPort.write(«y»);
 
ylLED = 0;
 
}
if(led[2] == 1){
 
arduinoPort.write(«Y»);
 
ylLED = 255;
 
}
fill(ylLED,ylLED,0);
 
ellipse(50, 150, 50, 50);

if(led[3] == 0){
 
arduinoPort.write(«g»);
 
grLED = 0;
 
}
if(led[3] == 1){
 
arduinoPort.write(«G»);
 
grLED = 255;
 
}
fill(0,grLED,0);
 
ellipse(50, 250, 50, 50);
 

}


Запустил sketch на исполнение (Freeduino Nano должна быть подключена, иначе будет выдавать ошибку… не найдет COM порт), на телефоне открыл TouchOSC. Что получилось — можно увидеть в двух следующих роликах:



После этого я переставил джамперы, как изображено на фотографии:


и обеспечил для Freeduino Nano автономное питание. 


К компьютеру подключил USB Shield Shield с установленным модулем XBee. Заново запустил sketch в Processing. И получил желаемый результат: его вы видели в клипе, в самом начале поста.