Форумы РобоКлуба: Мобильный телефон как пульт управления - Форумы РобоКлуба

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Мобильный телефон как пульт управления

#1 Пользователь офлайн   ft-ninja 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 7
  • Регистрация: 25 Декабрь 09
  • Город, регион:Москва
  • Возраст:99
  • Профессия:Mechatroniker

Отправлено 25 Декабрь 2009 - 14:48

В моем проекте я управляю роботом, которого собрал из конструктора фишертехник.
Изображение

В этом конструкторе есть электронный блок управления со встроенным модулем Bluetooth. Я написал небольшое приложение на Mobile Java, которое позволяет управлять роботом на расстоянии с помощью мобильного телефона. Нажимая на кнопки телефона, можно задавать направление движения робота.

Короткое видео в котором я управляю роботом:
Изображение

Исходные коды мидлета:

RoboControl.java:
    package com.robocontrol;

    import javax.microedition.midlet.MIDlet;
    import javax.microedition.lcdui.*;

    public class RoboControl extends MIDlet implements CommandListener {
       protected ControlCanvas controlCanvas;
        protected String url = "";
        public TextBox tbxMain;
        private Command cmdExit;
        
        private Command cmdConnect;
        private Command cmdDisconnect;
        
        public void startApp() {
            
           cmdExit = new Command( "Exit", Command.EXIT, 1 );
           cmdDisconnect = new Command( "Disconnect", Command.SCREEN, 1 );
           cmdConnect = new Command( "Connect", Command.SCREEN, 2 );
           
           tbxMain = new TextBox("Enter ROBO TX BT address", "", 12, TextField.NON_PREDICTIVE);
           tbxMain.addCommand(cmdConnect);
           tbxMain.addCommand(cmdExit);
           tbxMain.setCommandListener(this);
           
           controlCanvas = new ControlCanvas(this);
           controlCanvas.addCommand(cmdExit);
           controlCanvas.addCommand(cmdDisconnect);
           controlCanvas.setCommandListener(this);
           
           Display.getDisplay( this ).setCurrent(tbxMain);
        }
        
        public void pauseApp() {
        }

        public void destroyApp(boolean unconditional) {
        }

        public void commandAction( Command command, Displayable displayable ) {
            if( command == cmdExit ) {    
                notifyDestroyed();
            }
            if( command == cmdConnect ) {
               url = "btspp://" + tbxMain.getString() + ":1;authenticate=true;encrypt=false;master=false";
               controlCanvas.connect(url);
               Display.getDisplay( this ).setCurrent(controlCanvas);
            }    
            if( command == cmdDisconnect ) {
               controlCanvas.disconnect();
               Display.getDisplay( this ).setCurrent(tbxMain);
            } 
        }
    }

ControlCanvas.java:
    package com.robocontrol;

    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;

    import javax.microedition.io.Connector;
    import javax.microedition.io.StreamConnection;
    import javax.microedition.lcdui.Canvas;
    import javax.microedition.lcdui.Font;
    import javax.microedition.lcdui.Graphics;

    public class ControlCanvas extends Canvas {
       private RoboControl midlet;
       private int width, height;                  // Screen width and height
       private int d, r;                           // Radius and diameter of a ball
       protected int xcoord, ycoord;               // Upper-left corner of the drawn ball
       protected int y_lim, x_lim;
       protected int x_off;
        private Font font;
        private int fontHeight = 0;
        private int pressedKey;
       private StreamConnection c;
        private OutputStreamWriter ow;
       private InputStreamReader ir;
       
        public ControlCanvas(RoboControl midlet) {
            r = 10;
            d = 2*r;
            width = getWidth();
            height = getHeight();
            xcoord = width/2;
            ycoord = height/2;
            y_lim = height/4;
            x_lim = width/4;
            x_off = x_lim + x_lim/2;
           this.midlet = midlet;
           repaint();
        }
        
       protected void paint(Graphics g) {
            g.setColor(255, 255, 255);
            g.fillRect(0, 0, width, height);
            g.setColor(255, 0, 0);
            g.drawRect(0, 0, width - 1, height - 1);
            g.setColor(0, 0, 0);
            
            font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
            fontHeight = font.getHeight();
            g.drawString("Key Code = " + pressedKey, 0, fontHeight, Graphics.TOP|Graphics.LEFT);
            g.drawLine(xcoord-x_lim, ycoord, xcoord+x_lim, ycoord);
            g.drawLine(xcoord, ycoord-y_lim, xcoord, ycoord+y_lim);
           
            if (pressedKey == this.KEY_NUM2){
               g.fillArc(xcoord - r - x_off, ycoord - r, d, d, 0, 360);
              g.fillArc(xcoord-r, ycoord - r - y_lim, d, d, 0, 360);
              this.cmdForward();
           } else if (pressedKey == this.KEY_NUM8) {
              g.fillArc(xcoord - r - x_off, ycoord - r, d, d, 0, 360);
                  g.fillArc(xcoord - r, ycoord - r + y_lim, d, d, 0, 360);
                  this.cmdBackward();
           } else if (pressedKey == this.KEY_NUM4) {
              g.fillArc(xcoord - r - x_off, ycoord - r, d, d, 0, 360);
                  g.fillArc(xcoord - r - x_lim, ycoord - r, d, d, 0, 360);
                  this.cmdLeft();
           } else if (pressedKey == this.KEY_NUM6) {
              g.fillArc(xcoord - r - x_off, ycoord - r, d, d, 0, 360);
                  g.fillArc(xcoord - r + x_lim, ycoord - r, d, d, 0, 360);
                  this.cmdRight();
           } else if (pressedKey == this.KEY_NUM1) {
              g.fillArc(xcoord - r - x_off, ycoord - r - y_lim, d, d, 0, 360);
              g.fillArc(xcoord - r, ycoord - r, d, d, 0, 360);
              this.cmdForkUp();
           } else if (pressedKey == this.KEY_NUM7) {
              g.fillArc(xcoord - r - x_off, ycoord - r + y_lim, d, d, 0, 360);
              g.fillArc(xcoord - r, ycoord - r, d, d, 0, 360);
              this.cmdForkDown();
           } else {
              g.fillArc(xcoord - r - x_off, ycoord - r, d, d, 0, 360);
               g.fillArc(xcoord - r, ycoord - r, d, d, 0, 360);
           }                   
       }

        protected  void keyPressed(int keyCode) {
           pressedKey = keyCode;
           repaint();
        }
        
        protected  void keyReleased(int keyCode) {
           this.cmdStop();
           pressedKey = 0;
           repaint();
        }

        protected  void keyRepeated(int keyCode) { }
        
        public void connect(String stringURL) {
            try {
               c = (StreamConnection)Connector.open(stringURL);
               synchronized(this) {
                  OutputStream os = c.openOutputStream();
                  ow = new OutputStreamWriter(os, "US-ASCII");
                  InputStream is = c.openInputStream();
                  ir = new InputStreamReader(is, "US-ASCII");
              }                      
            } catch (Throwable e) {
           }          
        }

        public void disconnect() {
           try {
              ow.close();
              ir.close();
              c.close();             
            } catch (Throwable e) {
           }
        }
        
        public void cmdForkUp() {
            try {          
              ow.write("\rload /flash/fup.bin\r");
              ow.flush();
              ow.write("run\r");
              ow.flush();
            } catch (Throwable e) {
           }          
        }

        public void cmdForkDown() {
            try {          
              ow.write("\rload /flash/fdown.bin\r");
              ow.flush();
              ow.write("run\r");
              ow.flush();
            } catch (Throwable e) {
           }          
        }

        public void cmdLeft() {
            try {          
              ow.write("\rload /flash/left.bin\r");
              ow.flush();
              ow.write("run\r");
              ow.flush();
            } catch (Throwable e) {
           }          
        }

        public void cmdRight() {
            try {          
              ow.write("\rload /flash/right.bin\r");
              ow.flush();
              ow.write("run\r");
              ow.flush();
            } catch (Throwable e) {
           }          
        }

        public void cmdForward() {
            try {          
              ow.write("\rload /flash/forward.bin\r");
              ow.flush();
              ow.write("run\r");
              ow.flush();
            } catch (Throwable e) {
           }          
        }

        public void cmdBackward() {
            try {          
           ow.write("\rload /flash/backward.bin\r");
           ow.flush();
           ow.write("run\r");
           ow.flush();
        } catch (Throwable e) {
       }          
        }
        
        public void cmdStop() {
            try {   
              ow.write("\rload /flash/stop.bin\r");
              ow.flush();
              ow.write("run\r");
              ow.flush();
            } catch (Throwable e) {
           }          
        }
    }

Если интересно, задавайте вопросы.
0

#2 Пользователь офлайн   Lex 

  • Старожил
  • PipPipPipPipPip
  • Группа: Главные администраторы
  • Сообщений: 1.003
  • Регистрация: 31 Январь 06
  • Город:Москва
  • Интересы:мобильные автономные и телеуправляемые системы с элементами автономного поведения
  • Город, регион:Москва
  • Возраст:40
  • Профессия:инженер-механик

Отправлено 25 Декабрь 2009 - 17:59

Просмотр сообщенияft-ninja (25.12.2009, 14:48) писал:

В моем проекте я управляю роботом, которого собрал из конструктора фишертехник.
Изображение

В этом конструкторе есть электронный блок управления со встроенным модулем Bluetooth. Я написал небольшое приложение на Mobile Java, которое позволяет управлять роботом на расстоянии с помощью мобильного телефона. Нажимая на кнопки телефона, можно задавать направление движения робота.

А что за робот? Откуда у него Bluetooth?

#3 Пользователь офлайн   ft-ninja 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 7
  • Регистрация: 25 Декабрь 09
  • Город, регион:Москва
  • Возраст:99
  • Профессия:Mechatroniker

Отправлено 25 Декабрь 2009 - 20:41

Просмотр сообщенияLex (25.12.2009, 17:59) писал:

А что за робот? Откуда у него Bluetooth?

Механика робота собрана из деталей, которые входят в наборы для конструирования фишертехник (fischertechnik). Вернее даже из одного набора "ROBO TX Trainig Lab".
Мозги робота - это такой черный пластмассовый кирпич ROBO TX Controller, в котором спрятан ARM-микроконтроллер, модуль блютус, USB-порт, ЖК-дисплей, входы и выходы.
Изображение

Насчет входов и выходов:
- 8 универсальных входов (дискртеные/аналоговые);
- 4 счетных входа (для подключения сигналов от сервомоторов);
- 8 универсальных выходов (дискртеные или ШИМ).
Питание от аккумулятора 9 В.

На страничке Robo-TX (unsorted "blog" 8-), которая посвящена реверс-инжинирингу этого блока, есть много информации. На английском языке (:
0

#4 Пользователь офлайн   iRobot 

  • Профан
  • PipPipPipPipPip
  • Группа: Постоянные пользователи
  • Сообщений: 1.379
  • Регистрация: 10 Январь 07
  • Город:ашхабад
  • Город, регион:Москва
  • Возраст:27
  • Профессия:Камергинер

Отправлено 25 Декабрь 2009 - 22:26

Прошивки то есть уже ?
0

#5 Пользователь офлайн   ft-ninja 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 7
  • Регистрация: 25 Декабрь 09
  • Город, регион:Москва
  • Возраст:99
  • Профессия:Mechatroniker

Отправлено 26 Декабрь 2009 - 12:49

Просмотр сообщенияiRobot (25.12.2009, 22:26) писал:

Прошивки то есть уже ?


Какие прошивки?
0

#6 Пользователь офлайн   evgenikys 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 21 Февраль 10
  • Город, регион:Ставропольский край
  • Возраст:24
  • Профессия:АСУТП

Отправлено 21 Февраль 2010 - 10:00

Здравствуйте, уважаемые форумчане!!!
Уважаемый ft-ninja, натолкните на ресурс, где можно изучить BlueTooth тему (книги для скачивания, подробные статьи, описания). Очень хочется построить балансирующий робот и воздействовать на него по средсвам телефона.
0

#7 Пользователь офлайн   ft-ninja 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 7
  • Регистрация: 25 Декабрь 09
  • Город, регион:Москва
  • Возраст:99
  • Профессия:Mechatroniker

Отправлено 21 Февраль 2010 - 11:52

Просмотр сообщенияevgenikys (21 Февраль 2010 - 10:00) писал:

Здравствуйте, уважаемые форумчане!!!
Уважаемый ft-ninja, натолкните на ресурс, где можно изучить BlueTooth тему (книги для скачивания, подробные статьи, описания). Очень хочется построить балансирующий робот и воздействовать на него по средсвам телефона.


Привет!

Для изучения технологии bluetooth я использовал официальный форум разработчиков Nokia - Forum Nokia. Там много статей с примерами на эту тему.

Не могли бы вы рассказать о конструкции вашего робота? Меня тоже интересует эта тема.
0

#8 Пользователь офлайн   evgenikys 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 21 Февраль 10
  • Город, регион:Ставропольский край
  • Возраст:24
  • Профессия:АСУТП

Отправлено 22 Февраль 2010 - 09:00

Балансирующий робот очень интересная для меня тема, так как к в алгоритмах его управления можно использовать много математики. Очень хочется прилепить впереди робота мешаническую руку, чтобы робот, захватывая предмет, изменял вертикальное равновесное положение и мог балансировать в наклоненном состоянии. BlueTooth хочется исползовать для управления рукой и перемешением робота. Жаль что с англицким туговато. Прийдется все-таки доучивать:-). Конструкция робота обещает быть следующей: шасси-Двухмоторный редуктор TAMIYA и два колесика Tamiya D50mm Offroad. Следующий этаж- драйверы двигателей и контроллерная часть. Третий этаж- аккумуляторный отсек и модули связи с внешним миром(моим телефоном), вожможно какой-нибудь дисплейчик от сотового для индикации чего-нибудь, а так же Акселерометр MMA7260Q(трех осевой с хорошей чувствительностью и по прекрасной цене) и гироскоп(с ним-то я еще не опредесился до конца, но скорее всего прийдется брать что-нибудь подороже, т.к. тут нудна чувствительность повыше). На днях закажутся в магазине шасси и детальки для драйверов, акселерометр и микроконтроллер(скорее всего AVR-очка, но мож замахнусь сразом и на ARM-ик).
:-)

Мож, все-таки, есть где-нибудь что-нибудь по-русски про BlueTooth-ину для быстрого легкого ознакомления?
0

#9 Пользователь офлайн   ft-ninja 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 7
  • Регистрация: 25 Декабрь 09
  • Город, регион:Москва
  • Возраст:99
  • Профессия:Mechatroniker

Отправлено 22 Февраль 2010 - 11:58

Просмотр сообщенияevgenikys (22 Февраль 2010 - 09:00) писал:

Мож, все-таки, есть где-нибудь что-нибудь по-русски про BlueTooth-ину для быстрого легкого ознакомления?


К сожалению у меня нет источников информации по блютусу на русском, только то, что я указал выше.
0

#10 Пользователь офлайн   evgenikys 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 21 Февраль 10
  • Город, регион:Ставропольский край
  • Возраст:24
  • Профессия:АСУТП

Отправлено 22 Февраль 2010 - 12:32

Ну, раз нет на русском буду учить англицкий. От робота не отступлюсь.
0

#11 Пользователь офлайн   ft-ninja 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 7
  • Регистрация: 25 Декабрь 09
  • Город, регион:Москва
  • Возраст:99
  • Профессия:Mechatroniker

Отправлено 22 Февраль 2010 - 13:30

Просмотр сообщенияevgenikys (22 Февраль 2010 - 12:32) писал:

Ну, раз нет на русском буду учить англицкий. От робота не отступлюсь.


Английский в этой области никогда не помешает!

Как вы предполагаете измерять отклонение робота от положения равновесия?
0

#12 Пользователь офлайн   evgenikys 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 21 Февраль 10
  • Город, регион:Ставропольский край
  • Возраст:24
  • Профессия:АСУТП

Отправлено 22 Февраль 2010 - 15:38

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

На первый взгляд кажется, что этого вполне хватит для поддержания равновесия ROBOчуда. Ан нет! Исходя из теории управления можно прикинуть, ента система очень вяло будет реагировать на отклонение от равновесия в начальный момент времени и переходные характеристики будут скорее всего не ахти.

Гигоскоп- друг очень полезный. Он преобразует ускорение в изменение сигнала на выходе. если мы его отклоним в сторону, он выдаст на выходе скачкообразное отклонение сигнала и вернет его (сигнал)в исходное состояние. Гироскоп не покажет на сколько велико отклонение от равновесия, но покажет насколько быстро оно происходит.

Используя их месте мы можем определить насколько быстро и в каком направлении надо реагировать двигателям на возмущающее воздействие чтобы коректировать равновесие при малых его отклонениях.
0

#13 Пользователь офлайн   Mr. MADcap a.k.a. Tj 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 4
  • Регистрация: 02 Май 10
  • Город, регион:nsk
  • Возраст:14
  • Профессия:MC, Programmer, Web-Designer

Отправлено 02 Май 2010 - 16:37

ft-ninja,спасибо за исходники! Сам немного программирую на J2ME, а с такой штукой встречаюсь впервые! :D
0

#14 Пользователь офлайн   ft-ninja 

  • Прохожий
  • Pip
  • Группа: Пользователи
  • Сообщений: 7
  • Регистрация: 25 Декабрь 09
  • Город, регион:Москва
  • Возраст:99
  • Профессия:Mechatroniker

Отправлено 02 Май 2010 - 17:55

Просмотр сообщенияMr. MADcap a.k.a. Tj (02 Май 2010 - 16:37) писал:

ft-ninja,спасибо за исходники! Сам немного программирую на J2ME, а с такой штукой встречаюсь впервые! :D


Всегда пожалуйста.

Вот тут - http://sourceforge.n.../robotxcontrol/ есть самые свежие версии исходников.
0

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему