我试着用迷你四驱车做IoT实验
介绍一下自己
- 姓名
- 加纳圣大
- 公司
- NC设计与咨询股份有限公司
- 工作内容
- 网页应用
- 建设和运营基础设施
- 爱好
- 电脑游戏
- 家庭服务器
- 尝试不同的技术进行娱乐
推特:@karuru6225
我是(自己的名字),来自(自己的国家/城市)。
- 姓名
- 十川亮平
- 公司
- NC设计与咨询有限公司
- 工作内容
- 我是AppPot后端服务的产品经理,在本次演示中负责服务器端。
Twitter:@rsogo
Twitter:@app_pot
NCDC介绍
伊势丹百货店先生/女士:「我的伊势丹,我的三越」。
其他的案例
AppPot 是一个什么?
AppPot的架构
物联网和人工智能的案例
某个建设公司先生/女士
自動将建设机器的数据上传至云端。
自动生成管理文件,防止篡改和输入错误。
研究的主题是尝试使用深度学习来判断施工结果是合格还是不合格。
通过物联网和机器学习来改变公司的规章制度和业务。
-
- 曖昧になっていたものが見えるようになる。
これまでより多くの品質検査NGがでるようになるかも知れない・・・。現場のマネージャは結構悩んでいる
一方、今まで分からなかったので過剰に余裕を持っていたものを最適化
从这些案件可以得出的结论是:
从业务流程(也可以称为UX)的角度来看,以改善业务流程的模式为目标。
-
- これまで人が入力していた業務を、Thingが勝手に連携してくれる
- 人が考えてやっていた業務を、MLが勝手にやってくれる
从这些案例可以得出以下结论2
通过物质量和CPU的强大能力,设法实现以前无法做到的事情。
迷你四驱模型的演示构成
更加深入地了解服务器端(AppPot IoT)。
我们正在选择各种不同的IaaS和能够在本地运行的中间件。
-
- ActiveMQ: MQTTを受信する
-
- Javaプログラム: 端末認証、端末の記録
-
- Kafka: メッセージをトピックとしてPublish
-
- Fluentd:
Kafka Consumer: Kafkaからのメッセージ取得
fluent-plugin-mysql
MySQL: 今回は。実際はなんでもいい。
开始
在喝酒聊天时的想法
-
- (ミニ四駆の)バッテリー残量を見る
電圧測ればいける?
F1の実況中継みたいな、加速度計があったらかっこいい?
加速度計
ラップ数、ラップタイム
ジャイロで一周したことを測る?
コースに黒いテープを貼り付けて、そこを通過したら一周とする?
フォトリフレクタの電圧をバッテリ残量のための電圧計で測ればいいか。
モーターの温度とか測りたい
温度計
选择我的控制板
因为我们的目标是宣传我们公司的产品 AppPot IoT,所以我们需要满足以下条件的微控制器。
比较各款单片机开发板
购买零件(10/7)
-
- Intel Edison Breakout Board Kit
-
- MPU-6050搭載 三軸加速度三軸ジャイロセンサモジュール
-
- ADS1015搭載 12BitADC 4CH 可変ゲインアンプ付き
-
- LiPo 燃料ゲージ
-
- QRE1113 フォトリフレクタ・モジュール
-
- TMP007 非接触温度センサ
- リチウムイオン電池900mAh
从传感器获取数据 qì
使用 I2C 通信与各种传感器进行通信,通过处理获取的数据可以获得各种传感器的数据。
各种传感器都有独特的地址,在读写之前,将目标地址发送到I2C通信路径上。
让它动起来试试看
马上开始各种焊接工作,并使用面包板组装电路,对树莓派的代码进行修改并运行测试一下。
然而,在Intel Edison上,无法运行Node.js的I2C库。
看起来Edison要使用一个名为mraa的库来进行各种通信。
该安装mraa。
由于构建失败,无法实现。
经过各种调查,发现问题在于Edison内置的
固件(Linux发行版:Edison Yocto)
版本过旧。
→ 将Yocto升级至最新版本
固件更新
J3にUSB MicroBを接続(シリアル接続)
J16にもUSB MicroBを接続(充電&その他接続)
iot-devkit-prof-dev-image-edison-20160606.zip をダウンロード&解凍
$ sudo brew install dfu-util coreutils gnu-getopt
$ cd iot-devkit-prof-dev-image-edison-20160606
$ sudo cu -s 115200 -l /dev/cu.usbserial-A502OQ0D
$ sudo ./flashall.sh
蓝牙网络共享的设置
- 展示会場で使うことを踏まえ、Wifiでなく、Bluetoothデザリングをする
蓝牙配对
$ systemctl start connman
$ systemctl enable connman
$ rfkill unblock bluetooth
$ bluetoothctl
[bluetooth]# scan on
[bluetooth]# discoverable on
[bluetooth]# devices
[bluetooth]# pair AB:CD:EF:01:23:45
[bluetooth]# exit
设置连接和自动连接
$ connmanctl
[connmanctl]# services
[connmanctl]# connect bluetooth_5fed432cba10_abcdef012345
[connmanctl]# config bluetooth_5fed432cba10_abcdef012345 autoconnect yes
[connmanctl]# exit
$ reboot
整个组织的构成
从这里开始,到装上迷你四驱车为止的过程
安装Node.js
while(运行正常) {
– 在面包板上制作和修改电路原型
– 编写JavaScript代码
}
进行行驶测试
在面包板上进行试制
JavaScript-只需要一个选项:中文原生化重述
const webpack = require('webpack');
const env = process.env.NODE_ENV;
const webpackConfig = {
entry: {
index: './src/index.js'
},
output: {
filename: '[name].js',
libraryTarget: 'umd'
},
resolve: {
extensions: ['', '.js']
},
plugins: [],
target: 'node',
externals: [
/^(?!^\.\/)/,
/config\.js/
],
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
'presets':['es2015']
}
},
{ // ここ重要。mraaのバイナリを読むために必要
test: /\.node$/,
loader: 'node-loader'
}
]
},
node: {
fs: 'empty'
}
};
if(env == 'production'){
webpackConfig['plugins'].push(
new webpack.optimize.UglifyJsPlugin({
compress: { warnings: false }
})
);
}else{
webpackConfig['devtool'] = '#source-map';
}
module.exports = webpackConfig;
const gulp = require('gulp');
const plumber = require('gulp-plumber');
const watch = require('gulp-watch');
const del = require('del');
const webpack = require('webpack-stream');
const webpackConfig = require('./webpack.config.js');
const distDir = './dist/';
gulp.task('clean-js', ()=>{
return del([
distDir + '**/*'
]);
});
gulp.task('copy-js', ['clean-js'], ()=>{
return gulp.src([
'./src/config.js'
])
.pipe(plumber())
.pipe(gulp.dest(distDir))
});
gulp.task('compile', ['copy-js'], ()=>{
return gulp.src([
'./src/**/*.js'
])
.pipe(plumber())
.pipe(webpack(webpackConfig))
.pipe(gulp.dest(distDir));
});
gulp.task('build', ['compile']);
gulp.task('watch', ['build'], ()=>{
watch([
'./src/**/*.js'
], ()=>{
gulp.start('compile');
});
});
尽管C语言和Arduion的代码都是完整的,但是JavaScript的代码无论搜寻到哪里都完全找不到!
在实施过程中,需要参考各个传感器(加速度计)的数据表,以及C语言和Arduino的示例代码。
传感器数据的读写
所有的传感器都有寄存器,其中存储着设置和测量结果。
大致上可以通过以下步骤获取传感器数据:
1. 将设置写入到设置寄存器中。
2. 从测量结果寄存器中提取原始数据。
3. 根据数据表的描述,对原始数据进行处理以计算出测量数据。
JavaScript的数据类型
使用缓冲区。
const raw = this._i2c.readBytes(0x3b, 14);
return {
ax: new Buffer([raw[0], raw[1]] ).readInt16BE(0) * this._accelMagni + this._e.ax,
ay: new Buffer([raw[2], raw[3]] ).readInt16BE(0) * this._accelMagni + this._e.ay,
az: new Buffer([raw[4], raw[5]] ).readInt16BE(0) * this._accelMagni + this._e.az,
gx: new Buffer([raw[8], raw[9]] ).readInt16BE(0) * this._gyroMagni + this._e.gx,
gy: new Buffer([raw[10], raw[11]]).readInt16BE(0) * this._gyroMagni + this._e.gy,
gz: new Buffer([raw[12], raw[13]]).readInt16BE(0) * this._gyroMagni + this._e.gz
};
实施
行车测试 (10/21 12:00 – 16:31 〜 18:30)
在实际的赛道上驾驶,进行零件布局的更改,修复线路,修正代码…
有什么不对吗?
进行行驶测试试试看
→ 行驶结果时好时坏……
不管怎么检查,代码好像也没错,感觉传感器也没坏吧?最少可以用最基本的电路验证一下,应该是正确的……
爱迪生的IO
外部设备使用3.3V进行操作,与Edison的I2C通信相连接,但其外部连接处于1.8V标准,电压不匹配。
更改并配置Edison的I2C通信设置。
颤颤颤
I2C通信再次出现
-
- I2C通信では、通信経路をプルアップすることが規格で定められている(電圧は決まってない)。
- Edison側、センサー側両方でプルアップがされていた。
→ Edison的设定是默认使用pullup,可以设定为pullup、pulldown、nopull。
→ 将I2C端口的设定从pullup改为nopull。
echo "nopull" > /sys/kernel/debug/gpio_debug/gpio27/current_pullmode # i2c-6 scl
echo "nopull" > /sys/kernel/debug/gpio_debug/gpio28/current_pullmode # i2c-6 sda
难以置信?出故障了。
第二代回路
由于电池电压测量传感器和加速计无法同时操作,因此引入了比较器以获取光反射传感器的结果。
光电传感器?
购买的传感器用于获取圈数和圈速。
传感器发出红外线,并根据反射光的强度,输出电压会发生变化。
比较器?
比较两个电压,如果其中一个大于另一个,输出电源电压;如果一个较小,则输出0V的元件。
比较器
在第二代中,将半固定抵抗2的输出输入到一个端口,同时将光电反射器的输出输入到另一个端口。
获取光电传感器的数据
当从比较器中获取到数字输出时,将其输入到GPIO中。
(当反射光超过一定阈值时,输出为0)
使用mraa获取GPIO的结果,并发送给计数器。
从GPIO的变化中判断是否完成一圈,并发送此时刻。
设计第二代电路。
第一代通过亲眼目睹面包板的试制,在无章法的情况下进行了布线。
二号测试行驶(10/24 18:30至23:00)
终于通过了! !)
展示会场进行测试(10/25 15:00开始)
电池连接器松动等问题出现,但总算成功准备好了展示。
代码说明
代码已经在GitHub上的代码库进行了公开。
MQTT是什么?
MQTT 是一种用于异步交换小型消息的称为消息队列的机制之一。
其特点是使用轻量级协议,可以在各种设备上适用。
比较不同MQTT代理服务
使用Fluentd将数据连接到任何分析基础设施。
需要从机器获取的原始数据中获得有商业意义的值。
可以将其导入到像RedShift或Hadoop这样的BigData分析平台中,也可以导入到机器学习的基础设施中。
例如。。。
从收集货物的车辆中收集载重量和位置信息。
在分析平台上,如果载重量超过一定的条件,我们将呼叫一辆最优的卡车根据位置信息和货物数量来取货,并计算出最佳的时间和费用。
需要更详细地了解服务器端(后端服务AppPot)。
-
- JavaScript SDK
-
- ユーザー認証
- Databaseのテーブル作成とデータアクセス
尽管具有诸多功能,如Push和File API等,但我们此次只使用了这一个。
总结。
-
- Web系エンジニアでも、なんとかIoTっぽいことができる(ハード含めて)
-
- IoTのPoCするときでも、自分たちでなんとか作れる!
- ミニ四駆IoTくらいのものなら、2週間半(実業務をしながら)で、作れる!
三代目
正在向P板.com订购印刷电路板。
购买商品清单
專注於製造電子開關的科學。
-
- Intel Edison Breakout Board Kit
-
- MPU-6050搭載 三軸加速度三軸ジャイロセンサモジュール
-
- ADS1015搭載 12BitADC 4CH 可変ゲインアンプ付き
-
- LiPo 燃料ゲージ
-
- QRE1113 フォトリフレクタ・モジュール
-
- TMP007 非接触温度センサ
- リチウムイオン電池900mAh
秋月电子贸易
-
- 2回路入コンパレータ NJM2903D (5個入)1パック
-
- 半固定ボリューム 3362P 10kΩ
-
- ロープロファイルピンヘッダ 2×14(28P) 9.54mm
- ロープロファイルピンソケット (低メス) 2×14 (28P) 5.0mm
可以通过调整电阻值,在电源电压至0V之间输出任意电压的东西。