Управляем чем угодно откуда угодно

Где посмотреть пример программы на с/с++ для vir2real ?

Обсуждение линуксовой части и софта на борту виртурилки

Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение infospacer » 20 сен 2013, 17:44

Управление через вэб интерфейс это чудесно, но хотелось бы написать что нибудь полезное на С для virt2real, светодиодиками помигать, моторчик покрутить.
Ну и далее более сложные алгоритмы реализовать, для автономного режима.
Существует ли документация, желательно с примером простейшей программы и процессом компиляции?
Хорошо бы на вики выложить статью либо ссылку на эту тему, специально для начинающих.
infospacer
 
Сообщения: 3
Зарегистрирован: 20 сен 2013, 17:13

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение orangeudav » 20 сен 2013, 18:14

Между вами и ногой со светодиодом находится линукс. Чтобы дергать ногами и прочим вам в любом случае придется писать и читать файлы (как описано в вики). Так что вобщем-то подходит любой язык программирования в котором есть File.open/write/read/close

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

Кстати есть вероятность что например такую задачу как стабилизация полета квадракоптера целиком придется в свой драйвер переносить (ради производительности) либо компилить с включенным RT Linux и выставлять максимальный приоритет своему процессу.
orangeudav
 
Сообщения: 152
Зарегистрирован: 04 сен 2013, 15:35

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение phoenix367 » 20 сен 2013, 18:35

infospacer писал(а):Управление через вэб интерфейс это чудесно, но хотелось бы написать что нибудь полезное на С для virt2real, светодиодиками помигать, моторчик покрутить.
Ну и далее более сложные алгоритмы реализовать, для автономного режима.
Существует ли документация, желательно с примером простейшей программы и процессом компиляции?
Хорошо бы на вики выложить статью либо ссылку на эту тему, специально для начинающих.


Для компиляции можно использовать тотже самый тулчейн, который прошивку собирает. Тут ничего сложного нет. Для удобства можно настроить IDE в которой работаете для того, чтобы она нужный компилятор для сборки использовала. Я, например, так netbeans настроил. Вроде собирает нормально.

Что касается примера работы с GPIO, то как уже писали выше - открываете файл устройства, записываете туда данные (те же самые, которые в инструкции в вики), закрываете. Для себя возможно буду подобный фреймворк делать, если у разработчиков такого в планах нет (скорее всего что нет).
phoenix367
 
Сообщения: 193
Зарегистрирован: 09 сен 2013, 00:19

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение Mirmik » 20 сен 2013, 19:13

Пожалуйста, пример программы...
Программа моего робота...


Код: Выделить всё
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
void MOSINT();

#define rt1 write(0,"ggg1gg\n",7);
#define rt2 write(0,"ggg2gg\n",7);
#define rt3 write(0,"ggg3gg\n",7);
#define rt4 write(0,"ggg4gg\n",7);
#define rt5 write(0,"ggg5gg\n",7);
#define rt write(0,"\n",1);

int fd;
char buf[1024];
int bytes_read;
int sock;
struct sockaddr_in addr;
   
int main()
{
sock=0;
fd=0;
   
   //Set PWM on pins
   system("echo 'set con44 pwm1' > /dev/v2r_pins");
   system("echo 'set con43 pwm0' > /dev/v2r_pins");

//Restart Label
startserver:

   
   // USART0 open port
   fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);
   if (fd == -1) {fprintf(stderr,"open_port: Unable to open ports ");goto ex;}
   
   
   

   //Socket create
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock < 0) {perror("socket");goto ex;}
   
    //Socket configuration
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10600);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);;


   //Try to bind port for Socket
    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {goto ex;}
      
   // Main cycle
    while(1)
         {
         bytes_read = recv(sock, buf, 1024, 0);
            if(bytes_read <= 0) {break;}
         MOSINT();     
         write(0, buf, bytes_read);
         write(fd, buf, bytes_read);
         }
   
// Error handler
ex:
   if (fd!=0) close(fd);
    if (sock!=0) close(sock);
   sleep(1);
    goto startserver;
   
    return 0;
}

   int i2=0,flag=0;
   void interpreter();
   char buffer[100],kekeke[100];
   unsigned int n_INT=0;
   char inChar;

void MOSINT()
{st:

   for(;i2<bytes_read;i2++)
   {
   inChar=buf[i2];
   if (inChar=='|') {goto startint;}
   if (n_INT<100-1) {buffer[n_INT]=inChar; n_INT++;}
   }
   
  return;
 
startint:

   buffer[n_INT] = 0x00;
   interpreter();
   n_INT=0;
   if (i2+1<bytes_read) {i2++;goto st;}
   i2=0;
}


#define T 4
#include <stdlib.h>
#include <limits.h>
unsigned long m;
unsigned long lastm=0,lastm2=0;
char strsys[100]="";char strtemp[100]="";
unsigned long duty;
void interpreter(void)
{char* c;
strsys[0]=0;
strsys[1]=0;
   unsigned int i=0;
   for (;(i<strlen(buffer)) && (buffer[i]==' ');i++);
   for (;(i<strlen(buffer)) && (buffer[i]!=' ');i++);
   c=(buffer+i);
   c[0]=0x00;
   c=c+1;

   
   if(!strcmp(buffer,"serv1")) {
   strcat(strsys,"echo 'set pwm1 duty:");
   sprintf(strtemp,"%d",atoi(c)*(57000-13000)/180+13000);
   strcat(strsys,strtemp);
      
   strcat(strsys," period:700000' > /dev/v2r_pins");
   if (clock()-lastm>T)
{   lastm=clock();
   system(strsys);
}
}
   if(!strcmp(buffer,"serv2")) {
   strcat(strsys,"echo 'set pwm0 duty:");
   sprintf(strtemp,"%d",atoi(c)*(57000-13000)/180+13000);
   strcat(strsys,strtemp);
      
   strcat(strsys," period:700000' > /dev/v2r_pins");
   if (clock()-lastm2>T)
{   lastm2=clock();
   system(strsys);
}}
   
}


Делает:
Открывает порт USART, создаёт socket, вешает его на порт 10600.

Висит в цикле:
Получает данные из сокета. Посылает их на USART.
Дублирует в функцию MOSINT.

Функция накапливает байты до прихода стоп байта, выдаёт их на простенький интерпретатор, обученный распознавать команды управления сервами.
Последний раз редактировалось Mirmik 21 сен 2013, 20:09, всего редактировалось 2 раз(а).
... и перерастворяясь из одной формы реальности в другую. И вот он я, рядом с вами падаю в эту же нору, тот кто волшебной палочкой вра...
Аватара пользователя
Mirmik
 
Сообщения: 221
Зарегистрирован: 04 сен 2013, 19:20
Откуда: Московская область, Пушкино

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение andrewion » 20 сен 2013, 19:21

Mirmik писал(а):Пожалуйста, пример программы...
Программа моего робота...


Код: Выделить всё
void MOSINT();

#define rt1 write(0,"ggg1gg\n",7);
#define rt2 write(0,"ggg2gg\n",7);
#define rt3 write(0,"ggg3gg\n",7);
#define rt4 write(0,"ggg4gg\n",7);
#define rt5 write(0,"ggg5gg\n",7);
#define rt write(0,"\n",1);

int fd;
char buf[1024];
int bytes_read;
int sock;
struct sockaddr_in addr;
   
int main()
{
sock=0;
fd=0;
   
   //Set PWM on pins
   system("echo 'set con44 pwm1' > /dev/v2r_pins");
   system("echo 'set con43 pwm0' > /dev/v2r_pins");

//Restart Label
startserver:

   
   // USART0 open port
   fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);
   if (fd == -1) {fprintf(stderr,"open_port: Unable to open ports ");goto ex;}
   
   
   

   //Socket create
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if(sock < 0) {perror("socket");goto ex;}
   
    //Socket configuration
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10600);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);;


   //Try to bind port for Socket
    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {goto ex;}
      
   // Main cycle
    while(1)
         {
         bytes_read = recv(sock, buf, 1024, 0);
            if(bytes_read <= 0) {break;}
         MOSINT();     
         write(0, buf, bytes_read);
         write(fd, buf, bytes_read);
         }
   
// Error handler
ex:
   if (fd!=0) close(fd);
    if (sock!=0) close(sock);
   sleep(1);
    goto startserver;
   
    return 0;
}

   int i2=0,flag=0;
   void interpreter();
   char buffer[100],kekeke[100];
   unsigned int n_INT=0;
   char inChar;

void MOSINT()
{st:

   for(;i2<bytes_read;i2++)
   {
   inChar=buf[i2];
   if (inChar=='|') {goto startint;}
   if (n_INT<100-1) {buffer[n_INT]=inChar; n_INT++;}
   }
   
  return;
 
startint:

   buffer[n_INT] = 0x00;
   interpreter();
   n_INT=0;
   if (i2+1<bytes_read) {i2++;goto st;}
   i2=0;
}


#define T 4
#include <stdlib.h>
#include <limits.h>
unsigned long m;
unsigned long lastm=0,lastm2=0;
char strsys[100]="";char strtemp[100]="";
unsigned long duty;
void interpreter(void)
{char* c;
strsys[0]=0;
strsys[1]=0;
   unsigned int i=0;
   for (;(i<strlen(buffer)) && (buffer[i]==' ');i++);
   for (;(i<strlen(buffer)) && (buffer[i]!=' ');i++);
   c=(buffer+i);
   c[0]=0x00;
   c=c+1;

   
   if(!strcmp(buffer,"serv1")) {
   strcat(strsys,"echo 'set pwm1 duty:");
   sprintf(strtemp,"%d",atoi(c)*(57000-13000)/180+13000);
   strcat(strsys,strtemp);
      
   strcat(strsys," period:700000' > /dev/v2r_pins");
   if (clock()-lastm>T)
{   lastm=clock();
   system(strsys);
}
}
   if(!strcmp(buffer,"serv2")) {
   strcat(strsys,"echo 'set pwm0 duty:");
   sprintf(strtemp,"%d",atoi(c)*(57000-13000)/180+13000);
   strcat(strsys,strtemp);
      
   strcat(strsys," period:700000' > /dev/v2r_pins");
   if (clock()-lastm2>T)
{   lastm2=clock();
   system(strsys);
}}
   
}


Делает:
Открывает порт USART, создаёт socket, вешает его на порт 10600.

Висит в цикле:
Получает данные из сокета. Посылает их на USART.
Дублирует в функцию MOSINT.

Функция накапливает байты до прихода стоп бита, выдаёт их на простенький интерпретатор, обученный распознавать команды управления сервами.



А поделитесь пожалуйста опытом, как вы прогу собираете для виртурилки? Какими инструментами пользуетесь? Если можно, по шагам. :)
Аватара пользователя
andrewion
 
Сообщения: 150
Зарегистрирован: 03 сен 2013, 21:46

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение Mirmik » 20 сен 2013, 19:55

Helloworld для Virt2real. В самом ненавороченном варианте.
Могут быть ошибки. Сейчас не на чем отлаживаться.

Что будем делать: Мы возьмем компилятор из SDK, компильнем с его помощью программу HelloWorld, полученный файл кинем на virt2real и запустим.

Нужно:
virt2real (целевая машина ЦМ) в одной сети с компьютером (инструментальная машина ИМ)
ИМ должна управляться ОС семейства Linux, иметь скачанный SDK.

Как делать:
ИМ:
- идём в папку ......./virt2real-sdk/codesourcery/arm-2013.05/bin
- Создаём символическую ссылку на файл "arm-none-linux-gnueabi-g++".
- Переименовываем ссылку во чтонибудь попроще (Мой вариант, "virt-gcc" , хотя оно вроде и не gcc, а совсем таки g++ ... )
- Кидаем ссылку в один из каталогов, где Линух ищет свои команды. (Полный список каталогов можно получить, сделав вызов "echo $PATH" через консоль)

Замечательно. Теперь ИМ понимает команду virt-gcc. (Имеет смысл это проверить, сделав соответствующий вызов)

Далее.
- создаем где-нибудь (пусть это будет директория /home/user/) текстовый файл prg.cpp .
- редактируем:

//prg.cpp
#include "stdio.h"
int main(void) {printf("It`s bugged world\n");return(0);}

- выполняем в консоли, находясь в папке с созданным нами файлом
virt-gcc prg.cpp -o prg

Теперь у нас есть бинарник нашей программы скомпилированный специально для ЦМ. Остается только залить его на ЦМ.
Это можно сделать через флешку или:

Пишем в консоли:
scp ./prg root@192.168.1.128:/root/ (Предполагается, что 192.168.1.128 -адрес ЦМ)

Отвечаем на вопросы утилиты копирования, и если все хорошо, файл уходит на ЦМ.
Лежит он в папке /root/

Теперь очередь за ЦМ:
cd /root/
chmod 777 prg
./prg

Если видите наш helloWorld, вы обучились таинству кросскомпиляции.


Разумеется, дальше идет или подшивание компилятора к среде разработки, или написание Makefile. И т.д.
Это (как и само программирование) лежит за рамками сего обзорчика, ибо по большому счету не отличается от программирования в срреде ОС Linux. (что до меня, то я пользуюсь редактором geany)

(Если вдруг что-то неочевидно, спрашивайте...)
... и перерастворяясь из одной формы реальности в другую. И вот он я, рядом с вами падаю в эту же нору, тот кто волшебной палочкой вра...
Аватара пользователя
Mirmik
 
Сообщения: 221
Зарегистрирован: 04 сен 2013, 19:20
Откуда: Московская область, Пушкино

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение andrewion » 20 сен 2013, 23:44

Mirmik писал(а):Helloworld для Virt2real. В самом ненавороченном варианте.
Могут быть ошибки. Сейчас не на чем отлаживаться.

Что будем делать: Мы возьмем компилятор из SDK, компильнем с его помощью программу HelloWorld, полученный файл кинем на virt2real и запустим.

Нужно:
virt2real (целевая машина ЦМ) в одной сети с компьютером (инструментальная машина ИМ)
ИМ должна управляться ОС семейства Linux, иметь скачанный SDK.

Как делать:
ИМ:
- идём в папку ......./virt2real-sdk/codesourcery/arm-2013.05/bin
- Создаём символическую ссылку на файл "arm-none-linux-gnueabi-g++".
- Переименовываем ссылку во чтонибудь попроще (Мой вариант, "virt-gcc" , хотя оно вроде и не gcc, а совсем таки g++ ... )
- Кидаем ссылку в один из каталогов, где Линух ищет свои команды. (Полный список каталогов можно получить, сделав вызов "echo $PATH" через консоль)

Замечательно. Теперь ИМ понимает команду virt-gcc. (Имеет смысл это проверить, сделав соответствующий вызов)

Далее.
- создаем где-нибудь (пусть это будет директория /home/user/) текстовый файл prg.cpp .
- редактируем:

//prg.cpp
#include "stdio.h"
int main(void) {printf("It`s bugged world\n");return(0);}

- выполняем в консоли, находясь в папке с созданным нами файлом
virt-gcc prg.cpp -o prg

Теперь у нас есть бинарник нашей программы скомпилированный специально для ЦМ. Остается только залить его на ЦМ.
Это можно сделать через флешку или:

Пишем в консоли:
scp ./prg root@192.168.1.128:/root/ (Предполагается, что 192.168.1.128 -адрес ЦМ)

Отвечаем на вопросы утилиты копирования, и если все хорошо, файл уходит на ЦМ.
Лежит он в папке /root/

Теперь очередь за ЦМ:
cd /root/
chmod 777 prg
./prg

Если видите наш helloWorld, вы обучились таинству кросскомпиляции.


Разумеется, дальше идет или подшивание компилятора к среде разработки, или написание Makefile. И т.д.
Это (как и само программирование) лежит за рамками сего обзорчика, ибо по большому счету не отличается от программирования в срреде ОС Linux. (что до меня, то я пользуюсь редактором geany)

(Если вдруг что-то неочевидно, спрашивайте...)


За инструкцию, огромное спасибо!

У меня возникает вопрос, а сесть ли возможность упрости всё дело с перетаскиванием проги с ИМ на ЦМ? Например, применять сам компилятор, прямо на виртурилке. А то, из-за перетаскивания проги туда-сюда, особо не на хардкодишься :D
Аватара пользователя
andrewion
 
Сообщения: 150
Зарегистрирован: 03 сен 2013, 21:46

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение Mirmik » 21 сен 2013, 00:19

Безусловно можно... Для этого надо всего-лишь найти исходные коды компилятора и откомпилировать его самим же собой... Я не знаю, где их взять.

Второй вариант - через Makefile процесс переброса скомпилированного файла вполне можно автоматизировать... Только я не знаю, как автоматизировать ввод пароля....

Что касается удобства, то... В общем, дело привычки... С учетом того, что я компилирую с терминала, у меня процесс компиляции нового варианта программы, с учетом того, что инструкции уже сидят в памяти shell-а выглядит "сохранить файл-переключится на терминал(встроенный в geany)-вверх-вверх-ентер-вверх-вверх-ентер-ввод пароля-переключение на путти-вверх-ентер" ... Программа запустилась. Не особо сложно... При нужной сноровке с учетом лага на запросе пароля... Секунды три-четыре...
... и перерастворяясь из одной формы реальности в другую. И вот он я, рядом с вами падаю в эту же нору, тот кто волшебной палочкой вра...
Аватара пользователя
Mirmik
 
Сообщения: 221
Зарегистрирован: 04 сен 2013, 19:20
Откуда: Московская область, Пушкино

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение infospacer » 21 сен 2013, 01:59

orangeudav писал(а):Между вами и ногой со светодиодом находится линукс. Чтобы дергать ногами и прочим вам в любом случае придется писать и читать файлы (как описано в вики). Так что вобщем-то подходит любой язык программирования в котором есть File.open/write/read/close

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

Кстати есть вероятность что например такую задачу как стабилизация полета квадракоптера целиком придется в свой драйвер переносить (ради производительности) либо компилить с включенным RT Linux и выставлять максимальный приоритет своему процессу.


Спасибо всем отписавшимся по теме!
Будем разбираться с RTLinux и пробовать писать драйвера.
Инструкции не прошу, но думаю ссылки по эти темам на вики с толковыми ресурсами были бы полезны для сообщества.
infospacer
 
Сообщения: 3
Зарегистрирован: 20 сен 2013, 17:13

Re: Где посмотреть пример программы на с/с++ для vir2real ?

Сообщение scayn » 21 сен 2013, 19:35

Все бьюсь над этой строчкой:
Код: Выделить всё
system("echo 'set con44 pwm1' > /dev/v2r_pins");

При компиляции выдает ошибку:
Код: Выделить всё
play.cpp:11:51: error: 'system' was not declared in this scope

Думаю какую то библиотеку нужно подключить, но какую? Пробовал:
Код: Выделить всё
#include <iostream>
#include <stdio.h>
#include <string>
#include <unistd.h>

Раньше на дельфях писал и под винду, сейчас си осваиваю, так что сильно не пинайте :oops:

Сам нашел:
Код: Выделить всё
#include <stdlib.h>
Аватара пользователя
scayn
 
Сообщения: 27
Зарегистрирован: 16 сен 2013, 16:14

След.

Вернуться в Софт на виртурилке - SDK, Linux, Github, программирование (C/C++ и др.)

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

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

cron