roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 13:03

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 23 июл 2010, 11:53 
Не в сети

Зарегистрирован: 09 янв 2009, 13:02
Сообщения: 41
прог. языки: C/C++/Assembler/С#
Решил сделать небольшое клиент-серверное приложение ,которое управляет Arduino (с платой MotorShield) через локальную сеть.
Проект состоит из трех этапов
1)сектч для Arduino:
Код:
#include <AFMotor.h>;
int outputPin = 13;                //здесь храним номер контакта
int val;
AF_DCMotor motorL(1);
AF_DCMotor motorR(2);

void setup()
{
  Serial.begin(9600);              //установка порта на скорость 9600 бит/сек
  pinMode(outputPin, OUTPUT);      //устанавливаем 13 контакт в режим вывода
}

void loop()
{
  if (Serial.available()) {         //если есть принятый символ,
    val = Serial.read();            //  то читаем его и сохраняем в val
    if (val == "L") {               //  если принят симовол 'H',...
      motorL.run(FORWARD);
      motorL.setSpeed(128);
      motorR.run(BACKWARD);
      motorR.setSpeed(128);
    }
    if (val == "R") {               //  если принят симовол 'L',
      motorL.run(BACKWARD);
      motorL.setSpeed(128);
      motorR.run(FORWARD);
      motorR.setSpeed(128);     
    }
    if(val=="S"){
      motorL.run(RELEASE);
      motorL.setSpeed(128);
      motorR.run(RELEASE);
      motorR.setSpeed(128);
    }
    if(val=="B"){
      motorL.run(BACKWARD);
      motorL.setSpeed(128);
      motorR.run(BACKWARD);
      motorR.setSpeed(128);
    }
    if(val=="F"){
      motorL.run(FORWARD);
      motorL.setSpeed(128);
      motorR.run(FORWARD);
      motorR.setSpeed(128);
    }
  }
}

2)приложение для клиента (можно глянуть в аттаче исходники ArduinoProject.rar)
3)приложение для сервера (лежит там же)

Хотелось бы услышать критику со стороны сообщества=)

ПЫСЫ подскажите ,где в Москве можно купить тележку на 4 колесика ,с креплениями для моторчиков,редуктор (что бы можно было сделать поворот на месте ,левая пара колес вращается влево ,а другая вправо) ,сами колесики?


Вложения:
Server.rar [56.52 КиБ]
Скачиваний: 0
ArduinoProject.rar [89.31 КиБ]
Скачиваний: 0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 23 июл 2010, 17:07 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
getbraine писал(а):
Где в Москве купить тележку для робота ?

В Москве можно купить у Семенова Михаила такую тележку и другие электро механические платформы и детали электронные модули микросхемы и компоненты для создания роботов - http://mkpochtoi.narod.ru

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

getbraine писал(а):
управляет Arduino (с платой MotorShield) через локальную сеть.

Извини за ламерский вопрос - т.е. можно рулить с ПК через WiFi роботом с соотвествующим радио модулем ?

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 23 июл 2010, 19:00 
Не в сети

Зарегистрирован: 09 янв 2009, 13:02
Сообщения: 41
прог. языки: C/C++/Assembler/С#
если есть 2 пк ,и они соединены в локальную сеть (или просто имеют выход в инет оба) ,причем один из них -нетбук с тележкой на колесиках ,которой управляет arduino , то можно без проблем управлять нетбуком с пк . причем не важно ,как пк и нетбук будут соединены(либо через вай-фай ,либо через лан)

просто нужен сервер ,который крутится на компе и принимает команды от клиента. а потом сервер отправляет их на arduino.

схема приблизительно такая:
TCP/IP
ПК---------------ПК+Arduino+тележка+с_моторчиками
| |
| |
клиент сервер


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 29 июл 2010, 13:25 
Не в сети
Аватара пользователя

Зарегистрирован: 06 июн 2005, 02:27
Сообщения: 166
Откуда: Минск, Лида
а вот как организовать связь двух компов (без фиксированных ip) через интернет.
Пока что я своим роботом могу управлять по локальной сети по Wi-Fi каналу, но это на дистанции до 500 м (в прямой видимости).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 29 июл 2010, 14:00 
Не в сети
Аватара пользователя

Зарегистрирован: 05 фев 2008, 15:33
Сообщения: 2687
Откуда: St. Petersburg - Moscow
Skype: SkyStorm77
ФИО: Костюк Константин Вячеславович
Без фиксированных Ip через третий комп с фиксированным IP или DNS именем.

_________________
Никто кроме нас!!!
4Robots.ru - Все для роботов!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 29 июл 2010, 14:09 
Не в сети
Аватара пользователя

Зарегистрирован: 06 июн 2005, 02:27
Сообщения: 166
Откуда: Минск, Лида
может есть мысли где комп с фиксированным ip взять, да ещё чтоб доступ к нему был....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 29 июл 2010, 14:46 
Не в сети
Аватара пользователя

Зарегистрирован: 05 фев 2008, 15:33
Сообщения: 2687
Откуда: St. Petersburg - Moscow
Skype: SkyStorm77
ФИО: Костюк Константин Вячеславович
В интернете заводиш страничку на безплатном сервере.
А потом работаеш через него.
Один комп туда пишет, другой читает и наоборот.

_________________
Никто кроме нас!!!
4Robots.ru - Все для роботов!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C# ,управление Arduino через локальную сеть
СообщениеДобавлено: 17 сен 2010, 06:48 
Не в сети

Зарегистрирован: 06 июл 2010, 16:36
Сообщения: 198
Откуда: Черногорск
прог. языки: Objective-C, C#, C, C++
Команды для управления в слишком деревянные, где же тут плавное управление? Я сейчас тоже занимаюсь подобной программой, вот могу для контроллера свою наработку выложить, может пригодиться:

Код:
#include <Bounce.h>
byte LeftMotorPin[] = {3, 6, 9}; // номер выхода разъема для левого мотора. ШИМ/ реле 1/ реле 2
byte RightMotorPin[] = {5, 7,8};// номер выхода разъема для правого мотора. ШИМ/ реле 1/ реле 2
byte OptoBarrierPin = 12; // номер входа разъёма для опто датчика
byte OptoBarrierPinLed = 13; //номер выхода разъёма индикации срабатывания опто барьера
Bounce bouncer = Bounce(OptoBarrierPin, 40);
boolean motorsEnabled = true; //разрешения действий над моторами

unsigned int ControlTime = 0;
unsigned long CurrentTime;
unsigned long LastTime = 0;

//byte CommandType = 0;
//byte CommandState = 0;
//int ParamValue1, ParamValue2;
char versionMessage[] ="Rockman Robo V1.0 2010\r\n";
String message;
char inData;
int pos;

void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
 
  for(int i =0; i < 3; i++)
  {
   pinMode(LeftMotorPin[i], OUTPUT);
   pinMode(RightMotorPin[i], OUTPUT);
  }
  pinMode(OptoBarrierPin, INPUT);
  pinMode(OptoBarrierPinLed, OUTPUT);
 
  Serial.print(versionMessage);
}

void loop()
{
   
  if (bouncer.update()) {     //если произошло событие
    if (bouncer.read()== HIGH) {    //если сработал опто датчик
       Stop();
       motorsEnabled = false; //вводим моторы в неактивное состояние
       Serial.print("Opto Barrier HIGH\r\n");  //вывод сообщения о препятствии
       digitalWrite(OptoBarrierPinLed, HIGH);
       bouncer.rebounce(500);      //повторить событие через 500мс
    }
    else
        {
          motorsEnabled = true;//активируем моторы
          digitalWrite(OptoBarrierPinLed, LOW);
          Serial.print("Opto Barrier LOW\r\n"); //вывод сообщения об отсутсвии препятствия
        }
  }
 
   CurrentTime = millis();
   ControlTime += CurrentTime - LastTime;
   LastTime = CurrentTime;
   
  if(ControlTime >= 100)
  {
    ControlTime = 0;
    Stop();
  }
   
  if (Serial.available() > 0) {
    // get incoming byte:
    inData = Serial.read();
   
    if(inData != '\n')
     {
       message += inData; 
        if(message.length() > 255)
         {
           Serial.print("Out of size Command (>255): " + message + "\r\n");
           message = "";
         }
     }
      else
         {         
                 if(message.indexOf("Forward",0) == 0) //команда на движение вперед
                         Forward();
                 else if(message.indexOf("Backward",0) == 0)//команда на движение назад
                         Backward();
                 else if(message.indexOf("Stop",0) == 0) //команда останова
                         Stop(); 
                 else if(message.indexOf("Right",0) == 0)//команда на движение вправо
                         Right();
                 else if( message.indexOf("Left",0) == 0)//команда на движение влево
                         Left();
                 else if(message.indexOf("Rotate+",0) == 0)//команда на разворот по часовой стрелке
                         RotatePos();
                 else if(message.indexOf("Rotate-",0) == 0)//команда на разворот против часовой стрелки
                         RotateNeg();
                 else if( message.indexOf ("Get Version", 0) == 0)//команда на запрос версии
                 {
                   Serial.print(versionMessage);
                 }
                 else Serial.print("Unknown Command: " + message + "\r\n"); //неизвестная или ошибочный синтаксис команды
           
                 message = "";
         }
   
   }
}
//-------------------------------------------
int GetParamValue1(String mes)
{
  pos = mes.indexOf(',');
  if(pos > 0)
  {
    /*ParamValue1 = int(mes[pos - 1]);
    String s ;
    for(int i = 0; i < mes.length(); i ++)
    {
      s += String(int(mes[i])) + " ";
    }
    Serial.print("Message: " + s);
    Serial.print("ParamValue1: " + (String)ParamValue1+"\r\n");
    return ParamValue1;*/
    return int(mes[pos - 1]);
  }
  else
  {
    Serial.print("Eror: ParamValue1 not found\r\n");
    return -1;
  }
}

int GetParamValue2(String mes)
{
  pos = mes.indexOf(',');
  if(pos > 0)
  {
   if(mes.length() > pos + 1) return  int(mes[pos + 1]);
  }
 
  Serial.print("Eror: ParamValue2 not found\r\n");
  return -1;
  //Serial.print("Entered Command: " + message + "\r\n");
}

void SetMotorValue(byte *MotorPinArr, int inverted, int power)

     ControlTime = 0;
 
     if(inverted >= 0 && power >= 0)
       {
       //Выключаем оба реле мотора
       digitalWrite(MotorPinArr[1], LOW);
       digitalWrite(MotorPinArr[2], LOW);
       
       if (motorsEnabled == true)
         {
           if(power > 0)
             {
              if(inverted == 1)digitalWrite(MotorPinArr[1], HIGH);
              else digitalWrite(MotorPinArr[2], HIGH);
             }
         }
         else power = 0; //убираем мощность двигателя на 0 если он в неактивном состоянии   
         analogWrite(MotorPinArr[0], power);
      }
     else Serial.print("Error SetMotorValue: arguments < 0!\r\n");
 
}
//-----------------------------------------------------------------
void Stop()
{
  SetMotorValue(RightMotorPin, 0, 0);
  SetMotorValue(LeftMotorPin, 0, 0);
}

void Right()
{
   SetMotorValue(LeftMotorPin, 0, 0);
   SetMotorValue(RightMotorPin, GetParamValue1(message), GetParamValue2(message));
}
void Left()
{
  SetMotorValue(RightMotorPin, 0, 0);
  SetMotorValue(LeftMotorPin, GetParamValue1(message), GetParamValue2(message));
}
void Forward()
{
   SetMotorValue(LeftMotorPin, 0, GetParamValue1(message));
   SetMotorValue(RightMotorPin, 0, GetParamValue2(message));
}
void RotatePos()
{
  SetMotorValue(RightMotorPin, 0, GetParamValue1(message));
  SetMotorValue(LeftMotorPin, 1, GetParamValue2(message));
}
void RotateNeg()
{
  SetMotorValue(RightMotorPin, 1, GetParamValue1(message));
  SetMotorValue(LeftMotorPin, 0, GetParamValue2(message));
}
void Backward()
{
  SetMotorValue(LeftMotorPin, 1, GetParamValue1(message));
  SetMotorValue(RightMotorPin, 1, GetParamValue2(message));
}


Последний раз редактировалось Vooon 17 сен 2010, 07:28, всего редактировалось 1 раз.
[code=cpp]!


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

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


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

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


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

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