版主: wanchong , wangyu , eepwwp , firedom

分享到:
共9条 1/1 1   

arduino玩家转Edison,Galileo 基础一 GPIO操作

    [您是本帖的第1660位阅读者]
sydfeng
我是MM
普通会员

最后登陆时间:2015-01-13 22:11:15

直达楼层
1# 发表于 2015-04-24 23:04:07
 如果你以前没接触过C/C++的编程,而是从arduino可以学习的,那么这篇帖子就是让你从arduino编程思维转换到C++面向对象思维,现代编程语言基本都是面向对象编程,除了C语言。
        首先我们来熟悉intel给我们提供的新IDE环境Eclipse 。 
         Eclipse 是用java语言编写的的一个跨平台IDE,支持多种语言,对于语言的支持是通过插件来扩展的,Eclipse上的东西基本都是以插件形式实现的。
      安装Eclipse。
        intel提供的Eclipse已经帮我们写好一个脚本devkit-launcher.bat ,这个脚本会自动帮我们设置好环境变量,所以我们通过devkit-launcher.bat 脚本来启动Eclipse。

           启动后Eclipse的界面是这样的


对应编号如下:
1:这是你当前环境下的项目列表,Eclipse是以项目为单位的,所以你要打开一个其他人的项目需要导入,
具体操作是:  文件->导入->现有项目到工作空间->在选择根目录选择你需要导入的项目->完成。
2: 这是IDE的代码编辑区
3: 这是错误提醒,如果编写的程序出现问题,然后进行编译的时候这个区域会显示你那里出了问题,当然Eclipse支
持实时错误检查,但最终是否有错误还是需要以这个区域的提醒为主。
4: Eclipse 的菜单栏
打开其中的一个项目
 
        
Includes

表示这个项目你有那些库可以调用,和arduino里的libraries类似,但是这里是需要自己设置的,刚开始我们可以复制官方例程的4_cpp_onboard_LED_blink项目,这个项目已经设置了基本的库与动态链接库了,关于动态链接库概念等晚些时候在讲,具体复制流程是“右击要复制的项目->点击Copy->在项目区空白处右击-> 点击粘贴需要把项目名称改掉
src

这个是我们项目的主程序,通过修改这个文件夹里的文件进行程序编程
Debug

这是你点程序编译后生成的程序文件







我们打开项目 4_cpp_onboard_LED_blink 里面的src ---- 双击4_cpp_onboard_LED_blink.cpp文件把里面的代码全部删除


复制下面的代码,粘贴到程序编辑区,按Ctrl+S保存,然后点  这个图标进行编译


[C++] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#include "mraa.hpp"
 
 
intmain (intargc,char**argv)
{
        mraa::Gpio* gpio;
    gpio =newmraa::Gpio(13);
    gpio->dir(mraa::DIR_OUT);
 
    while(1) {
        gpio->write(1);
        sleep(1);
        gpio->write(0);
        sleep(1);
    }
    return0;
 
}    
这是一个最简单的Blink程序,和Hello Word差不多的意义

我们一条条分析其中的语句,当你认真的去理解其中的原理,以后其他比如spi,i2c....的操作都是同样操作。


#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "mraa.hpp"

这条和arduino的意思一样,加载对应库文件到程序中,前4条不用关心,你每次写程序的时候记得加载它们就行,那是C++ 常用的标准库,#include "mraa.hpp" 这个就是intel针对EdisonGalileo编写的驱动库,里面包含了pwm; aio; gpio; i2c; spi; uart; 的操作类库。
int main (int argc, char **argv)
这条语句相当于arduino里的loop()语句,请记住,这条语句不会和arduino一样循环执行,它是从第一条执行到最后一条就会结束,所以正常添加while(1)语句进行循环执行。while(1)语句上方的程序相当于arduino里的setup()语句
mraa::Gpio* gpio;
这是和arduino里类的实例化一样,如果你不清楚什么是实例化的话那么去百度一下具体的解释,这个对于以后编程很重要,如果你知道arduino里类的实例化,可能你会想那个*号是做什么用的,这个星号是指针的意思,就相当于在arduino如果我们实例化一个类以后,比如 nrf NRF;  实例化一个nrf类,那个我们要调用它的函数就是NRF.XXX(); 调用的时候是加一个"." 那么加上指针的实例化就要换成"->"操作符了,就变成NRF->XXX();了
gpio = new mraa::Gpio(13);
这是给刚才实例化的gpio分配一个对于13号引脚的动态内存,如果你不太理解的话那你只有记住实例化   mraa::Gpio* gpio; 以后
就要通过这个语句  gpio = new mraa::Gpio(13); 才能对对于的引脚进行操作
gpio->dir(mraa::DIR_OUT);
这句是给13号引脚设置输出模式,mraa::DIR_OUT是输出,mraa::DIR_IN是输入;可以理解成gpio现在已经代表了13号引脚,你看到gpio->类似语句的时候就是要对13号引脚进行操作;
gpio->write(1);
这是对13号引脚写入高电平,和刚才设置输入或者输出模式一样,gpio对于13号引脚,write对于要写入的值,你要是了解面向对象编程那会好理解一点。
sleep(1);
这个是和arduino  delay()一样,只是sleep()单位是秒,delay()单位是毫秒;如果你需要微秒,那对于语句是usleep();

接下来按照我之前的帖子http://www.arduino.cn/thread-9054-1-1.html里关于如何把Eclipse编译好的程序上传到Edison或者Galileo中运行,你就可以看到和arduino里的Blink一样的效果了
最后是总结:
1:当你不懂这个函数是什么意思的时候把鼠标放在对应的函数上面,Eclipse会很智能的显示函数原型与解释
 
2:你要先去了解关于C语言中的结构体,和C++中的面向对象,不需要太深入学,只有大概了解概念就行,当然你要深入理解那对于你以后的编程是很有帮助的,其实每个人对什么是面向对象编程有自己不同的理解。
3:多去试验下intel在Eclipse里的例程,不过例程中很多都是容易误导初学者的无用语句,你先忽略不懂的语句,只修改你懂的,有时间我会把其中的关键语句提出来,这样看到就不会晕了。

        

RE:by zpeng

xiaofeng881105
我是MM
普通会员

最后登陆时间:2015-01-14 10:55:26

2# 发表于 2015-04-25 20:22:33
支持

RE:by zpeng

wc8
我是MM
普通会员

最后登陆时间:2015-01-14 10:55:17

3# 发表于 2015-04-26 15:30:18
极品。很好的经验。值得学习啊!

RE:by zpeng

lanshwh
我是MM
普通会员

最后登陆时间:2015-01-14 10:56:34

4# 发表于 2015-04-27 06:28:50
马一个,等楼主更

RE:by zpeng

twt495
我是MM
普通会员

最后登陆时间:2015-01-14 11:08:31

5# 发表于 2015-04-27 11:42:55
大神啊!

RE:by zpeng

kindyu
我是MM
普通会员

最后登陆时间:2015-01-14 10:52:31

6# 发表于 2015-04-28 10:52:55
楼主什么专业滴?

RE:by zpeng

skychao
我是MM
普通会员

最后登陆时间:2015-01-14 11:10:45

7# 发表于 2015-04-29 10:58:10
好……

RE:by zpeng

1feiyangyyyqqw
我是MM
普通会员

最后登陆时间:2015-01-14 10:40:32

8# 发表于 2015-04-29 11:22:37
顶一个

RE:by zpeng

zhangjian1013
我是MM
普通会员

最后登陆时间:2015-01-14 11:08:06

9# 发表于 2015-04-30 13:27:13
学习了
共9条 1/1 1   
快速回复主题
  • 匿名不能发帖!请先 [ 登陆 注册 ]