Первые шаги в работе с Arduino

Любому, кто только делает свои первые шаги в радиоэлектронике, освоении программирования, хочется помочь, придать уверенности, чтобы появлялся интерес изучать эту интересную тему дальше. Поэтому я решил сделать пошаговую инструкцию для тех, кто делает свои первые шаги, но не знает, с чего можно начать?

Мы будем разбирать платформу Arduino от покупки самого контроллера, до «заливания» кода программы (далее скетч*) и управления собственной моделью при помощи телефона на Android; далее напишем свой алгоритм, по которому наш робот будет сам выбирать путь, куда ему двигаться (следующий урок).

Вот такой робот у нас получится по истечению всех уроков (прошу прощения за качество, это стоп-кадр видео):

image

Содержание


1. Покупка деталей
2. Разбор каждой позиции
3. Сборка и программирование модели
4. Подключение к Android

Итак, начнём!

1. Покупка деталей


Для начала следует выбрать контроллер. Большой выбор есть на официальном сайте Arduino, но в этом вопросе можно немного сэкономить, заказав аналогичную и полностью совместимую модель Freeduino.
1) Для данного проекта нам отлично подойдет модель UNO. Все параметры отлично подходят под наши критерии — это средний размер, возможность подключать различные модули, шилды, да и цена не так сильно кусается, как на более «старших» моделях. Заказывал её тут, пришла за 3 недели (г. Волгоград), качество отличное, проблем в эксплуатации не было.
2) Далее заказываем расходные материалы, шилды, модули, которые понадобятся нам для сборки. Для управления моторами нам, соответственно, понадобится следующая деталь: Motor Shield заказывал здесь. Доставили тоже быстро, упаковано всё было хорошо, без повреждений.
3) Для связи телефона с нашим роботом нам нужен Bluetooth-модуль, который заказывал вот тут. Нареканий в работе не наблюдал.
4) Конечно же, всё это должно иметь платформу, на которую мы всё это закрепим. Воспользуемся готовым вариантом.

Это все детали, которые жизненно необходимы для работы нашего робота, но есть ещё несколько вещей, которые, по моему мнению, здорово упрощают жизнь и работу с Arduino. Я решил отказаться от батареек, которыми питают саму платформу, я заказал себе маленький Power Bank, при помощи которого всё это дело запустится. Вот ссылка. На момент заказа курс был около 35р, поэтому все детали мне достались на много дешевле, чем на момент написания данного урока.

2. Разбор каждой позиции


Мы заказали детали и, пока дожидаемся извещения, чтобы скорее забрать наш заказ, можем более подробно изучить каждую позицию, да и вообще цель нашей работы.

Мы заказали Freeduino 2009 – аналог Arduino Duemilanove.

Технические характеристики:
  • Микроконтроллер: ATmega328 (ATmega168 в ранних версиях платы)
  • Цифровые порты ввода/вывода: 14 портов (из них 6 с ШИМ-сигналом)
  • Аналоговые порты ввода: 6 портов
  • ППЗУ (Flash Memory): 32 K (16 К), из них 2 К используются загрузчиком
  • ОЗУ (SRAM): 2 Кбайт (1 Кбайт)
  • ПЗУ (EEPROM): 1024 байт (512 байт)
  • Тактовая частота: 16 МГц
  • Интерфейс с ПК: USB
  • Питание от USB, либо от внешнего источника, выбор с помощью перемычки

Далее рассмотрим Motor Shield, который поможет нам в управлении моторами робота.

image

К данному модулю мы можем подключить до 4-х моторов, и программируя каждый на определенную мощность и скорость вращения. У данного модуля есть один минус- это отсутствие пинов, куда бы мы могли подключить последующию модули при помощи специальных кабелей, что мне немного усложнило задачу. Можно было заказать отдельно пины и перепаять их, но я решил просто припаять модули напрямую к motor shield.

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

image

Платформа же имеет полный набор для сборки. В комплекте была даже отвертка, которой удобно собирать нашу модель.

image

3. Сборка и программирование модели


В сборке не должно возникнуть никаких проблем, разве что только с подключением Bluetooth-модуля. Внизу прилагается схема подключения, а простыми словами это выглядит так:

Bluetooth-модуль --> контроллер
VCC --> 5V
GND --> Gnd
TXD --> PIN-0
RXD --> PIN-1

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

image

Для программирования нам понадобится среда разработки Arduino — качаем.

Arduino IDE — специальная среда разработки для плат Arduino. С её помощью можно написать код, скомпилировать его и «залить» на плату, чтобы заставить работать наше устройство. Также в данной среде имеется большое количество подключаемых библиотек, содержащих в себе много дополнительных уже готовых скетчей, которые позволяют быстро проверить работоспособность отдельных модулей, дополнений к нашей плате. Язык программирования очень похож на семейство языка С, который довольно прост в освоении, если знать основы языка С, это и является большим плюсом в программировании данной платформы.

Начинаем, как и всегда с подключения нужных библиотек. Скорее всего, Вам придется поискать в интернете AFMotor.h, проблемы найти данную библиотеку быть не должно.

#include <AFMotor.h> // Подключаем библиотеку для управления двигателями  
#include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты

Далее создаем объекты для двигателей:

AF_DCMotor motor1(1); //канал М1 на Motor Shield 
AF_DCMotor motor2(2); //канал М2 на Motor Shield

Канал M1 и M2 определяется легко- достаточно посмотреть на наш модуль и там около креплений с зажимами подписано M1, М2, М3, М4 соотвественно:

SoftwareSerial BTSerial(0, 1); // RX, TX, подключение БТ

// Переменная для команд Bluetooth 
char vbt; 
//Переменные для запоминания скорости двигателей 
int vL, vR; 
/* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах. 
Текущая скорость должна быть больше этого значения.  В противном случае двигатели со стороны направления поворота просто не будут вращаться */ 
int vspd = 200;

void setup() { 
  //Cкорость передачи данных по Bluetooth 
  BTSerial.begin(9600); 
  // Cкорость передачи данных по кабелю 
  Serial.begin(9600); 
  // Устанавливаем максимальную скорость вращения двигателей 
  vspeed(255,255); 
}

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

В этой части мы просто описываем функционал программы (скорость, переменные).

void loop() { 
  //проверяем наличие данных для передачи
  if (BTSerial.available()) 
  { 
    // Принимаем команды, преобразуем код в соответствующий символ 
    vbt = (char)BTSerial.read(); 
    

    // Вперед 
    if (vbt == 'F') { 
      vforward(); 
    } 
    // Назад 
    if (vbt == 'B') 
    { 
      vbackward(); 
    } 
    // Влево 
    if (vbt == 'L') 
    { 
      vright(); 
    }     
    // Вправо 
    if (vbt == 'R') 
    { 
      vleft(); 
      
    }  
    // Прямо и влево 
    if (vbt == 'G') 
    { 
      vforwardright();
    }  
    // Прямо и вправо 
    if (vbt == 'I') 
    { 
      vforwardleft(); 
      vforwardright(); 
    }  
    // Назад и влево 
    if (vbt == 'H') 
    { 
      vbackwardleft(); 
    }  
    // Назад и вправо 
    if (vbt == 'J') 
    { 
      vbackwardright(); 
    }  
    // Стоп 
    if (vbt == 'S') 
    { 
      vrelease(); 
    } 
    // Скорость 0% 
    if (vbt == '0') 
    { 
      vspeed(0,0); 
    } 
    // Скорость 10% 
    if (vbt == '1') 
    { 
      vspeed(25,25); 
    } 
    // Скорость 20% 
    if (vbt == '2') 
    { 
      vspeed(50,50); 
    } 
    // Скорость 30% 
    if (vbt == '3') 
    { 
      vspeed(75,75); 
    } 
    // Скорость 40% 
    if (vbt == '4') 
    { 
      vspeed(100,100); 
    } 
    // Скорость 50% 
    if (vbt == '5') 
    { 
      vspeed(125,125); 
    } 
    // Скорость 60% 
    if (vbt == '6') 
    { 
      vspeed(150,150); 
    } 
    // Скорость 70% 
    if (vbt == '7') 
    { 
      vspeed(175,175); 
    } 
    // Скорость 80% 
    if (vbt == '8') 
    { 
      vspeed(200,200); 
    } 
    // Скорость 90% 
    if (vbt == '9') 
    { 
      vspeed(225,225); 
    } 
    // Скорость 100% 
    if (vbt == 'q') 
    { 
      vspeed(255,255); 
    } 
  } 
}


Далее мы описываем каждое действие, в данном случае FORWARD заставляет двигатель крутиться вперёд, а BACKWARD крутит двигатель в обратном направлении. Сочетание этих действий позволяет поворачивать, двигаться влево-вправо, отклоняться от прямого направления движения робота.

// Вперед 
void vforward() { 
  vspeed(vL,vR); 
  vforwardRL(); 
}

// Вперед для RL 
void vforwardRL() { 
  motor1.run(FORWARD); 
  motor2.run(FORWARD); 
 
}

// Назад 
void vbackward() { 
  vspeed(vL,vR); 
  vbackwardRL(); 
}

// Назад для RL 
void vbackwardRL() { 
  motor1.run(BACKWARD); 
  motor2.run(BACKWARD);  
}

// Влево 
void vleft() { 
  vspeed(vL,vR); 
  motor1.run(BACKWARD); 
  motor2.run(FORWARD); 

}

// Вправо 
void vright() { 
  vspeed(vL,vR); 
  motor1.run(FORWARD); 
  motor2.run(BACKWARD); 
}

// Вперед и влево 
void vforwardleft() { 
  if (vL > vspd) { 
    vspeed(vL-vspd,vR); 
  } 
  else 
  { 
    vspeed(0,vR); 
  } 
  vforwardRL(); 
}

// Вперед и вправо 
void vforwardright() { 
  if (vR > vspd) { 
    vspeed(vL,vR-vspd); 
  } 
  else 
  { 
    vspeed(vL,0); 
  } 
  vforwardRL(); 
}

// Назад и влево 
void vbackwardleft() { 
  if (vL > vspd) { 
    vspeed(vL-vspd,vR); 
  } 
  else 
  { 
    vspeed(0,vR); 
  } 
  vbackwardRL(); 
}

// Назад и вправо 
void vbackwardright() { 
  if (vR > vspd) { 
    vspeed(vL,vR-vspd); 
  } 
  else 
  { 
    vspeed(vL,0); 
  } 
  vbackwardRL(); 
}

// Стоп 
void vrelease(){ 
  motor1.run(RELEASE); 
  motor2.run(RELEASE);  
}

// Изменение скорости 
void vspeed(int spdL,int spdR){ 
  if (spdL == spdR) { 
    vL=spdL; 
    vR=spdR; 
  } 
  motor1.setSpeed(spdL); 
  motor2.setSpeed(spdR); 
}

В этом видео я подключал просто пропеллер к разъему M1 и изменял код программы, оставив только движение «вперёд» и «назад»:



А вот такой робот получился по окончании нашего урока:



В следующей части я объясню, как построить логику робота, подключим к нему дальномер, при помощи которого он будет ориентироваться в пространстве.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 5

    0
    Извините, вы сами то проверяли что написали?
    SoftwareSerial BTSerial(0, 1); // RX, TX, подключение БТ

    Вообще — то пины 0 и 1 привязаны к железному ком — порту, и я боюсь SoftSerial не будет так работать.
    И потом вместо Motor Shield вы положили картинку платы контроллера.
    Будьте пожалуйста повнимательней
    И непонятно зачем Вы инициализировали Serial если нигде его не используете
    Serial.begin(9600);
      0
      Попробовал, в принципе работает, но всё равно, это же для начинающих, а использовать эти пины в качестве SoftwareSerial не стоит. Уж если решили подключить блютуз к 0 и 1 пину используйте железный порт. Тогда и с другими устройствами конфликта не будет, и начинающим понятнее будет.
      +2
      Прикольно, конечно. Только почему-то мне кажется, что такими темпами мы скоро дойдём до пошагового разбора мигания светодиодом. За 5 уроков…
        +1
        Уже есть — на амперке например, переводы видеоуроков какого-то паренька. Но там за 1 урок уложились )
        0
        Тоже баловался с аналогичной конструкцией, жаль не получилось плавное наращивание скорости сделать с этими движками :)

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

        Самое читаемое