720 likes | 1.21k Views
超越之美:JavaFX、视差、触摸、陀螺仪及其他. Angela Caicedo Oracle,Java 宣讲师. 本讲座谈论的话题. 打造更好的用户界面 当前用户界面太过呆板、臃肿,但使用 3D 技术又成本太高 。 对嵌入式尤其如此 用户界面应能对用户位置变化做出反应,我们提供相关工具 JavaFX 非常适合更具动态的用户界面 我们如何将这些功能融合在一起 ? 这就是本讲座谈论的内容 !. 议题. 硬件: Raspberry Pi 协议:I2C 在 Pi 上启用 I2C 使用的硬件 MPU-9150
E N D
超越之美:JavaFX、视差、触摸、陀螺仪及其他 Angela Caicedo Oracle,Java宣讲师
本讲座谈论的话题 • 打造更好的用户界面 • 当前用户界面太过呆板、臃肿,但使用 3D 技术又成本太高。 • 对嵌入式尤其如此 • 用户界面应能对用户位置变化做出反应,我们提供相关工具 • JavaFX非常适合更具动态的用户界面 • 我们如何将这些功能融合在一起? • 这就是本讲座谈论的内容!
议题 • 硬件: • Raspberry Pi • 协议:I2C • 在 Pi 上启用 I2C • 使用的硬件 MPU-9150 • Chalkboard Electronics LCD 屏 • 软件 • I2C 原生库和 Java 库 • 所用用户界面的原理:视差 • 用来实现该用户界面的 JavaFX
项目始于 2006 年 目标是设计一台能够吸引孩童的计算机 灵感来自 1981 年 BBC Micro 项目 2012 年 2 月 29 日正式推出 首批产量是 10,000 块电路板 推出当天,RS 和 Farnell 的服务器停止销售 RS 报道,一天的预订量超过 100,000 块 目前产量是每天约 4,000 块 历史和目标 Raspberry Pi
CPU:ARM 11 内核,700MHz Broadcom SoC 包 现在主频可达到 1GHz(不会违反保修协议!) 内存:512Mb I/O: HDMI 与合成视频 2 个 USB 端口(仅限 B 型号) 以太网(仅限 B 型号) 适用于 GPIO、UART、SPI 和 I2C 的插针 规格 Raspberry Pi
适用于 ARM 的 Java 的具体细节 浮点运算 • 虽然是 ARMv6 处理器,却包含一个 FPU • FPU 自 ARMv7 起成为标准 • FPU(硬浮点或称HF)比软件库更快 • 适用于 ARM 的 Linux distros 和 Oracle JVM 假定 ARMv6 上无 HF • 需要两者的特殊版本 • Raspbiandistro版本现已提供(基于Debian) • Oracle JVM 于 2012 年 12 月已发布!(预先试用版)
我从事过的项目: 串行 (TTL UART) 已完成 USB 已完成 GPIO 已完成 I2C 许多奇思妙想! 在 Raspberry Pi 上使用 Java
使用串行端口 • UART 提供 TTL 级信号 (3.3V) • RS-232 使用 12V 信号 • 使用 MAX3232 芯片来转换 • 用来访问串行控制台
USB 和 OWI 机械臂 便宜且令人鼓舞 • 随 USB 接口提供 • 仅限 Windows 驱动程序 • 被 Linux 识别为 USB 设备 (dev/bus/usb) • 使用原生代码实现控制和 JNI • 简单控制协议 • 3 字节(1 = arm、2 = base、3 = light) • 合并运动需要小改动 • 只能停止所有电机,而不能停止个别电机
机械臂控制 JNI 代码 • 原生 C 函数 • 使用 libusb 和适当设备的臂初始化 • 每个控制元素有单独的函数 • 编译到共享库 • 使用 JNI 生成适合 Java 代码使用的头文件 • 例如 native int arm_usb_init() • 实现适当的桩来调用库 • 编译到共享库 • JNI 不能轻松地重用
机械臂控制 Java 代码 • Java 代码很简单 • 需要校准来确定特定运动的时间 arm_gripper_move(OPEN); uSleep(500); arm_gripper_move(STOP); uSleep(500); arm_gripper_move(CLOSE); uSleep(500); arm_gripper_move(STOP);
使用 GPIO 线 P1 连接器布局 14 (TXD) 15 (RXD) 8 5V 25 7 18 24 23 GND P1-01 0 (SDA) 1 (SCL) 9 (MISO) 10 (MOSI) 17 4 21 22 3.3V 11 (SCLK) P2 连接器:针 1 = 3.3V 针 7, 8 = GND
GPIO 示例:LEGO电机 使用 L293D 双 H 桥 GPIO 线 GPIO 线 GPIO 线 GPIO 线 +9V 电源
使用 JNI 隐藏神奇魔咒 简单的 Java 接口 • 访问/dev/mem需要有 root 访问权限 • 可通过编写自己的设备驱动程序来解决这个问题 gpio_init(); gpio_pin_output(MOTOR_PIN_CLKWISE); gpio_pin_output(MOTOR_PIN_ACLKWISE); /* Turn clockwise */ gpio_pin_low(MOTOR_PIN_ACLKWISE); gpio_pin_high(MOTOR_PIN_CLKWISE);
用于方便快速地从一台设备向另一台设备移动数据用于方便快速地从一台设备向另一台设备移动数据 串行接口 同步: 对数据计时,并附加时钟信号 (SCL) 由时钟信号控制何时更改数据以及何时读取数据 与异步(RS-232 样式)通信不同,时钟频率会变化 双向 I2C 概述
具有时钟 (SCL) 线和数据 (SDA) 线的总线 7 位寻址。 角色: 主节点:生成时钟并启动与从节点的通信 从节点:接收时钟并在主节点寻址时做出响应 多主总线 允许主节点和从节点互相切换 I2C 设计
启动 (S) 和停止 (P) 信号 当主节点在总线上发出启动信号 (S) 时开始通信:SDA 线从高转变到低,此时 SCL 线为高 总线会保持繁忙状态,直到主节点在总线上发出停止信号 (P):SDA 线从低转变到高,此时 SCL 线为高 I2C 通信协议
I2 C 数据字节长度为 8 位 传输的每个字节后面必须有 ACK 确认信号 数据格式/确认 I2C 通信协议
通信 I2C 通信协议
/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 将以下行注释掉 blacklist spi-bcm2708 blacklist i2c-bcm2708 I2C 未启用!
能否看到您的设备? sudo i2cdetect -y 1 或 Sudo i2cdetect –y 0 (用于 256 Pi 型号 B) I2C 未启用!
在 /dev 下应包含以下内容 spidev0.0 Spidev0.1 I2c-0 I2c-1 如果未看到任何内容,请运行 sudo modprobe i2c-dev I2C 验证…
9 轴 MotionTracking设备 I²C 串行主机接口 焊接跳线用于切换 I2C 地址的 LSB 允许连接其中的两个 三轴角速率传感器(陀螺仪) 三轴加速度计 三轴罗盘,完整标度范围为 ±1200µT VDD 电源的电压范围为 2.4V–3.46V MPU-9150 分线板
P1 连接器布局 使用 I2C 线 14 (TXD) 15 (RXD) 5V 25 8 18 24 7 GND 23 P1-01 0 (SDA) 1 (SCL) 9 (MISO) 10 (MOSI) 4 17 21 22 3.3V 11 (SCLK) P2 连接器:针 1 = 3.3V 针 7, 8 = GND
Pi 连接器布局 (SDA) 3.3V (SCL) 3.3V/GND P2 连接器:针 1 = 3.3V 针 7, 8 = GND
Chalkboard Electronics 触摸屏 • 外形尺寸为 10 英寸或 7 英寸 • 通过 HDMI/USB 连接 • 使用 JavaFX 8 进行了测试 • 10% 的专享折扣: G1F0U796Z083
演示设置 亮度传感器 ADXL345 MPU-9150 分线板 LCD 屏幕 Raspberry Pi 触摸屏 传感器
WiringPi 原生库 • 用 C 编写的库 • 灵感来自Arduino的联接包 • 作为 Raspberry Pi 的输入和输出核心 • 可供用来访问: • GPIO 针、I2C 和 SPI 接口、UART 线 • 包括命令行实用程序gpio: • 允许对 GPIO 针进行编程和设置 • 对针进行读取和写入,甚至从 shell 脚本使用它来控制针
Pi4J • 在原生库 (WiringPi) 和 Java 之间建立连接,从而实现对 Raspberry Pi 的完全访问。 • 团队: • Robert Savage • Chris Walzl • Raspberry Pi 社区论坛 • Pi4J Google 群论坛 • https://groups.google.com/forum/#!forum/pi4j • Twitter 上的 @Pi4J • Pi4J 问题跟踪 • https://github.com/Pi4J/pi4j/issues
用于从 Java 直接访问WiringPi库的包装类 导出和取消导出 GPIO 针 配置 GPIO 针方向 配置 GPIO 针边缘检测 控制/写入 GPIO 针状态 发出 GPIO 针状态脉冲 读取 GPIO 针状态 监听 GPIO 针状态更改(基于中断;非轮询) 在程序终止(GPIO关闭)时自动设置 GPIO 状态 Pi4J:特性 (1/2)
根据针状态更改触发自动化 通过 RS232 串行通信发送和接收数据 I2C 通信 SPI 通信 可扩展的 GPIO 提供商接口,用于通过扩展板增加 GPIO 容量 从 Raspberry Pi 访问系统信息和网络信息 用于从 Java 直接访问 WiringPi 库的包装类 Pi4J:特性 (2/2)
安装和使用 Pi4J (1/2) • 获取 API wgethttp://pi4j.googlecode.com/files/pi4j-0.0.5.deb • 安装 sudodpkg -i pi4j-0.0.5.deb • 检查以下位置的源文件: /opt/pi4j/lib /opt/pi4j/examples • 在类路径中包含 Pi4J lib 文件夹:javac -classpath .:classes:/opt/pi4j/lib/'*' ...
安装和使用 Pi4J (2/2) • 在类路径中包含 Pi4J lib 文件夹:sudo java -classpath .:classes:/opt/pi4j/lib/'*' ... • 构建所有演示:cd /opt/pi4j/examples ./build • 卸载 Pi4J sudodpkg -r pi4j
使用 Pi4J 的 GPIO 状态监听器示例 public class ListenGpioExample { public static void main(String args[]) throws InterruptedException { final GpioControllergpio = GpioFactory.getInstance(); final GpioPinDigitalInputmyButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02, PinPullResistance.PULL_DOWN); myButton.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent( GpioPinDigitalStateChangeEvent event) { System.out.println(”PIN STATE:" + event.getPin() + " = " + event.getState()); } }); for (;;) {Thread.sleep(500);} // 停止所有 GPIO 活动/线程 // gpio.shutdown(); <--- 如果要终止 Pi4J GPIO 控制器, //请实施此方法 } }
采用 Pi4J 的 I2C (1/2) public Sensors() { try { //获取 i2c 总线 bus = I2CFactory.getInstance(I2CBus.BUS_1); //获取设备自身 device = bus.getDevice(0x68); //开始传感,使用配置注册表 6B 和 6C device.write(0x6B, (byte) 0b00000000); device.write(0x6C, (byte) 0b00000000); //配置陀螺仪 device.write(0x1B, (byte) 0b11100000); //配置加速度计 device.write(0x1C, (byte) 0b00011001); startReading(); catch (IOException e) {System.out.println(e.getMessage()); } }