Жизнеспособность этого блога полностью зависит от тебя, дорогой читатель. Комментируй, пиши замечания и предложения. Если блог будет дышать, я буду дополнять его интересными статьями.

понедельник, 22 апреля 2013 г.


Часть 6. Завершение 


На приведенных ниже фотографиях показан вариант готового робота. В передней части установлен телефон Nokia 5800. Телефон под управлением уже устаревшей symbian, но под него удалось найти приложение, снимающее видео на камеру и отсылающее данные под WiFi на экран моего десктопа. Таким образом используя android-телефон в качестве пульта и наблюдая за изображением на мониторе, получилось весьма весело покатать по квартире и даже залезть в укромные уголки используя светодиодные фары.
В статьях были даны все необходимые данные для самостоятельной сборки робота.





Часть 5. СКЕТЧ 


Проект для arduino называетя СКЕТЧ. Ответы на все вопросы по созданию ПО для arduino можно найти тут arduino.ru
Текст самой программы находится ниже. В принципе это все, что необходимо для  прошивки платы arduino:

/*
 * Version 1.2 2013
 * http://tutrobot.blogspot.com/
 * Робот на базе Arduino
*
*/
#define MIN_speed     0

//Только выходы с PWM - 3,5,6,9,10,11
int PIN_ENB = 9;
int PIN_ENA = 6;

int PIN_IN4 = 2;
int PIN_IN3 = 4;
int PIN_IN2 = 5;
int PIN_IN1 = 7;

int LED_PIN = 13;
float vel,ks,m1,m2;
float spl, spr;
int quadr = 0;
int ver, hor;
unsigned char mode;
unsigned char oldmode;
unsigned char iSpeed;
unsigned char rx_buf[8];
unsigned char rxcnt;
boolean binv = 0; 
boolean rx_ok;

// Правый мотор
void RM_foward()
{
  digitalWrite(PIN_IN1, LOW);
  digitalWrite(PIN_IN2, HIGH);
}
void RM_back()
{
  digitalWrite(PIN_IN1, HIGH);
  digitalWrite(PIN_IN2, LOW);
}
// Левый мотор
void LM_foward()
{
  digitalWrite(PIN_IN4, LOW);
  digitalWrite(PIN_IN3, HIGH);
}
void LM_back()
{
  digitalWrite(PIN_IN4, HIGH);
  digitalWrite(PIN_IN3, LOW);
}
void setup()
{
  Serial.begin(9600);
  pinMode(PIN_ENB, OUTPUT);
  pinMode(PIN_IN4, OUTPUT);
  pinMode(PIN_IN3, OUTPUT);
  pinMode(PIN_IN2, OUTPUT);
  pinMode(PIN_IN1, OUTPUT);
  pinMode(PIN_ENA, OUTPUT);
  pinMode(LED_PIN, OUTPUT);

  digitalWrite(PIN_IN1, LOW);
  digitalWrite(PIN_IN2, LOW);
  digitalWrite(PIN_IN4, LOW);
  digitalWrite(PIN_IN3, LOW);

  digitalWrite(PIN_ENA, LOW);
  digitalWrite(PIN_ENB, LOW); 
}
//Процедура задания скорости
void setspeed()
{
  float sf1;
  //левый двигатель
  if (spl>0.0) LM_foward(); else LM_back(); 
  sf1=abs(spl);
  sf1=sf1*(255-MIN_speed)+MIN_speed;
  if (spl==0.0) sf1=0;
  iSpeed = int(sf1);
  analogWrite(PIN_ENA, iSpeed);
  //правый двигатель
  if (spr>0.0) RM_foward(); else RM_back(); 
  sf1=abs(spr);
  sf1=sf1*(255-MIN_speed)+MIN_speed;
  if (spr==0.0) sf1=0;
  iSpeed = int(sf1);
  analogWrite(PIN_ENB, iSpeed);
}

void loop()
{
  if (Serial.available() == 7)
  {
    rxcnt=0;
    digitalWrite(LED_PIN, binv);
    binv=!binv;
  
    while (Serial.available() > 0)
    {  
      rx_buf[rxcnt] = Serial.read();
      rxcnt++;
    }
    //Контроль целостности пакета
    rx_ok=true;
    if (rx_buf[4]!=4) rx_ok=false;
    //прочистка буфера
    if (!rx_ok)
    {
      int avi = Serial.available();
      Serial.print("err");
      while (Serial.available() > 0)
      {
        avi = Serial.read();
      }
    }
   
    if (rx_ok)
    {
        hor = rx_buf[1];
        ver = rx_buf[2];
        
        quadr = 0;
        //Вычисление рабочего квадранта
        float fhor=float(hor);
        float fver=float(ver);       
       
        if (fhor>128.0)
        {
          fhor=256.0-fhor;
          quadr = quadr+1;
        } 

        if (fver>128.0)
        {
          fver=256.0-fver;
          quadr = quadr+2;
        }
        //нормализация скоростей
        fhor=fhor/127.0;
        fver=fver/127.0;
       
        if (fver>fhor)
        {
          m1 = fver;
          m2 = (1.0-fhor)*fver;
          
        } else
        {
          m1 = fhor;
          m2 = (fver-1.0)*fhor;   
        }
        if ((fver<0.1)&&(fhor<0.1))
        {
          m1=0;
          m2=0;
        }
     
        //Приведение знаков скоростей по квадрантам
        if (quadr==0)
        {
          spl=-m1;
          spr=-m2;
        }

        if (quadr==1)
        {
          spr=-m1;
          spl=-m2;
        }       
        if (quadr==2)
        {
          spr=m1;
          spl=m2;
        }
        if (quadr==3)
        {
          spl=m1;
          spr=m2;
        }
       
        setspeed();           
    }   
 
  }
  if (Serial.available() > 7) 
  {
      int avi = Serial.available();
      Serial.print("e");
      while (Serial.available() > 0)
      {
        avi = Serial.read();
      }
  }

}



Часть 4. Модуль Bluetooth


На упомянутом мной китайском сайте, да и много где, предлагаются интересные устройства – Bluetooth serial – модули:


При их весьма скромной цене (мене 10$) они имеют большую функциональность. Имея на своем борту мощный микроконтроллер, они имеют возможность программирования. Туда можно залить свою программу, скомпилированную на специализированной IDE
Но мы этим заниматься не будем. Изначально в модуль зашита программа Bluetooth-serial конвертора. И этого нам вполне достаточно. Посылая данные в виртуальный Bluetooth COM-порт компьютера, они появляются на выходе последовательного порта (UART) модуля. Соответственно подключив последовательный порт модуля к последовательному порту arduino мы свяжем нашу плату управления по беспроводной сети с PC или aндроидом.
Подключиться к модулю довольно просто:
  • включите Bluetooth на своем устройстве;
  • в окружении Bluetooth найдите свой модуль (обычно это BOLUTEK);
  • для подключения введите код, по умолчанию «1234».

Для посылки команд с андроид-устройства скачайте программу «4joy». Она находится на Google Play Market и бесплатна (пока). Для управления лучше использовать джойстик с аналоговым управлением:


Хотя робот будет прекрасно работать и с цифровыми стрелками:  



Часть 3 Особенности подключения электродвигателей к плате управления L298 (Motor shield)



Двигатели постоянного тока, используемые в роботе, по заявленной характеристике имеют рабочее напряжение 6 – 12 вольт. Других характеристик, как и принято в китайских магазинах, на данные двигатели нет. Поэтому эмпирически выявлено, что напряжение, при котором двигатель работает и редуктор создает достаточный момент, должно быть не менее 7 вольт.  При этом ток двигателя составляет несколько сотен мА.
Выводы, которые можно сделать по рабочему напряжению двигателя:
  • данные двигатели для устройств с батарейным питанием мягко говоря не ахти;
  • для питания двигателей необходимо как минимум 8 аккумуляторов АА*, либо как вариант повышающий преобразователь напряжения типа ”STEP UP Converter” или, как говорят моделисты, бустер. Но последний вариант будем рассматривать как перспективу. А пока – 8хAA.
Выводы по току потребления: К сожалению для управления двигателями не достаточно выходной мощности портов arduino. Поэтому нужно искать решения. Стоит отметить, что управлять двигателями можно совершенно различными способами:
  • реализация на реле;
  • реализация на россыпи (транзисторы, резисторы и т.п.);
  • применение специализированных микросхем.  
Однако реле не позволят сделать плавное управление скоростью двигателя, а реализация на россыпи требует специализированных знаний в схемотехнике и достаточно трудоемка. Поэтому самым распространенным решением для этой задачи является специализированная микросхема. В нашем случае это L298. И хотя эта микросхема уже морально устарела, но в то же время является весьма распространенной и к тому же для ардуино выпускается множество вариантов шильдов с этой микросхемой с одноименным названием L298(N).

L298 (Motor shield)
Схема L298 (Motor shield):
Типовое подключение двигателей постоянного тока:
Поскольку в нашем случае четыре двигателя, то двигатели подключаются к L298 по два к каждому каналу параллельным соединением.

*Примечание: есть неприятные моменты с L298. Схемотехника устаревшего драйвера такова, что выходные каскады не могут установить напряжения так сказать «peak_to_peak».
Т.е. верхний и нижний каскады будут брать на себя порядка 1.2-1.3 вольта и это снижает амплитуду рабочего напряжения. Проще говоря, два аккумулятора из восьми будут работать просто на радиатор самой микросхемы. 

Вывод казалось бы прост – использовать более современные и совершенные микросхемы. Вот, например, интересная микросхемка VNH3SP30. Однако надо учитывать и реалии своего географического местоположения. Далеко не каждый найдет эту микросхему в соседнем магазине.






вторник, 16 апреля 2013 г.


  Часть 2. Из чего собрать платформу робота




Комплектация, предлагаемая к использованию, взята с сайтов http://dx.com и http://www.aliexpress.com. К сожалению именно такого набора, на котором собирался исходный робот, на DX-е уже нет. Но это совершенно не важно - там множество подобных наборов. Поэтому я укажу лишь необходимую для данного проекта комплектацию:
  • 4 редуктора с моторами постоянного тока:

  • 4 колеса «65 * 26 * D-5.3mm Rubber Car Tire»:


  • плата управления двигателями L298N:

  • плата управления на базе Arduino UNO:

  • беспроводной модуль Bluetooth:


В принципе этого уже достаточно. Остальное можно отыскать у себя в столе. Но все же для удобства можно указать еще и это:
  • держатель батарей 6xAA + 2xAA и соответственно 8 батарей АА, а еще лучше 8 аккумуляторов (почему именно 8 объясню попозже);
  • Разъем питания для платы arduino uno;
  • breadboard (макетная доска);
  • выключатель питания;
  • 4 белых светодиода под фары с токогасящими резисторами 120 Ом
  • интерфейсная плата “Sensor Shield”. (хотя можно прекрасно обойтись и без нее)
  • и конечно само основание для установки двигателей и плат, но его можно изготовить и самостоятельно из того же оргстекла. Но все конечно определяется выделенными на этот проект финансами.


Итак, этот цикл статей посвящен созданию робота на основе четырехколесной платформы. Я собрал этого робота из набора «robot car kit for arduino», купленного на dx.com. http://dx.com/s/Arduino+Robot.  
Сам DX удобен для меня, поскольку есть бесплатная доставка в Беларусь. На самом же деле не важно где покупать комплектующие, главное, это применяемые решения.








Как я говорил, этот робот уже собран и работает. На данный момент он представляет из себя полноприводную машинку с управлением по Bluetooth с android-устройства. Приложение под андроид “4joy” выполняет роль аналогового джойстика и позволяет плавно изменять скорости моторов - двигаться вперед, назад, двигаться под разными углами или просто разворачиваться на месте. Так же можно включать фары при помощи функциональных кнопок. Сразу скажу, что эта программа абсолютно бесплатна и доступна для скачивания на play market.
В этом цикле статей я дам исчерпывающая информацию для самостоятельной сборки и запуска такого робота. Собрав его, ты освоишь сразу несколько вещей – научишься работать с микропроцессорным модулем arduino, прошивать его, освоишь основы управления двигателями постоянного тока и узнаешь о принципах широтно-импульсного управления, а так же, освоишь весьма доступную и перспективную технику беспроводного управления устройствами используя недорогие модули Bluetooth и приложение под андроид.
Конечно, это только начало, но в последующем ты сможешь самостоятельно развить эту платформу до полноценного многофункционального робота, благо под ардуино выпускается огромное количество  различных датчиков, исполнительных механизмов и т.п.
В статьях будет показано:
  • из чего собрать платформу робота;
  • особенности подключения электродвигателей к плате управления L298 (Motor shield);
  • сборка и настройка модулей arduino;
  • особенности создания управляющего кода для arduino и программирование управляющего микроконтроллера;
  • подключение к arduino беспроводного модуля Bluetooth;
  • дана вся необходимая документация по используемым элементам;
  • даны ссылки и сами программы с необходимыми пояснениями.
Жизнеспособность этого блога полностью зависит от тебя, дорогой читатель. Комментируй, пиши замечания и предложения. Если блог будет дышать,  я буду дополнять его интересными статьями.