Управление роботом акселерометром телефона

В ROS  есть готовое приложение для Android, которое позволяет использовать акселерометр вашего телефона в своих проектах - это Android Sensor Driver: http://www.ros.org/wiki/android_sensors_driver там же коротенький туториал. Для теста также пока буду запускать roscore у себя на компьютере и работать с Arduino через прослойку на Pearl, которую мы подредактируем.

Чтобы сделать такое же управление, устанавливаем Android Sendord Driver себе на телефон:
QR код для установки Android Sensors Driver

  1. Запускаем в отдельном терминале roscore:
    $ roscore
  2. Я прописал себе на компьютере статический IP адрес 192.168.0.10, чтобы каждый раз при пере подключениях компьютера не менять настройки в Android Sensor Driver. Запускаем его у себя на телефоне и указываем http://192.168.0.10:11311/ и нажимаем Ok.
  3. Проверим подключение - есть ли в списке нод /android_sensors_driver_imu:
    $ rosnode list

    Если не появилось, ищем где ошиблись.

  4. # Проверяем соединение:
    $ rosnode ping android_sensors_driver_imu
    # Если пинг не идет, перезапустите приложение. (Мне потребовалось после смены IP)
    # Смотрим публикуемые топики, нужный нам /android/imu
    $ rostopic list
    
    # Кстати, топик /android/fix позволит нам общаться с GPS, но это нам пока не надо.
    # Можно посмотреть публикуемые сообщения
    $ rostopic echo /android/imu

В том же проекте katusha напишем Phyton-прослойку для приема сообщений от топика акселератора, преобразования их в команды перемещения и передачи нашему роботу katusha_accelerometr.py:

 1 #!/usr/bin/env python
 2 #coding=utf8
 3 
 4 # Author: Stepan
 5 # Howto use: http://robotlife.ru/upravlenie-akselerometrom/
 6 
 7 from turtlesim.msg import Velocity
 8 from sensor_msgs.msg import Imu
 9 from time import sleep
10 import serial
11 import rospy
12 
13 # Data from accelerometers
14 acc_x = acc_y = acc_z = 0
15 
16 def dec2hex(n):
17     """return the hexademical string in XXXX format"""
18     return ("%0.4X" % (n>=0 and n or n+256**2))[-4:]
19 # the mystery here n>=0 actually goes to n+256*2 and returns 10000 in hex. but it's cuted to 0000 by [-4:0]
20 
21 def move(speed=255):
22     """move foreward, or backward if speed<0"""
23     ser.write('G'+dec2hex(speed))
24 
25 def rotate(speed=255):
26     """rotate clockwise if speed<0, or anti-clockwise if speed>0"""
27     ser.write('R'+dec2hex(speed)+'L'+dec2hex(-speed))
28 
29 def moveR(speed=255):
30     """Move right weels only. Forward if speed>0, backwards if speed<0"""
31     ser.write('R'+dec2hex(speed))
32 
33 def moveL(speed=255):
34     """Move left weels only. Forward if speed>0, backwards if speed<0"""
35     ser.write('L'+dec2hex(speed))
36 
37 def imucallback(msg):
38     """callback for 'android/imu' messages from turtlesim. Updateing current positoin of accelerometr"""
39     global acc_x, acc_y, acc_z
40 #    rospy.loginfo(rospy.get_name() + ": I heard %s and %s and %s" % (msg.linear_acceleration.x, msg.linear_acceleration.y,  msg.linear_acceleration.z))
41     acc_x = msg.linear_acceleration.x
42     acc_y = -msg.linear_acceleration.y
43     acc_z = msg.linear_acceleration.z
44 
45 def listener():
46     """Main loop"""
47     rospy.init_node('katusha', anonymous=True)
48     rospy.Subscriber('android/imu', Imu, imucallback)
49 
50     while not rospy.is_shutdown():
51         # This way we prevent from sending values to motors which will not move the robot, but only make noise from motors. Also prevent acidental moving when phone in horiosntal position.
52         if (abs(acc_y+acc_x)>2) or (abs(acc_y-acc_x)>2):
53             moveR((acc_y+acc_x)*255/10)
54             moveL((acc_y-acc_x)*255/10)
55         else:
56             move(0)
57         print 'Y:%s' % acc_y
58         print 'X:%s' % acc_x
59         # read and print data from serial port (bluetooth)
60         data = ser.read(9999)
61         if len(data)>0:
62             print data
63         # Move with
64         # rospy.sleep(0.1)
65 
66 if __name__ == '__main__':
67     # connect to bluetooth. Make sure you have  connected robot with 
68     # rfcomm connect 0 00:13:02:01:70:17 1 
69     ser = serial.Serial('/dev/rfcomm0', 9600, timeout=0)
70     listener()
71     # stop motors before exit
72     move(0)


Запускаем каждую программу в новом терминале:

  1. $ roscore   # Ядро ROS
  2. $ Приложение Android Sensor Driver на телефоне, указываем адрес ROSCore и подключаемся
  3. $ rfcomm connect 0 00:13:02:01:70:17 1   # Включаем bluetooth соединение с роботом - здесь 00:13:02:01:70:17 - MAC адрес bluetooth робота.
  4. $ rosrun katusha katusha_accelerometr.py  # Наш модуль

Управление роботом симулятором turtlesim

Только начиная проходить Tutorial по ROS, управляя черепахой из модуля turtlesim, пришла идея подписаться на топик turtle1/command_velocity, который транслирует команды черепахе и параллельно с черепахой управлять роботом. Дочитав весь туториал и изучив основы Python взялся за дело. На время обучения ROS и его возможностям, решил roscore запускать пока на компьютере и работать с Arduino через bluetooth напрямую, без участия Android-телефона.

В директории src в рабочем месте ~/catkin_ws/ (созданном ещё во время прохождения туториала), создаем проект для нашего робота Катюши:

$ cd ~/catkin_ws/src
$ catkin_create_pkg katusha std_msgs rospy roscpp
$ cd katusha
# Будем писать на Phyton, поэтому сделаем для него отдельную директорию:
$ mkdir source

Задача модуля на Phyton - связать ROS и наш Arduino скетч. Я попробовал использовать решения ROS для отправки сообщений между ROS и Arduino, но существующее решение оказалось очень не стабильно, а поддержка хромает т.к. разработчиков этой части мало. Поэтому будем использовать существующую и уже хорошо зарекомендовавшую себя систему команд нашего робота и просто напишем ROS прослойку, которая будет читать топики ROS и отправлять команды в Arduino. Сам модуль, я назвал katusha_turtlesim.py:

#!/usr/bin/env python
#coding=utf8
from turtlesim.msg import Velocity
from time import sleep
import serial
import rospy

def dec2hex(n):
    """return the hexademical string in XXXX format"""
    return ("%0.4X" % (n>=0 and n or n+256**2))[-4:]
# the mystery here n>=0 actually goes to n+256*2 and returns 10000 in hex. but it's cuted to 0000 by [-4:0]

def move(speed=255):
    """move foreward, or backward if speed<0"""
    ser.write('G'+dec2hex(speed))

def rotate(speed=255):
    """rotate clockwise if speed<0, or anti-clockwise if speed>0"""
    ser.write('R'+dec2hex(speed)+'L'+dec2hex(-speed))

def turtlesim_cmd(msg):
    """callback for 'turtle1/command_velocity' messages from turtlesim"""
    # Logs
    #rospy.loginfo(rospy.get_name() + ": I heard %s and %s" % (msg.linear, msg.angular))
    # Determine the direction to move
    if msg.linear+msg.angular>0:
        speed=255
    else:
        speed=-255
    # Go straight or rotate
    if msg.linear!=0:
        move(speed)
        sleep(abs(msg.linear/100))
    else:
        rotate(speed)
        sleep(abs(msg.angular/100))
    # Stop
    move(0)

def listener():
    rospy.init_node('katusha', anonymous=True)
    # Listen for messages from turtlesim
    rospy.Subscriber('turtle1/command_velocity', Velocity, turtlesim_cmd)

    while not rospy.is_shutdown():
        # read and print data from serial port (bluetooth)
        data = ser.read(9999)
        if len(data)>0:
            print data

if __name__ == '__main__':
    # connect to bluetooth. Make sure you have  connected robot with 
    # rfcomm connect 0 00:13:02:01:70:17 1 
    ser = serial.Serial('/dev/rfcomm0', 9600, timeout=0)
    listener()
    # stop before exit
    move(0)

Обязательно делаем модуль исполняемым

$ chmod +x katusha_turtlesim.py

Запускаем каждую программу в новом терминале:

  1. $ roscore   # Ядро ROS
  2. $ rosrun turtlesim turtle_teleop_key  # Терминал с которого будем управлять
  3. $ rosrun turtlesim turtlesim_node   # Необязательно, но если захочется - черепашка будет на экране дублировать действия робота
  4. $ rfcomm connect 0 00:13:02:01:70:17 1   # Включаем bluetooth соединение - здесь 00:13:02:01:70:17 - MAC адрес bluetooth робота.
  5. $ rosrun katusha katusha_turtlesim.py  # Наш модуль, хотя у меня работает и просто запуск из директории с исходником: ./katusha_turtlesim.py

Все, можно переключиться на окно с turtle_teleop_key и управлять Катюшей! :)

Чтобы посмотреть как работают сообщения в ROS и проверить, подписаны ли мы на правильный топик, можем воспользоваться rqt_graph:

$ rosrun rqt_graph rqt_graph

Топики ROS для нашего робота

Подключение по Bluetooth Arduino c Ubuntu

Настройка bluetooth в Ubuntu

У меня почему-то не получилось настроить подключение к bluetooth через графический интерфейс ubuntu - сначала долго не указывался правильный пин, а потом не удавалось воспользоваться этим устройством. Поэтому решил попробовать через коммандную строку - оказало довольно просто:

# Поиск доступных bluetooth устройств
$ hcitool scan
Scanning ... 
	00:13:02:01:70:17	Bluetooth_Bee_V2 

# Подключаемся к нему (после этого у нас спросят PIN код, для моего Bluetooth Bee 2.0 это 1234):
$ sudo rfcomm connect 0 00:13:02:01:70:17 1
Connected /dev/rfcomm0 to 00:13:02:01:70:17 on channel 1 
Press CTRL-C for hangup 

# Оставляем это в консоли, теперь можем подключаться к нему в тепрминале как com-порту по адресу: /dev/rfcomm0

Важно! В Ubuntu доступ к rfcomm0 имеет только root, поэтому не из под рута подключение происходить не будет – будем получать ошибку:
stty: /dev/rfcomm0: Device or resource busy
Чтобы дать доступ к rfcomm0 нашему пользователю рекомендуют, создать файл:
/etc/udev/rules.d/rfcomm.rules
И записать в него:
KERNEL=="rfcomm*", GROUP="dialout"
Перезагружаем компьютер для применения изменений.
Но у меня это не сработало!

Также как и совет:
sudo chmod u+s /usr/bin/rfcomm

Поэтому саму работу с портом приходится делать из-под root. Хотя подключение устанавливается и из обычного пользователя. Почему это происходит я так и не разобрался. Кто сможет помочь буду рад.
Если что - мой пользователь a состоит в группе dialout
$ cat /etc/group | grep dialout
dialout:x:20:a

Полезные комманды:
$ ps ax | grep rfcomm - список процессов
$ lsof | grep rfcomm – проверить разрешения
$ sudo rfcomm -a состояние подключения
$ hciconfig подробная информация по принятым-переданным данным

Проверяем соединение с Arduino

Делаем простой тест – заливаем скетч в Ардуино и проверяем, приходят ли приветы:

void setup()
{ 
  Serial1.begin(9600); 
} 

void loop()
{ 
  Serial1.println("Hello, Stepa!");
  delay(1000);
}

Если у вас не Leonardo, то Serial1 поменяйте просто на Serial. На Leonardo при прошивке bluetooth убирать не надо. На остальных Arduino надо отключать bluetooth каждый раз перед перепрошивкой.

Программирование Bluetooth Xbee

Мне не понятно как на Arduino Leonardo (Romeo V2) связаться с Xbee в коммадном режиме режиме для изменения рабочей скорости передачи данных. Хочу увеличить с 9600 до 57600 бод – для увеличения скорости, а самое главное, чтобы не менять код библиотек ROS (от которой я всё же отказался и решил написать свою прослойку), где везде используется скорость 57600 бод.
Для изменеия скорости подключил Arduino Uno + Xbee Shield for Arduino + Xbee.
На Xbee Shield for Arduino надо выставить рычажки: XBEE/USB в положение USB (правое) и RUN/PROG в положение RUN (верх).
На самом Xbее рычажок в положение AT Mode.
После этого открывает Arduino IDE, выбираем определившейся порт, открываем Serial Monitor (Ctrl+Shift+M), в нем выставляем скорость 38400 бод (скорость работы в коммандном режиме) и выставляем настройку “both NL & CR”. После этого посылаем комманду:

AT

должны получить в ответ

OK

Если получили ERROR:(0) - тоже очень хороший знак – связь есть! Скорее всего до этой комманды в буфере порта были ещё какие-то символы. Повторная посылка несколько раз команды AT до состояния ответа ОК – решает проблему.
если не получили, то проверяем что сделали не так – возможно ещё на плате Arduino Uno залит скетч, который пишет что-то в порт. Залейте на всякий случай пустой скетч в Arduino.
Когда получим в ответ ОК, изменяем частоту:

AT+UART=57600,0,0

Должны получить ответ

OK

Проверяем все ли применилось:

AT+UART?

Должны получить:

+UART:57600,0,0
OK

Отключаем питание от Arduino Uno, отсоединяем Xbee, переключаем рычажок на Xbee в рабочий режим и присоединяем к Arduino Leonardo.

http://arduino.cc/en/Serial/Begin (The default is 8 data bits, no parity, one stop bit. - поэтому мы выставляли параметры 0,0 в конце комманды AT+UART=57600,0,0
Документация по Xbee:
http://www.dfrobot.com/wiki/index.php/BLUETOOH_BEE_(SKU:TEL0023)#Entering_AT_Mode

Ставим Arduino IDE в Ubuntu

Среда разработки Arduino IDE на удивление ставится легко и без проблем в Ubuntu. В Windows тоже проблем не было Arduino Uno, но вот с Arduino Leonardo, на котором построен Romeo V2-All in one Controller я в Windows запарился и если одну доску удалось запустить, то вторую с тот же компьютер уже не получится вставить просто так - только в другой компьютер. Не знаю почему так - но я так и не нашел решения, благо два компьютера были под рукой.

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

      1. Ставим библиотеки для IDE и JAVA:
        sudo apt-get install gcc-avr avr-libc openjdk-6-jre
      2. Качаем последнюю версию Arduino IDE с официального сайта: http://arduino.cc/en/Main/Software
      3. Я скопировал этот архив в домашнюю директорию и распаковал:
tar -xzvf arduino-1.0.4-linux64.tgz

Исправим интерфейс Arduino IDE на классический, чтобы убрать баги в интерфейсе и тормоза:

cd ~/arduino-1.0.4/
gedit arduino

# Комментируем последнюю строку:
#java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel processing.app.Base
# Меняем на эту:
java processing.app.Base
# Сохраняем, выходим.

Вставляем Arduino Leonardo (или вашу плату) в USB и смотрим на каком порту установилась плата:

dmesg | grep cdc_acm
# У меня этот запрос выдал:
[94918.887392] cdc_acm 2-1:1.0: ttyACM0: USB ACM device
[94926.908525] cdc_acm 2-1:1.0: This device cannot do calls on its own. It is not a modem.
[94926.908575] cdc_acm 2-1:1.0: ttyACM0: USB ACM device
# Это означает, что Arduino установился в ttyACM0
# Даем полные права на этот порт нашему пользователю:
sudo chmod a+rw /dev/ttyACM0
# Включаем в группу, которая имеет доступ к порту
sudo usermod -aG dialout <username>

Перезагружаем компьютер, т.к. настройки группы вступают только после перезагрузки!

 # Запускаем arduino:
cd ~/arduino-1.0.4/
./arduino   # Обратите внимание на точку вначале - её тоже надо писать

В Arduino IDE в настркойках палты указываем нашу плату (Leonardo) и наш порт: ttyACM0.
Если вдруг настройка порта будет серая - то попробуйте запустить Arduino IDE от администратора:

sudo ./arduino

Дальше рекомендую пройти курс по rosserial_arduino: http://www.ros.org/wiki/rosserial_arduino/Tutorials
Если в процессе компиляции у вас возникнет ошибка (У всех на Leonardo она возникнет т.к. связана с тем, что эта плата использует Serial1 для коммуникации через пины 0,1 (RX1,TX1) Arduino):

cannot convert 'Serial_*' to 'HardwareSerial*' in assignment

То во всех файлах где будет такая ошибка замените:

_serial = &Serial;

на

_serial = &Serial1;

Перехожу на ROS + Arduino

Как показала практика дальнейшее развитие робота требует хорошего софта для него. Самому писать или даже партировать модули простейшего ИИ: систему навигации, распознавание речи и объектов, и т.д. - довольно труднозатратно и и даже если и получится черевато многими багами...
Мне очень понравилася ROS (Robotic Operation System) - операционная система для робота. Она полностью OpenSource и содержит куча готовых модулей и главное огромное коммьюнити людей, которые поддерживают и улучшают ROS. Мы ведь не пишем операционную систему, когда нам надо написать софт? Мы даже не начали паять сами плату для МП, а используем Arduino. Ту же роль и ROS играет для робота. Мне очень понравился их принцип:

Хватит изобретать велосипед.

А куча видео на Youtube с проектами на ROS окончательно меня убедили, например, вот:

Правда для такой навигации как в ролике они используют http://www.robotshop.com/hokuyo-urg-04lx-laser-rangefinder-1.html вещь очень дорогая, но и на базе обычных дешевых сонаров есть хорошие бибилиотеки. (точнее библиотека одна - просто разные источники данных и соответсвенно точность)

Конечно, изобертение велосипедов - интересно и повышает самооценку, но если мы хотим сделать что-то серьёзное, то надо использовать существующие достижения и коллективный разум. Поэтому я начинаю изучать и перехожу на ROS. Пока что в связке ROS+Arduino+Ноут на Ubuntu. Как разберусь с этим, вместо ноута будет один из вариантов ниже.

Самое сложное в этом решении - было переступить через свое эго - ведь уже столько сделано...

Как это привентить к нашему роботу

Варианты:

  1. ROS партирован на Android, т.е. мы сможем запустить его у себя на телефоне. У меня сразу поставить не получилось, но когда я пробовал ещё не понимал архитектуру ROS, да и инструкция была под Ubuntu, а я пытался из-под Widnows. Как более подробно разберусь попробую ещё раз.
  2. Поставить Linux на Android, точнее параллельно с ним. Я поставил Ubuntu, работает исправно, удаленка по VNC не тормозит почти. http://linuxonandroid.org/
  3. Грядет выпуск Ubuntu для мобильников. Я очень надеюсь что у них все получится и с удовольствием поставлю себе на телефон. Но ставить на этот вариант не буду т.к. все пако что очень сыро. http://www.ubuntu.com/phone/ubuntu-for-android
  4. Заменить наш телефон на мини-компьютер. Нет я ни в коем случае не собираюсь ставить килограммовый ПК - у нас не такой робот. Но сейчас появились дешевые и мощные для своего ультра-портативного размером меньше чем кредитная карта компьютеры на базе ARM Cortex-A9 1,7Ghz, например ODROID-U2 на который отлично встает Ubuntu
    http://www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G135341370451
    Обзор на хабре: http://habrahabr.ru/post/172895/
    Более бюджетная интересная альтернатива компьютер+замена Arduino за 45$ BeagleBone Black на процессоре AM335X 1GHz ARM Cortex-A8 с двумя USB2.0, а также 65 цифровыми и 7 аналогвыми портами http://habrahabr.ru/post/177887/ http://beagleboard.org/

С чего начать

  1. Для начала освоить операционую систему Ubuntu - я для начала поставил её как виртуальную машину в Windows, используя VirtualBox. Поиспользуйте её, разберитесь что к чему, научитесь пользоваться коммандной строкой и ставить из неё приложения. Очень поможет курс по Ubuntu на русском. http://help.ubuntu.ru/manual/
  2. Пройдите полный курс Tutorial по ROS для новичков. http://www.ros.org/wiki/ROS/Tutorials
  3. Я после этого поставил Ubuntu себе как основную операционную систему. Параллелно Windows 7 стоит на всякий случай. Уже 4й день не загружал Windows. Хочу сказать что Ubuntu встала без проблем вообще все драйвера на все устройства заработали сразу же! Но почемуто ы 32bit ном дистрибутиве не работал тачпад, поставил 64 бит и все сразу ок было. Совет - перед тем как ставить, запустите Live-версию и посмотрите как она пойдет.
  4. Ставим Arduino IDE и проходим курс по rosserial_arduino

Зарядная станция для робота

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

Нам потребуются:

  1. Собственно сам робот. Предполагаю, что он у вас уже собран и работает, но заряжаете вы его вручную специальной зарядкой.
  2. Источник тока, поиск на ebay.com: LM2596S DC-DC Step Down Adjustable Power Supply Module. У источника тока на изображении должно быть три потенциометра (синий прямоугольника) - смотреть фото ниже.
  3. Источник напряжения, поиск на ebay тот же, что и выше, только у источника напряжения один потенциометр (Они сделаны на одной и той же микросхеме LM2596S). Рекомендую обоих источников взять по несколько штук, могут еще понадобится для фар или в результате неудачных экспериментов какая-нибудь плата сгорит.
  4. Два делителя напряжения. (Или просто 4 сопротивления для самодельного делителя). Нужно для контроля напряжения средствами ПО. Не обязательно.
  5. Вольтметр - для визуального контроля напряжения. Не обязательно.
  6. Два лезвия от ножа по бумаге (для контактов на зарядной станции).
  7. Блок питания с напряжением от 12В до 30В и током минимум 2A. Большинство блоков питания для ноутбуков подойдут. Блок питания нужен для зарядной станции.
  8. Два пружинных контакта (для контактов на роботе). Я сделал из пружин для крепления пальчиковых батареек.
  9. miniUSB-USB провод или другой, какой используется у вас в телефоне для зарядки. Его разрезать пополам надо будет.

Настройка источников тока и напряжения

Источники тока и напряжения lm2596s

  1. Подключаем к разъемам источника тока LM2596S IN+ и IN- блок питания с напряжением от 12В до 30В и током минимум 2A. Большинство блоков питания для ноутбуков подойдут.
  2. Подключаем вольтметр в режиме измерения напряжения к выходам источника тока LM2596S OUT+ и OUT-.
  3. Синие прямоугольники на плате - это потенциометры. Всего их три. Крутим плоской отверткой самый левый потенциометр. (Источник питания слева, вольтметр справа.) По часовой стрелке увеличивать напряжение, против часовой уменьшать напряжение. Справа можно разглядеть три светодиода. Нижний будет гореть зелёным цветом - это значит, что источник работает в режиме стабилизации напряжения. Если у вас Li-Pol аккумулятор на 7,4В, значит напряжение полной зарядки у него 8,4В (на самом деле даже ещё чуть выше). Для аккумулятора с защитой от перезарядки смело выставляйте 9В на выходе источника с помощью левого потенциометра. Это самый простой вариант т.к. как только аккумулятор полностью зарядится сработает внутренняя защита аккумуляторов и они перестанут заряжаться. А робот пока будет находиться на зарядной станции дальше будет питаться от неё (мы программно сможем определить этот момент по тому как напряжение станет почти 9В), сберегая ресурс вашего аккумулятора. Если защиты нету, то выставляйте 8,4В (может лучше чуть меньше для страховки 8,35В). Аккумулятор будет чуть-чуть недозаряжаться, зато и взрыва не произойдёт. Вообще в этом случае лучше  придумать самодельную "умную" зарядку, например, на базе этих же источников тока - если отпаять пятую (самую правую) ножку на самой микросхеме LM2596S и подключить её через логическую схему НЕ к выходу платы Arduino, то можно программно контролировать включение-выключение платы. Но я это не собирал, т.к. у меня аккумуляторы с защитой.
  4. Подключаем нагрузку на источник тока - можно использовать разряженный аккумулятор (плюс аккумулятора к плюсу источника тока, не перепутайте, иначе скорее всего взорвется плата LM2596S - я один раз перепутал случайно когда экспериментировал) и последовательно нагрузке амперметр  (мультиметр надо переключить в режим измерения тока, не забудьте что и провод мультиметра надо переставить на измерение тока) и выставляем самым правым потенциометром на источнике тока силу тока 1,1 А (мы позже это подкорректируем). Обратите внимание, что на источнике тока загорелся кроме зелёного ещё и красный светодиод - это значит, что источник работает в режиме стабилизации тока.
  5. Измеряем напряжение на выходе USB порта т.е. из переходника 220V->USB, который используется для зарядки телефона. У меня это 5,12В. Вольтметры обладают некоторой погрешностью, поэтому лучше измерьте это значение для своего переходника и вольтметра. Я для удобства измерения разрезал miniUSB-USB шнур зарядки пополам.
  6. Подключаем источник напряжения LM2596S к настроенному выше источнику тока и с помощью единственного потенциометра на источнике напряжения выставляем на выходе источника напряжения измеренное выше напряжение на выходе USB порта.
  7. Подключите телефон на выход источника напряжения LM2596 и проверьте, чтобы он заряжался. (Используйте половинку с miniUSB от шнура miniUSB-USB). Измерьте потребляемый источником напряжения ток. Т.е. амперметр надо воткнуть последовательно в один из разъемов между выходом источника тока и входом источника напряжения. У меня ток 0,34A.
  8. Arduino, подключенная к этому источнику тока потребляет где-то 0,1A в среднем в пассивном режиме (без моторов и работы серв).
  9. Наши аккумуляторы можно заряжать током не больше, чем 1A (на них так написано). По идее, у нас соединено два аккумулятора параллельно, и их можно заряжать было бы током 2А, но не в нашем случае, так как после того как защита сработает на одном из аккумуляторов, на другой пойдет ток в 2A, хоть и не надолго, но это все равно не хорошо.
  10. Подключаем нагрузку (разряженный аккумулятор) на источник тока  и последовательно нагрузке амперметр и выставляем ПРАВЫМ потенциометром на источнике тока: 1A+0,34A+0,1A=1,44A. Телефон как зарядится будет потреблять меньше тока, поэтому я решил выставить 1,3A - пусть аккумуляторы будут чуть медленнее заряжаться, зато дольше прослужат и источник тока будет меньше греться, а греется он прилично.

Сборка зарядки робота

Схема зарядной станции

На схеме слева:

R2, R1 - сопротивления делителя напряжения. Эти значения используются в коде в robo_body.h для вычисления dividerRatio0 и dividerRatio1 по формуле (R1+R2)/R2 - коэффициентов делителя напряжения. Если вы используете делитель от DFRobot, то эти значения dividerRatio равны 5.
A5 Arduino, A4 Arduino - аналоговые входы A5 и A4 на Arduino.
V - вольтметр для визуального контроля напряжения.
АКБ1, АКБ2 - два аккумулятора, соединенных параллельно. Можно подключить больше, можно оставить только один.

Вся эта электроника находится внутри робота, и с зарядной станцией контактирует через пружинный контакт. В принципе источник тока можно было бы вынести за пределы робота, но тогда сложно будет определить момент подключения к зарядной станции (А так мы всегда это легко можем сделать, проверив напряжение на аналоговом входе A5) и при наличии источника тока на самом роботе - мы можем использовать вообще любую внешнюю зарядку с напряжением 12-30В и током более 2А, что может быть полезно если мы поехали куда-нибудь с роботом.

Вся эта электроника, вошла у меня внутрь тележки рядом с аккумуляторами:Сборка зарядной станции

Пружинные контакты у Робота

Я меня не было под рукой нормальных пружинных контактов и где заказать быстро я не знал, поэтому смастерил сам - вырезал кусок ДСП, к нему используя двусторонний скотч прикрепил пластик с пружинами от держателя батареек AA (они обычно с тележкой идут - да и так найти их не составит труда). К основанию пружин припаял контакты. Вся этак конструкция крепится к тележке также с помощью двустороннего скотча.

Пружинные контакты для робота

Зарядная станция

С такой электроникой в роботе как у нас, зарядная станция представляет собой просто два контакта выведенных от любого блока питания 12-30В, более 2A. Я в качестве контактов использовал два лезвия от ножа по бумаги. Припаял к ним контакты от блока питания и параллельно друг другу и полу прикрепил их к стене двусторонним скотчем (точнее к фанере, чтобы не портить стену). В условиях влажного климата, да и вообще рекомендую попрыскать лезвия WD-шкой, чтобы лезвия не заржавели. И повторять эту процедуру раз в месяц.

Робот на зарядке на станцииЗарядная станция для робота

Эксплуатация

Я уезжал и оставлял робота на 21 день без присмотра на этой станции, и когда я вернулся он был полностью заряжен и в боевом расположении духа! Т.е. управление удаленно работало. Единственный косяк, который случился на 6й день когда я попробовал удаленно подключиться - почему-то вылетело приложение IPWebCam и по этой причине я не мог удаленно наблюдать что происходит. Так что робот у нас теперь полностью автономный, дело за софтом...

Когда паркуетесь к зарядной станции, сбавляйте скорость, если парковаться на быстрой скорости, пружины вас отбросят назад. Надо ещё придумать как  парковаться при удаленном управлении. Если смотришь на станцию воочию и паркуешься, то всё легко, но если делаешь это удаленно через камеру, то довольно сложно. Какие есть варианты решения:

  1. Переместить клеммы заряда вперед. Но это не очень элегантно.
  2. Включать для парковки заднюю камеру.
  3. Нарисовать на полу "парковочные линии".

Какой выбрать аккумулятор для робота

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

1) Желательно, чтобы это были Li-Pol аккумуляторы т.к. из всех они имеют наибольшую емкость при тех же размерах, нет эффекта памяти, большое количество циклов разрядки-зарядки. Классная статья про Li-Pol аккумуляторы: http://2a3a.ru/li-po/
2) Напряжение Li-Pol аккумуляторов должно быть 7,4V. Это наиболее подходящее напряжение для наших моторов. Напряжение Li-Pol аккумуляторов может быть кратно 3,7V т.к. увеличение напряжение достигается просто увеличением количества "банок": т.е. возможное напряжение: 3,7V, 7,4V, 11,1V. 11,1V - сильно много, моторы будут сильно искриться, греться, нам придется выдумывать всякие сложности, чтобы его использовать, а оно нам не надо. 3,7V - сильно мало, следовательно 7,4V - идеал.
3) Емкость/вес. Понятно, что чем больше емкость, тем дольше робот сможет кататься без подзарядки, но тем он будет тяжелее т.е. медленнее и сложнее будет их вставить в тележку.
4) Габариты. Аккумулятор должен влазить в вашу тележку. Поэтому измерьте место куда будете ставить аккумуляторы и берите аккумуляторы меньше этого размера с запасом на провода как минимум 5мм, чтобы они не сжимались.
5) Ток разрядки 10A. Пиковая нагрузка на всего робота (4 мотора, Зарядка телефона, Сервы, Arduino, Светодиоды) по моим подсчетам не превышает 5A. С очень хорошим запасом берем 10А. Для аккумуляторов 2200mAh это 5С.
6) Защита от перезарядки. Необязательно, но я рекомендую если есть возможность взять с защитой, поскольку она защитит вас от взрыва при случайной перезарядке аккумулятора. От ошибок никто не застрахован, а мы будет собирать свою зарядную станцию, мало ли что. Также появляется дополнительная приятная функция - даже если вы не будете делать зарядную станцию, можно будет заряжать любым источником напряжения на 9В, тем самым сэкономите на специализированном зарядном устройстве. После полной зарядки, когда напряжение на аккумуляторе будет 8,4В, цепь разорвется и зарядка остановится.

Я купил и рекомендую взять 2 штуки 7.4V Lipo 2200mAh 20С Battery (Arduino Power Jack) от DFRobot.  Изначально я воткнул в нашу тележку целых четыре таких аккумулятора их было очень сложно посадить хватает очень надолго, поэтому я остановился на двух, чтобы уменьшить вес и самое главное добавить пространства внутри тележки, чтобы хватило на электронику для блока зарядки и фар! Если аккумуляторов 2 и более, они просто соединяются параллельно (т.е. плюс к плюсу, минус к минусу). Я отрезал стандартный ардуиновский разъем, который был на аккумуляторах и просто спаял провода, потому что разъемы занимали очень много места в тележке.

Вот как выглядят эти 2 аккумулятора в тележке  у меня:

dva-akkumulatora-ot-dfrobot

Как запихнуть четыре аккумулятора в стандартную тележку

Именно запихнуть. Потому что по другому это не назовешь, и с первого взгляда может показаться, что это невозможно :)

Предполагается, что используется четыре аккумулятора 7.4V Lipo 2200mAh Battery (Arduino Power Jack) от DfRobot:
http://www.dfrobot.com/index.php?route=product/product&product_id=489

Их фишка в том, что в них встроена защита, позволяющая их заряжать от любого источника напряжения в 9В. Когда аккумулятор зарядится, он разрывает цепь и аккумулятор не перезарядится  и не взорвется. Зная ток зарядки, можно с хорошей точностью оценить время на зарядки.

Чтобы засунуть аккумуляторы в робота, вам придется почти полностью разобрать корпус тележки. Моторы остаются. Три аккумулятора ставятся параллельно друг другу, провода смотрят в одну сторону, аккумуляторы очень плотно сжимаются и вставляются в один край тележки ближе к тому мотору, где будет выход на зарядное устройство. Четвёртый аккумулятор вставляется наискосок как на картинке:

Разобранная тележка Собранная тележка с четырьмя аккумуляторами

После этого вставляется другая часть тележки с другой стороны аккумуляторов. Аккумуляторы также надо будет сжать. После этого все разъемы аккумуляторов откусываются и аккумуляторы соединяются параллельно. Итого получили 8800 mAh. На этой емкости робот может проездить очень-очень долго. Просто так вы его не посадите :)

 

Робот телеприсутствия в Новосибирске

На данный момент собрано два робота присутствия. Один сейчас на службе в Новосибирске, её зовут Робот-Катюша. Это самая первая версия, у неё на борту 8800 мАч аккумы, трехэтажное тело из шилдов на ардуино c bluetooth для общения с головой на Android (HTC Sensation), пружинный хвост. Вот она радость как выглядит:

Робот телеприсутствия Новосибирск Три этажа шилдов из Arduino

Она мило виляет хвостиком и забавно улыбается:

Поскольку я в Новосибирск вернусь только летом, решил собрать нового робота телеприсутствия с нуля на базе Romeo-All in one Controller. О нем и будут дальнейшие посты. А к этому роботу мы вернемся летом :)