telegamochka: (Default)
telegamochka ([personal profile] telegamochka) wrote2011-04-19 08:46 am

Управляем Румбой из-под линукса

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>

int fd;
char buf[512];

int main(void) {
port_set:
  fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
  if (fd == -1) {
    printf("Error opening port.\n");
  } else {
    // Настроим порт
    struct termios options;
    tcgetattr(fd, &options);
    cfsetispeed(&options, B57600);
    cfsetospeed(&options, B57600);
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~PARODD;
    options.c_cflag |= CS8;
    options.c_cflag &= ~HUPCL;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag |= CLOCAL;
    tcsetattr(fd, TCSANOW, &options);

    // Переведем Румбу в режим "полного послушания"   
    buf[0]=0x80;
    write(fd, buf, 1);
    sleep(1);
    buf[0]=0x82;
    write(fd, buf, 1);
   sleep(1);

/*
// Эта последовательность скомандует Румбе ехать вперед и вперед
    buf[0]=0x89;
    buf[1]=0x00;
    buf[2]=0xC8;
    buf[3]=0x80;
    buf[4]=0x00;
    write(fd, buf, 5);
*/

// Эта последовательность команд заставит Румбу бегать по периметру квадрата со стороной примерно в полметра
    for(;;) {
      buf[0]=0x89;
      buf[1]=0x01;
      buf[2]=0x2C;
      buf[3]=0x80;
      buf[4]=0x00;
      buf[5]=0x9C;
      buf[6]=0x01;
      buf[7]=0x90;
      buf[8]=0x89;
      buf[9]=0x01;
      buf[10]=0x2C;
      buf[11]=0x00;
      buf[12]=0x01;
      buf[13]=0x9D;
      buf[14]=0x00;
      buf[15]=0x5A;
      write(fd, buf, 16);
      sleep(1);
    }
  }
}

Откомпилировать программу можно командой
$ gcc roomba.c -o roomba

[identity profile] mandrykin.livejournal.com 2011-04-29 09:48 am (UTC)(link)
Может быть имеет смысл направление робота брать из *argv[]?
Тогда роботом можно будет управлять скриптами. А то каждый раз пере-компилировать сырцы, чтобы задать маршрут, как-то некрасиво.

[identity profile] telegamochka.livejournal.com 2011-04-29 10:27 am (UTC)(link)
Исходник - просто чтобы показать, как настроить порт и как слать команды для работы с румбой. Ну а откуда брать команды - дело автора проекта :) Или управлять роботом скриптами (у меня такой задачи не стояло), или брать управление с джойстика. У меня робот будет управляться командами, подаваемыми через интернет. Ну и попробую будет написать вариант, когда компьютер сам генерит последовательность команд для достижения нужной цели.

Например, если использовать робот для присмотра за домом, то можно рулить им через инет. Но удобнее, введя карту своей квартиры, указать роботу точку, куда ему нужно прибыть - и пусть сам едет туда.