本帖最后由 渴死的鱼儿 于 2016-1-3 20:59 编辑
上次介绍了Arduino IDE的使用和mBot库文件的导入配置,有了mBot的库文件,玩mBot算是有了基本的地基,但是我们总不能一直只使用别人写的程序,一直被别人的思维方法所捆绑,我们玩电子的必须有创新意识,更何况我们还接触到编程这方面问题,就凭这一点我们必须要培养出创新的思维。这里,我们就要了解Arduino C的基本语法和函数封装等基本原理,下面我就借着mBot这个平台简单介绍一下Arduino C,这也是一个新手学习Arduino C的一个跳板吧。楼主也是现学现卖,所学知识不如大家,不足之处还望大家多多包涵,共同进步!
下面用mBot的实例介绍Arduino C,拿上次的rgb程序来说,不要以为简单,短短几句功能代码简单的背后是很多的基本语法:
大家可以看到整个代码中除了mcore的头文件,就只有MeRGBLed rgb的调用和void loop()、void setup()两个函数模块!看起来非常简洁,但是又有点摸不着头脑的感觉。MeRGBLed rgb就是调用了其他的封装函数,mcore头文件下面的那一大段注释就是其内部函数功能,但是里面的函数又调用了其他的函数块,这里我们可以暂且放一放,不要把自己搞迷糊了。具体想深入的可以参考我一好友写的贴,里面有这方面的深究挖掘: https://bbs.elecfans.com/jishu_522284_1_1.html
主要是这两个函数:void setup()和void loop():
setup():在Arduino程序运行时首先要调用setup()函数,用于初始化变量、设置针脚的输出输入类型、配置串口、引入类库文件等等。每次 Arduino上电或重启(复位)后,setup()函数只运行一次。 loop():在setup()函数中初始化和定义变量,然后执行loop()函数。顾名思义,该函数在程序运行过程中不断地循环,根据反馈,相应地改变执行情况。通过该函数动态控制Arduino主控板。
结合rgb的程序我们再来看一下,首先上电执行setup()函数(仅执行一次),之后开始loop()函数(重复循环不间断执行loop函数里面的所有指令)。
rgb.setColorAt(0,20,0,0): 可以看到该函数是带参函数,有4个参数0,20,0,0,其对应的意思依次是: 0:指mcore主板上第一个rgb灯。(mcore主板上面一共有两个rgb灯,左右各一个)。 20:代指R-red的值为20,即红色灯的亮度值为20,所有灯的变化值在0~255之间,值越大亮度越明显,0为灭,255则最亮(特别刺眼的哦)。 0:指G-green值为0,即mcore上的绿色灯不亮。 0:指B-blue值为0,同样主板上的蓝色等也不会亮。 所以终上所述,此函数的功能就是让mcore主板上的第一个RGB灯显示红色,亮度值为20。
rgb.setColorAt(1,0,20,0): 同上面的那个函数功能大同小异,只是换成RGB2灯的绿色灯亮,亮度值为20;
rgb.show(): 执行指令,功能是执行上面的rgb.setColorAt(0,20,0,0)和rgb.setColorAt(1,0,20,0) 两个函数。因为上面的这两个函数只是设置了一下模块的工作模式并没有执行,真正的执行函数就在rgb.show();
delay(1000): 这个我相信用过C语言的都不会陌生,我们给单片机编程经常用到delay各种延时,这里也是一样的。其功能就是延时1S,上面的led亮之后会暂停1S。
rgb.setColor(0,0,20): 这个函数的看起来和rgb.setColorAt(1,0,20,0)类似,但是实质完全不同,之前的那个是自己执行自己的,而后面这个则是整体执行RGB灯。看到该函数参数只有3个没,比之前的那个少了1个,少的这个就是为了可以执行全部的led。这也就是我们的mbot小车上电后的红、绿、蓝间隔闪烁之后2个RGB灯的蓝色灯全部亮的程序。
delay(1000); 再次延时1S钟,达到效果;
以上几句代码就是mbot上电时红、绿、蓝间隔闪烁的效果。
看过Arduino C 的整体结构框架之后,接下来我们再了解一下Arduino C的基本语法,进一步渗透到Arduino C的分支去:
Arduino C关键字: Arduino C是从C语言延伸出来的,自然很多东西和C是相通的。比如它的关键字和C是一模一样的: if if...else for switch case while do... while break return goto
Arduino C 基本运算符:和C也是一样的。 = + - * / % == < > <= >= && || ! ++ -- += -= *= /=
Arduino C的数据类型:C同样适用。 boolean char byte int unsigned int long unsigned long float double string array
不同的就是Arduino程序特有的:引脚电压常量、数字引脚常量、函数结构、管脚I/O功能、数学相关函数等。
引脚电压常量: HIGH | LOW:表示数字IO口的电平,HIGH 表示高电平1,LOW表示低电平0。 数字引脚常量: INPUT | OUTPUT:表示数字IO口的方向,INPUT表示辒入(高阻态),OUTPUT表示辒出(AVR能提供5V电压 40mA电流)。 true| false true:表示真(1),false表示假(0)。
函数结构: 就是上面说过的非常重要的两个函数。 voidsetup() 初始化变量,管脚模式,调用库函数; voidloop() 连续执行凼数内的语句;
管脚I/O功能: 分为数字I/O口和模拟I/O口。 1、数字I/O口: pinMode(pin,mode) 数字IO口输入输出模式定义凼数,pin表示为0~13, mode表示为INPUT或OUTPUT。 digitalWrite(pin,value) 数字IO口输出电平定义凼数,pin表示为0~13,value表示为HIGH或LOW。比如定义HIGH可以驱动LED。 intdigitalRead(pin) 数字IO口读输入电平凼数,pin表示为0~13,value表示为HIGH或LOW。比如可以读数字传感器。 2、模拟I/O口: intanalogRead(pin) 模拟IO口读凼数,pin表示为0~5(Arduino Diecimila为0~5,Arduinonano为0~7)。比如可以读模拟传感器(10位AD,0~5V表示为0~1023)。 analogWrite(pin,value) - PWM 数字IO口PWM输出凼数,Arduino数字IO口标注了PWM癿IO口可使用该凼数,pin表示3, 5, 6, 9, 10, 11,value表示为0~255。比如可用于电机PWM调速或音乐播放。
数学相关函数: 求最小值:min(x, y); 求最大值:max(x, y); 算绝对值:abs(x)计; 约束凼数,下限a,上限b,x必须在ab之间才能返回:constrain(x, a, b) ; 约束凼数,value必须在fromLow不toLow之间和fromHigh与toHigh之间: map(value,fromLow, fromHigh, toLow, toHigh); 开方凼数,base的exponent次方:pow(base,exponent) ; 平方:sq(x); 开根号:sqrt(x);
以上这些是我对Arduino C的基本认识,以后的学习则会更加深入,同时也会更加困难。 革命尚未成功,同志仍需努力呀!
--------------------------------------------------------分割线------------------------------------------------------- --------------------------------------------------------分割线------------------------------------------------------- --------------------------------------------------------分割线-------------------------------------------------------
最后推荐一些我平常随手收集来的和Arduno C相关的资料供大家学习参考:
Arduino中hex文件的保存及应用: http://blog.sina.com.cn/s/blog_5e4725590101bjwv.html Arduino为什么只有loop和setup函数:
Arduino IDE 编译生成过程: http://www.tuicool.com/articles/y6F3ia
楼主强烈推荐: 很适合新手学习的一本书《Arduino从零开始学》,虽然只有3章,但内容十分详细,简明易懂。百度文库找到的,感觉非常不错,花了一个大洋下载下来了,这里分享给大家学习。 第一章:进入Arduino的世界; 第二章:开始Arduino之旅; 第三章:进入硬件的世界;
|