• 11 – 读取传感器:加速度计、陀螺仪

    平衡直立车要想保证直立,得知当前角度和角速度尤为重要;
    加速度计常用两种:数字加速度计和模拟加速度计;
    数字加速度计一般通过I2C来传送数据,模拟加速度计直接给出电压读数;
    模拟加速度计使用较为简单,而且读取速度和精度基本能满足平衡直立车的需求;
    数字加速度计可以进行丰富的配置,获得更加理想的数据而不耗费单片机过多资源。
    陀螺仪用来测量角速度。这里用的是模拟陀螺仪,直接用ADC读数。

    计算角度的方法

    牛顿老人家说过: F = ma; 加速度计能测量加速度a,从而可以得知测量方向上所受的重力分量;
    accelerometer
    测出小车前后水平放置时,加速度计的读数,可以得到±G的读数。小车行走时,加速度计的读数除以G的读数,就能得到角度值了。
    具体请参考互补滤波算法:https://feichashao.com/balance_filter/
    (更多…)

  • 10 – 中断:中断优先级

    前面讲到了各种中断。
    PIT中断用于控制小车的直立速度角度;
    EXTI中断用于处理摄像头的行场中断;
    UART中断用于串口通信;

    直立控制必须1ms进行一次计算,所以PIT中断一次都不能少;
    摄像头的行场中断缺一不可,而且行场中断来了必须马上处理,处理过程不能暂停,否则图像会采集出错;
    UART不要求马上反应,但需要处理每个请求;

    那么问题来了,一个中断正在处理的时候,另一个中断来了,怎么办?
    中断优先级的设置,可以让每个中断都得到处理,且能按照优先级进行中断嵌套。(优先级低的中断正在处理的时候,来了优先级高的中断,会先暂停优先级低的中断,执行完优先级高的中断后再继续进行处理。)

    好消息是,在K60和XS128中设置中断优先级都不难。
    (更多…)

  • RHEL6: squid代理服务器的安装与简单配置

    参考文档

    1.鸟哥的Linux私房菜 http://linux.vbird.org/linux_server/0420squid.php
    2.Squid文档 http://www.squid-cache.org/Versions/v3/3.1/cfgman/
    3.https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/chap-Managing_Confined_Services-Squid_Caching_Proxy.html

    实验内容与实验环境

    1. 物理机和虚拟机的操作系统为 RHEL6.5;物理机IP地址为192.168.122.1,虚拟机IP地址为192.168.122.108
    2. 虚拟机作为squid server,物理机作为client;
    3. 实验配置虚拟机为标准代理,让物理机可以通过代理浏览网页;
    4. 配置squid,使得baidu不能被访问;
    5. 将虚拟机配置成透明代理;

    配置物理机

    配置/etc/sysctl.conf,修改ipforward为1,启用物理机的路由功能。

    # Controls IP packet forwarding
    net.ipv4.ip_forward = 1
    

    更新kernel参数

    [root@feichashao ~]# sysctl -p
    

    确认虚拟机能连上外网。

    ping -c3 www.baidu.com
    

    (更多…)

  • 9 – 中断:PIT定时中断

    PIT是个非常准的定时中断(相比delay函数来说),说好的1ms触发一次中断就是1ms触发一次。
    PIT是平衡直立车的灵魂,因为角度计算,速度计算,和方向控制都高度依赖于积分,而积分的“单位时间”5ms靠的就是PIT中断。

    PIT中断的配置也很简单。设置好中断时间间隔(这里是1ms),写好中断处理函数,就可以啦。
    要注意的是,中断处理函数要尽可能简单,把复杂的工作留给主循环。

    K60

    这里用野火的底层库,详情请参考《三天入门 Cortex-M4——Kinetis 系列》PIT 定时中断模块。

    初始化

    函数原型
    [cc lang=”C”]
    void pit_init(PITn,u32 cnt);
    [/cc]
    调用示例
    [cc lang=”C”]
    pit_init(PIT0,100000); //初始化 PIT0,定时 100000 个时钟周期
    [/cc]

    中断处理

    中断重定向
    [cc lang=”C”]
    #undef VECTOR_084
    #define VECTOR_084 PIT0_IRQHandler //重新定义 84 号中断为 PIT0_IRQHandler 中断
    extern void PIT0_IRQHandler(); //PIT0 定时中断服务函数
    [/cc]
    中断处理函数
    [cc lang=”C”]
    void PIT0_IRQHandler(void)
    {
    PIT_Flag_Clear(PIT0); //清中断标志位
    // Do sth.
    }
    [/cc]

    (更多…)

  • RHEL6: Apache httpd安装与配置(SSL, Userdir, Auth, VirtualHost)

    Apache httpd是应用最广的http服务器,它的基本安装配置也很简单。

    –参考文档–

    1. httpd配置文档 http://httpd.apache.org/docs/2.2/configuring.html
    2. 文档路径 http://httpd.apache.org/docs/2.2/urlmapping.html
    3. 认证授权 http://httpd.apache.org/docs/2.2/howto/auth.html
    4. 虚拟主机 http://httpd.apache.org/docs/2.2/vhosts/
    5. 访问控制 http://httpd.apache.org/docs/2.2/howto/access.html
    6. 鸟哥私房菜 http://linux.vbird.org/linux_server/0360apache.php

    –实验环境–

    在虚拟机上搭建服务器,用物理机来访问;
    1. 虚拟机和物理机均使用RHEL 6.5;
    2. 虚拟机安装Apache HTTPD 2.2;
    3. 虚拟机IP 192.168.122.108;
    4. 物理机IP 192.168.122.1;

    –安装–

    RHEL6.5的镜像自带了Apache httpd,推荐使用它。

    yum安装

    [cc lang=”text”]
    [root@server1 ~]# yum install httpd -y
    [/cc]
    完事了。

    设置iptables和SELinux

    [cc lang=”text”]# vim /etc/sysconfig/iptables
    -A INPUT -p TCP –dport 80 -j ACCEPT # 在Reject的条目前加上这一行

    # /etc/init.d/iptables restart
    [/cc]
    [cc lang=”text”]
    # setsebool -P httpd_can_network_connect=1
    [/cc]
    如果httpd的资料目录不是/var/www/html,那么需要修改该目录的selinux context.
    [cc lang=”text”]
    chcon -reference /var/www/html /httpd
    [/cc]

    测试

    无需修改配置,直接启动httpd,即可访问。
    [cc lang=”text”]
    [root@server1 ~]# /etc/init.d/httpd restart
    [/cc]
    在物理机上,在浏览器上输入虚拟机的IP地址192.168.122.108,即可看到测试页面。

    要更改网页的内容,直接修改DocumentRoot目录下(/var/www/html)的内容即可。
    在/var/www/html/下建立一个index.html文件.
    [cc lang=”text”]
    # vim /var/www/html/index.html
    Hello World.
    [/cc]
    保存。
    在物理机的浏览器上刷新一下页面,就能看到Hello World!字样啦。
    (更多…)

  • 8 – 中断:EXTI外部中断

    EXTI外部中断可用来应付那些“出现时机不确定”的事件。比如说,按键,摄像头的行场中断,测速编码器的输入等。
    例如,设定A1引脚上升沿能触发EXIT中断,A1连接一个按钮,按钮按下那瞬间,A1产生上升沿,触发中断,进行按钮事件的处理。

    K60

    同样,K60使用野火的底层库,参考《三天入门 Cortex-M4》EXTI 外部 GPIO 中断例程。

    初始化

    函数原型
    [cc lang=”C”]
    void exti_init(PORTx, u8 n,exti_cfg);
    [/cc]
    调用例子
    [cc lang=”C”]
    void
    exti_init(PORTA,17,rising_down);//下拉,上升沿触发中断
    [/cc]
    (更多…)

  • 7 – 输入/输出:UART(串口)

    UART是单片机与计算机通信的重要工具,可以外接蓝牙模块进行通信,也可以通过有线连接usb进行通信。
    通过有线usb连接计算机时,单片机上只需连接TX,RX,GND,一般不需要连接VCC。
    单片机的底层库一般都自带了UART通信模块,激活对应管脚,设定好波特率即可在程序中调用。
    波特率决定数据的传输速率,波特率越高传输越快。一般为了稳定,传简单的数据用9600就够;传图像的话,最好用115200或以上,节省时间。

    K60

    K60用的是野火的底层库,可以参考它的手册;

    输出

    输出的话,定义好输出端口和波特率就能用。
    [cc lang=”C”]
    uart_init (UART1,19200); //初始化 串口 1 波特率为 19200
    uart_putchar (UART1,’F’); //发送一个字符’F’
    uart_sendStr (UART1,”uart_str 函数发送数据”); //发送字符串
    [/cc]

    开启Uart输入中断

    [cc lang=”C”]
    // isr.h
    // 串口输入中断服务
    #undef VECTOR_061
    #define VECTOR_061 UART0_IRQHandler
    extern void UART0_IRQHandler(void);
    [/cc]
    [cc lang=”C”]
    // main.c
    // main() 函数内
    //打开串口中断
    UART_IRQ_EN(UART0);
    [/cc]
    (更多…)

  • Bash Shell Cheatsheet

    本文记下常用的bash shell语法和命令,方便日后参考。

    参考文档

    Bash Guide for Beginners
    http://www.tldp.org/LDP/Bash-Beginners-Guide/html/

    注释 Comment

    1. bash脚本要以

    #!/bin/bash 
    

    开头。
    2. ‘#’号后面的都是注释,如

    # An example for bash comment.
    echo "hehe"    # Print hehe to screen.
    

    (更多…)

  • 马尼拉中转计划

    既然要回家,就找个地方中转一下吧。
    我是个不诚实的孩子,这次的马尼拉中转计划出发前只告诉了舍友,母亲大人不知道。

    交通

    北京 -> 马尼拉, 宿雾航空,4.5小时,含税535元;
    马尼拉 -> 澳门, 亚洲航空,2小时,机票115元+机场税75元+餐食23元=213元;
    总计748元。

    北京->马尼拉

    宿雾在首都机场T2。
    过安检,不让我进,之后我意识到,我走到国内出发那儿了….
    拿着网上打印的登机牌到国际出发,出入境又表示,自己打印的不能用,要去柜台重新印一遍。幸好宿雾那柜台就寥寥几个人排着队。
    Broading Pass

    每次都能遇见212登机口。
    Gate 212

    宿雾航空是屌丝界的佼佼者,航空界的硬座。
    可能受我国外交部旅行警示的影响,上座率大概只有50%。
    在爬升的过程中,有不少乘客各种走动和挪行李,真揪心啊。他们这么拼只为占一排空座躺着睡!

    睡梦中,抵达了马尼拉。
    Manila Airport
    (更多…)

  • RHEL6: 网卡bonding

    通过bonding,可以将两块或多块网卡当作一块网卡使用,可用于提高性能或是冗余。

    参考文档

    1. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s2-networkscripts-interfaces-chan.html
    2.

    # yum install kernel-doc
    # vim /usr/share/doc/kernel-doc-2.6.32/Documentation/networking/bonding.txt
    

    (更多…)