12 - 读取传感器:编码器

对于四轮车,只要电机的输出保持恒定,速度基本是恒定的。
但平衡直立车要控制直立,就算是原地不动,电机的输出每时每刻都在发生变化。
所以,要进行速度控制,获得当前小车的实际速度相当重要。


编码器有好多种,主要区别是单向双向,200线500线等不同精度,AB相输出,AZ相输出等区别。
其实对于平衡直立车,左右轮各一个200线的单向编码器就足够了。(大概100元一个)

200线的单向编码器,有一个A相输出,简单地说,就是轮子转一圈,就输出200个脉冲,也就是每转1/200圈,编码器就输出一个脉冲。
通过统计单位时间的脉冲,即可得到小车当前的行走速度。

K60有两个脉冲计数模块,够用。
XS128只有一个脉冲计数模块,需要在电路上另加一个加计数器(74LS系列即可)进行计数。

继续阅读“12 - 读取传感器:编码器”

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

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

计算角度的方法

牛顿老人家说过: F = ma; 加速度计能测量加速度a,从而可以得知测量方向上所受的重力分量;
accelerometer
测出小车前后水平放置时,加速度计的读数,可以得到±G的读数。小车行走时,加速度计的读数除以G的读数,就能得到角度值了。
具体请参考互补滤波算法:https://feichashao.com/balance_filter/
继续阅读“11 - 读取传感器:加速度计、陀螺仪”

10 - 中断:中断优先级

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

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

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

好消息是,在K60和XS128中设置中断优先级都不难。
继续阅读“10 - 中断:中断优先级”

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

继续阅读“RHEL6: squid代理服务器的安装与简单配置”

9 - 中断:PIT定时中断

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

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

K60

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

初始化

函数原型

void pit_init(PITn,u32 cnt);

调用示例

pit_init(PIT0,100000); //初始化 PIT0,定时 100000 个时钟周期

中断处理

中断重定向

#undef VECTOR_084
#define VECTOR_084 PIT0_IRQHandler  //重新定义 84 号中断为 PIT0_IRQHandler 中断
extern void PIT0_IRQHandler();     //PIT0 定时中断服务函数

中断处理函数

void PIT0_IRQHandler(void)
{
  PIT_Flag_Clear(PIT0);                 //清中断标志位
  // Do sth.
}

继续阅读“9 - 中断:PIT定时中断”

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安装

[root@server1 ~]# yum install httpd -y

完事了。

设置iptables和SELinux

# vim /etc/sysconfig/iptables
-A INPUT -p TCP --dport 80 -j ACCEPT  # 在Reject的条目前加上这一行

# /etc/init.d/iptables restart
# setsebool -P httpd_can_network_connect=1

如果httpd的资料目录不是/var/www/html,那么需要修改该目录的selinux context.

chcon -reference  /var/www/html  /httpd

测试

无需修改配置,直接启动httpd,即可访问。

[root@server1 ~]# /etc/init.d/httpd restart

在物理机上,在浏览器上输入虚拟机的IP地址192.168.122.108,即可看到测试页面。

要更改网页的内容,直接修改DocumentRoot目录下(/var/www/html)的内容即可。
在/var/www/html/下建立一个index.html文件.

# vim /var/www/html/index.html
Hello World.

保存。
在物理机的浏览器上刷新一下页面,就能看到Hello World!字样啦。
继续阅读“RHEL6: Apache httpd安装与配置(SSL, Userdir, Auth, VirtualHost)”

8 - 中断:EXTI外部中断

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

K60

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

初始化

函数原型

void exti_init(PORTx, u8 n,exti_cfg);

调用例子

void
exti_init(PORTA,17,rising_down);//下拉,上升沿触发中断

继续阅读“8 - 中断:EXTI外部中断”