BeagleBone Green と Grove IoT スターターキット(AWS 提供)
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
BeagleBone Green (BBG) は BeagleBoard.org と Seeed Studio の共同開発による製品です。これは BeagleBone Black のオープンソースハードウェア設計を基にしており、2つの Grove コネクタが追加されています。このキットには新しい BBG、10個の Grove モジュール、およびそれらを迅速に接続するためのステップバイステップのチュートリアルが含まれています。Grove IoT スターターキットには、AWS クラウドコンピューティングを使用してアイデアを具体的なアプリケーションに変えるために最も頻繁に使用されるセンサーとアクチュエータが含まれています。
特徴
- 箱から出してすぐに使用可能、プラグアンドプレイ、ブレッドボードやはんだ付け不要
- AWS サービスおよび AWS ベストプラクティスに完全準拠
- 開発者やメーカーが迅速に始められるようにするためのステップバイステップのチュートリアル
同梱物
始め方
AWS IoT サービスの設定
まず最初に、AWS IoT サービスアカウントを取得し、いくつかの設定を行う必要があります。
AWS IoT コンソールにアクセスし、AWS IoT ダッシュボード を開きます。
左上の Services をクリックし、その後 AWS IoT をクリックします。以下の画像を参照してください。
Get started ボタンをクリックします。
Create a Resource をクリックし、その後 Create a thing をクリックします。
任意の名前を入力します。ここでは "temperature" と名付けます。
Create をクリックして作成を完了し、その後 View thing をクリックして作成したものの情報を確認します。
Connect a device をクリックします。
Node JS を選択し、Generate certificate and policy をクリックします。
3つのファイルが表示されます。これらをダウンロードしてください。後で使用します。その後、Confirm & start connecting をクリックします。
AWS IoT Node.js SDK をダウンロードし、Return to Thing Detail をクリックします。
これでこのステップは完了です。次のステップに進みましょう。
BeagleBone Green のセットアップ
以下の画像のように Grove モジュールを BBG に接続します。
ソフトウェアの作業
SDK とキー ファイルを Cloud9 の examples フォルダにアップロード
- 以前にダウンロードした 3つのキー ファイルと Node JS SDK を覚えていますか?
- SDK とキー ファイルを Cloud9 の examples フォルダにアップロードします。
新しいターミナルを開く
SDK を解凍し、キーを正しい場所に移動する必要があります。
# cd examples
SDK ファイルを解凍します。
# unzip aws-iot-device-sdk-js-latest.zip
解凍されたフォルダに入ります。
# cd aws-iot-device-sdk-js
依存パッケージをインストールします。
# npm install
新しいフォルダ awsCerts を作成します。
# mkdir awsCerts && cd awsCerts
その後、3つのキー ファイルを新しいフォルダに移動します。
# mv ../../31f2fd2680-* .
31f2fd2680 は自身のキー ファイル番号に置き換えてください。
キー ファイルの名前を変更します。
# mv 31f2fd2680-certificate.pem.crt.txt certificate.pem.crt
# mv 31f2fd2680-private.pem.key private.pem.key
インターネットからファイルをダウンロードします。
# wget https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem
ダウンロードしたファイルの名前を root-CA.crt に変更します。
# mv VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem root-CA.crt
BBG 上でのプログラミング
examples フォルダに入ります。
cd .. && cd examples/
新しいファイル grove_temperature_sensor.py を作成します。
# vim grove_temperature_sensor.py
以下のコードをファイルにコピーしてください。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import math
import Adafruit_BBIO.GPIO as GPIO
from Adafruit_I2C import Adafruit_I2C
BUZZER = "P9_22" # GPIO P9_22
GPIO.setup(BUZZER, GPIO.OUT)
# ブザーをオンにする閾値は28度
THRESHOLD_TEMPERATURE = 28
ADDR_ADC121 = 0x50
REG_ADDR_RESULT = 0x00
REG_ADDR_ALERT = 0x01
REG_ADDR_CONFIG = 0x02
REG_ADDR_LIMITL = 0x03
REG_ADDR_LIMITH = 0x04
REG_ADDR_HYST = 0x05
REG_ADDR_CONVL = 0x06
REG_ADDR_CONVH = 0x07
i2c = Adafruit_I2C(ADDR_ADC121)
class I2cAdc:
def __init__(self):
i2c.write8(REG_ADDR_CONFIG, 0x20)
def read_adc(self):
"ADCデータを読み取る 0-4095"
data_list = i2c.readList(REG_ADDR_RESULT, 2)
#print 'data list', data_list
data = ((data_list[0] & 0x0f) << 8 | data_list[1]) & 0xfff
return data
adc = I2cAdc()
# read_temperature() メソッドの引数は接続されているGroveボード(Grove Temperature Sensor)のバージョンを定義します。
# デフォルトは 'v1.2' です。例:
# temp = read_temperature('v1.0') # B値 = 3975
# temp = read_temperature('v1.1') # B値 = 4250
# temp = read_temperature('v1.2') # B値 = 4250
def read_temperature(model = 'v1.2'):
"Grove Temperature Sensorから摂氏温度を読み取る"
# 各センサーのリビジョンは異なるサーミスタを使用しており、それぞれに固有のB値定数があります
if model == 'v1.2':
bValue = 4250 # センサーv1.2はサーミスタ ??? を使用(SeeedStudioが明確にするまでNCP18WF104F03RCを仮定)
elif model == 'v1.1':
bValue = 4250 # センサーv1.1はサーミスタNCP18WF104F03RCを使用
else:
bValue = 3975 # センサーv1.0はサーミスタTTC3A103*39Hを使用
total_value = 0
for index in range(20):
sensor_value = adc.read_adc()
total_value += sensor_value
time.sleep(0.05)
average_value = float(total_value / 20)
# ADCデータをArduinoプラットフォームのデータに変換
sensor_value_tmp = (float)(average_value / 4095 * 2.95 * 2 / 3.3 * 1023)
resistance = (float)(1023 - sensor_value_tmp) * 10000 / sensor_value_tmp
temperature = round((float)(1 / (math.log(resistance / 10000) / bValue + 1 / 298.15) - 273.15), 2)
return temperature
# 機能: 温度センサーがコードで設定した閾値に達すると、ブザーが1秒間鳴ります。
# ハードウェア: Grove - I2C ADC, Grove - Temperature Sensor, Grove - Buzzer
# 注意: P9_22(UART2_RXD)をGPIOとして使用。
# Grove BuzzerをBeaglebone GreenのUART Groveポートに接続。
# Grove - I2C ADCをBeaglebone GreenのI2C Groveポートに接続し、その後Grove - Temperature SensorをGrove - I2C ADCに接続。
if __name__ == '__main__':
while True:
try:
# Grove Temperature Sensorから摂氏温度を読み取る
temperature = read_temperature('v1.2')
# 温度が設定した閾値に達した場合、ブザーが鳴る
if temperature > THRESHOLD_TEMPERATURE:
# HIGHを送信してBUZZERをオンにする
GPIO.output(BUZZER, GPIO.HIGH)
else:
# LOWを送信してBUZZERをオフにする
GPIO.output(BUZZER, GPIO.LOW)
print "temperature = ", temperature
except KeyboardInterrupt:
GPIO.output(BUZZER, GPIO.LOW)
break
except IOError:
print "Error"
新しいファイル python_sensor.py を作成します。
新しいファイル python_sensor.py
を作成します。
#vim python_sensor.py
以下のコードを新しいファイルにコピーしてください。
import socket
import grove_temperature_sensor
if __name__ == "__main__":
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 7000))
while True:
temperature = grove_temperature_sensor.read_temperature('v1.2')
print temperature
client.sendall(str('%.2f' % temperature))
data = client.recv(1024)
print data
client.close()
print 'Received', repr(data)
新しいファイル rgbled.js
を作成します。
#vim rgbled.js
以下のコードを新しいファイルにコピーしてください。
var exec = require('child_process').exec;
var value = 0;
exports.initpins = function(){
exec("echo 3 > /sys/class/gpio/export", function(error, stdout, stderr){
if(error)
console.info('stderr : ' + stderr);
});
exec("echo out > /sys/class/gpio/gpio3/direction", function(error, stdout, stderr){
if(error)
console.info('stderr : ' + stderr);
});
exec("echo 2 > /sys/class/gpio/export", function(error, stdout, stderr){
if(error)
console.info('stderr : ' + stderr);
});
exec("echo out > /sys/class/gpio/gpio2/direction", function(error, stdout, stderr){
if(error)
console.info('stderr : ' + stderr);
});
}
digitalwrite = function(pin, state){
exec("echo " + state.toString() + " > /sys/class/gpio/gpio" + pin.toString() + "/value",
function(error, stdout, stderr){
if(error)
console.log('stderr : ' + stderr);
});
}
sleep = function(sleepTime) {
for(var start = +new Date; +new Date - start <= sleepTime; ) { }
}
clk = function(){
digitalwrite(2, 0);
sleep(2);
digitalwrite(2, 1);
sleep(2);
}
sendByte = function(b){
for(var i = 0; i < 8; i++){
if((b & 0x80) != 0)
digitalwrite(3, 1);
else
digitalwrite(3, 0);
clk();
b = b << 1;
}
}
setColor = function(red, green, blue){
var prefix = 0xc0;
if((blue & 0x80) == 0)
prefix |= 0x20;
if((blue & 0x40) == 0)
prefix |= 0x10;
if((green & 0x80) == 0)
prefix |= 0x08;
if((green & 0x40) == 0)
prefix |= 0x04;
if((red & 0x80) == 0)
prefix |= 0x02;
if((red & 0x40) == 0)
prefix |= 0x01;
sendByte(prefix);
sendByte(blue);
sendByte(green);
sendByte(red);
}
exports.setColorRGB = function(led, red, green, blue){
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
for(var i = 0; i < led; i++ ){
setColor(red, green, blue);
}
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
console.log("set rgb");
}
test = function(){
initpins();
while(1){
console.log("loop");
setColorRGB(1, 255, 0, 0);
setColorRGB(1, 0, 255, 0);
setColorRGB(1, 0, 0, 255);
setColorRGB(1, 0, 255, 255);
setColorRGB(1, 255, 0, 255);
setColorRGB(1, 255, 255, 0);
setColorRGB(1, 255, 255, 255);
}
}
新しいファイル shadow.js
を作成します。
vim shadow.js
以下のコードを新しいファイルにコピーしてください。
var awsIot = require('..');
var net = require('net');
var rgbled = require('./rgbled.js');
var exec = require('child_process').exec;
var myThingName = 'temperature';
var thingShadows = awsIot.thingShadow({
keyPath: '/var/lib/cloud9/examples/aws-iot-device-sdk-js/awsCerts/private.pem.key',
certPath: '/var/lib/cloud9/examples/aws-iot-device-sdk-js/awsCerts/certificate.pem.crt',
caPath: '/var/lib/cloud9/examples/aws-iot-device-sdk-js/awsCerts/root-CA.crt',
clientId: 'myAwsClientId',
region: 'us-west-2'
});
var HOST = '127.0.0.1';
var PORT = 7000;
var temperature = 25;
var red = 0;
var green = 0;
var blue = 0;
// サーバーインスタンスを作成し、listen関数をチェーンします
net.createServer(function(socket) {
console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
// このソケットインスタンスに 'data' イベントハンドラを追加
socket.on('data', function(data) {
console.log('DATA ' + socket.remoteAddress + ': ' + data);
temperature = data.toString().substr(0,5);
socket.write('This is your request: "' + data + '"');
});
// このソケットインスタンスに 'close' イベントハンドラを追加
socket.on('close', function(data) {
console.log('Socket connection closed... ');
});
}).listen(PORT, HOST);
//
// Thing Shadowの状態
//
var rgbLedLampState = {"state":{"desired":{"red":187,"green":114,"blue":222,value:25}}};
//
// thingShadows.update() 操作から返されるクライアントトークン値
//
var clientTokenUpdate;
thingShadows.on('connect', function() {
//
// AWS IoTプラットフォームに接続した後、
// 'RGBLedLamp' という名前のThing Shadowに関心を登録します。
//
thingShadows.register( myThingName );
//
// 登録後2秒後に、最新のデバイス状態で 'RGBLedLamp' という名前のThing Shadowを更新し、
// クライアントトークンを保存して、ステータスまたはタイムアウトイベントと関連付けることができます。
//
// 注意:遅延は最初の更新にのみ必要であり、
// デフォルトパラメータを使用したThing Shadow登録後の最初の更新に限ります。
// updateメソッドのAPIドキュメントを参照してください。
//
exec('python python_sensor.py',function(error,stdout,stderr){
if(stdout.length >1){
console.log('you offer args:',stdout);
}else {
console.log('you don\'t offer args');
}
if(error) {
console.info('stderr : '+stderr);
}});
rgbled.initpins();
setTimeout( function() {
clientTokenUpdate = thingShadows.update(myThingName, rgbLedLampState );
}, 2000 );
});
setInterval(function(){
new_data = {"state":{"desired":{"red":187,"green":114,"blue":222,value:temperature.toString()}}};
//new_data = {"state":{"desired":{"value":temperature.toString()}}};
console.log(new_data);
clientTokenUpdate = thingShadows.update(myThingName, new_data )
},2000);
thingShadows.on('status',
function(thingName, stat, clientToken, stateObject) {
console.log('received '+stat+' on '+thingName+': '+
JSON.stringify(stateObject));
});
thingShadows.on('delta',
function(thingName, stateObject) {
console.log('received delta '+' on '+thingName+': '+
JSON.stringify(stateObject));
//console.log(stateObject["state"]);
if(stateObject["state"]["red"] != red ||
stateObject["state"]["green"] != green||
stateObject["state"]["blue"] != blue)
rgbled.setColorRGB(1,stateObject["state"]["red"],
stateObject["state"]["green"],
stateObject["state"]["blue"]);
red = stateObject["state"]["red"];
green = stateObject["state"]["green"];
blue = stateObject["state"]["blue"];
});
thingShadows.on('timeout',
function(thingName, clientToken) {
console.log('received timeout '+' on '+thingName+': '+
clientToken);
});
myThingName の値(5行目)は、AWSアカウントで事前に作成したThing名と同じである必要があることに注意してください。
コードの実行
BBGの再起動が完了したら、コードを実行してください。
# cd examples/aws-iot-device-sdk-js/examples/
# node shadow.js
結果を確認する
次に、AWS IoT のウェブサイトを開き、アカウントにサインインします。そして数分前に作成した Thing をクリックします。これで温度がウェブサイトにアップロードされたことが確認できます。
Grove Chainable LED の色を変更したい場合は、Shadow の値を更新することができます。例:
BBG が新しい RGB 値を取得したことが確認できます。
そして Grove - Chainable RGB LED も緑色に変わります。
AWS IoT Services Getting Started Guide を参照して、AWS IoT に関する詳細情報を取得してください。
トラブルシューティング
192.168.7.2 にアクセスできない
192.168.7.2 にアクセスできない場合は、最新のソフトウェアを更新してください。
ステップ #1: 最新のソフトウェアイメージをダウンロードする
更新日時: 2015年11月15日
Google Drive から最新のイメージをダウンロードしてください。
ステップ #2: 圧縮ユーティリティをインストールする
7-zip をダウンロードしてインストールしてください。
ステップ #3: イメージを解凍する
7-zip を使用して .img ファイルをデスクトップまたは他のフォルダに解凍してください。
ステップ #4: SDカードプログラミングユーティリティをインストールする
Image Writer for Windows をダウンロードしてインストールしてください。バイナリ配布版をダウンロードすることを確認してください。
ステップ #5: SDカードをコンピュータに接続する
少なくとも8GBのmicroSDカードを使用し、SDアダプタまたはUSBアダプタを使用してSDカードをコンピュータに接続してください。
ステップ #6: SDカードにイメージを書き込む
Ubuntu Image Writer またはそのページの指示を使用して、解凍したイメージをSDカードに書き込んでください。
注意事項
1. デバイスを損傷する可能性があるという警告が表示される場合があります。これは、書き込み先がSDカードであることを確認している限り問題ありません。
2. この時点で BeagleBone をコンピュータに接続してはいけません。
ステップ #7: SDカードを取り出す
新しくプログラムされたSDカードを取り出してください。
ステップ #8: SDカードからボードを起動する
SDカードを(電源がオフの状態の)ボードに挿入し、USBケーブルまたは5Vアダプタで電源を供給してください。開始するとフラッシュLEDが点灯し、この再起動には最大10分かかる場合があります。最新のDebianフラッシャーイメージは完了時に自動的にボードの電源をオフにします。ボードの電源をオフにし、SDカードを取り外して再度電源を供給すると完了です。
頑張ってください。
ファームウェア更新
- 192.168.7.2 にアクセスできない問題を修正
- Windows 10 に対応
リソース
- 【PDF】AWS IoT Developer Guide
- 【PDF】AWS User Guide for BBG
- 【Github】AWS SDK for BeagleBone Green kit
- 【Github】Libraries for BeagleBone Green kit
- Main page of Beagleboard
- Grove - I2C Hub
- Grove - OLED Display 96*96
- Grove - Button
- Grove - Temperature sensor v1.2
- Grove - Sound sensor
- Grove - 3-Axis Digital Accelerometer ADXL345
技術サポートと製品ディスカッション
弊社の製品をお選びいただき、ありがとうございます!お客様が弊社製品をスムーズにご利用いただけるよう、さまざまなサポートをご提供しております。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。