在Arduino上用Java编程
1.序
2.TotoroVM使用方法
3.通过Eclipse开发Arduino程序
Eclipse是广受欢迎的程序开发环境,支持Java,C等多种程序语言,由于他优秀的插件机制和成熟的社区支撑,有着近乎无限的可能性。用惯了Eclipse的语法提示的我,对于Arduino自带的IDE实在是不能适应。通过Eclipse开发Arduino程序,自然也是要通过插件的支持,而这个插件名叫AVR Eclipse Plugin,它不但可以编写,编译Arduino程序,还支持一键烧录的功能。下面,让我们来一步一步搭建一个支持Arduino的Eclipse。
第一步,Eclipse:
去到Eclipse的官网的下载页面 http://www.eclipse.org/downloads/ 找到最新版的 Eclipse IDE for C/C++ Developper,下载需要的32/64位版本。http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/juno/SR2/eclipse-cpp-juno-SR2-win32.zip
有了Eclipse IDE for C/C++之后还可以安装一个mingw或者cygwin,两者都有gcc可以编译出windows下的执行文件,区别是mingw编译出来的文件可以直接执行,而cygwin编译出来的文件比较小,但需要有一个cygwin1.dll支持。装他们的目的是为了调试为Arduino写的C++程序(需要自己实现一些调试用的Arduino.h中的方法),以弥补Arduino芯片上难于调试程序的尴尬。
我使用的的mingw,下载安装包 http://sourceforge.net/projects/mingw/files/latest/download?source=files 安装好后,将
上面简单介绍了Eclipse IDE for C++的一般使用方法,接下来进入正题,开始Arduino编译之旅:
第二步,Arduino IDE
从Arduiono官网 http://arduino.cc/en/Main/Software 上下载Arduino IDE,其中包含了Arduino的编译命令avr-gcc,库文件和硬件配置信息。以供Eclipse直接使用。
第三步,AVR Eclipse Plugin
下载地址 http://nchc.dl.sourceforge.net/project/avr-eclipse/avr-eclipse%20stable%20release/2.4.0/avreclipse.2.4.0.final.p2repository.zip 。
Eclipse的插件有多种安装方式,我倾向于把插件安装到Eclipse目录之外,通过link的方式调用。方法为:
解压插件包到任意目录,如: D:\eclipse_plugins\avreclipse.2.4.0.final.p2repository
到Eclipse的安装目录下新建一个links目录,在links目录中新建一个任何名称的.link文件,如avreclipse.link,编译这个文件,填入刚才的插件路径:
path=D:\\eclipse_plugins\\avreclipse.2.4.0.final.p2repository
重启Eclipse,如能在Window->Preferences菜单中看到AVR选项即说明插件安装成功。
配置插件Window->Preferences->AVR->Paths,统统指向Arduino IDE里的目录
AVR-GCC :
GNU-make :
AVR Header Files :
AVRDude :
如图:
配置插件Window->Preferences->AVR->AVRDude,
选择Use custom config file for AVRDude,输入
在Programmer configuration中添加配置
- Programmer Hardware选择Arduino
- Override default port 填写arduino的com口,不知道可以去设备管理器中的Usb serial port上找
- Override default baudrate填写115200
第四步,编译静态链接库
Arduino的一些标准的库需要事先编译,以省得每个新的项目都把这些东西重要编译一遍。
新建一个C++ AVR静态库项目ArduinoCore:
- Toolchains : AVR-GCC
- Configurations : Release(Arduino没法调试)
- MCU Type : ATMega328P (我的Arduino UNO是这个芯片)
- MCU Frequency : 16000000
Finish
导入静态库通用源码:在ArduinoCore项目上右键->Import->File System
- From Directory :
钩选所有文件,Finish
导入静态库型号源码:在ArduinoCore项目上右键->Import->File System
- From Directory :
钩选,Finish
设置编译参数:在ArduinoCore项目上右键->Preferences->C/C++ Build->Settings
- AVR Compiler -> Directories : "${workspace_loc:/${ProjName}}" (引入ArduinoCore自己)
- AVR Compiler -> Optimization -> Other Optimize Flags -ffunction-sections -fdata-sections
* 这两个参数是告诉编译器把程序中的代码段和数据库都分散保存,这样以后编译时就有可能只包含用到的方法和数据,给执行文件减肥
- AVR C++ Compiler -> Directories : "${workspace_loc:/${ProjName}}"
- AVR C++ Compiler -> Optimization -> Other Optimize Flags -ffunction-sections -fdata-sections
Finish
编译项目 Project->Build Project。成功后会生成一个静态文件libArduinoCore.a并出现如下信息:
第五步,编写Arduino程序
准备就绪,可以编写自己的项目了。
新建一个C++ AVR应用项目 ArduinoDemo:
- Toolchains : AVR-GCC
- Configurations : Release
- MTU Type : ATMega328P
- MTU Frequency : 16000000
Finish
配置编译参数
- AVR Compiler -> Directories : "${workspace_loc:/ArduinoCore}" (引入ArduinoCore)
- AVR Compiler -> Optimization -> Other Optimize Flags -ffunction-sections -fdata-sections
- AVR C++ Compiler -> Directories : "${workspace_loc:/ArduinoCore}"
- AVR C++ Compiler -> Optimization -> Other Optimize Flags -ffunction-sections -fdata-sections
- AVR C++ Linker -> General -> Other Arguments -Wl,--gc-sections
* 配合之前的 -ffunction-sections -fdata-sections,编译时过滤未用到的方法和数据
- AVR C++ Linker -> Libraries -> Libraries ArduinoCore (libArduinoCore.a,去除lib和.a)
- AVR C++ Linker -> Libraries -> Libraries Path "${workspace_loc:/ArduinoCore/Release}"
完成,下面可以写程序了,我们以arduino标准的demo程序Blink为例,新建一个新的cpp文件blink.cpp:
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
*复制自arduino示例
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
/* main方法 */
int main(void) {
/* Must call init for arduino to work properly */
init();
setup();
for (;;) {
loop();
}
}
*arduino代码和c++代码的唯一区别就是arduino会自动生成main方法,依次调用init(), setup()和loop()方法,我们需要自己添加它。
编译项目 Project->Build Project。成功后会会打印程序的大小,用户需要自行确保程序小于arduino的flash空间大小32K
烧录程序:
把arduino连接到电脑的USB口
右键点击项目 Properties->AVR->AVRDude,在Programmer Configuration中选取之前设置过的Arduino,关闭。
选择菜单AVR->Upload Project to Target Device或者按工具栏上的AVR图标
完工,在Arduino上测试我们的程序吧!