Lazarus + Arduino + Servo

Lazarus + Arduino: две переменные

Уже было...

Где взять и как установить программное обеспечение Ардуино и Лазарус, а также необхоимые библиотеки для работы с COM-портом написано в предыдущей статье Lazarus + Arduino: виртуальный COM порт.

Повторюсь

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

Сразу с примера. Простая логика

В данном примере будем управлять с компьютера двумя обычными китайскими сервомашинками. Программу для компьютера пишем в лазарусе на паскале.

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

Итак, будем отправлять на ардуино два числа - значения углов поворота "левого" и "правого" сервоприводов, назовем их так, в моем случае: от 5 до 160 градусов (мои китайские сервы "дергаются" в нуле).

Из программы на компьютере будем отправлять данные с двух ползунков в виде строки: "LxxRyy.", где "L" и "R" - обозначение левой и правой сервомашинки, а "xx" и "yy" - значение углов, считываемое с ползунков.

Ардуино считывает данные из COM-порта и составляет строку, ожидая символа "точка". Обрабатываем полученную строку: число, после "L" и до "R" отправляем на "левую" сервомашинку, число, после "R" и до "." отправляем на "правую" сервомашинку. Вот и вся логика.

Программа в Лазарусе

Размещаем элементы, как на картинке.

Форма Lazarus

Меняем название формы на желаемое, я назову "Две переменные".

Меняем надпись на кнопке на Соединить.

Для Label1 и Label2 меняем Caption на 5 (минимальное значение).

В свойствах ползунка меняем минимальное и максимальное значение Min: 5 и Max: 160.

Настраиваем SdpoSerial1. Свойство BaundRate - это скорость передачи данных, устанавливаем на br_9600. Свойство Device - это наш COM-порт, пишем порт, к которому подключена Arduino (можно посмотреть в диспетчере устройств), обычно это COM3.

Форма Lazarus

Свойства SdpoSerial

Двойным кликом по кнопке Соединить создаем процедуру TForm1.Button1Click(Sender: TObject) и активируем соединение:

procedure TForm1.Button1Click(Sender: TObject);
begin
  SdpoSerial1.Active:=true;
end;

Двойным кликом на первом ползунке создаем процедуру TForm1.TrackBar1Change(Sender: TObject) и дописываем ее, согласно нашей логики. Она должна выглядеть так:

procedure TForm1.TrackBar1Change(Sender: TObject);
var servoL, servoR, command: string; //объявляем переменные
begin
  servoL:=IntToStr(TrackBar1.Position); //читаем значения с ползунков
  servoR:=IntToStr(TrackBar2.Position); //и переводим в строку
  command:='L'+servoL+'R'+servoR+'.'; //формируем строку "LxxRyy."
  sleep(1);                           //задержка
  sdposerial1.WriteData(command);     //отправляем строку
  label1.Caption:=IntToStr(TrackBar1.Position); //пишем значения ползунков
  label2.Caption:=IntToStr(TrackBar2.Position); //в label для наглядности
end;

Далее, выбираем второй ползунок (TrackBar2), переходим во вкладку События, ищем OnChange, жмем на стрелочку раскрывающегося списка и выбираем TrackBar1Change.

Свойства TrackBar

Теперь необходимо разорвать соединение с COM-портом при закрытии программы. В инспекторе объектов выбираем Form1: TForm1, переходим на вкладку События, выбираем событие OnClose и кликаем на кнопке с троеточием (...) - появится новая процедура TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction).

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  SdpoSerial1.WriteData('L5R5.'); //сервы в "ноль" (в 5 градусов)
  SdpoSerial1.Active:=false;   //разрываем соединение
end;

Программа для компьютера готова, жмем Запустить, чтобы компилировать проект.

Программа для Arduino. Все пояснения в комментариях.

//подключаем библиотеку управления сервомашинками
#include <Servo.h>

//объявляем переменные
String command = "";
String l;
String r;
int indexL;
int indexR;

Servo servoL;
Servo servoR;

void setup() {                
  //инициализируем сервы на 9-м и 10-м пинах
  servoL.attach(10);
  servoR.attach(9);
  //поворачиваем сервы на 5 градусов (начальное положение)
  servoL.write(5);  
  servoR.write(5);
  //устанавливаем скорость соединения  
  Serial.begin(9600);  
}

void loop() {
  while (Serial.available() > 0) {  //если есть доступные данные
    char inChar = Serial.read();    //считываем байт
    command += inChar;              //собираем информацию в строку
    delay(1);
    if (inChar == '.') {             //если пришел символ "точка"
      indexL = command.indexOf('L'); //порядковый номер символа "L" в принятой строке
      indexR = command.indexOf('R'); //порядковый номер символа "R" в принятой строке
      l = command.substring(indexL+1,indexR); //выделяем число после "L" до "R" и присваиваем переменной
      r = command.substring(indexR+1,command.length()-1); //выделяем число после "R" до "." и присваиваем переменной 
      servoL.write(l.toInt()); //переводим полученные значение в integer 
      servoR.write(r.toInt()); //и поворачиваем сервы     
      command = "";    //обнуляем переменную
    }
  }
}

Еще немного пояснений

Запись indexL+1: здесь прибавляем единицу к порядковому номеру искомого символа, чтобы начать считывание значение переменной, которое идет после символа "L". В случае с indexR+1 аналогично.

Запись command.length() - это количество символов в принятой строке, начиная с "L" и заканчивая ".". Чтобы исключить символ ".", т.е. последний символ в строке, пишем command.length()-1.

Собираем схему

У меня на пластиковой платформе установлено 3 сервы - не обращайте внимания на третью, я ее не подключаю, просто лень откручивать.

Схема с сервоприводами

Схема с сервоприводами

ОСТОРОЖНО! Я вот так неаккуратно пользуюсь напряжением ардуины (5 В) для питания двух сервоприводов - питание платы может "проседать". Используйте отдельный источных питания для сервоприводов!

Время тестов!!!

Грузим скетч в ардуино, запускаем программу на компе, жмем Соединить и передвигаем ползунки, как вам нравится! О результатах и проблемах отписывайтесь в комментариях.

Файл скетча ардуино скачать.
Исходники программы на Lazarus скачать.

Видео снял на телефон.

"Кликайте по иконкам социальных сетей - делитесь с друзьями полезной информацией."


Назад к списку статей

comments powered by Disqus
наверх

Примерные цены

Эти цены совсем примерные для общей оценки стоимости! Для уточнения стоимости вашего сайта пишите мне, контактные данные представлены ниже на странице.


Сайт визитка
Описание: - Дополнительные модули по договоренности.
Цена: от 3000 руб.

Корпоративный
Описание: Визитка + - Дополнительные модули по договоренности.
Цена: от 5000 руб.




Магазин
Описание: Корпоративный + - Дополнительные модули по договоренности.
Цена: от 12000 руб.



×

Модуль SMS Back

Модуль SMS Back - предназначен для отправки пользователем номера телефона администратору сайта.

Как им пользоваться?


1. Установка и настройка

2. Заполнение формы


3. Получение СМС

Ограничения по количеству бесплатных смс: 60 смс в сутки.


Версии модуля

На данный момент идет разработка трех версий модуля: "SMS Back Standart", "SMS Back +" и "SMS Back Full".


"SMS Back Standart"
  • - Отправка смс сообщения на один номер*.
  • - Обновления модуля бесплатны.
  • - Установка*** и подключение модуля бесплатно.

  • Цена: $50
"SMS Back +"
  • - Отправка смс сообщения на два номера**.
  • - Обновления модуля бесплатны.
  • - Установка*** и подключение модуля бесплатно.

  • Цена: $60
"SMS Back Full" в разработке
  • - Отправка смс сообщения на два номера**.
  • - Отправка сообщения на электронный ящик.
  • - Обновления модуля бесплатны.
  • - Установка*** и подключение модуля бесплатно.
  • Цена: $75



* Бесплатная отправка смс на один номер. Возможна отправка смс на два номера и более, плата за отправку смс на дополнительный номер составит 0,25 руб за смс. Стоимость подключения дополнительного номера: $10 за 1 номер телефона.

** Бесплатная отправка смс на два номера. Возможна отправка смс на три номера и более, плата за отправку смс на дополнительный номер составит 0,25 руб за смс. Стоимость подключения дополнительного номера: $10 за 1 номер телефона.

*** Бесплатная установка на Joomla.


Ожидаемые дополнения и обновления

- Усиление защиты от СПАМ-ботов.

- Запись отправленных сообщений в таблицу для создания базы клиентов и отслеживания СПАМа.

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

×