Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Это руководство покажет вам, как создать собственного робота, подключенного к сети (с помощью микроконтроллера Arduino и ПК Asus eee). Зачем вам нужен робот, подключенный к сети? Конечно, чтобы поиграть. Управляйте своим роботом из любой точки комнаты или страны, используя только Skype и веб-браузер (ничего не нужно устанавливать на управляющий компьютер). После этого? Погрузитесь в программное обеспечение и адаптируйте его, как вам нравится, добавьте GPS, чтобы вы могли смотреть, где вы едете, на карте, добавьте датчики температуры, чтобы отображать градиенты температуры в вашем доме, или датчики гидролокатора, чтобы добавить элементы управления на то, что вы в Интернете водители могут и не могут столкнуться. Функции:
- Недорого - (~ 500 долларов, если вы покупаете все детали новыми и значительно дешевле, если копаетесь в своем мусорном ведре с запчастями)
- После запуска для управления роботом требуется только веб-браузер (и Skype, если вы хотите видеть, куда вы едете).
- Открытый исходный код и легко адаптируемый - (использует микроконтроллер Arduino, обработка для веб-сервера и все программное обеспечение может быть запущено в Linux (весь код также сильно прокомментирован, чтобы упростить переход и изменение))
- Модульный дизайн (не полностью интегрированная система, не беспокойтесь, если вы хотите использовать другую службу видеоконференцсвязи, или если у вас есть штамп Basic, а не Arduino, просто небольшой фрагмент кода и вставьте его)
Вот короткое видео, на котором моего робота, подключенного к Интернету, выгнали из кухни.
Шаг 1. Детали и инструменты
Требуется всего несколько частей: Робот: серво-робот, управляемый Arduino - (SERB) (175 долларов на сайте oomlout.com) или (сделайте свой собственный)
Робот с открытым исходным кодом, который использует микроконтроллер Arduino в качестве своего мозга
(Можно использовать любую платформу с двумя сервоприводами и Arduino (вариант 1) (сообщите мне, если вы обнаружите другие варианты) Компьютер: Asus eee PC 4G (280 долларов США) (@ Лучшая покупка)
Небольшой недорогой ноутбук, идеально подходящий для этой цели
(можно использовать любой ноутбук (или настольный компьютер, если вы хотите работать с аккордом), способный запускать эскизы обработки) Стол для ноутбука: лазерная резка акрила (25 долларов США (@ oomlout)) или (создайте свой собственный шаг 3)
Несколько дополнительных акриловых деталей, которые крепятся к (SERB), чтобы дать ему стол для ноутбука
Nuts and Bols: (доступно в домашних условиях)
- Болт 3 мм x 10 мм (x4)
- Болт 3 мм x 15 мм (x4)
- Гайка 3 мм (8 шт.)
Шаг 2: вырезание деталей и сборка
Есть три варианта получения деталей для рабочего стола ноутбука. Вариант резки 1: (Покупка на сайте oomlout.com)
Детали стола, вырезанные лазером, и необходимое оборудование можно приобрести в oomlout за 25 долларов (здесь)
Вариант 2: (Резка на собственном лазерном резаке или на Ponoko.com)
- Загрузите файл ниже (03-WEBB-Acrylic Parts.cdr или 03-WEBB-Acrylic Parts (Ponoko P2).eps)
- Вырежьте их из акрила толщиной 3 мм (1/8 дюйма).
Вариант 3: (Пила для прокрутки)
- Загрузите образец спиральной пилы снизу (03-WEBB-ScrollSaw Pattern (A4).pdf (для бумаги формата A4) или 03-WEBB-ScrollSaw Pattern (letter).pdf (для бумаги размера Letter))
- Дважды проверьте, не масштабировался ли он при печати (измеряя напечатанные линейки)
- Приклейте к кусочку акрила толщиной 3 мм (1/8 дюйма) и вырежьте кусочки.
Сборка: загрузите руководство по сборке (04-WEBB-Assembly Guide.pdf) ниже и соберите стол ноутбука.
Шаг 3: Программное обеспечение - (Arduino)
Для тех, кто плохо знаком с Arduino, ознакомьтесь с отличным руководством по началу работы на Arduino.cc Прежде всего, ознакомьтесь с программным обеспечением, работающим на Arduino. Это очень простая программа, и все, что делает Arduino, - это отслеживает данные на своем последовательном порту. Она ищет диалог длиной 5 байтов.
- Байт 1-3 (проверьте байты «AAA»)
- Команда байта 4 (сообщает Arduino, что делать) (Поддерживаемые команды 'F' - вперед, 'B' - назад, 'L' - влево, 'R' - вправо, 'S' - скорость, 'X' - SetSpeedLeft, 'Y' - SetSpeedRight, 'C' - Стоп)
- Параметр байта 5 - для команд перемещения это интерпретируется как временной интервал (параметр * 100 мс), а для команд скорости - как процентное значение от 0 до 100.
Код тщательно прокомментирован, и с учетом этого фреймворка добавление дополнительных команд должно быть простым.
- Загрузите прикрепленный zip-файл. (05-WEBB-Arduino Code.zip)
- Распакуйте в каталог Arduino Sketch. (по умолчанию: Мои документы / Arduino)
- Откройте среду разработки Arduino и загрузите в Arduino.
Чтобы скопировать и вставить
- Скопируйте код снизу.
- Вставьте в среду разработки Arduino.
- Загрузите в свой Arduino.
Приложение: Программа Arduino
/ * * Arduino Controlled Web Connected Robot (WEBB) - последовательный хост * Для получения дополнительной информации посетите: https://www.oomlout.com/serb * * Поведение: Arduino прослушивает свой последовательный порт для команды * в формате 254, 88, 88, (КОМАНДА), (ВРЕМЯ) * Поддерживаемые команды - & aposF & apos - 70 - Вперед * & aposB & apos - 66 - Назад * & aposL & apos - 76 - Влево * & aposR & apos - 82 - Вправо * & aposS & apos - 83 - Скорость * & aposX & aposL - 88 - SetSpeed * & aposY & apos - 89 - SetSpeedRight * & aposC & apos - 67 - Стоп * Поддерживаемое время - 0 - 255 (от 0 до 25,5 секунд) значение * 100 миллисекунд * sp * Подключение: правый серво сигнал - контакт 9 * левый серво сигнал - контакт 10 * * Лицензия: Эта работа находится под лицензией Creative Commons * Attribution-Share Alike 3.0 Unported License. Чтобы * просмотреть копию этой лицензии, посетите * https://creativecommons.org/licenses/by-sa/3.0/ * или отправьте письмо в Creative Commons, 171 Second * Street, Suite 300, Сан-Франциско, Калифорния 94105, * СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ. * * / // --------------------------------------------- ---------------------------- // НАЧАЛО ПРЕАМБУЛЫ ПОСЛЕДОВАТЕЛЬНОГО СЕРВЕРА ARDUINO // Определение констант, соответствующих каждой команде (также номер кода ascii) #define FORWARD 70 // F # define BACKWARD 66 // B #define LEFT 76 // L # define RIGHT 82 // R # define SETSPEED 83 // S # define STOP 67 // C # define SETSPEEDLEFT 88 // X #define SETSPEEDRIGHT 89 // Y / * Три проверочных байта (используемые для предотвращения ответа робота на случайные последовательные * данные) в настоящее время "AAA" * / # define checkByte1 65 // "A" #define checkByte2 65 // "A "#define checkByte3 65 //" A "// -------------------------------------- ------------------------------------ // ЗАПУСК СЕРВОРОБОТА, УПРАВЛЯЕМОГО ARDUINO (SERB) ПРЕАМБУЛА # include #define LEFTSERVOPIN 10 // Контакт, к которому подключен левый сервопривод #define RIGHTSERVOPIN 9 // Контакт правого сервопривода, подключен к Servo leftServo; Servo rightServo; int leftSpeed = 50; // удерживает скорость роботов leftServo // в процентах от 0 до 100int rightSpeed = 100; // удерживает скорость роботов rightServo // в процентах от 0 до 100 // КОНЕЦ СЕРВОРОБОТА, УПРАВЛЯЕМОГО ARDUINO (SERB) ПРЕАМБУЛА // ------------------- -------------------------------------------------- ----- // Все готово и работаетvoid setup () {Serial.begin (9600); // Запускаем последовательный порт serbSetup (); // устанавливает состояние всех необходимых // выводов и добавляет сервоприводы в ваш скетч} // Основная программа loopvoid loop () {serbPollSerialPort (); // постоянно смотрит на последовательный порт // если есть данные, которые он обрабатывает} // ------------------------------ ----------------------------------------- // НАЧАЛО РАБОТЫ ПОСЛЕДОВАТЕЛЬНОГО СЕРВЕРА ARDUINO / * * Обрабатывает команды, доставленные на последовательный порт arduino & aposs * / void serbPollSerialPort () {int dta; // переменная для хранения последовательного байта if (Serial.available ()> = 5) {// если в буфере 5 байтов (длина полного запроса) dta = Serial.read (); if (dta = checkByte1) {// Проверяет наличие первого байта проверки dta = Serial.read (); if (dta = checkByte2) {// Проверяет наличие второго байта проверки dta = Serial.read (); if (dta = checkByte3) {// Проверяет наличие третьего байта проверки int command = Serial.read (); // Четвертый байт - это команда int param1 = Serial.read (); // Пятый байт - это param1 интерпретацияCommand (command, param1); // отправляет ему проанализированный запрос & aposs handler}}}}} / * * Принимает команду и параметр и передает их роботу * / void convertCommand (int command, int param1) {if (command == FORWARD) {goForward (); задержка (param1 * 100); goStop ();} // если вперед else if (command == BACKWARD) {goBackward (); задержка (param1 * 100); goStop ();} // если назад else if (command == LEFT) {goLeft (); задержка (param1 * 100); goStop ();} // если осталось else if (command == RIGHT) {goRight (); задержка (param1 * 100); goStop ();} // если правильно else if (command == SETSPEED) {setSpeed (param1);} // если установка скорости else if (command == STOP) {goStop ();} // если остановка else if (command == SETSPEEDLEFT) {setSpeedLeft (param1);} // если устанавливается левая скорость else if (command == SETSPEEDRIGHT) {setSpeedRight (param1);} // если устанавливается правая скорость else {// если нераспознанная команда делает небольшое шимми иди налево(); задержка (150); направо(); задержка (150); goStop (); }} // ---------------------------------------------- -------------------------- // НАЧАЛО ПРОЦЕССОВ УПРАВЛЯЕМЫМ ARDUINO SERVO ROBOT (SERB) / * * настраивает ваш arduino для обращения к вашему SERB, используя включенные процедуры * / void serbSetup () {setSpeed (leftSpeed); pinMode (ЛЕФТСЕРВОПИН, ВЫХОД); // устанавливает левый вывод сигнала серво // на вывод pinMode (RIGHTSERVOPIN, OUTPUT); // устанавливает правый вывод сигнала серво // на вывод leftServo.attach (LEFTSERVOPIN); // присоединяет левый сервопривод rightServo.attach (RIGHTSERVOPIN); // подключает правый сервопривод goStop ();} / * * устанавливает скорость робота между 0- (остановлен) и 100- (полная скорость) * ПРИМЕЧАНИЕ: скорость не изменит текущую скорость, вы должны изменить скорость * затем вызвать ее методов go до внесения изменений. * / void setSpeed (int newSpeed) {setSpeedLeft (newSpeed); // устанавливает левую скорость setSpeedRight (newSpeed); // устанавливает правую скорость} / * * Устанавливает скорость левого колеса * / void setSpeedLeft (int newSpeed) {if (newSpeed> = 100) {newSpeed = 100;} // если скорость больше 100 // сделать это 100 if (newSpeed = 100) {newSpeed = 100;} // если скорость больше 100 // сделать 100 if (newSpeed <= 0) {newSpeed = 0;} // если скорость меньше 0 сделать // it 0 rightSpeed = newSpeed * 0,9; // масштабирует скорость до значения} / * * отправляет робота вперед * / void goForward () {leftServo.write (90 + leftSpeed); rightServo.write (90 - rightSpeed);} / * * отправляет робота назад * / void goBackward () {leftServo.write (90 - leftSpeed); rightServo.write (90 + rightSpeed);} / * * отправляет робота вправо * / void goRight () {leftServo.write (90 + leftSpeed); rightServo.write (90 + rightSpeed);} / * * отправляет робота влево * / void goLeft () {leftServo.write (90 - leftSpeed); rightServo.write (90 - rightSpeed);} / * * останавливает робота * / void goStop () {leftServo.write (90); rightServo.write (90);} // КОНЕЦ ПРОЦЕССОВ СЕРВИСНОГО РОБОТА, УПРАВЛЯЕМЫМ ARDUINO (SERB) // ---------------------------- -----------------------------------------------
Шаг 4. Программное обеспечение - ноутбук-робот (веб-сервер)
(Processing - это язык программирования с открытым исходным кодом и среда, с которой очень легко начать работу. Для получения более подробной информации посетите страницу Processing) Программное обеспечение, которое запускается на портативном роботе, также довольно простое. Это довольно примитивный веб-сервер (прослушивание запросов веб-страниц из веб-браузера), небольшой пользовательский интерфейс (для его настройки) и средства для передачи команд, полученных от веб-сервера, на Arduino. Для быстрой установки: (на окнах)
- Загрузите zip-файл ниже (06-WEBB-Processing Webserver (windows exe).zip)
- Разархивируйте его и запустите файл.exe (_WEBB_WebServer_RobotComputer.exe)
Для редактирования в процессе обработки:
- Загрузите zip-файл ниже (06-WEBB-Processing Webserver (исходные файлы).zip)
- Распакуйте в любое место на вашем компьютере.
- Откройте среду обработки и откройте (_WEBB_WebServer_RobotComputer.pde)
Тестировать:
- Запустите программу.
- В поле № 1 будет список доступных портов связи на вашем компьютере (нажмите на тот, к которому подключен ваш Arduino. (Ваш робот будет несколько раз подергиваться, когда компьютер подключается, и рядом с выбранной точкой появится голубая точка). порт связи)
- В поле № 2 проверьте, подключен ли ваш Arduino. Щелкните одну из стрелок, и, надеюсь, ваш робот будет двигаться в указанном направлении в течение полсекунды.
- В поле №3 нажмите кнопку «Пуск», чтобы запустить веб-сервер.
- Откройте веб-браузер (на портативном роботе) и посетите https://127.0.0.1:12345/ControlPage.html (надеюсь, появится веб-страница управления с кнопками на ней) -Подробнее о том, как использовать эту страницу на следующем шаге -
Что происходит:
- Веб-сервер прослушивает порт 12345 для HTTP-запросов (что отправляется, когда вы вводите адрес веб-страницы)
- Он отвечает на запросы двух типов.
1. Он прослушивает "ControlPage.html" и отправляет веб-страницу управления. 2. Он прослушивает запросы формы "/ request? Command = F & param1 = 100" (эти команды анализируются и отправляются в Arduino (в этом примере будет в роботе, идущем вперед на 10 секунд) Приложение: (Код для WebServer)
/ * * Arduino Controlled Web Connected Robot (WEBB) - веб-сервер * Для получения более подробной информации посетите: https://www.oomlout.com/serb * * Поведение: программа прослушивает запросы http (веб-страницы) в форме * "/ request ? command = F & param1 = 100 "и затем передает их * Arduino * Поддерживаемые команды - & aposF & apos - 70 - Вперед * & aposB & apos - 66 - Назад * & aposL & apos - 76 - Влево * & aposR & apos - 82 - Вправо * & aposS & apos - 83 - Скорость * & aposX & apos - 88 - SetSpeedLeft * & aposY & apos - 89 - SetSpeedRight * & aposC & apos - 67 - Stop * param1 & aposs - 0 - 255 (от 0 до 25,5 секунд) значение * 100 миллисекунд * * также передает контрольную веб-страницу в браузер при запросе ControlPage.html * * Операция: 1. Щелкните порт связи, к которому подключен ваш Arduino * 2. Используйте кнопки тестирования, чтобы проверить, слушает ли ваш Arduino * (будет двигаться в направлении, указанном на полсекунды) * 3. Нажмите «Пуск», и ваш веб-сервер откроется. прислушиваться к запросам * * * Лицензия: эта работа находится под лицензией Creative Commons * Attribu tion-Share Alike 3.0 Непортированная лицензия. Чтобы * просмотреть копию этой лицензии, посетите * https://creativecommons.org/licenses/by-sa/3.0/ * или отправьте письмо в Creative Commons, 171 Second * Street, Suite 300, Сан-Франциско, Калифорния 94105, * СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ. * * / import processing.serial. *; // импортируем последовательную библиотеку для использования Serial (для разговора с Arduino) import processing.net. *; // импортируем сетевую библиотеку для использования сервера (для связи с Интернетом) / * переменные, связанные с последовательным портом * / int serialPortIndex = -1; // индекс последовательного порта, который мы используем в Serial.list () listString commOptions; // Переменная для хранения Serial.list (), поэтому нет необходимости // опрашивать последовательные порты каждый раз, когда мы хотим ссылаться на них (опрос вызывает // скачок в сервоприводах Arduino) Serial serialPort; // Делает последовательный порт адресуемым на протяжении всего этого скетча / * Переменные, связанные с графикой и рендерингом * / PFont font; // делает шрифт общедоступным, поэтому его нужно загружать только один раз (Arial-72) / * Сетевые переменные * / Server wServer; // Сервер, который обрабатывает веб-запросы int port = 12345; // Порт, который сервер слушает int cycleCount = 0; // Подсчитывает количество выполнений цикла отрисовки (используется для // анимации «бегущего» текста) / * служебные переменные * / PImage bg; // Текущее фоновое изображение / WEBB-background.png / * * Переменные, связанные с кнопкой * (кнопки реализованы очень грубо, ограничивающие рамки сохраняются, а графика и текст * рисуются на фоновом изображении) т.е. перемещение переменных кнопок не изменит внешний вид кнопок * / Button comm1; Кнопка comm2; Кнопка comm3; Кнопка comm4; // Кнопки для выбора правильного последовательного портаButton up; Кнопка правая; Кнопка левая; Button down; // Кнопки направления для проверки ответа робота Button webServer; // Кнопка для запуска веб-сервера / * * устанавливает все необходимое * / void setup () {frameRate (5); // Немного замедляет работу скетча, поэтому система не так утомительна bg = loadImage ("WEBB-background.png"); // Загружает фоновое изображение (хранящееся в папке скетча) size (700, 400); // Устанавливает размер окна скетча font = loadFont ("ArialMT-72.vlw"); // Загружает шрифт, который мы будем использовать в этом скетче commOptions = Serial.list (); // Опрашивает последовательные порты и получает список доступных портов // (выполнение этого только один раз не дает роботу дергаться каждый раз, когда он & aposs // опрашивает последовательный порт) defineButtons (); // Определяет ограничивающие рамки для каждого фона кнопки (bg); // Закрашивает фоновое изображение (на этом изображении изображена вся графика кнопок)} / * Основной цикл эскизов * / void draw () {if (cycleCount == 0) {// - вызов подпрограмм рисования drawCommBox (); // Рисует элементы в поле связи (поле 1) drawTestBox (); // Отрисовывает все элементы в Test Box (поле 2) drawWebServerBox (); // Рисует все элементы в WebServer Box (поле 3)} // - вызываем рабочие процедуры pollWebServer (); // Опрашивает веб-сервер, чтобы узнать, поступили ли какие-либо запросы через сеть} // ------------------------------ ----------------------------------------------//Начало процедуры рисования (разделены, чтобы код было удобнее читать) / * * Процедура обновления рисования (выполняется каждый цикл) для элементов в поле связи (поле 1) * / void drawCommBox () {fill (0, 0, 0); // Устанавливаем черную заливку textFont (font, 15); // Устанавливаем правильный размер шрифта для (int i = 0; i 0) {running = running + ".";} // количество точек основано на cycleCount if ((cycleCount / 1)> 1) { running = running + ".";} if ((cycleCount / 1)> 2) {running = running + ".";} if ((cycleCount / 1)> 3) {cycleCount = 0;} текст (выполняется, 520, 210); } cycleCount ++; // Каждый раз при прохождении цикла cycleCount увеличивается на единицу} // Конец процедуры отрисовки // ------------------------------- ------------------------------ // ------------------ ------------------------------------------- // Запуск подпрограмм обслуживания / * * mousePressed вызывается каждый раз, когда нажимается мышь, это * проверяет, находится ли мышь внутри любого из ограничивающих прямоугольников кнопки * и вызывается ли соответствующая процедура * / void mousePressed () {if (comm1.pressed ()) { updateSerialPort (0);} // Изменяет порт связи с индексом 0 в Serial.list () else if (comm2.pressed ()) {updateSerialPort (1);} // Изменяет порт связи с индексом 1 в Serial.list () else if (comm3.pressed ()) {updateSerialPort (2);} // Изменяет порт связи по индексу 2 в Serial.list () else if (comm4.pressed ()) {updateSerialPort (3);} // Изменяет порт связи с индексом 3 в Serial.list () else if (up.pressed ()) {sendRobotCommand ("F", 5);} // Отправляет команду на перемещение робота вперед на 0,5 секунды иначе if (left.pressed ()) {sendRobotCommand ("L", 5);} / / Отправляет команду на перемещение робота влево на 0,5 секунды else if (right.pressed ()) {sendRobotCommand ("R", 5);} // Отправляет команду на перемещение робота вправо на 0,5 секунды else if (down. Press ()) {sendRobotCommand ("B", 5);} // Отправляет команду для перемещения робота назад на 0,5 секунды else if (webServer.pressed ()) {startWebServer ();} // Запускает цикл webServerCount = 0; фон (bg); // Перерисовывает фоновое изображение (на этом изображении изображена вся графика кнопок) draw ();} / * * Вызывается после выполнения, он проверяет Сервер, чтобы увидеть, есть ли какие-либо ожидающие соединения * если есть ожидающее соединение, которое он вытаскивает выдает запрос и передает его подпрограмме parseRequest (String) * для удаления лишнего текста. Затем он отправляется подпрограмме интерпретатора (String), чтобы * вызвать соответствующую подпрограмму действия (т.е. отправить инструкции роботу).* * Запрос передается путем ввода адреса и порта компьютера в веб-браузер * Для локального компьютера "https://127.0.0.1:12345/request?command=F¶m1=100" * * Пример запроса: * GET / request? command = F & param1 = 100 HTTP / 1.1 * User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit / 525.19 (KHTML, как Gecko) * Accept: * // * * Accept-Language: en-US, en * Accept-Charset: ISO-8859-1, *, utf-8 * Accept-Encoding: gzip, deflate, bzip2 * Хост: 127.0.0.1:12345 * Соединение: Keep-Alive * * Пример ответа (для обработанного запроса) * HTTP / 1.1 200 OK * Connection: close * Content-Type: text / html * * command: F param1: 100 * / void pollWebServer () {if (wServer! = null) {// Если веб-сервер выполняется Клиентский запрос = wServer.available (); // Загружаем следующего Клиента в строке // сервера (null, если запросы не ждут) if (request! = Null) {// если есть процесс запроса it String fullRequest = request.readString (); // Сохраняем содержимое запроса в виде строки String ip = request.ip (); // Сохраняем IP-адрес клиентов в виде строки String requestString = parseRequest (fullRequest.toUpperCase ()); // Удаляем всю лишнюю // информацию, оставляя только строку запроса (текст после GET) // (переходит в верхний регистр, чтобы упростить проверку строки) if (requestString.indexOf ("REQUEST?")! = -1) { // Проверяет, есть ли в запросе "ЗАПРОС?" Строковый ответ = интерпретироватьRequest (requestString); // Отправляет запрос в интерпретатор запросов request.write ("HTTP / 1.1 200 OK / nConnection: close / nContent-Type: text / html / n / n" + reply); // Отправляет ответ 200, чтобы сообщить, что запрос был // обработан, и строку «reply» в качестве ответа wServer.disconnect (request); // Отключает клиента} else if (requestString.indexOf ("CONTROLPAGE")! = -1) {// Если запрос относится к управляющей веб-странице String webPageArray = loadStrings ("WEBB-ControlPage.html"); // Загружает веб-страницу управления из / data / WEBB-ControlPage.html // (загружается как массив строк) String webPage = ""; // Чтобы упростить редактирование, на веб-странице остались // разрывы строк, поэтому цикл for удаляет эти строки for (int i = 0; i portIndex) {// если переданный portIndex является допустимым индексом в Serial.list () // (т.е. не третий вариант в списке из двух) serialPortIndex = portIndex; // устанавливаем для переменной serialPortIndex новый индекс последовательного порта // (это используется для отображения точки рядом с активным портом)} if (serialPortIndex! = -1) {// проверяем, был ли выбран порт когда-то ранее, если (serialPort! = null) {serialPort.stop ();} // если последовательный порт уже используется, остановите его перед загрузкой нового serialPort = new Serial (this, Serial.list () [serialPortIndex], 9600); // Создаем новый объект Serial для связи с Arduino 9600 Baud}} / * * Принимает строку запроса (например, «request? Command = F & param1 = 100»), удаляет команду * и param1 и передает ее в arduino (здесь можно было бы добавить дополнительные параметры или команды, отличные от arduino) * / String ИнтерпретацияRequest (String requestString) {String returnValue = "OK"; // Подготавливает переменную returnValue String command; // Следующие три строки извлекают значение после "command =" // (дополнительная строка на тот случай, если параметр команды находится в // конце запроса и не сопровождается & if (requestString.indexOf ("COMMAND =")! = -1) {command = requestString.substring (requestString.indexOf ("COMMAND =") + "COMMAND =". Length ());} else {command = "Z";} if (command.indexOf (" & ")! = -1) {command = command.substring (0, command.indexOf (" & "));} else {command = command;} String param1String; // Следующие три строки извлекают значение после" param1 = "// (дополнительная строка в случае, если параметр команды находится // в конце запроса и не сопровождается & if (requestString.indexOf (" PARAM1 = ")! = -1) {param1String = requestString.substring (requestString.indexOf ("PARAM1 =") + "PARAM1 =". length ());} else {param1String = "0";} if (param1String.indexOf ("&")! = -1) {param1String = param1String.substring (0, param1String.indexOf ("&"));} else {param1String = param1String;} int param1 = Integer.parseInt (param1String); // Превращает строку param1 в целое число sendRobotCommand (команда, параметр1); // Отправляет команду в процедуру, которая отправляет ее в Arduino returnValue = "command:" + command + "param1:" + param1; // на данный момент только проанализированная команда, но отправка // как html, чтобы можно было включить форматирование return returnValue;} / * * Принимает команду (в настоящее время одна буква) и параметр (один байт 0-255) и отправляет их в arduino *, который прослушивает и повторно передает * поддерживаемые в настоящее время команды * F - * / void sendRobotCommand (String command, int param1) {println ("command:" + command + "time:" + param1); Строка checkString = "AAA"; если (serialPort! = null) {serialPort.write (checkString + команда); serialPort.write (байт (параметр1)); }} // Конец настройки / не очень часто называемые процедуры // ----------------------------------- -------------------------------------------------- // Пример кнопки и кода RectButton из примера processing.org с некоторыми изменениями // в основном для упрощения и удаления анимации наведения // https://processing.org/learning/topics/buttons.html (2008-09-23) class Button {int x, y; int ширина, высота; Кнопка (int ix, int iy, int iwidth, int iheight) {x = ix; y = iy; width = iwidth; height = iheight; } логическое нажатие () {если (overRect ()) {вернуть истину; } else {return false;}} логическое overRect () {if (mouseX> = x && mouseX = y && mouseY <= y + height) {return true; } else {вернуть ложь; }}}
Шаг 5: Программное обеспечение - (Веб-страница)
Что ж, мы почти закончили, все, что осталось, - это поговорить с вашим роботом. Чтобы поговорить: (по локальной сети-на Windows-)
- Узнайте локальный IP-адрес портативного компьютера. Для этого перейдите в «Пуск / Программы / Accesories / Командная строка» и, когда откроется окно терминала, введите «ipconfig». Запишите «IP-адрес» и перейдите к другому компьютеру в вашей локальной сети.
- Откройте веб-браузер и введите https:// (ip-адрес компьютера-робота): 12345 / ControlPage.html.
- Должна загрузиться управляющая веб-страница, в поле «IP-адрес» введите IP-адрес компьютера робота.
- Начни управлять своим роботом.
Чтобы начать разговор: (через Интернет) Теперь, когда он работает локально, он может говорить через Интернет всего в нескольких шагах от вас.
- (самый сложный шаг) Настройка переадресации портов - ваш компьютер должен прослушивать Интернет, а не только локальную сеть. Для этого вам нужно указать маршрутизатору, чтобы он передавал определенные запросы компьютеру, управляющему роботом. Это немного сложно и выходит далеко за рамки данного руководства. Однако, если вы посетите PortForward.com, они предоставят вам все, что вам нужно знать о настройке маршрутизатора (вам необходимо перенаправить порт 12345 на свой ноутбук-робот).
- Затем найдите свой IP-адрес в Интернете (посетите WhatIsMyIP.com)
- Наконец, запустите Skype, настройте видеозвонок и попросите всех, с кем вы разговариваете, посетить "https:// (IP-адрес в Интернете): 12345 / ControlPage.html"
- Введите IP-адрес в Интернете в поле «IP-адрес» на веб-странице управления, и ваш робот, подключенный к сети, будет управляться издалека.
Шаг 6: Готово
Ну вот и все. Надеюсь, вы весело проводите время, управляя своим роботом издалека. Если у вас есть какие-либо проблемы с программным или аппаратным обеспечением, не стесняйтесь оставлять комментарии, и я постараюсь вам помочь. Если вы хотите ознакомиться с другими интересными проектами, попробуйте посетить: oomlout.com