makibot — робот телеприсутствия на скорую руку


makibot - робот телеприсутствия на скорую руку
Здесь уже не раз рассматривались различные роботы телеприсутсвия, но этот робот — makibot — самый суровый (и шумный).
Priit Hansen собрал его на день рождения подруги, чтобы их знакомые, которые не смогли присутствовать — могли поздороваться через Skype и виртуально поприсутстваовать на вечеринке.
Главным минусом робота является слишком громкая работа его двигателей, но в то же время — это не позволит вашим абонентам Skype подкрасться к вам незаметно 🙂

Команды управления роботом передаются через Интернет, используя комбинацию Ajax и PHP (используется php-serial class).

AJAX, Ajax (Asynchronous Javascript and XML — «асинхронный JavaScript и XML») — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате, при обновлении данных, веб-страница не перезагружается полностью, и веб-приложения становятся более быстрыми и удобными.

Команды принимает контроллер Arduino, который через пару автомобильных реле (12V 40A) управляет питанием двух шуруповёртов (от их же аккумуляторных батарей), в патроне которых зажаты колёса.
makibot - робот телеприсутствия на скорую руку
makibot - робот телеприсутствия на скорую руку
makibot - робот телеприсутствия на скорую руку

видео работы:

http://www.youtube.com/watch?v=TjH2fpcFu_8

http://www.youtube.com/watch?v=EKpRiLlYS-g

Код

HTML & CSS

<html>
<head>
	<style type="text/css">
	.nupud {
		-moz-box-shadow:inset 0px 1px 0px 0px #ffffff;
		-webkit-box-shadow:inset 0px 1px 0px 0px #ffffff;
		box-shadow:inset 0px 1px 0px 0px #ffffff;
		background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ededed), color-stop(1, #dfdfdf) );
		background:-moz-linear-gradient( center top, #ededed 5%, #dfdfdf 100% );
		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#dfdfdf');
		background-color:#ededed;
		-moz-border-radius:6px;
		-webkit-border-radius:6px;
		border-radius:6px;
		border:1px solid #dcdcdc;
		display:inline-block;
		color:#777777;
		font-family:Verdana;
		font-size:15px;
		font-weight:bold;
		padding:32px 19px;
		text-decoration:none;
		text-shadow:1px 1px 0px #ffffff;
		-webkit-user-select: none;
		-khtml-user-select: none;
		-moz-user-select: none;
		-o-user-select: none;
		user-select: none;
	}.nupud:hover {
		background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #dfdfdf), color-stop(1, #ededed) );
		background:-moz-linear-gradient( center top, #dfdfdf 5%, #ededed 100% );
		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dfdfdf', endColorstr='#ededed');
		background-color:#dfdfdf;
	}.nupud:active {
		position:relative;
		top:1px;
	}
	/* This imageless css button was generated by CSSButtonGenerator.com */
	</style>
<script type="text/javascript">


function command(where)
{

	xmlhttp=new XMLHttpRequest();
 	xmlhttp.open("GET","serial.php?go="+where);
	xmlhttp.send();
}
</script>
</head>
<body>
<div class="nupud" style="position: absolute; top: 20px; left: 120px;" onMouseDown="command('e')" onMouseUp="command('s')" onMouseOut="command('s')">Edasi</div>
<div class="nupud" style="position: absolute; top: 130px; left: 30px;" onMouseDown="command('v')" onMouseUp="command('s')" onMouseOut="command('s')">Vasakule</div>
<div class="nupud" style="position: absolute; top: 130px; left: 170px;" onMouseDown="command('p')" onMouseUp="command('s')" onMouseOut="command('s')">Paremale</div>
</body>
</html>

скетч Arduino

boolean stringComplete = false;  // whether the string is complete
String inputString = "";

void setup() {
  // test pin
  pinMode(10, OUTPUT); // Vasakule
  pinMode(9, OUTPUT); // Paremale

  // initialize serial:
  Serial.begin(9600);

}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {

    if (inputString == "e") {
      digitalWrite(10, HIGH);
       digitalWrite(9, HIGH);
    }
   if (inputString == "v") {
      digitalWrite(10, HIGH);
    }
   if (inputString == "p") {
      digitalWrite(9, HIGH);
    }

    if (inputString == "s") {
      digitalWrite(10, LOW);
      digitalWrite(9, LOW);
    }

    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char suund = (char)Serial.read();
    inputString += suund;
    stringComplete = true;

    }
}

PHP

<?php
include "php_serial.class.php";

$go = $_GET["go"];

// Let's start the class
$serial = new phpSerial;

// First we must specify the device. This works on both linux and windows (if
// your linux serial device is /dev/ttyS0 for COM1, etc)
$serial->deviceSet("/dev/cu.usbserial-A4007mX9");

// We can change the baud rate, parity, length, stop bits, flow control
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");

// Then we need to open it
$serial->deviceOpen();

// To write into
$serial->sendMessage($go);


// Or to read from
//$read = $serial->readPort();

// If you want to change the configuration, the device must be closed
$serial->deviceClose();


?>

Ссылки
Skype got legs
php-serial — PHP-класс для работы с последовательным портом

По теме
Собрать робота для телеприсутствия за 500 долларов
Oculus — недорогой робот телеприсутствия
Робот телеприсутствия для контроля домашних животных


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение