怎么分分钟成为Java嵌入式开发人员-Java-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:221回复:0

  怎么分分钟成为Java嵌入式开发人员

楼主#
更多 发布于:2016-05-22 15:05

用Java开发下一代嵌入式商品

在我10年的Java布道师生计里,没有哪次Java新版别发布能让我如此振奋。Java 8的发布不仅在言语自身加入了些不错的新特性,还在嵌入式开发上加入了很棒的功用,进行了优化,还有简练的开发文档。假如你是一名Java程序员,而且预备好和我一起加入机器间技能的潮流,或许说开发下一代改动国际的设备,那么就让咱们开端学习物联网(IoT)把。

在你开端嵌入式开发之前,你需求知道你具体想要开宣布啥,以及你计划在哪运转你的程序。这非常重要,由于得根据意图挑选不相同版别的Embedded Java。

假如你想要开发跟桌面运用类似的运用,或许你想要开宣布美丽的UI,那么你需求挑选从Java SE衍生出来的Oracle Java SE Embedded版别。它支撑同Java SE相同的渠道和功用。此外,它还供给了其它特性,兼容更多渠道,小巧的Java运转环境(JREs),支撑headless形式装备,以及内存优化。

假如你想要更方便地衔接如开关、传感器、马达之类的外设,Oracle Java ME Embedded将是你最好的挑选。它具有设备拜访API,为嵌入式渠道最常见的外设供给了接口:通用输入/输出(GPIO)、集成电路总线(IIC)、串行外设接口总线(SPI)、模数转换器(ADC)、数模转换器(DAC)、通用异步收发传输器(UART)、内存映射输入输出(MMIO)、AT指令设备、看门狗定时器、脉冲计数器、脉冲宽度调制器(PWM)和通用设备。

至于设备,Embedded Java覆盖了大多数的渠道,从传统的Java SE桌面渠道与服务器渠道到根据STM微处理器的STM32F4DISCOVERY板、树莓派和windows渠道。在这篇文章中,我将运用树莓派,不仅仅是由于它是非常强大,且只需卡片巨细的核算机,还由于它价格便宜。最新版只需35美元。

预备树莓派

树莓派需求一张存有Linux镜像的SD卡才干开机。由于树莓派没有硬盘,SD卡就被用来存储运转所需的Linux镜像。该SD卡也被当作存储设备用于加载其它的运用程序。

装备SD卡请按以下过程操作:

格式化SD卡。

下载Raspbian(一个专为树莓派优化的根据Debian的免费操作体系)。

创立一个可引导的镜像。运用像Win32 Disk Imager这么的运用能够更方便地创立镜像。

当你预备好SD卡以后,树莓派就能够开机了。首次开机时,树莓派会加载软件装备东西让你进行根本的设置。以下是此刻应当留意的选项:

勾选“拓展文件体系(Expand Filesystem)”选项,使操作体系对全部SD存储具有权限。

挑选“国际化(Internationalisation)”选项中挑选与本地对应的言语与区域。

在主菜单挑选“高档(Advanced)”选项,经过敞开SSH将树莓派设置为headless嵌入式设备形式(没有显现器)。

设置静态IP地址,保证树莓派总以相同的IP地址接入。尽管这不是有必要的,但我发如今树莓派headless形式下老是很有用。设置静态IP需求修正/etc/network/interfaces文件如下图:

(图1)

如今你现已预备好了衔接树莓派,你能够挑选运用[PuTTY](http://www.putty.org/)衔接。如下图:

(图2)

在树莓派上装置Embedded Java

如今是时分决议你计划在你的设备上运转啥样的运用了。我个人喜爱搞外设,所以在这篇文章中我将运用Oracle Java ME Embedded,这么我才干运用设备拜访API。可是你也能够用Oracle Java SE Embedded来开发树莓派运用。

在树莓派上装置Oracle Java ME Embedded二进制文件非常简略,只需求经过SSH衔接用FTP协议把树莓派版别的zip压缩文件从桌面传输到树莓派,然后再解压到一个新目录就好了。

集成开发环境

运用Java ME SDK和NetBeans IDE是创立嵌入式运用不错的挑选。这两者联系就能在设备上运转之前先在虚拟机中进行测验,而且能够自动地将代码传输到树莓派运转,乃至能在运转时调试。你所需求做的仅仅保证Java ME SDK是IDE的Java渠道的一部分。你需求在 东西->Java渠道 点击“添加渠道”的选项,然后挑选SDK的途径。

为了能够远程办理树莓派上的嵌入式运用,你需求运转运用办理体系(AMS)。经过SSH,运转以下代码:

pi@raspberrypi sudo

javame8ea/bin/usertest.sh

第一个嵌入式运用

Oracle Java ME Embedded运用与Java ME运用看起来彻底相同,就如下例:

public class Midlet extends MIDlet {

@Override

public void startApp() {

System.out.println(“Started…”);

}

@Override

public void destroyApp(boolean unconditional) {

System.out.println(“Destroyed…”);

}

}

(代码1)

你的运用有必要承继MIDlet类,而且重写两个生命周期办法:startApp和destroyApp。这两个办法分别在运用发动时和快完毕前被调用。以上代码能在操控台输出信息。

打开LED灯

如今让咱们做些更风趣的事,比方经过开关来完成敞开和封闭LED灯。首要让咱们看下树莓派的通用外设输入输出(GPIO)管脚。

(图3)

通用外设输入输出衔接器(GPIO connector)上有很多不相同的衔接类型管脚:

– 通用外设输入输出管脚(GPIO)

– 集成电路总线管脚(IIC)

– 串行外设接口管脚(SPI)

– RxTx串口管脚

这意味着咱们有好几个挑选能够衔接LED和开关,以上任何一个GPIO管脚都能够,只需记住管脚数字和外设ID,由于你需求这些信息才干用代码指向这些设备。

如今依照下图焊接电路。留意咱们将LED衔接到16管脚(GPIO 23),把开关衔接到11管脚(GPIO 17)。一起加上 两个电阻以保证电压在安全范围以内。

(图4)

如今让咱们看下程序。设备拜访API中的PeripheralManager类能够让你用外设ID衔接到任何类型的外设,这能够极大地简化代码。比方要衔接LED,只需求用静态办法open,供给管脚ID 23如下代码:

private static final int LED1_ID = 23;

...

GPIOPin led1 = (GPIOPin) PeripheralManager.open(LED_ID);

(代码2)

要改动LED的值(即开关函数)只需用setValue办法传入相应参数:

//打开LED

led1.setValue(true);

这实在不能再简略了。

咱们能用PeripheralManager中同样的open办法来衔接开关,但咱们将用略微不相同的办法来设置一些装备信息。首要,创立GPIOPinConfig目标(代码3),其间包含了如下信息:

private static final int Button_Pin = 17;

...

GPIOPinConfig config1 = new GPIOPinConfig("BUTTON 1",

Button_Pin,

GPIOPinConfig.DIR_INPUT_ONLY,

PeripheralConfig.DEFAULT,

GPIOPinConfig.TRIGGER_RISING_EDGE,

false);

(代码3)

外设名称

– 管脚号

– 传输方向:输入、输出仍是双向

– 形式:上拉、下拉仍是开漏

– 触发器:无触发、降低沿触发、上升沿触发仍是双边缘触发,高电平触发、低电平触发仍是双电平触发

– 初始值

接着咱们用该装备目标调用open办法,如下:

GPIOPin button1 = (GPIOPin) PeripheralManager.open(config1);

(代码4)

咱们也能够给管脚添加监听,这么管脚值一旦发作改动,咱们就能够知道。在这个比如中,咱们想要知道啥时分开关的值发作了改动,这么咱们就能相应的改动LED的值:

button1.setInputListener(this);

然后完成valueChanged办法,当监听事情发作时就调用该办法。

@Override

public void valueChanged(PinEvent event) {

GPIOPin pin = (GPIOPin) event.getPeripheral();

try {

if (pin == button1) {

// Toggle the value of the led

led1.setValue(!led1.getValue());

}

}catch (IOException ex) {

System.out.println("IOException: " + ex);

}

}

(代码5)

在完毕时封闭管脚是非常重要的,一起还要保证关掉了LED。

public void stop() throws IOException {

if (led1 != null) {

led1.setValue(false);

led1.close();

}

if (button1 != null) {

button1.close();

}

}

(代码6)

全部类的代码能够在衔接找到。

如今,咱们剩余的只需MIDlet来启用咱们的代码了。代码7中的startApp办法会生成一个目标来操控咱们的两个通用输入输出设备(LED和开关),而且监听咱们的输入。stopApp办规律保证一切东西都被正确地封闭。

public class Midlet extends MIDlet{

private MyFirstGPIO gpioTest;

@Override

public void startApp() {

gpioTest = new MyFirstGPIO();

try {

gpioTest.start();

} catch (PeripheralTypeNotSupportedException |

PeripheralNotFoundException|

PeripheralConfigInvalidException |

PeripheralExistsException ex) {

System.out.println(“GPIO error:”+ex.getMessage());

} catch (IOException ex) {

System.out.println(“IOException: ” + ex);

}

}

@Override

public void destroyApp(boolean unconditional) {

try {

gpioTest.stop();

} catch (IOException ex) {

System.out.println(“IOException: ” + ex);

}

}

}

}

(代码7)

感知环境

做到LED和开关现已非常不错,但感知周围环境才是实在有意思的。鄙人面的比如中,我将演示怎么着手运用IIC协议的传感器。

IIC设备可能是最常见的设备,它们最大的有点是规划简略。IIC只需两条双向的开漏线:串行数据线(SDA)和串行时钟线(SCL)。

总线上的设备都会有一个特别的地址。主操控器经过在串行数据线上宣布开端恳求和设备地址树立通讯衔接。假如对应地址的设备闲暇,则回来恳求。然后数据就在串行数据线上传输,用串行时钟线来操控每一比特的时刻。

一旦通讯完毕,操控器就宣布中止恳求。这么的协议使得在两条总线上得以添加多个设备。

发动树莓派的集成电路总线

假如你查看树莓派的管脚图(图3),你会发现两个IIC管脚:管脚3是数据总线,管脚5是时钟总线。IIC默许未敞开,所以咱们需求采纳以下过程才干让咱们的运用运用总线。

首要,用终端衔接树莓派,然后在/etc/modules文件添加一下两行:

i2c-bcm2708

i2c-dev

i2c-tools包非常有用,它能够检测设备,保证一切正常运转。能够经过以下指令装置:

sudo apt-get install python-smbus

sudo apt-get install i2c-tools

最终,树莓派中有个黑名单文件/etc/modprobe.d/raspi-blacklist.conf,默许情况下SPI和IIC都在该名单中。这意味着除非咱们移除它们或许把他们设为注释,IIC和SPI在树莓派上是不能用的。修正该文件去除以下两行:

blacklist spi-bcm2708

blacklist i2c-bcm2708

重启树莓派,保证运用一切的修正。

添加传感器

Bosch Sensortec的BMP180传感器是丈量大气压和气温的经济解决方案。由于气压随着海拔高度改动,你也能够把它当作海拔高度丈量仪。BMP180运用IIC协议,作业电压为3V到5V,非常合适衔接到树莓派。

依照以下的图5把BMP180焊接到树莓派上。通常情况下,运用IIC设备时需求需求在串行数据线和串行时钟线加上一个上拉电阻。走运的是,树莓派支撑上拉电阻,所以你只需求把它们衔接在一起。

(图5)

在你把传感器衔接到树莓派以后,就能够查看是不是能看到IIC设备了。在树莓派上运转以下指令:

sudo i2cdetect -y 1

你应当能在表格中看到设备。图6中显现了两个IIC设备:一个在地址40,另一个在地址70。

运用IIC设备来获取温度

在你编程衔接IIC设备之前有一些有必要知道的事项:

设备地址是多少?IIC运用7位作为设备地址,树莓派运用IIC总线1。

寄存器的地址是多少?在咱们的比如中,咱们将读取温度值,而相应寄存器地址是0xF6。(对于BMP180)

是不是需求设置操控寄存器来发动传感器?某些设备默许处于睡觉状况,除非咱们发动它,不然它是不会监测任何数据的。此处设备的操控寄存器地址是0xF4。(对于BMP180)

设备的时钟频率是多少?BMP180频率为3.4Mhz。

代码8将BMP180的这些参数设置为静态变量供以后的代码运用://Raspberry Pi's I2C bus

private static final int i2cBus = 1;

// 设备地址

private static final int address = 0x77;

// 3.4MHz最大时钟频率

private static final int serialClock = 3400000;

// 地址宽度

private static final int addressSizeBits = 7;

...

// 温度传感器操控寄存器地址

private static final byte controlRegister = (byte) 0xF4;

// 读取温度地址

private static final byte tempAddr = (byte) 0xF6;

// 读取温度指令地址

private static final byte getTempCmd = (byte) 0x2E;

// 设备目标

private I2CDevice bmp180;

(代码8)

编程衔接设备仍然是运用PeripheralManager类的静态办法open。该处咱们将对于IIC设备创立一个I2CDeviceConfig目标(代码9)。该目标能让咱们设定设备的总线,地址,地址位数(比特单位)和时钟速度。

...

//设置装备信息

I2CDeviceConfig config = new I2CDeviceConfig(i2cBus,

address, addressSizeBits, serialClock);

//衔接IIC设备

bmp180 = (I2CDevice) PeripheralManager.open(config);

...

(代码9)

要读取温度,咱们需求采纳以下过程:

按代码10a和代码10b从设备读取校准数据。该步只对于BMP180传感器,运用其它温度传感器时不一定需求这一步。

// EEPROM寄存器——校准数据

private short AC1;

private short AC2;

private short AC3;

private int AC4;

private int AC5;

private int AC6;

private short B1;

private short B2;

private short MB;

private short MC;

private short MD;

private static final int CALIB_BYTES = 22;

// 读取一切的校准数据为一个byte型数组

ByteBuffer calibData=

ByteBuffer.allocateDirect(CALIB_BYTES);

int result = bmp180.read(EEPROM_start,

subAddressSize, calibData);

if (result < CALIB_BYTES) {

System.out.format(“Error: %n bytes read/n”,

result);

return;

}

// 将每组数据读取为带符号short型

calibData.rewind();

AC1 = calibData.getShort();

AC2 = calibData.getShort();

AC3 = calibData.getShort();

(代码10a)

//unsigned short型

byte[] data = new byte[2];

calibData.get(data);

AC4 = (((data[0] << 8) & 0xFF00) + (data[1] & 0xFF));

calibData.get(data);

AC5 = (((data[0] << 8) & 0xFF00) + (data[1] & 0xFF));

calibData.get(data);

AC6 = (((data[0] << 8) & 0xFF00) + (data[1] & 0xFF));

// signed short型

B1 = calibData.getShort();

B2 = calibData.getShort();

MB = calibData.getShort();

MC = calibData.getShort();

MD = calibData.getShort();

(代码10)

2.写入到设备上的一个操控寄存器,初始化温度传感器(代码11)。

// 将读取温度指令写入到寄存器

ByteBuffer command = ByteBuffer.allocateDirect

(subAddressSize).put(getTempCmd);

command.rewind();

bmp180.write(controlRegister, subAddressSize, command);

(代码11)

3.读取未抵偿温度为两个字节的变量,用校准常量得出实在的温度。代码如下(仍然对于BMP180)

ByteBuffer uncompTemp = ByteBuffer.allocateDirect(2);

int result = bmp180.read(tempAddr, subAddressSize,

uncompTemp);

if (result < 2) {

System.out.format("Error: %n bytes read/n", result);

return 0;

}

// 读取温度为无符号byte型

uncompTemp.rewind();

byte[] data = new byte[2];

uncompTemp.get(data);

UT = ((data[0] << 8) & 0xFF00) + (data[1] & 0xFF); // 核算实践温度 // 代码只适用BMP180 int X1 = ((UT – AC6) * AC5) >> 15;

int X2 = (MC << 11) / (X1 + MD); B5 = X1 + X2; // 摄氏度为单位的温度 float celsius = (float) ((B5 + 8) >> 4) / 10;

(代码12)

最终,摄氏度为单位的温度数据就被保存在了celsius变量中。你能够在衔接找到全部程序。

作为操练,你也能够把该程序拓展到读取压力、海拔或许两者。

总结:

咱们经过演示怎么运用GPIO和IIC设备的实在事例学习了怎么创立Java嵌入式运用。如今是时分轮到你自己在树莓派上衔接更多设备了,期望你喜爱树莓派嵌入式Java开发。

优质IT资源分享社区为你提供此文。

本站有大量优质Java教程视频,资料等资源,包含java基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

java教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客