Предисловие или зачем извращенец? Привет, Хабрахабр! Сидел вечером 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
-
Отчет С Последней Startup Meeting В Киеве
19 Oct, 24 -
Карты, Деньги, Два... Фактора
19 Oct, 24 -
Новый Конкурс От Azspcs.net
19 Oct, 24