roboforum.ru

Технический форум по робототехнике.

Управление роботом с помощью мобильного телефона

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

Управление роботом с помощью мобильного телефона

Сообщение ft-ninja » 22 дек 2009, 23:40

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

Вот небольшое видео с работающим роботом:


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

==
Поздравляю, ft-ninja!
Последний раз редактировалось ft-ninja 23 дек 2009, 02:15, всего редактировалось 1 раз.
Аватара пользователя
ft-ninja
 
Сообщения: 82
Зарегистрирован: 21 дек 2009, 15:21
Откуда: Inner Mongolia

Re: Управление роботом с помощью мобильного телефона

Сообщение кулер 23 » 22 дек 2009, 23:53

Круто!
Nokia 5500 моя мечта :roll: неуспел купить :( :cry:
Аватара пользователя
кулер 23
 
Сообщения: 798
Зарегистрирован: 17 апр 2009, 19:44
Откуда: Югорск
Skype: rizhykot
ФИО: Аксютин Юрий

Re: Управление роботом с помощью мобильного телефона

Сообщение ft-ninja » 22 дек 2009, 23:59

У 5500 слабое место - резиновая клавиатура, которая отклеивается постоянно (:
Поздравляю, ft-ninja!
Изображение
Аватара пользователя
ft-ninja
 
Сообщения: 82
Зарегистрирован: 21 дек 2009, 15:21
Откуда: Inner Mongolia

Re: Управление роботом с помощью мобильного телефона

Сообщение ALHIMIK » 23 дек 2009, 00:38

:good: прикольно
Аватара пользователя
ALHIMIK
 
Сообщения: 997
Зарегистрирован: 05 окт 2008, 14:41
Откуда: СПб
прог. языки: C,Python

Re: Управление роботом с помощью мобильного телефона

Сообщение SMT » 23 дек 2009, 01:36

Отлично! :)
Такие Java приложения затачиваются под конкретные модели телефонов?
Управление на джойстик можно настраивать? Может удобнее будет.
Что там в роботе вообще - поподробнее, пожалуйста.
SMT
 
Сообщения: 1158
Зарегистрирован: 23 авг 2008, 22:28
Откуда: Санкт-Петербург
ФИО: Сергей

Re: Управление роботом с помощью мобильного телефона

Сообщение ft-ninja » 23 дек 2009, 02:07

Такие Java приложения затачиваются под конкретные модели телефонов?

Если телефон поддерживет Mobile Java, то перенос не должен вызвать больших проблем. Я проверил мидлет на двух разных нокиях. На платформах S40 и S60. Главное, чтобы поддерживался Bluetooth API for Java ME (JSR-82).
Управление на джойстик можно настраивать?

Можно конечно. Еще есть возможность использовать встроенный акселерометр - получится подобие 3D-манипулятора.
Что там в роботе вообще - поподробнее, пожалуйста.

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

Внутри блока управления крутится операционная система. Есть консоль, к которой можно подрубиться через USB или блютус.

Предварительно в среде разработки ROBO Pro были написаны семь управляющих программ (УП):
- Движение вперед;
- Движение назад;
- Поворот налево;
- Поворот направо;
- Поднять вилы;
- Опустить вилы;
- Стоп.

Затем эти УП были загружены на флеш-диск в ROBO TX. Из консоли они запускаются просто:
Код: Выделить всёРазвернуть
load forward.bin
run


Мидлет в телефоне соединяется с консолью и посылает вышеуказанные команды через последовательный порт в символьном виде.
Последний раз редактировалось ft-ninja 23 дек 2009, 11:30, всего редактировалось 1 раз.
Аватара пользователя
ft-ninja
 
Сообщения: 82
Зарегистрирован: 21 дек 2009, 15:21
Откуда: Inner Mongolia

Re: Управление роботом с помощью мобильного телефона

Сообщение кулер 23 » 23 дек 2009, 02:32

эта чтука стоит 18 тисяч :shock: :shock: :shock: :shock: :shock: я сошел сума поставте мне прививку от бешенства!!!
Аватара пользователя
кулер 23
 
Сообщения: 798
Зарегистрирован: 17 апр 2009, 19:44
Откуда: Югорск
Skype: rizhykot
ФИО: Аксютин Юрий

Re: Управление роботом с помощью мобильного телефона

Сообщение Vooon » 23 дек 2009, 05:14

кулер, ты что раньше не видел фишертехник?
Это отличный конструктор, посмотри на тытрубе примеры производственных линий, будет сразу понятно почему лего курит в стороне :)

Добавлено спустя 1 минуту 5 секунд:
А исходники мидлета можешь выложить?
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Управление роботом с помощью мобильного телефона

Сообщение ft-ninja » 23 дек 2009, 10:45

А исходники мидлета можешь выложить?


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) {
       }         
    }
}
Аватара пользователя
ft-ninja
 
Сообщения: 82
Зарегистрирован: 21 дек 2009, 15:21
Откуда: Inner Mongolia

Re: Управление роботом с помощью мобильного телефона

Сообщение Kozinaka » 23 дек 2009, 14:48

Клёво! Красиво, эффектно, и работа была именно над сутью, благодря использованию готовых штук. Мне нравится такой подход!

В описании конструктора порадовала подпись: "Конструкторы профессионального уровня для детей от 9 лет."
Аватара пользователя
Kozinaka
 
Сообщения: 85
Зарегистрирован: 17 ноя 2009, 16:21
Откуда: Москва
прог. языки: C/C++/C#
ФИО: Олег Козлов

Re: Управление роботом с помощью мобильного телефона

Сообщение elmot » 10 янв 2012, 01:29

Лично я после свойе машинки разочаровался в j2me. Не буду больше с ним связываться. Да здравствует андроид!
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Управление роботом с помощью мобильного телефона

Сообщение Romeo » 10 янв 2012, 20:05

Аватара пользователя
Romeo
 
Сообщения: 320
Зарегистрирован: 04 фев 2009, 16:02
Откуда: Десногорск
прог. языки: VB, MicroC, Pascal, С++ Builder

Re: Управление роботом с помощью мобильного телефона

Сообщение aalleexxaa » 06 фев 2012, 20:52

а где тут темы про программирование кпк для управления роботом по проводу (без использования Irda и Bluetooth)?
aalleexxaa
 
Сообщения: 20
Зарегистрирован: 22 окт 2010, 17:46

Re: Управление роботом с помощью мобильного телефона

Сообщение ft-ninja » 06 фев 2012, 21:03

А такое вообще возможно? :shock:
а где тут темы про программирование кпк для управления роботом по проводу (без использования Irda и Bluetooth)?
Поздравляю, ft-ninja!
Изображение
Аватара пользователя
ft-ninja
 
Сообщения: 82
Зарегистрирован: 21 дек 2009, 15:21
Откуда: Inner Mongolia

Re: Управление роботом с помощью мобильного телефона

Сообщение mellit » 06 фев 2012, 23:36

да можно и по проводу если у тебя есть старый кпк palm там обычно были rs232 порты или какойнибуть новый телефон с юсб хостом например нокиа с6-01
Аватара пользователя
mellit
 
Сообщения: 33
Зарегистрирован: 18 дек 2011, 20:23
Откуда: Киев Украина
Skype: evgen.mellit
ФИО: Evgen Mellit


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17