Электронный компонент:Набор Grove IoT Starter Kit с Beaglebone Green и поддержкой AWS

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 1874 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Набор Grove IoT Starter Kit с Beaglebone Green и поддержкой AWS[1]

Aws kit bbg cover.JPG

Плата BeagleBone Green (BBG) – это совместная работа BeagleBoard.org и Seeed Studio. Она создана на основе BeagleBone Black, но имеет и нововведения – к примеру, два Grove-коннектора. Набор, о котором рассказывает эта статья, содержит плату BBG, десять Grove-модулей и пошаговые руководства, которые объясняют, как подключить эти компоненты друг к другу. Кроме того, все компоненты набора совместимы с облачными сервисами AWS (Amazon Web Services).

Купить набор можно по этой ссылке.

Функционал

  • Для сборки проектов не требуется ни пайки, ни макетной платы
  • Полная совместимость с сервисами и технологиями AWS
  • Пошаговые руководства

Что идет в комплекте

Aws kit bbg.JPG

С чего начать

Настройка сервиса AWS IoT

В самом начале нужно войти в аккаунт AWS IoT и выполнить определенные настройки.

1. Создайте аккаунт в AWS

2. Войдите в консоль и откройте панель управления AWS IoT. Для этого кликните по кнопке Services в левом верхнем углу, а затем на AWS IoT

AWS LinkIt starter kit click service 1.jpg


AWS LinkIt starter kit click iot 2.png


3. Нажмите на кнопку Get Started

AWS LinkIt starter kit click get started 3.jpg

4. Кликните на Create a Resource, а затем – на Create a thing

AWS LinkIt starter kit click create a thing 4.jpg


AWS LinkIt starter kit view a thing 5.jpg


AWS LinkIt starter kit name a thing 6.png


5. Введите название для «вещи» (т.е. «thing»). В моем случае это «temperature»

BbgAWSCreateAThing 7.png

6. Кликните на Create, чтобы завершить создание «вещи», а затем на View thing, чтобы посмотреть информацию о созданной «вещи»

BbgAWSViewThing 8.png

7. Кликните на Connect a device

BbgAWSConnectADevice 9.png

8. Выберите пункт Node JS и кликните на Generate certificate and policy

BbgAWSGenerate 10.png

9. Вы получите ссылки на три файла. Загрузите их, позже они нам понадобятся. Затем кликните на Confirm & start connecting

BbgAWSConfirm 11.png

10. Теперь загрузите «AWS IoT Node.js SDK» и кликните на Return to Thing Detail

BbgAWSReturn 12.png

Настройка AWS IoT завершена. Переходим к следующему шагу.

Настройка Beaglebone Green

Подключите BBG к ПК через кабель MicroUSB и дайте BBG получить доступ к интернету. Если вы первый раз используете BBB/BBG, то ознакомительную статью можно прочесть тут.

Подключите Grove-модули к BBG как показано на картинке ниже:

BbgAWSSetup.jpg

Настройка ПО

Загрузка SDK и файлов ключей в Cloud9

Помните о трех файлах ключей и SDK, которые мы загрузили выше? Теперь они нам пригодятся.

BbgAWSFile 1.png

Загрузите SDK и файлы ключей в папку «examples» Cloud9.

BbgAWSUpload1 2.png


BbgAWSUpload2 3.png

Установка SDK и ключей (сертификатов)

Теперь нам нужно распаковать SDK и переместить файлы ключей (сертификатов) в нужное место. Кликаем в Cloud9 на Window > New Terminal:

BbgAWSUNzip.png

Переходим в папку «examples»:

# cd examples

Распаковываем архив с SDK:

# unzip aws-iot-device-sdk-js-latest.zip

Переходим в распакованную папку:

#cd aws-iot-device-sdk-js

Устанавливаем зависимые пакеты:

# npm install
BbgAWSMkdir.png

Создаем новую папку под названием «awsCerts»:

# mkdir awsCerts && cd awsCerts

Перемещаем в эту папку три файла ключей (обратите внимание, что «31f2fd2680» нужно заменить на номер своего сертификата):

# mv ../../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
BbgAWSRename.png

Запись прошивки на BBG

Войдите в папку «examples»:

# cd .. && cd examples/
BbgAWSexamples.png

Создайте новый файл под названием «grove_temperature_sensor.py»:

# vim grove_temperature_sensor.py

Скопируйте в этот файл следующий код:

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import time
  5. import math
  6. import Adafruit_BBIO.GPIO as GPIO
  7. from Adafruit_I2C import Adafruit_I2C
  8. BUZZER = "P9_22"            # GPIO P9_22
  9. GPIO.setup(BUZZER, GPIO.OUT)
  10.  
  11. # Температурный порог для включения зуммера – 28 градусов:
  12. THRESHOLD_TEMPERATURE = 28
  13. ADDR_ADC121 = 0x50
  14.  
  15. REG_ADDR_RESULT = 0x00
  16. REG_ADDR_ALERT = 0x01
  17. REG_ADDR_CONFIG = 0x02
  18. REG_ADDR_LIMITL = 0x03
  19. REG_ADDR_LIMITH = 0x04
  20. REG_ADDR_HYST = 0x05
  21. REG_ADDR_CONVL = 0x06
  22. REG_ADDR_CONVH = 0x07
  23.  
  24. i2c = Adafruit_I2C(ADDR_ADC121)          
  25.  
  26. class I2cAdc:
  27.     def __init__(self):
  28.         i2c.write8(REG_ADDR_CONFIG, 0x20)
  29.  
  30.     def read_adc(self):
  31.         # считываем АЦП-данные (0-4095):
  32.         "Read ADC data 0-4095."
  33.         data_list = i2c.readList(REG_ADDR_RESULT, 2)
  34.         #print 'data list', data_list
  35.         data = ((data_list[0] & 0x0f) << 8 | data_list[1]) & 0xfff
  36.         return data
  37. adc = I2cAdc()
  38.  
  39. #  Аргумент в функции read_temperature() определяет,
  40. #  какую версию (температурного) Grove-модуля вы подключили.
  41. #  По умолчанию стоит 'v1.2':
  42. #       temp = read_temperature('v1.0')          # значение «B» = 3975
  43. #       temp = read_temperature('v1.1')          # значение «B» = 4250
  44. #       temp = read_temperature('v1.2')          # значение «B» = 4250
  45. def read_temperature(model = 'v1.2'):
  46.     #  «Считывание температуры (в Цельсиях) с температурного датчика»:
  47.     "Read temperature values in Celsius from Grove Temperature Sensor"
  48.     #  Разные версии датчика используют разные термисторы,
  49.     #  и у каждого – собственное значение константы «B»:
  50.     if model == 'v1.2':
  51.         #  Неизвестно, какой термистор использует датчик v1.2.
  52.         #  Пока Seeed Studio не уточнит этот вопрос,
  53.         #  предполагается, что это NCP18WF104F03RC:
  54.         bValue = 4250
  55.     elif model == 'v1.1':
  56.         #  Датчик v1.1 использует термистор NCP18WF104F03RC:
  57.         bValue = 4250
  58.     else:
  59.         #  Датчик v1.0 использует термистор TTC3A103*39H:
  60.         bValue = 3975
  61.  
  62.     total_value = 0
  63.     for index in range(20):
  64.         sensor_value = adc.read_adc()
  65.         total_value += sensor_value
  66.         time.sleep(0.05)
  67.     average_value = float(total_value / 20)
  68.  
  69.     # Трансформируем АЦП-данные в данные платформы Arduino:
  70.     sensor_value_tmp = (float)(average_value / 4095 * 2.95 * 2 / 3.3 * 1023)
  71.     resistance = (float)(1023 - sensor_value_tmp) * 10000 / sensor_value_tmp
  72.     temperature = round((float)(1 / (math.log(resistance / 10000) / bValue + 1 / 298.15) - 273.15), 2)
  73.     return temperature
  74.  
  75. # Функция: Если температурный датчик определит температуру,
  76. # которая превышает заданный порог, это активирует зуммер,
  77. # который будет издавать звук в течение 1 секунды.
  78. #
  79. # Устройства:
  80. # * Grove-модуль с АЦП (шина I2C)
  81. # * Grove-модуль с температурным датчиком
  82. # * Grove-модуль с зуммером
  83. #
  84. # Примечание: В качестве GPIO-контакта используйте P9_22(UART2_RXD)
  85. #
  86. # Подключите Grove-модуль с АЦП (I2C) к Grove-порту (I2C) BBG.
  87. # Подключите Grove-модуль с температурным датчиком
  88. # к Grove-модулю с АЦП (I2C).
  89.  
  90. if __name__ == '__main__':
  91.  
  92.     while True:
  93.         try:
  94.             # Считываем градусы Цельсия с температурного датчика:
  95.             temperature = read_temperature('v1.2')
  96.  
  97.             # Когда температура достигает заданного значения,
  98.             # активируем зуммер:
  99.             if temperature > THRESHOLD_TEMPERATURE:
  100.                 # Отправляем HIGH, чтобы включить зуммер:
  101.                 GPIO.output(BUZZER, GPIO.HIGH)
  102.             else:
  103.                 # Отправляем LOW, чтобы выключить зуммер:
  104.                 GPIO.output(BUZZER, GPIO.LOW)
  105.  
  106.             print "temperature = ", temperature
  107.  
  108.         except KeyboardInterrupt:
  109.             GPIO.output(BUZZER, GPIO.LOW)
  110.             break
  111.  
  112.         except IOError:
  113.             print "Error"

Создайте новый файл под названием «python_sensor.py»:

#vim  python_sensor.py

Скопируйте в этот файл код ниже:

  1. import socket
  2. import grove_temperature_sensor
  3. if __name__ == "__main__":
  4.     client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5.     client.connect(('127.0.0.1', 7000))
  6.  
  7.     while True:
  8.         temperature = grove_temperature_sensor.read_temperature('v1.2')
  9.     print temperature
  10.         client.sendall(str('%.2f'%temperature))
  11.     data = client.recv(1024)
  12.     print data
  13.     client.close()
  14.  
  15.     print 'Received', repr(data)

Создайте новый файл под названием «rgbled.js»:

#vim rgbled.js

Скопируйте в него следующий код:

  1. var exec = require('child_process').exec;
  2. var value = 0;
  3.  
  4. exports.initpins = function(){
  5.     exec("echo 3 > /sys/class/gpio/export",function(error,stdout,stderr){
  6.         if(error)
  7.                 console.info('stderr : '+stderr);
  8.     });
  9.     exec("echo out > /sys/class/gpio/gpio3/direction",function(error,stdout,stderr){
  10.                 if(error)
  11.                         console.info('stderr : '+stderr);
  12.         });
  13.  
  14.     exec("echo 2 > /sys/class/gpio/export",function(error,stdout,stderr){
  15.                 if(error)
  16.                         console.info('stderr : '+stderr);
  17.         });
  18.  
  19.     exec("echo out > /sys/class/gpio/gpio2/direction",function(error,stdout,stderr){
  20.                 if(error)
  21.                         console.info('stderr : '+stderr);
  22.         });
  23.  
  24. }
  25. digitalwrite = function(pin,state){
  26.     exec("echo "+state.toString()+" > /sys/class/gpio/gpio"+pin.toString()+"/value",
  27.         function(error,stdout,stderr){
  28.                     if(error)
  29.                             console.log('stderr : '+stderr);
  30.         });
  31.  
  32. }
  33. sleep = function(sleepTime) {
  34.     for(var start = +new Date; +new Date - start <= sleepTime; ) { }
  35. }
  36. clk = function(){
  37.         digitalwrite(2,0);
  38.         sleep(2);
  39.                 digitalwrite(2,1);
  40.         sleep(2);
  41. }
  42. sendByte = function(b){
  43.     for(var i = 0 ; i < 8 ;i++){
  44.         if((b & 0x80) != 0)
  45.             digitalwrite(3,1);
  46.         else
  47.             digitalwrite(3,0);
  48.         clk();
  49.         b = b << 1;
  50.     }
  51. }
  52. setColor = function(red,green,blue){
  53.     var prefix = 0xc0;
  54.     if((blue & 0x80) == 0)
  55.         prefix |= 0x20;
  56.     if((blue & 0x40) == 0)
  57.         prefix |= 0x10;
  58.     if((green & 0x80) == 0)
  59.         prefix |= 0x08;
  60.     if((green & 0x40) == 0)
  61.         prefix |= 0x04;
  62.     if((red & 0x80) == 0)
  63.         prefix |= 0x02;
  64.     if((red & 0x40) == 0)
  65.         prefix |= 0x01;
  66.     sendByte(prefix);
  67.     sendByte(blue);
  68.     sendByte(green);
  69.     sendByte(red);
  70. }
  71. exports.setColorRGB = function(led,red,green,blue){
  72.     sendByte(0x00);
  73.     sendByte(0x00);
  74.     sendByte(0x00);
  75.     sendByte(0x00);
  76.     for(var i = 0; i < led; i++ ){
  77.         setColor(red,green,blue);
  78.     }
  79.     sendByte(0x00);
  80.     sendByte(0x00);
  81.     sendByte(0x00);
  82.     sendByte(0x00);
  83.     console.log("set rgb");
  84. }
  85. test = function(){
  86.     initpins();
  87.     while(1){
  88.     console.log("loop");
  89.         setColorRGB(1, 255, 0, 0)
  90.         setColorRGB(1, 0, 255, 0)
  91.         setColorRGB(1, 0, 0, 255)
  92.         setColorRGB(1, 0, 255, 255)
  93.         setColorRGB(1, 255, 0, 255)
  94.         setColorRGB(1, 255, 255, 0)
  95.         setColorRGB(1, 255, 255, 255)
  96.     }
  97. }

Создайте новый файл под названием «shadow.js»:

#vim shadow.js

Вставьте туда следующий код:

  1. var awsIot = require('..');
  2. var net = require('net');
  3. var rgbled = require('./rgbled.js');
  4. var exec = require('child_process').exec;    
  5. var myThingName = 'temperature';
  6. var thingShadows = awsIot.thingShadow({
  7.    keyPath: '/var/lib/cloud9/examples/aws-iot-device-sdk-js/awsCerts/private.pem.key',
  8.   certPath: '/var/lib/cloud9/examples/aws-iot-device-sdk-js/awsCerts/certificate.pem.crt',
  9.     caPath: '/var/lib/cloud9/examples/aws-iot-device-sdk-js/awsCerts/root-CA.crt',
  10.   clientId: 'myAwsClientId',
  11.     region: 'us-west-2'
  12. });
  13. var HOST = '127.0.0.1';
  14. var PORT = 7000;
  15. var temperature = 25;
  16. var red = 0;
  17. var green = 0;
  18. var blue = 0;
  19.  
  20. //  создаем экземпляр класса для сервера
  21. //  и привязываем к нему прослушивающую функцию:
  22. net.createServer(function(socket) {
  23.     console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
  24.     //  добавляем экземпляру класса для гнезда
  25.     //  обработчик событий «DATA»:
  26.     socket.on('data', function(data) {
  27.         console.log('DATA ' + socket.remoteAddress + ': ' + data);
  28.         temperature = data.toString().substr(0,5);
  29.         socket.write('This is your request: "' + data + '"');
  30.                  //  "Это ваш запрос: "
  31.     });
  32.     //  добавляем экземпляру класса для гнезда
  33.     //  обработчик события «close»:
  34.     socket.on('close', function(data) {
  35.         console.log('Socket connection closed... ');
  36.                 //  "Соединение с гнездом закрыто... "
  37.     });
  38. }).listen(PORT, HOST);
  39. //
  40. //  Состояние тени вещи (т.е. состояние
  41. //  виртуальной репрезентации устройства).
  42. //  «Тень» (shadow) в терминологии AWS –
  43. //  это виртуальная репрезентация, а «вещь» (thing) – это устройство.
  44. //
  45. var rgbLedLampState = {"state":{"desired":{"red":187,"green":114,"blue":222,value:25}}};
  46.  
  47. //
  48. // Токен клиента, возвращенный функцией thingShadows.update()
  49. //
  50. var clientTokenUpdate;
  51.  
  52. thingShadows.on('connect', function() {
  53. //
  54. // Подключившись к платформе AWS IoT, регистрируем интерес в тени вещи
  55. // под названием «RGBLedLamp». «Зарегистрировать интерес» - это значит
  56. // подписать класс thingShadows на все доступные топики, а также
  57. // скомандовать ему запускать события для myThingName,
  58. // пока не будет вызвана функция unregister().
  59. //
  60.     thingShadows.register( myThingName );
  61. //
  62. // Спустя 2 секунды после регистрации обновляем тень вещи 'RGBLedLamp'
  63. // новыми данными и сохраняем clientToken, чтобы его можно было
  64. // соотнести с событиями таймаута и статуса.
  65. //
  66. // Обратите внимание, что для последующих апдейтов задержка не нужна.
  67. // Задержка нужна только для первого апдейта после регистрации
  68. // интереса, которая использует параметры по умолчанию.
  69. // Более подробно об апдейте читайте в документации к API.
  70. //
  71.     exec('python python_sensor.py',function(error,stdout,stderr){
  72.             if(stdout.length >1){
  73.                 console.log('you offer args:',stdout);
  74.             }else {
  75.                 console.log('you don\'t offer args');
  76.             }
  77.             if(error) {
  78.                 console.info('stderr : '+stderr);
  79.             }});
  80.     rgbled.initpins();
  81.     setTimeout( function() {
  82.        clientTokenUpdate = thingShadows.update(myThingName, rgbLedLampState );
  83.        }, 2000 );
  84.     });
  85. setInterval(function(){
  86.         new_data = {"state":{"desired":{"red":187,"green":114,"blue":222,value:temperature.toString()}}};
  87.         //new_data = {"state":{"desired":{"value":temperature.toString()}}};
  88.         console.log(new_data);
  89.        clientTokenUpdate = thingShadows.update(myThingName, new_data )
  90. },2000);
  91. thingShadows.on('status',
  92.     function(thingName, stat, clientToken, stateObject) {
  93.        console.log('received '+stat+' on '+thingName+': '+
  94.                    JSON.stringify(stateObject));
  95.     });
  96.  
  97. thingShadows.on('delta',
  98.     function(thingName, stateObject) {
  99.        console.log('received delta '+' on '+thingName+': '+
  100.                    JSON.stringify(stateObject));
  101.         //console.log(stateObject["state"]);
  102.     if(stateObject["state"]["red"]      != red ||
  103.        stateObject["state"]["green"]  != green||
  104.       stateObject["state"]["blue"]    != blue)
  105.             rgbled.setColorRGB(1,stateObject["state"]["red"],
  106.                         stateObject["state"]["green"],
  107.                         stateObject["state"]["blue"]);
  108.  
  109.     red = stateObject["state"]["red"];
  110.     green = stateObject["state"]["green"];
  111.     blue = stateObject["state"]["blue"];
  112.     });
  113.  
  114. thingShadows.on('timeout',
  115.     function(thingName, clientToken) {
  116.        console.log('received timeout '+' on '+thingName+': '+
  117.                    clientToken);
  118.     });

Обратите внимание, что myThingName в 5-ой строчке нужно поменять на название своей вещи, которую вы создали ранее в аккаунте AWS.

Запуск кода

Перезагрузив BBG, запускаем код:

# cd examples/aws-iot-device-sdk-js/examples/
# node shadow.js
BbgAWSRun.png

Просмотр результата

Открываем страницу AWS IoT и заходим в аккаунт. Кликаем на вещь, которую мы создали несколько минут назад. Вы должны увидеть, как на сайт загружаются данные о температуре:

BbgAWSResult 1.png

Здесь также можно изменить цвет RGB-светодиода. Для этого измените значения в коде, который находится справа, в поле «Shadow state»:

BbgAWSChange 2.png

Как видите, BBG получила новое значение для RGB-светодиода...

BbgAWSRGB.png

...а сам RGB-светодиод загорелся зеленым цветом:

BbgAWSGreen 3.png

Более подробно об AWS IoT читайте в ознакомительном руководстве AWS IoT.

Решение проблем

Проблема 1: Не могу открыть IP-адрес «192.168.7.2».

Чтобы исправить эту проблему, нужно установить последнюю версию прошивки. Для этого нужно сделать следующее:

Шаг 1. Загрузите образ с последней версией

Сделать это можно отсюда.

AWS BBG 4 4.png

Шаг 2: Установите утилиту-архиватор

Загрузите и установите 7-zip.

AWS BBG 1 5.png

Шаг 3: Разверните образ

При помощи 7-zip разверните файл «*.img» на рабочий стол или в другую папку.

Шаг 4: Установите утилиту для записи прошивки на SD-карту

Загрузите и установите Image Writer (Windows). Убедитесь, что загружаете двоичную версию.

AWS BBG 2 6.png

Шаг 5: Подключите SD-карту к компьютеру

Для этого воспользуйтесь SD-адаптером или USB-адаптером. Потребуется карта MicroSD объемом не менее 8 Гб.

Шаг 6: Запишите образ на SD-карту

Запишите развернутый образ на SD-карту, подключенную к компьютеру.

AWS BBG 3 7.png

Примечания:

  • Может появиться предупреждение о возможном повреждении устройства. Пока вы используете SD-карту для записи, его можно проигнорировать
  • Плату BeagleBone к компьютеру подключать не нужно

Шаг 7: Вытащите SD-карту

Отключите запрограммированную SD-карту от компьютера.

Шаг 8: Загрузите в плату прошивку с SD-карты

Вставьте SD-карту в (выключенную) плату, а затем подключите к ней питание – либо через USB-кабель, либо через 5-вольтовый адаптер. Если запись прошивки началась, у платы начнет мигать светодиод flash-памяти, и эта перезагрузка займет до 10 минут. Записав прошивку, флэшер Debian автоматически выключит плату. Теперь отключите питание от платы, выньте SD-карту и снова подключите к ней питание.

Техническая поддержка

Если у вас возникнут какие-то проблемы, обратитесь на форум.

Прошивка

Последняя версия – от 15.11.2015

  • Исправляет проблему с невозможностью открыть IP-адрес «192.168.7.2»
  • Добавлена поддержка Windows 10

Полезные ссылки

См.также

Внешние ссылки

  1. wiki.seeed.cc - Beagle Bone Green and Grove IoT Starter Kit Powered by AWS