Hacking the Wowwee Rovio

来自Jack's Lab
跳转到: 导航, 搜索

目录

1 Undocumented Rovio API

1.1 debug.cgi

detailed information is located in 'Host/LibCamera/Src/LibIPCamera.c'

  http://YOUR_ROVIO_IP/debug.cgi?action=DEBUG_CMD[&param1=value[&param2=value[...]]]

DEBUG_CMD:

  • net
  • print
  • pppip
  • dppp
  • ppp
  • rtsp
  • channel
  • upnp
  • malloc
  • checkip
  • ddns
  • line
  • uart (MCU debug)
  • mcu
  • break
  • ps (wlan ps mode)
  • cfg (set wlan sleep cfg 5)
  • gpiob19 (set gpiob for mcu)
  • mall (return mall info, including arena, ordblks, smblks, hblks, hblkhd, usmblks, fsmblks ... maxfree)
  • write_mp4 [bitrate]
  • read_flash [address, size]
  • read_mem [address, size]
  • write_mem [address, size, value]
  • write_register [address, value, size]
  • set_oe [out, dir, size]
  • set_dat [out, dat, size]
  • get_oe [address, value, size]
  • read_i2c [address]
  • write_i2c [address, value]



1.2 mcu

此为控制 mcu 的 cgi 接口

这个 mcu 是指驱动板上的牛屎块 MCU,其用于负责三个轮子的方向和里程计数、head 的高中低角度、head 上的 LED 灯控制、IR radar 电源和状态、电池电量检测、电源控制(电量低则切断电源),可见 Rovio 的核心控制都在这

主控 SoC 通过串口 /dev/ser1 和其通讯,其相关代码位于 Host/LibCamera/Src/MCU.c

GPIOB19 作为外部中断,用于唤醒 MCU。欲唤醒时,软件模拟一个中断脉冲即可:

void mcuWakeup()
{
    /* Set GPIO for MCU */
    mcuLock();
    outpw(REG_GPIOB_OE,inpw(REG_GPIOB_OE) & ~MCU_GPIO);  	//GPIOB19 output;
    outpw(REG_GPIOB_DAT,inpw(REG_GPIOB_DAT) & ~MCU_GPIO);	//GPIOB19 low
    tt_msleep(100);
    outpw(REG_GPIOB_DAT,inpw(REG_GPIOB_DAT) | MCU_GPIO);	//GPIOB19 high
    tt_msleep(100);
    mcuUnlock();
}


命令语法:

http://YOUR_ROVIO_IP/mcu?parameters=CMD_ID

CMD_ID 是一串 16 进制数字,只能有 36 个,否则会报 'responses = error_length'

貌似 CMD_ID 的 28 个前缀始终为:114d 4d00 0100 5348 5254 0001 0001


1.2.1 Get Battery state

http://YOUR_ROVIO_IP/mcu?parameters=114d4d0001FF53485254000100010b000000

上述命令结果返回 responses = 0E0100000000000000000003CB744A

最后的 74 和 4A 分别为电池的电量(<100 turn itself off; 100 ~ 106 try to go back home; 106 ~ 127 normal)和充电状态(0~79 not charging; 80 charging)


1.2.2 Rovio 顶灯控制

以下命令仅适用于 Rovio 离开充电底座的情形

http://YOUR_ROVIO_IP/mcu?parameters=114D4D00010053485254000100011A000000    # turn off all lights
http://YOUR_ROVIO_IP/mcu?parameters=114D4D00010053485254000100011AFF0000    # turn on all lights

命令字 114D4D00010053485254000100011AXY0000 中的 XY 是个 16 进制值,其与各 LED 的对应关系为:

 LED6 LED5 | LED4 LED3 LED2 LED1


LED 编号如下所示:

Rovio-led.jpg


则 3F 就可将所有 LED 打开;0F 则 打开 LED4 ~ LED1;12 则打开 LED5 和 LED2

#!/bin/sh

# LED1 0x01
# LED2 0x02
# LED3 0x04
# LED4 0x08
# LED5 0x10
# LED6 0x20

for ((c=1; c<5; c++))
do
curl -u username:password -d "parameters=114D4D00010053485254000100011A000000" http://192.168.1.254/mcu
curl -u username:password -d "parameters=114D4D00010053485254000100011AFF0000" http://192.168.1.254/mcu
done


for ((c=1; c<5; c++))
do
curl -u username:password -d "parameters=114D4D00010053485254000100011A010000" http://192.168.1.254/mcu
curl -u username:password -d "parameters=114D4D00010053485254000100011A020000" http://192.168.1.254/mcu
curl -u username:password -d "parameters=114D4D00010053485254000100011A040000" http://192.168.1.254/mcu
curl -u username:password -d "parameters=114D4D00010053485254000100011A080000" http://192.168.1.254/mcu
curl -u username:password -d "parameters=114D4D00010053485254000100011A100000" http://192.168.1.254/mcu
curl -u username:password -d "parameters=114D4D00010053485254000100011A200000" http://192.168.1.254/mcu
done

for ((c=1; c<5; c++))
do
curl -u username:password -d "parameters=114D4D00010053485254000100011A000000" http://192.168.1.254/mcu
curl -u username:password -d "parameters=114D4D00010053485254000100011AFF0000" http://192.168.1.254/mcu
done

sleep 1;
curl -u username:password -d "parameters=114D4D00010053485254000100011A3F0000" http://192.168.1.254/mcu

1.3 Rovio 车轮精确控制

虽然 API 提供有 Motion Control,但无法精确控制,这个还得直接来操作 MCU

libNS.a 分析得知:

send_wheel_speed_cmd 用的命令字是:

1b xx xx xx


后面的三个字段分别代表 右轮、左轮、后轮

00 ~ 7F 为正转;80 ~ FF 为反转。如:1b818100 为后退,1b010100 为前进


send_wheel_pwm_cmd,用的命令字是:

17 xx xx xx

后面的三个字段分别代表 右轮、左轮、后轮

xx 取值 09 ~ 28 轮子才有明显的前进移动。后退移动则 xx 取值应在 88 ~ a8



2 Key Control Rovio API

2.1 Movement Control

语法:

http://YOUR_ROVIO_IP/rev.cgi?Cmd=nav&action=value&drive=d_value&speed=s_value
value = 18

d_value = 0 (Stop)
  1 (Forward)
  2 (Backward)
  3 (Straight left)
  4 (Straight right)
  5 (Rotate left by speed)
  6 (Rotate right by speed)
  7 (Diagonal forward left)
  8 (Diagonal forward right)
  9 (Diagonal backward left)
  10 (Diagonal backward right)
  11 (Head up)
  12 (Head down)
  13 (Head middle)
  14 (Reserved)
  15 (Reserved)
  16 (Reserved)
  17 (Rotate left by 20 degree angle increments)
  18 (Rotate right by 20 degree angle increments)

s_value = 1 (fastest) – 10 (slowest)


简单的,如下的命令实现持续前进:

  for ((i=0; i<18; i++));
    do curl -u username:password -d "Cmd=nav&action=18&drive=1&speed=1" http://YOUR_ROVIO_IP/rev.cgi;
  done


2.1.1 摄像头抬头控制

一般的,摄像头抬头有三个位置:低、中、高

其对应的命令为:

 /rev.cgi?Cmd=nav&action=18&drive=12
 /rev.cgi?Cmd=nav&action=18&drive=13
 /rev.cgi?Cmd=nav&action=18&drive=11


更精确地,通过连续执行:

  http://YOUR_ROVIO_IP/rev.cgi?Cmd=nav&action=18&drive=11&speed=1
  http://YOUR_ROVIO_IP/rev.cgi?Cmd=nav&action=18&drive=0&speed=1

可将摄像头抬高的过程改为 4 个点,视角要比原高、中、低三个点的要好,可用如下命令行实现之:

curl -u username:password -d "Cmd=nav&action=18&drive=11&speed=1" http://YOUR_ROVIO_IP/rev.cgi &&        \
curl -u username:password -d "Cmd=nav&action=18&drive=0&speed=1" http://YOUR_ROVIO_IP/rev.cgi 

2.1.2 Rovio 回家

curl -u username:password -d "Cmd=nav&action=13" http://YOUR_ROVIO_IP/rev.cgi


2.2 获取当前图像

改变图像分辨率

 /ChangeResolution.cgi?ResType=value

value 取 0 (176x144), 1 (352x288), 2 (320x240), 3 (640x480)

curl -u username:password -d "ResType=3" http://YOUR_ROVIO_IP/ChangeResolution.cgi


改变图像压缩质量

 /ChangeCompressRatio.cgi?Ratio=value

value 取 0(低质量), 1(中等质量), 2(高质量)


如下直接获取实时高质量图像:

 /Jpeg/CamImg.jpg
curl -u username:password -d "ResType=3" http://YOUR_ROVIO_IP/ChangeResolution.cgi
curl -u username:password -d "Ratio=2" http://YOUR_ROVIO_IP/ChangeCompressRatio.cgi
curl -u username:password http://YOUR_ROVIO_IP/Jpeg/CamImg.jpg > realtime-img.jpg



























个人工具
名字空间

变换
操作
导航
工具箱