roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 09:48

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 22 дек 2009, 23:40 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2009, 15:21
Сообщения: 82
Откуда: Inner Mongolia
В моем проекте я управляю роботом, которого собрал из конструктора фишертехник.
Изображение
В этом конструкторе есть электронный блок управления со встроенным модулем Bluetooth. Я написал небольшое приложение на Mobile Java, которое позволяет управлять роботом на расстоянии с помощью мобильного телефона. Нажимая на кнопки телефона, можно задавать направление движения робота.

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


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

==
Поздравляю, ft-ninja!


Последний раз редактировалось ft-ninja 23 дек 2009, 02:15, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 22 дек 2009, 23:53 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 22 дек 2009, 23:59 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2009, 15:21
Сообщения: 82
Откуда: Inner Mongolia
У 5500 слабое место - резиновая клавиатура, которая отклеивается постоянно (:

_________________
Поздравляю, ft-ninja!
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 23 дек 2009, 00:38 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 23 дек 2009, 01:36 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 23 дек 2009, 02:07 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2009, 15:21
Сообщения: 82
Откуда: Inner Mongolia
Цитата:
Такие 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 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 23 дек 2009, 02:32 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 23 дек 2009, 05:14 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
кулер, ты что раньше не видел фишертехник?
Это отличный конструктор, посмотри на тытрубе примеры производственных линий, будет сразу понятно почему лего курит в стороне :)

Добавлено спустя 1 минуту 5 секунд:
А исходники мидлета можешь выложить?

_________________
Linux user | Firefox user


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 23 дек 2009, 10:45 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2009, 15:21
Сообщения: 82
Откуда: Inner Mongolia
Цитата:
А исходники мидлета можешь выложить?


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) {
       }         
    }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 23 дек 2009, 14:48 
Не в сети
Аватара пользователя

Зарегистрирован: 17 ноя 2009, 16:21
Сообщения: 85
Откуда: Москва
прог. языки: C/C++/C#
ФИО: Олег Козлов
Клёво! Красиво, эффектно, и работа была именно над сутью, благодря использованию готовых штук. Мне нравится такой подход!

В описании конструктора порадовала подпись: "Конструкторы профессионального уровня для детей от 9 лет."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 10 янв 2012, 01:29 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 10 янв 2012, 20:05 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 06 фев 2012, 20:52 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 06 фев 2012, 21:03 
Не в сети
Аватара пользователя

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

_________________
Поздравляю, ft-ninja!
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление роботом с помощью мобильного телефона
СообщениеДобавлено: 06 фев 2012, 23:36 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 4 часа


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

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


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO