roboforum.ru

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

C# ,управление Arduino через локальную сеть

C# ,управление Arduino через локальную сеть

getbraine » 23 июл 2010, 11:53

Решил сделать небольшое клиент-серверное приложение ,которое управляет 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 через локальную сеть

avr123.nm.ru » 23 июл 2010, 17:07

getbraine писал(а):Где в Москве купить тележку для робота ?

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

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

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

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

Re: C# ,управление Arduino через локальную сеть

getbraine » 23 июл 2010, 19:00

если есть 2 пк ,и они соединены в локальную сеть (или просто имеют выход в инет оба) ,причем один из них -нетбук с тележкой на колесиках ,которой управляет arduino , то можно без проблем управлять нетбуком с пк . причем не важно ,как пк и нетбук будут соединены(либо через вай-фай ,либо через лан)

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

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

Re: C# ,управление Arduino через локальную сеть

hadok » 29 июл 2010, 13:25

а вот как организовать связь двух компов (без фиксированных ip) через интернет.
Пока что я своим роботом могу управлять по локальной сети по Wi-Fi каналу, но это на дистанции до 500 м (в прямой видимости).

Re: C# ,управление Arduino через локальную сеть

SkyStorm » 29 июл 2010, 14:00

Без фиксированных Ip через третий комп с фиксированным IP или DNS именем.

Re: C# ,управление Arduino через локальную сеть

hadok » 29 июл 2010, 14:09

может есть мысли где комп с фиксированным ip взять, да ещё чтоб доступ к нему был....

Re: C# ,управление Arduino через локальную сеть

SkyStorm » 29 июл 2010, 14:46

В интернете заводиш страничку на безплатном сервере.
А потом работаеш через него.
Один комп туда пишет, другой читает и наоборот.

Re: C# ,управление Arduino через локальную сеть

Rockman » 17 сен 2010, 06:48

Команды для управления в слишком деревянные, где же тут плавное управление? Я сейчас тоже занимаюсь подобной программой, вот могу для контроллера свою наработку выложить, может пригодиться:

Код: Выделить всёРазвернуть
#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]!


Rambler\'s Top100 Mail.ru counter