5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: mapgps
打印 上一主题 下一主题

将AR.Drone四轴DIY进行到底!

[复制链接]
141
发表于 2010-10-21 23:08 | 只看该作者
楼上这款实在感觉不错~再找找看看

欢迎继续阅读楼主其他信息

142
 楼主| 发表于 2010-10-22 00:27 | 只看该作者
另外一个3G方案是用WiFi/3G无线路由器, 比如: E5830

把E5830搁到AR.Drone上, 就成了一个机载WiFi AP了.
这样AR.Drone WiFi连到E5830 WiFi AP(参见本贴2楼), 再路由到3G网.

本方案优点:
1) 无需连接线,  简单进行软件配置后就能用
2) 着急想让AR.Drone 上3G的, 马上就可自行开玩, 不必等USB方案(要DIY的路还很长)

缺点:
1) 价格贵 (550元左右)
2) 重90克 (不过对AR.Drone来说, 该负重没问题)
143
发表于 2010-10-22 01:04 | 只看该作者
为什么在dos窗口下能ping得通drone,ip是192.168.1.1
没开路由器,直接用手提连接
但用telnet却提示连接不上,23开端口不能打开???
用超级终端也不行

[ 本帖最后由 xo 于 2010-10-22 01:05 编辑 ]
144
 楼主| 发表于 2010-10-22 08:44 | 只看该作者
原帖由 xo 于 2010-10-22 01:04 发表
为什么在dos窗口下能ping得通drone,ip是192.168.1.1
没开路由器,直接用手提连接
但用telnet却提示连接不上,23开端口不能打开???
用超级终端也不行

你的升级到1.3.3了?
1.3.3作了些安全设置: 在iptables规则中绑定了iPhone的MAC地址. 只有该MAC地址的机子可以Telnet到AR.Drone.
你需要捅一下AR.Drone腹部的那个Unpair钮. 之后就可以与其它任何机子连了.
145
发表于 2010-10-22 09:58 | 只看该作者
还要爆菊?
146
发表于 2010-10-22 11:05 | 只看该作者
对啦~刚在阿莫那和人聊想起来的~可以带小的投影仪上天!这个是不是够有意思?
就是电池的问题~
147
发表于 2010-10-22 12:02 | 只看该作者
原帖由 mapgps 于 2010-10-22 00:27 发表
另外一个3G方案是用WiFi/3G无线路由器, 比如: E5830

把E5830搁到AR.Drone上, 就成了一个机载WiFi AP了.
这样AR.Drone WiFi连到E5830 WiFi AP(参见本贴2楼), 再路由到3G网.

本方案优点:
1) 无需连接线,  简单 ...


这个方案确实是一个短期内解决的办法,同时对数据延迟这块有点担心,比如机子看到的画面和它传回来的画面如果因为距离的增加产生延迟(打比方延迟0.5秒),这时对操控就很不利了。
148
发表于 2010-10-22 12:36 | 只看该作者
我的意思是希望ioctl后面的代码开源,不是控制接口开源,那样没有多大意思,希望飞控板开源,算法开源啊
原帖由 mapgps 于 2010-10-18 20:25 发表

AR.Drone端是开源的Linux, 驱动程序也是开源的:
https://projects.ardrone.org/wiki/ardrone-api/Gpl
通过看源程序, 就可知如何编程控制设备.
比如, 对/dev/ttyPA1进行ioctl(), 就可直接控制4个电机.
从/dev/v ...
149
 楼主| 发表于 2010-10-22 13:34 | 只看该作者
原帖由 samurai2 于 2010-10-22 12:36 发表
我的意思是希望ioctl后面的代码开源,不是控制接口开源,那样没有多大意思,希望飞控板开源,算法开源啊

来一段 ioctl 里面的实现代码:

  1. struct file_operations pwm_fops = {
  2.     .ioctl =     pwm_ioctl,
  3.     .open =      pwm_open,
  4.     .release =   pwm_release,
  5. };
  6. ...
  7. static int pwm_ioctl(struct inode *inode, struct file *filp,
  8.         unsigned int cmd, unsigned long arg)
  9. {
  10.     struct pwm_info *info = filp->private_data;
  11.     struct pwm_device *dev = info->dev;
  12.     struct pwm_ops *ops = dev->pwm_ops;
  13.     int ret = 0;
  14.     if (!ops)
  15.         return -EINVAL;
  16.     if (mutex_lock_interruptible(&dev->lock))
  17.         return -ERESTARTSYS;

  18.     switch (cmd) {
  19.         case PWM_REQUEST:
  20.         case PWM_RELEASE:
  21.             {
  22.                 unsigned int pwm;
  23.                 if (get_user(pwm, (int __user *) arg)) {
  24.                     ret = -EFAULT;
  25.                 }
  26.                 if (cmd == PWM_REQUEST)
  27.                     ret = ioctl_pwm_request(info, pwm);
  28.                 else
  29.                     ret = ioctl_pwm_release(info, pwm);
  30.                 break;
  31.             }
  32.         case PWM_START:
  33.             ret = ioctl_pwm_start(info);
  34.             break;
  35.         case PWM_STOP:
  36.             ret = ioctl_pwm_stop(info);
  37.             break;
  38.         case PWM_SET_FREQ:
  39.             {
  40.                 unsigned int pwm_freq;
  41.                 if (get_user(pwm_freq, (int __user *) arg)) {
  42.                     ret = -EFAULT;
  43.                     break;
  44.                 }
  45.                 ret = ioctl_pwm_set_freq(info, pwm_freq);
  46.                 break;
  47.             }
  48.         case PWM_SET_WIDTH:
  49.             {
  50.                 unsigned int pwm_width;
  51.                 if (get_user(pwm_width, (int __user *) arg)) {
  52.                     ret = -EFAULT;
  53.                     break;
  54.                 }
  55.                 ret = ioctl_pwm_set_width(info, pwm_width);
  56.                 break;
  57.             }
  58.         case PWM_GET_FREQ:
  59.             {
  60.                 unsigned int pwm_freq;
  61.                 ret = ioctl_pwm_get_freq(info, &pwm_freq);
  62.                 if (put_user(pwm_freq, (int __user *) arg)) {
  63.                     ret = -EFAULT;
  64.                 }
  65.                 break;
  66.             }
  67.         case PWM_GET_WIDTH:
  68.             {
  69.                 unsigned int pwm_width;
  70.                 ret = ioctl_pwm_get_width(info, &pwm_width);
  71.                 if (put_user(pwm_width, (int __user *) arg)) {
  72.                     ret = -EFAULT;
  73.                 }
  74.                 break;
  75.             }
  76.         case PWM_MAX:
  77.             {
  78.                 if (put_user(ops->pwm_max, (int __user *) arg))
  79.                     ret = -EFAULT;
  80.                 break;
  81.             }
  82.         default:
  83.             ret = -ENOTTY;
  84.     }
  85.     mutex_unlock(&dev->lock);
  86.     return ret;
  87. }
  88. ...
  89. static int ioctl_pwm_start(struct pwm_info *info)
  90. {
  91.     struct pwm_device *dev = info->dev;
  92.     struct pwm_ops *ops = dev->pwm_ops;
  93.     int err;
  94.     if (info->id_used == PWM_ID_NONE) {
  95.         err = -EINVAL;
  96.         goto exit;
  97.     }
  98.     err = ops->pwm_start(info->id_used);
  99. exit:
  100.     return err;
  101. }
  102. ...
  103. struct pwm_ops s3c2412_pwm_ops = {
  104.     .pwm_max = PWM_TIMER_MAX,
  105.     .pwm_start = s3c2412pwm_start,
  106.     .pwm_stop = s3c2412pwm_stop,
  107.     .pwm_request = s3c2412pwm_request,
  108.     .pwm_release = s3c2412pwm_release,
  109.     .pwm_set_width = s3c2412pwm_set_width,
  110.     .pwm_set_freq = s3c2412pwm_set_freq,
  111.     .pwm_get_width = s3c2412pwm_get_width,
  112.     .pwm_get_freq = s3c2412pwm_get_freq,
  113.     .owner = THIS_MODULE,
  114. };
  115. ...
  116. static int s3c2412pwm_start(unsigned int timer)
  117. {
  118.     unsigned long tcon;
  119.     unsigned long flags;
  120.     /* invert do we want to invert TOUT output
  121.      * auto_reload
  122.      * tout do we want to activate TOUT gpio
  123.      */
  124.     const int invert = 0, auto_reload = 1, tout = 1;
  125.     if (timer > PWM_TIMER_MAX)
  126.         return -EINVAL;
  127.     /* if the TOUT is already active there will be some discontinuity :
  128.      * the manual update will reset the engine, and make
  129.      * TOUT = !invert
  130.      *
  131.      * We can do nothing and assume we don't care of the signal before the
  132.      * start.
  133.      */
  134.     local_irq_save(flags);
  135.     tcon = __raw_readl(S3C2410_TCON);
  136.     /* 2 configure timer */
  137.     tcon &= ~((S3C2410_TCON_T0START|S3C2410_TCON_T0INVERT|S3C2410_TCON_T0RELOAD)<<S3C2410_TCON_OFFSET(timer));
  138.     if (invert)
  139.         tcon |= S3C2410_TCON_T0INVERT<<S3C2410_TCON_OFFSET(timer);
  140.     if (auto_reload)
  141.         tcon |= S3C2410_TCON_T0RELOAD<<S3C2410_TCON_OFFSET(timer);
  142.     tcon |= S3C2410_TCON_T0MANUALUPD<<S3C2410_TCON_OFFSET(timer);
  143.     dprintk("tcon init : %08lx\n", tcon);
  144.     __raw_writel(tcon, S3C2410_TCON);
  145.     /* 3 start the timer */
  146.     tcon &= ~(S3C2410_TCON_T0MANUALUPD<<S3C2410_TCON_OFFSET(timer));
  147.     tcon |= S3C2410_TCON_T0START<<S3C2410_TCON_OFFSET(timer);
  148.     dprintk("tcon start : %08lx\n", tcon);
  149.     __raw_writel(tcon, S3C2410_TCON);
  150.     local_irq_restore(flags);
  151.     if (tout)
  152.         s3c2410_gpio_cfgpin(S3C2410_GPB0+timer, S3C2410_GPIO_SFN2);
  153.     return 0;
  154. }
复制代码
150
 楼主| 发表于 2010-10-22 13:44 | 只看该作者
void __raw_writel(u32 value,  volatile void __iomem *addr)
在Linux内核里的实现就是往内存地址里写值:
*(unsigned long *)addr = value;
151
 楼主| 发表于 2010-10-22 13:46 | 只看该作者
往某个内存地址里写值, 就控制了AR.Drone的电机! 哈哈!
152
发表于 2010-10-22 18:19 | 只看该作者
好多不认识的~郁闷
153
发表于 2010-10-24 17:46 | 只看该作者
这个必须顶!!!
154
发表于 2010-10-24 20:57 | 只看该作者
今天备了4块电池到天河公园玩,对这个机子有了新的认识。
1,想单独用fpv来操控,根本不可能,超过10米后,传回来的只是画面不是运动影像,帧数很低。这个摄像头只适合室内实景扩增游戏。
2,机子质量是很好的,连续飞1个半小时(最多停下来换电池,不超过3分钟),还有撞了很多次树,都没问题。电机散热很快,设计很好。
3,当底部环境很乱的时候,机子平衡识别就不是很好,有时上升有时漂移。
4,室内壳确实很酷,户外飞行还是愿意带着。
155
 楼主| 发表于 2010-10-24 21:58 | 只看该作者
AR.Drone的USB模块用的是SMSC的USB3317.
左边那排引脚中上边第一个引脚就是ID脚.
回头探测一下其是否和USB插座上那个8号空脚相通.
将ID脚接地就可将USB OTG置为Host模式, 从而支持USB外设.



USB3317的DataSheet:
http://soft.laogu.com/datasheet/106/USB3317_SMSC_332137.pdf
156
发表于 2010-10-24 22:19 | 只看该作者
我的ARdrone修好了 换了一个电机和电调,我的坏法真是偏门
157
 楼主| 发表于 2010-10-24 22:28 | 只看该作者
看来还要好好研究一下AR.Drone的电机和电调.
搞出山寨的.
要不坏了会很麻烦的.
158
发表于 2010-10-24 22:49 | 只看该作者
原帖由 fmatrix 于 2010-10-24 20:57 发表
今天备了4块电池到天河公园玩,对这个机子有了新的认识。
1,想单独用fpv来操控,根本不可能,超过10米后,传回来的只是画面不是运动影像,帧数很低。这个摄像头只适合室内实景扩增游戏。
2,机子质量是很好的,连续飞1个半小时(最多停下来换电池,不超过3分钟),还有撞了很多次树,都没问题。电机散热很快,设计很好。


用原装电池飞10分钟,电机就很热,有点烫手,不敢再飞
你的电机不热?
4块是什么样的电池?
159
发表于 2010-10-24 23:04 | 只看该作者
原帖由 xo 于 2010-10-24 22:49 发表


用原装电池飞10分钟,电机就很热,有点烫手,不敢再飞
你的电机不热?
4块是什么样的电池?


电机很热,同时做好了坏掉的准备,算是极限测试吧。估计这么个飞法,电机会很快退磁,不过也说不定哪天摔一下就坏了,所以也不想怎么去保护,想怎么用就怎么用吧,尽管折腾。1块原装电,3块1800毫安时(11.1v,10c)。
160
发表于 2010-10-25 15:49 | 只看该作者
原帖由 fmatrix 于 2010-10-24 23:04 发表


电机很热,同时做好了坏掉的准备,算是极限测试吧。估计这么个飞法,电机会很快退磁,不过也说不定哪天摔一下就坏了,所以也不想怎么去保护,想怎么用就怎么用吧,尽管折腾。1块原装电,3块1800毫安时(11.1v,10 ...


我想上2200mA 20C 的但不知道AR的载重极限是多少,你1800mA的多重?重量加重后你的AR还飞的稳定吗?我估计PID参数要重设了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

快速回复 返回顶部 返回列表