【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)
对已经具备一定Linux基础的人来说,树莓派学习起来应该非常简单自然。在他们眼中,树莓派就是一个简易版的,卡通版的Linux而已。但是对我这样一个早已习惯微软技术生态系统的人或者初学者来说,要实现一个简单程序的编写、编译到运行,还是不太容易的。
上图是我搭建的一个相对完整的树莓派开发环境,有显示(HDMI转VGA->7寸显示屏800*480),有键盘和鼠标等,当然这些不是必须的,只是对初学者来说,显的比较直观。
为了降低学习和开发难度,树莓派上提供多种编程语言选择,比如Python、Java、C/C++等linux可支持的开发语言。在图形界面下,可以在IDE环境相对简单的进行Python编程、调试、运行等。如果基于第三方支持库,还可以用Python操控GPIO等。
出于对C/C++语言的热爱,我还是选择了基于GNU C进行程序开发,下图是已经安装到智能小车上的树莓派。我们需要搭建一个没有显示、鼠标和键盘下的编程、部署、运行调试环境。
至于如何烧写树莓派的系统到SD卡上,我们这里就不再熬叙了,已有很多入门文章进行了相关的讲解和说明。本篇文章主要介绍,搭建一个便于和Windows平台交互的编程平台,借助wiringPi C/C++库,操作GPIO和串口通信。
第一步:远程登录树莓派
我们选择安装的树莓派系统镜像为Raspbian,系统默认启动后,就是支持远程SSH连接的。我们可以下载一个免费的PuTTY工具软件进行远程连接。
打开连接,输入用户名:pi 密码:raspberry(默认) 会出现如下画面。
第二步:安装简易FTP服务
为了便于把Windows系统中已经写好的C文件部署到树莓派中,我们安装一个简单的FTP服务。我们选择的是一个开源的比较轻量级的FTP服务器vsftpd,下面简单说一下安装步骤:
1、 安装vsftpd服务
sudo apt-get install vsftpd
2、 开启vsftpd服务
sudo service vsftpd start
3、 修改配置文件
sudo nano /etc/vsftpd.conf
找到并修改
anonymous_enable=NO //不允许匿名访问
local_enable=YES //允许本地用户访问
write_enable=YES //允许写
local_umask=022 //设定上传后文件权限掩码
存盘退出。
4、 重启vsftpd服务
sudo service vsftpd restart
打开windows上任意一款FTP客户端软件(我一直使用的是FlashFXP),配置相关IP、用户和密码(用户名:pi 密码:raspberry)。
连接成功后,会出现如下画面:
第三步:安装wiringPi库
WiringPi是第三方封装的一个针对树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。wiringPi使用C或者C++开发并且可以被其他语言转包应用。
详情请参见这篇文章:http://blog.csdn.net/xukai871105/article/details/17737005
有了以上三步的准备,我们就可以在Windows编写开发C语言代码,远程部署到树莓派,通过树莓派上的GCC工具进行编译,然后执行。编写代码之前,我们先了解一下树莓派的GPIO接口,如下图所示:
我们需要完成三个功能,一、GPIO控制一个LED闪烁;二、通过串口和凌霄板进行通信;三、输出PWM信号控制舵机。
下面我们将一一介绍上面三个功能的实现。
1、GPIO控制LED灯闪烁
硬件接线:我们选择一个LED发光二极管,焊接一个1K左右的电阻,把一根杜邦线剪开,分别焊接到二极管两个管脚上(其中一个焊接在电阻另外一端)。LED较长的管脚为正极,我们接在树莓派第11管脚上,也就是GPIO0上。另外一端,我们接在25管脚上(可任意接在一个标有0V的管脚上)。
我们在记事本(推荐使用EverEdit)编写相关代码,如下图所示:
把LED.C文件通过FlashFXP上传到树莓派上去。用GCC进行编译,然后执行,如下图所示:
如果硬件没有问题,那么你应该可以看到LED灯在闪烁了。
2、树莓派和凌霄开发板串口通信
2.1 关闭串口调试功能
串口还不能直接使用,因为默认是绑定调试端口的,所以我们必须先关闭该功能。
命令行中输入如下命令:
sudo nano /boot/cmdline.txt
将以下内容
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
改为
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
输入如下命令:
sudo nano /etc/inittab
将以下内容
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
改为
#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
然后重启树莓派。
2.2 硬件接线
8号管脚为TX,10号管脚为RX,是TTL电平的,我们和凌霄开发板的子板接口19和20管脚进行连接。
树莓派 8 (TX) -- 凌霄开发板19(RX)
树莓派 10 (RX) -- 凌霄开发板20(TX)
树莓派 6 (0v) -- 凌霄开发板03(GND)
2.3 .NET Micro Framework串口编程
我们要求的功能相对简单,并不要求双向通信,凌霄开发板接收到控制摄像头云台的按键信息后,直接发送给树莓派(如果通过网络远程控制小车,则可以由树莓派通过wifi socket编程获取远程的按键控制信息,然后通过串口发给凌霄开发板,由后者控制小车,后续如果有时间,可以做一个这方面的功能)。
串口定义:
static SerialPort piPort = new SerialPort("COM4", 9600);
在Main函数中,进行串口打开操作:
piPort.Open();
在按键事件中发送按键信息:
static void ps2_Click(object sender, PS2.ButtonArgs e)
{
if (e.key == PS2.Key.RRocker)
{
PS2 ps2 = (PS2)sender;
PS2.ButtonArgs button = ps2.GetButton(PS2.Key.L2);
if (button.state == 1) //按下L2按键,我们才发送摇杆的信息
{
byte[] buffer = new byte[] { 0xAA, (byte)e.x, (byte)e.y, 0x55 };
piPort.Write(buffer, 0, 4);
piPort.Flush();
}
}
}
2.4 树莓派串口编程
打开串口:
if ((fd = serialOpen ("/dev/ttyAMA0", 9600)) < 0)
{
fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
return 1;
}
接收数据:
while(1)
{
if(serialDataAvail (fd)>=4) //判断接收缓冲区的个数
{
if (read (fd, buffer, 4) == 4)
{
if(buffer[0]==0xAA && buffer[3]==0x55)
{
printf("x:%d y:%d\r\n",buffer[1],buffer[2]);
}
}
}
else
{
delay (10) ;
}
}
注:WiringPi对外封装并没有提供串口read函数,只提供了单个字符的获取,我们直接采用linux本身提供的read函数。
2.5 通信测试
编写相关文件,传输到树莓派,然后进行编译。运行程序后,我们操作Sony PS2按键,应该可以看到如下信息输出:
3、树莓派PWM输出控制
树莓派仅提供一个物理硬件PWM输出IO,也就是GPIO1,第12管脚。实际测试发现,其周期为6.64us左右,WiringPi封装的接口还不能修改该周期的大小(后续有时间可以研究一下底层相关代码),这不符合舵机控制的需要,舵机一般要求20ms左右的周期。另外摄像头云台是控制两路舵机,所以一个物理硬件PWM也不够。所以我们采用软PWM,也就是用普通的GPIO,通过时钟中断,模拟PWM方波输出。
我们用GPIO1(12管脚)和GPIO2(13管脚)来模拟PWM输出,所以硬件接线也是舵机的PWM信号输入管脚和树莓派的这两个管脚相连(舵机5V的供电专门供,不要直接从树莓派5V管脚上取)。
PWM初始化代码:
#define PWM1 1
#define PWM2 2
softPwmCreate (PWM1, pwmV1, 200) ;
//1=100us 7~28
softPwmCreate (PWM2, pwmV2, 200) ;
//1=100us 7~28
在串口的信息接收中,输出PWM,从而控制舵机。
if (read (fd, buffer, 4) == 4)
{
if(buffer[0]==0xAA
&& buffer[3]==0x55)
{
pwmV1 = 7 +
(int)(buffer[1]*21.0/255.0); //x
pwmV2 = 7 + (int)(buffer[2]*21.0/255.0); //y
softPwmWrite(PWM1,
pwmV1);
softPwmWrite(PWM2,
pwmV2);
}
}
部署到树莓派,编译,运行,如果我们手头有示波器,我们应该可以看到GPIO1和GPIO2输出的波形。
以上程序如果和凌霄板共同运行,应该可以看到如下效果:
视频链接:http://v.youku.com/v_show/id_XNjY2MTE1NjQ0.html
文章导航:
2、【树莓派+.NET MF打造视频监控智能车】控制篇(.NET
MF)
3、【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)
4、【树莓派+.NET MF打造视频监控智能车】视频篇
小结:
1、 树莓派硬件设计小巧,会让一些人因为树莓派而喜欢上Linux。
2、 Linux毕竟不是一个实时系统,在做软PWM的时候,你会发现舵机会抖动,并且幅度还不小(由于凌霄系统已经提供了16路PWM,所以后续还是由凌霄系统控制所有的舵机)
3、 Linux系统的镜像大概2.8G左右,和凌霄系统的几百K相比,还是挺重量级的,并且启动时间会比较长一些。
【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)的更多相关文章
- 【树莓派+.NET MF打造视频监控智能车】控制篇(.NET MF)
在上一篇<遥控篇>文章中,我们介绍了Sony PS2手柄信号的采集和编程,通过简单的封装,以事件的方式向我们提供按键信息.本篇文章主要介绍.NET Micro Framework系统接受到 ...
- 【树莓派+.NET MF打造视频监控智能车】遥控篇
树莓派是最近比较火热的开源硬件,其设备只有信用卡大小,运行着Linux系统,专为学生编程教育而设计.我十多年的技术路线基本以学习微软的技术为主,中间也曾试图学习过linux,但是相对陡峭的学习曲线,只 ...
- 深度 | AI芯片之智能边缘计算的崛起——实时语言翻译、图像识别、AI视频监控、无人车这些都需要终端具有较强的计算能力,从而AI芯片发展起来是必然,同时5G网络也是必然
from:https://36kr.com/p/5103044.html 到2020年,大多数先进的ML袖珍电脑(你仍称之为手机)将有能力执行一整套任务.个人助理将变的更加智能,它是打造这种功能的切入 ...
- 【miscellaneous】监狱智能视频监控系统设计解决方案
监狱智能视频监控系统设计解决方案 一.系统概况 随着司法监狱管理系统内视频监控系统的日益发展,现有的被动式人工监控这一传统模式已无法满足新形势下的监管工作需求,尤其是现在靠轮询的视频监控方式,无法对突 ...
- 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾 ...
- 基于.NET打造IP智能网络视频监控系统
开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾情奉献:基于.NET打造 ...
- 【miscellaneous】监狱安防系统智能视频监控系统设计方案
1监狱安防新需求 随着司法监狱管理系统内视频监控系统的日益发展,现有的被动式人工监控这一传统模式已无法满足新形势下的监管工作需求,尤其是现在靠轮询的视频监控方式,无法对突发恶性事件做到第一时间的防御和 ...
- 【miscellaneous】华为智能视频监控系统设计解决方案
[导读] 近年来,随着经济的快速增长.社会的迅速进步,校园.工厂园区.中小企业.楼宇等领域对安全防范和现场记录报警系统的需求与日俱增,视频监控在工作.生活各方面得到了非常广泛的应用. 1.中小型视频监 ...
- 基于Spring4+SpringMVC4+Mybatis3+Hibernate4+Junit4框架构建高性能企业级的部标1077视频监控平台
开发企业级的部标GPS监控平台,投入的开发力量很大,开发周期也很长,选择主流的开发语言以及成熟的开源技术框架来构建基础平台,是最恰当不过的事情,在设计之初就避免掉了技术选型的风险,避免以后在开发过程中 ...
随机推荐
- MAPI错误0x80040107
MAPI错误0x80040107 的解决方案: The MAPI error means there's an "invalid entry" within the contac ...
- godep使用
安装: 1.mac:brew Install godep,全局可用 2.go get -u -v github.com/tools/godep 参数-u表示更新,-v可以看到进度信息.成功安装后,在 ...
- 6.1 如何在spring中自定义xml标签
dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...
- 首个threejs项目-前端填坑指南【转】
http://www.cnblogs.com/pursues/p/5226807.html 第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水 ...
- 【Spark】SparkStreaming-Kafka-Redis-集成-基础参考资料
SparkStreaming-Kafka-Redis-集成-基础参考资料 Overview - Spark 2.2.0 Documentation Spark Streaming + Kafka In ...
- ios 内存管理总结
在ios 中 项目有两个内存管理方式 第一种,arc 方式,编译器编译时,自动给obj 加上 release 实现要求 1. 设置项目 将 Objective-C Automatic Referen ...
- "Value does not fall within the expected range" with managed metadata fields
From: http://geekswithblogs.net/claraoscura/archive/2011/01/21/143569.aspx The problem: I have an ...
- GitHub最新命令使用教程
一.创建github仓库并提交代码 1.在github创建public仓库 2.会生成一个git地址 https://github.com/ae6623/Zebra.git 3.在本地打开命令,在文件 ...
- 微信、支付宝App支付-JPay0.0.2发布
JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:h ...
- VMware 安装Arch Linux记录
首先说明一下我的环境. 1.VMware Workstation 10.0.1 build-1379776 2.archlinux-2014.02.01-dual.iso 首先建立虚拟机,其他的不提了 ...