Простое Удаленное Управление Роботом С Компьютера



Предисловие или зачем извращенец? Привет, Хабрахабр! Сидел вечером 11 июня, смотрел фильм.

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

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

От меня требовалось сделать робота, управляемого с компьютера, с помощью отдельной программы.

У меня были сомнения по поводу некоторых проблем, например: успею ли я и как именно сделать беспроводную передачу данных (раньше я делал только беспроводную передачу данных на NXT)? Взвесив все за и против, я согласился.

После этого я начал задумываться о переносе данных.

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

Компьютер просто необходим для отправки данных в COM-порт. Этот способ странный, но самый быстрый.

Вот что я хочу здесь описать.

Также приложу 3 программы, которые помогут сделать радиоуправляемую машинку.



Сборка передатчика и его программа.

Модуль для компьютера я сделал из FTDI Basic Breakout 5/3.3V от DFrobot, довольно распространенного микроконтроллера ATMEGA 328P-PU с загрузчиком Arduino и радиомодулем на базе микросхемы nRF24L01. По сути это просто Arduino Uno с радиомодулем.

Что есть, то есть.

У радиомодуля есть особенность, которую я не сразу заметил: входное напряжение должно быть в пределах от 3 до 3,6 вольт (хотя подача на него 5 вольт его не убьет, но и не сработает), верхний предел логического единица 5В.

Это значит, что для подключения радиомодуля к меге не нужен преобразователь уровней между 3,3В и 5В, а нужно поставить стабилизатор 3,3В.

У FTDI есть встроенный стабилизатор, от него я и запитал радиомодуль.

Вот так выглядит сам модуль (внутри и в сборке):

Простое удаленное управление роботом с компьютера

Программа состоит из инициализации, стартового сообщения и обработки команд управляющей программы.

Так было и в моем случае.

Основные команды библиотеки Mirf: #включать #включать #включать #включать #включать Эти библиотеки нужны для работы радиомодуля Mirf.csnPin=4 — задает номер пина, отвечающего за «разрешение связи» между радиомодулем и МК Mirf.cePin=6 — устанавливает номер пина, отвечающий за режим работы радиомодуля (приемник/передатчик) Mirf.spi=&MirfHardwareSpi — настраивает линию SPI Mirf.init() — инициализирует радиомодуль Mirf.payload = 1 — размер одного сообщения в байтах (по умолчанию 16, максимум 32) Mirf.channel = 19 — устанавливает канал (0 — 127, по умолчанию 0) Mirf.config() — устанавливает параметры передачи Mirf.setTADDR((byte *)"serv1") — переключает радиомодуль в режим передатчика Mirf.setRADDR((byte *)"serv1") — переключает радиомодуль в режим приемника Mirf.send(data) — отправляет массив байтового типа.

Mirf.dataReady() — сообщает о завершении обработки полученных данных Mirf.getData(data) — записать полученные данные в массив данных Mirf.setTADDR((byte *)"serv1") — переключает радиомодуль в режим передатчика Mirf.setRADDR((byte *)"serv1") — переключает радиомодуль в режим приемника Mirf.send(data) — отправляет массив байтового типа.

Mirf.dataReady() — сообщает о завершении обработки полученных данных Mirf.getData(data) — записать полученные данные в массив данных Прикрепляю код программы-передатчика.

Программа передатчика #включать #включать #включать #включать #включать символ активен; байтовые данные[1]; недействительная настройка() { Серийный.

начало(19200); Мирф.

csnPin = 4; Мирф.

цеПин = 6; Mirf.spi = &MirfHardwareSpi; Мирф.

инит(); Мирф.

полезная нагрузка = 1; Мирф.

канал = 19; Мирф.

конфигурация(); Mirf.setTADDR((байт *)"serv1"); //сигнальное сообщение о начале работы данные[0]=7; Mirf.send(данные); задержка(200); } недействительный цикл() { if (Serial.available()) //Если данные готовы к чтению { активный = Serial.read(); // Записываем данные в переменную } если (активный=='2') { данные[0]=2; } если (активный=='3') { данные[0]=3; } если (активный=='4') { данные[0]=4; } если (активный=='5') { данные[0]=5; } если (активный=='6') { данные[0]=6; } Mirf.send(данные); //Отправляем данные while(Mirf.isSending()); // Подождем, пока данные будут отправлены }

Программа управления.

Есть одна интересная вещь — Обработка.

Синтаксис тот же, что и в Arduino, только вместо void Loop() используется void draw().

Но еще интереснее у меня стала ситуация с библиотекой обработки Serial, которая позволяет работать с последовательным портом.

Прочитав руководства на сайте Spurkfun, я поигрался с миганием светодиода на Arduino, подключенном к компьютеру, одним щелчком мыши.

После этого я написал программу для управления роботом с клавиатуры.

Прикрепляю код управления стрелкой.

В принципе, ничего необычного в этом нет. Программа управления машиной обработка импорта.

серийный.

*; импортировать cc.arduino.*; Последовательный порт myPort; PFont f=createFont("LetterGothicStd-32.vlw", 24); недействительная настройка() { размер(360, 160); инсульт(255); фон (0); текстовый шрифт (е); нетКурсор(); Строка portName = "XXXX"; //Здесь нужно написать имя вашего порта myPort = новый последовательный порт (это, имя_порта, 19200); } недействительный розыгрыш () { если (keyPressed == false) { прозрачный(); myPort.write('6'); println("6"); } } недействительная клавишаPressed() { // 10 - войти // 32 - пробел // 37/38/39/40 — ключи прозрачный(); заполнить (255); textAlign (ЦЕНТР); //текст(keyCode, 180, 80); переключатель (код ключа) { случай 37: text("Едем влево", 180, 80); myPort.write('1'); перерыв; случай 38: text("Едем прямо", 180, 80); myPort.write('2'); перерыв; случай 39: text("Едем вправо", 180, 80); myPort.write('3'); перерыв; случай 40: text("Едем назад", 180, 80); myPort.write('4'); перерыв; по умолчанию: text("Такая команда net", 180, 80); myPort.write('6'); перерыв; } }

Программа-приемник.

Инициализация этой программы отличается от инициализации программы передатчика всего одной строкой.

Ключевая команда в бесконечном цикле — Mirf.getData(data).

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

Ну а дальше робот действует точно по командам.

Прикрепляю код программы для ресивера машины.

Машинные программы #включать #включать #включать #включать #включать недействительная настройка() { Серийный.

начало(9600); pinMode(13, ВЫХОД); //ВЕЛ Мирф.

csnPin = 10; Мирф.

цеПин = 9; Mirf.spi = &MirfHardwareSpi; Мирф.

инит(); Мирф.

полезная нагрузка = 1; Мирф.

канал = 19; Мирф.

конфигурация(); Mirf.setRADDR((байт *)"serv1"); } недействительный цикл() { байтовые данные[1]; if(!Mirf.isSending() && Mirf.dataReady()) { Мирф.

getData(данные); Serial.println(данные[0]); } переключатель (данные[0]) { Дело 1: моторы(-100, 100); // Поверните налево перерыв; случай 2: моторы(100, 100); // Езжайте прямо перерыв; случай 3: двигатели(100, -100); // Поверните направо перерыв; случай 4: двигатели(-100, -100); // возвращаться перерыв; по умолчанию: двигатели(0, 0); // мы стоим перерыв; } задержка(50); }

Заключение.

Что из всего этого получилось: Я сделал этого робота для " Клаустрофобия" .

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

Мне это нравится.

Это, конечно, ущербно, потому что.

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

Надеюсь, эта статья поможет вам сделать что-то подобное, а может быть, и более сложное.

Здесь кто чего хочет. Теги: #Сделай сам или Сделай сам #arduino #Обработка #Mirf

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.