Pull to refresh
0

Кушать подано, садитесь подключать, пожалуйста

Reading time17 min
Views29K
Сегодня Intel Edison с набором датчиков и актюаторов поможет нам сделать следующее: сыграть песенку «В траве сидел кузнечик», определить, хорошо ли течет вода, горит ли огонь, перекачать воду, проверить есть ли в воздухе пары спирта, пыльная ли комната, проследить, как закипает чайник, определить свои координаты, найти магнит. И что-нибудь ещё.



Мы рассмотрим следующие датчики и актюаторы, и как их использовать с Intel Edison.
  • Grove — Hall Sensor – датчик Холла.
  • Grove – Speaker – динамик.
  • Grove — Flame Sensor – датчик огня.
  • Grove — LED Bar – светодиодный прогресс индикатор.
  • Grove – Encoder – датчик поворота.
  • Grove — Gas Sensor (MQ5) – датчик газа.
  • Grove — Air quality sensor – датчик качества воздуха.
  • Grove — Infrared Temperature Sensor – ИК измеритель температуры.
  • G1/4" Water Flow Sensor – датчик потока воды.
  • Grove — I2C Motor Driver – драйвер мотора.
  • 6V mini water pump – водный насос.
  • Grove — Digital Light Sensor – датчик освещения.
  • Grove — Alcohol Sensor – датчик алкоголя.
  • Grove — Dust Sensor – датчик пыли.
  • Planet Geared Motor F280 – мотор.
  • Grove – GPS – GPS-модуль.

Примеры работы датчиков можно посмотреть на видео:



Если вы до этого момента не работали с датчиками и Intel Edison посмотрите предыдущую статью.
Прежде чем начнем, небольшое замечание. Если в процессе запуска примеров, у вас будет ошибка при работе с функциями UPM, например, появится следующее сообщение:
Cannot find module 'jsupm_rotaryencoder'

Значит, вам надо обновить установленные пакеты, в том числе UPM. Делается это очень просто, командой:
opkg upgrade

Желательно обновлять и прошивку самой платы.

Датчик Холла




Grove — Hall Sensor. SKU: SEN14034P

Применение: Определение наличия магнитного поля. Определение частоты вращения.
Для определения частоты вращения, например, колеса, можно укрепить магнит на колесе и поставить датчик рядом с тем местом, с которым будет проходить магнит, при вращении. Тогда в момент их сближения будет сигнал.

Датчик Холла подключается к любому цифровому входу D2-D8. Выдает 0 – при наличии магнитного поля, 1 – при его отсутствии. На плате датчика расположен светодиод, который включается при появлении магнитного поля.

Пример программы, в которой при отсутствии магнитного поля горит встроенный на плате Intel Edison светодиод. А при наличии он выключается.
Датчик подключаем к D2.

Программа отправляет на встроенный светодиод (D13), значение, считанное с датчика Холла. Используем библиотеку MRAA.

Исходный код main.js
var mraa = require('mraa');

var hallSensor = new mraa.Gpio(2);
hallSensor.dir(mraa.DIR_IN);

var myOnboardLed = new mraa.Gpio(13);
myOnboardLed.dir(mraa.DIR_OUT);

periodicActivity();

function periodicActivity()
{
    var value = hallSensor.read();
    myOnboardLed.write(value);
    setTimeout(periodicActivity,20);
}

Динамик




Grove – Speaker. SKU: COM05051P

Подключается к цифровому выходу. Сигнал, который подается на этот выход, устанавливается на динамике. Поэтому, если быстро менять сигнал с определенной частотой, можно воспроизвести звук. Громкость можно менять подстроечным резистором.

В библиотеке UPM есть функции работы с динамиком.

Пример воспроизведения одной ноты.
var groveSpeaker = require('jsupm_grovespeaker');
var mySpeaker = new groveSpeaker.GroveSpeaker(2); // подключаем к D2
mySpeaker.playSound('a’, true, "med");// Ля

Функция:
playSound('a', false, "med");

Первый параметр, нота 'a', 'b', 'c', 'd', 'e', 'f', или 'g' (ля, си, до, ре, ми, фа, соль).
Второй параметр, надо ли использовать Диез для этой ноты.
Третий параметр, октава, может быть «low», «med», или «high».
Длительность задавать нельзя, но каждая нота звучит примерно 0.1 секунды.

Похоже, что звук воспроизводится программно, т. к. динамик можно подключать к любому цифровому выходу. И из-за этого звук получается не особенно чистый, он подхрипывает.

Поэтому для работы со звуком удобно использовать ШИМ, так как он позволяет аппаратно генерировать сигнал. (Про работу с ШИМ, можно почитать в предыдущей статье).

Динамик подключим к D3, так как он поддерживает ШИМ. (Контакты, которые поддерживают ШИМ, на плате обозначаются тильдой "~", это D3, D5, D6).

Например, вот так можно воспроизвести ноту Ля в течение одной секунды.

Исходный код main.js
var mraa = require("mraa"); 
var pwm3 = new mraa.Pwm(3);

freq = 440; // Нота Ля
var period = 1000000 / freq;

pwm3.period_us(period);
pwm3.pulsewidth_us(period/2);
pwm3.enable(true);

setTimeout( function(){pwm3.enable(false);}, 1000);

Теперь перейдем к хардкору и вручную запрограммируем мелодию «В траве сидел кузнечик», которая будет звучать чисто и прекрасно.

Исходный код main.js
var mraa = require("mraa"); 
var pwm3 = new mraa.Pwm(3);

// частоты нот первой октавы в Гц
// До, До-диез, Ре, Ре-диез, Ми, Фа, Фа-диез, Соль, Соль-диез, Ля, Си-бемоль, Си
var freq = [261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16, 493.88 ];

// В траве сидел кузнечик
// мелодия. пары N,V
// N-номер ноты (-1-пауза), длительность 1/V
var notes = [
9,4,
4,4,
9,4,
4,4,
9,4,
8,4,
8,2,
8,4,
4,4,
8,4,
4,4,
8,4,
9,4,
9,2,
9,4,
4,4,
9,4,
4,4,
9,4,
8,4,
8,2,
8,4,
4,4,
8,4,
4,4,
8,4,
9, 1.33];

var currNote = 0;
var baseValue = 1000;// базовая длительность ноты в мс

nextNote();

function nextNote()
{
    pwm3.enable(false);
    
    if( currNote >= notes.length / 2  )
    {
        return;
    }
    
    var note =  notes[currNote*2];
    var value = notes[currNote*2+1];
    
    // Коэффициент октавы:
    // 0.25 - большая октава
    // 0.5 - малая октава
    // 1 - первая октава
    // 2 - вторая октава
    // 4 - третья октава
    // 8 - четвертая октава
    // 16 - пятая октава
    var octaveScale = 2;// Сыграем во второй октаве, так веселее 
    
    console.log('note='+note+' value='+value);
    
    if( note >= 0 )
    {
        var frequency = freq[ note ] * octaveScale;
        var period = 1000000 / frequency;

        console.log('frequency='+frequency+ ' Hz');
        
        pwm3.period_us(period);
        pwm3.pulsewidth_us(period/2);
        pwm3.enable(true);
    }
    
    currNote++;
    setTimeout( nextNote, baseValue/value);   
}

Датчик потока воды




G1/4" Water Flow Sensor. SKU: TEM01071B

Датчик позволяет определить количество проходящей через него воды. Диапазон от 0.3 до 6 литров в минуту. На крышке стрелкой показано направление движения воды.
Внутри сенсора стоит датчик Холла, срабатывающий при вращении внутренней крыльчатки. Частота его срабатывания пропорциональна объему протекающей воды. На выводе датчика меняется сигнал 0 и 1. Мы будем следить за значением сигнала на выходе сенсора и учитывать его изменение с 0 на 1.
Подсчитаем количество импульсов за секунду, то есть частоту их следования. Формула перевода частоты в поток, следующая:
L = Q /73,
где Q – частота импульсов (Гц).
L – поток (л/минуту)

С подключением датчика есть небольшие проблемы. У него нет стандартных разъемов. Установлен трехконтактный, а надо четырёх. Но решается просто, если у вас есть три провода Male-Male. Они хорошо вставляются в разъемы.

Подключим датчик к D2.
Программа работает следующим образом. Сделаем два таймера. Первый будет срабатывать раз в миллисекунду и проверять состояние датчика. Если значение из 0 перешло в 1, увеличиваем счетчик импульсов.
Второй таймер будет срабатывать раз в секунду. Он считывает значение подсчитанных импульсов.
Так как мы берем 1 секунду для накопления, то минимальное значение потока будет 1/73 = 0.013 л/мин.
Надо учесть, что алгоритм без прерываний работает менее точно, так как если импульсы приходят слишком часто, то мы их не заметим. У меня на тестах, нормально работало около 230 импульсов в секунду, это около 3 литров в минуту. Если увеличивать скорость, то вычисленное значение начинает уменьшаться. Значение выводится на LCD экран. Для подведения к датчику воды, я купил в магазине шланг диаметром 4 мм.

Исходный код main.js
var mraa = require('mraa'); 

var jsUpmI2cLcd = require ('jsupm_i2clcd');
var lcd = new jsUpmI2cLcd.Jhd1313m1(0, 0x3E, 0x62);

lcd.setColor(10,10,10);

var waterFlowSensor = new mraa.Gpio(2); 

waterFlowSensor.dir(mraa.DIR_IN); 

var prev = waterFlowSensor.read();
var count  = 0;

setInterval( checkSensor, 1 );
setInterval( countProc, 1000 );

function checkSensor()
{
    var curr = waterFlowSensor.read();
    
    // Отслеживаем переход на 1
    if( prev === 0 && curr === 1 )
    {
        count++;
    }
    
    prev = curr;
}

function countProc()
{
    var litres = count / 73;
    var currCount = count;
    count = 0;
    
    console.log('count='+currCount+ ' water=' + litres + ' Litres/hour, water=' + (litres/60) + 'L/min');
    
    lcd.setCursor(0,0);
    lcd.write("Count=" + currCount + '    ');
    lcd.setCursor(1,0);
    lcd.write("Flow=" + parseFloat(litres).toFixed(2)+ ' L/min   ');
}

Датчик огня




Grove — Flame Sensor. SKU: SEN05082P

Датчик реагирует на присутствие огня, а точнее на излучение с длинной волны 760nm — 1100nm. Есть возможность настраивать чувствительность с помощью подстроечного резистора. У меня в тесте датчик не реагировал на помещенный рядом с ним зелёный светодиод. Реагировал на белый светодиодный фонарик, только когда центр его луча направлялся на сенсор. При включении газовой зажигалки, датчик срабатывал на расстоянии около 50 сантиметров. Примерно на таком же расстоянии он срабатывал от зажженной спички. Датчик срабатывает и от пульта дистанционного управления. Скорее всего, используется такой же фотодиод, как в бытовой технике. Реагирует на солнечный свет. Но так как чувствительность настраивается, то можно подстроить, чтобы не было ложных срабатываний.
В инструкции сказано, что расстояние срабатывания 0-1 м.

Пример, в котором датчик подключается к D2 и его значение показывается на встроенном на плате светодиоде.

Исходный код main.js
var mraa = require('mraa');

var flameSensor = new mraa.Gpio(2);
flameSensor.dir(mraa.DIR_IN);

var myOnboardLed = new mraa.Gpio(13);
myOnboardLed.dir(mraa.DIR_OUT);

periodicActivity();

function periodicActivity()
{
    var value = flameSensor.read();
    myOnboardLed.write(1-value);
    setTimeout(periodicActivity,20);
}

Бесконтактный ИК датчик температуры




Grove — Infrared Temperature Sensor. SKU: SEN01041P

Бесконтактный инфракрасный датчик температуры. Рабочее расстояние 9 см. Рекомендуется подбирать расстояние экспериментально, настраивая по тающей и кипящей воде.
Надо использовать UPM. Датчик выдает две температуры. Одну окружающей среды, другую измеряемого объекта. Внутри используется сенсор TP-538U.

Пример программы. Датчик подключим к A0 (будут использованы пины A0 и A1). Данные выводятся на консоль и ЖК-экран.

Исходный код main.js
var OTP538U_AREF = 5.0;// напряжение питания
var tempIRSensor_lib = require('jsupm_otp538u');

// ЖК-экран
var jsUpmI2cLcd = require ('jsupm_i2clcd');
var lcd = new jsUpmI2cLcd.Jhd1313m1(0, 0x3E, 0x62);

// Подключаем к A0 (используются пины A0 и A1)
// A0 - внешняя температура
// A1 - температура объекта
var tempIRSensor_obj = new tempIRSensor_lib.OTP538U(0, 1, OTP538U_AREF);

function checkTemp()
{
    var tempAmb = tempIRSensor_obj.ambientTemperature();
    var tempObj = tempIRSensor_obj.objectTemperature();

    var tempAmbStr = parseFloat(tempAmb).toFixed(2);
    var tempObjStr = parseFloat(tempObj).toFixed(2);
    
    var outputStr = "Ambient temp: " + tempAmbStr + " C, "
                    +"Object temp: " + tempObjStr + " C";
    
    lcd.setCursor(0,0);
    lcd.write('amb='+tempAmbStr+'    ');

    lcd.setCursor(1,0);
    lcd.write('obj='+tempObjStr+'    ');

    console.log(outputStr);
}

setInterval(checkTemp, 1000);

Датчик ультрафиолета




Grove — UV Sensor. SKU: SEN00700P

Датчик подключается к аналоговому входу. Можно просто считывать значение, а можно использовать UPM для перевода в напряжение. При этом библиотека сама усредняет значение, выполняя серию замеров. Из-за этого получение данных с датчика может притормаживать.

Исходный код main.js
var UVSensor = require('jsupm_guvas12d');

// Подключаем к A0
var myUVSensor = new UVSensor.GUVAS12D(0);

var g_GUVAS12D_AREF = 5.0;// напряжение
var g_SAMPLES_PER_QUERY = 1024;

setInterval(function()
{
    var val = myUVSensor.value(g_GUVAS12D_AREF, g_SAMPLES_PER_QUERY);
    var valStr = parseFloat(val).toFixed(6);

	var outputStr = "AREF: " + g_GUVAS12D_AREF 
					+ ", Voltage value (higher means more UV): "
					+ valStr;
	console.log(outputStr);
}, 1000);

В комнате с хорошим солнечным рассеянным освещением, но с закрытыми окнами, значение 0.283203. Если поднести его к окну на прямые лучи от солнца, но за тройным стеклопакетом, то значение поднимается до 0.473633. Если же открыть окно, то получается максимум 4.980469.

Прогресс бар




Grove — LED Bar. SKU: LED05031P

Прогресс бар состоит из 10 светодиодов. Все они зеленого цвета, кроме двух крайних, желтого и красного. Для работы лучше использовать библиотеку UPM. Она позволяет задавать сторону, где будет начальное значение и количество индикаторов, которые надо зажечь. Для управления используются оба проводника (данные и тактовые импульсы). Когда подключим к D2, это будет пин-2 и пин-3.

В следующем примере значение индикатора последовательно увеличивается, меняя каждый раз направление.

Исходный код main.js
var LEDBar = require("jsupm_my9221");
var myLEDBar = new LEDBar.MY9221(2, 3);// Разъем D2 (pin-D2,pin-D3)
var directionBool = true;

setInterval(function()
{
	show_LED(1, directionBool);
}, 1500 );

function show_LED(level, direction)
{
	if (level <= 10)
	{
		myLEDBar.setBarLevel(level, directionBool);
		setTimeout(show_LED, 50, ++level, directionBool);	
	}
	else
    {
		directionBool = !directionBool;
    }
}

Датчик поворота 360 градусов. Энкодер




Grove – Encoder. SKU: COM01112P

Энкодер, датчик поворота. Может поворачивать на полный оборот в любую сторону.
Для работы желательно использовать библиотеку UPM. При повороте значение будет увеличиваться, при повороте в другую сторону, уменьшаться. Значение может становиться меньше нуля. Используется два управляющих сигнала.

Исходный код main.js
var rotaryEncoder = require("jsupm_rotaryencoder");

// Подключаем к D2 (пин D2, D3)
var myRotaryEncoder = new rotaryEncoder.RotaryEncoder(2, 3);

getValue();

function getValue()
{
    var v = myRotaryEncoder.position();
	console.log("Position: " + v);
    
    setTimeout(getValue,100);
}

Датчик освещения I2C




Grove — Digital Light Sensor. SKU: SEN10171P

Датчик освещения. Подключается к шине I2C. Выдает значение в Люксах. По документации значения лежат в диапазоне 0-40000.

На тестах у меня получилось, что в светлой комнате значение порядка 500. На солнце через окно с жалюзи достигает 20000-40000. Если вынести на прямое солнце, то его зашкаливает и значение падает до 4000. Надо иметь это в виду.

Исходный код main.js
var digitalLightSensor = require('jsupm_tsl2561');

// сенсор TSL2561 on I2C
var myDigitalLightSensor = new digitalLightSensor.TSL2561();


setInterval(function()
{
	console.log("Light value is " + myDigitalLightSensor.getLux() + ' Lux');
}, 1000);

Датчик газа MQ5




Grove — Gas Sensor (MQ5). SKU: SEN90502P

Датчик газа. Реагирует на жидкие растворители, природный газ. Чувствительность можно настраивать потенциометром.

Выдает аналоговое значение. Можно просто брать его, но можно использовать библиотеку UPM. Библиотека вычисляет среднее значения, выполняя серию измерений, но из-за этого вызов функции приостанавливает программу.

Особенность датчика, что он ощутимо нагревается при работе. Это особенность большинства таких детекторов. Перед началом работы датчик должен прогреться. В инструкции написано, что наилучшее время предварительного нагрева 24 часа, хотя это как-то странно.

В следующем примере подключим датчик к A0 и будем использовать UPM.

Исходный код main.js
var upmMQ5 = require("jsupm_gas");

// Подключим к A0
var myMQ5 = new upmMQ5.MQ5(0);

var threshContext = new upmMQ5.thresholdContext;
threshContext.averageReading = 0;
threshContext.runningAverage = 0;
threshContext.averagedOver = 2;

while(1)
{
    var buffer = new upmMQ5.uint16Array(128);
    var len = myMQ5.getSampledWindow(2, 128, buffer);
    if (len)
    {
        var thresh = myMQ5.findThreshold(threshContext, 30, buffer, len);
        myMQ5.printGraph(threshContext, 5);
    }
}

Датчик пыли




Grove — Dust Sensor. SKU: SEN12291P

Датчик пыли. Выдает импульсы в зависимости от запылённости воздуха. Реагирует на частицы пыли размером 1 мкм и больше. Желательно использовать библиотеку UPM.

Особенность, что функция getData получает данные в течение 30 секунд.

Вот пример его работы. Это нормальное состояние:

Low pulse occupancy: 1829533
Ratio: 6.0984462
Concentration: 3279.9744018259016

А это я потряс рядом с датчиком пыльной тряпкой:

Low pulse occupancy: 5541164
Ratio: 18.470549560000002
Concentration: 15240.471566321306

Исходный код main.js
var dustSensor = require('jsupm_ppd42ns');
// Подключаем к D2
var myDustSensor = new dustSensor.PPD42NS(2);

var data;

var notice = "This program will give readings ";
notice += "every 30 seconds until you stop it"
console.log(notice);
while(1)
{
	data = myDustSensor.getData();
	console.log("Low pulse occupancy: " + data.lowPulseOccupancy);
	console.log("Ratio: " + data.ratio);
	console.log("Concentration: " + data.concentration);
}

Датчик качества воздуха




Grove — Air quality sensor. SKU: SEN01111P

Датчик качества воздуха. Спроектирован для закрытых помещений. Реагирует на угарный газ, водород, алкоголь, ацетон, растворители, формальдегиды и другие токсичные газы.
Я проверял его работу со спиртом и газом из зажигалки. Он их определял.
Подключается к аналоговому входу. В примере к A0. Просто считываем значение.

Исходный код main.js
var mraa = require('mraa');

var gas = new mraa.Aio(0); 

getGas();

function getGas()
{
    var g = gas.read();
    console.log(gas='+g);  
    setTimeout(getGas,500); 
}

Датчик алкоголя




Grove — Alcohol Sensor. SKU: SEN21723P

Датчик алкоголя. Выдает значение на аналоговый пин. Но ему необходим еще цифровой пин, для разогрева самого датчика. Если мы будем использовать обычный шилд для датчиков, тогда на разъеме A0 будут пины A0 и A1. А пин A1 это фактически цифровой пин D15.
Перед началом работы датчик желательно прогреть в течение 2 минут.

Исходный код main.js
// датчик алкоголя MQ303A
var mq303a = require('jsupm_mq303a');

// датчик mq303a
// A0 – значение
// A1, он же D15 для разогрева
var myAlcoholObj = new mq303a.MQ303A(0, 15);

console.log("Enabling heater and waiting 2 minutes for warmup.");

// Покажем сообщения ожидания через 30 секунд
statusMessage(1);
statusMessage(2);
statusMessage(3);

function statusMessage(amt)
{
	setTimeout(function()
	{
		console.log((amt * 30) + " seconds have passed");
	}, 30000 * amt);
}

// запустим получение данных через 2 минуты
setTimeout(runAlcoholSensor, 120000);

function runAlcoholSensor()
{
	var notice = "This sensor may need to warm " +
				"until the value drops below about 450."
	console.log(notice);

	setInterval(function()
	{
		var val = myAlcoholObj.value();
		var msg = "Alcohol detected ";
		msg += "(higher means stronger alcohol): ";
		console.log(msg + val);
	}, 1000);
}

GPS модуль




Grove – GPS. SKU: SEN10752P

Модуль для получения данных от GPS. Этот модуль выдает данные по серийному порту. Поэтому подключаем его к разъему, который может работать как последовательный порт. Это разъем с надписью UART.

Данные передает в текстовом виде в формате NMEA 0183. Описание полей можно посмотреть здесь.

Вот примерный вывод с модуля:

$GPGGA,183227.000,5619.7971,N,04400.5751,E,2,4,3.28,36.7,M,9.4,M,0000,0000*59
$GPGSA,A,3,16,27,19,22,,,,,,,,,3.43,3.28,0.99*05
$GPGSV,3,1,12,18,73,111,,27,61,264,22,22,56,212,26,21,41,107,*70
$GPGSV,3,2,12,19,38,302,22,15,30,054,,16,16,234,25,20,12,062,*78
$GPGSV,3,3,12,13,11,026,,14,06,169,,30,03,340,,04,03,281,*7A
$GPRMC,183227.000,A,5619.7971,N,04400.5751,E,0.00,87.99,230615,,,D*53

Для нас интересна последняя строка с $GPRMC
183227 – время 18:32:27 в UTC.
5619.7971,N — широта
04400.5751,E – долгота

Эти данные можно использовать, например, в картах yandex maps, указав их в строке поиска в следующем формате:
N56 19.7971 E44 00.5751

Если спутники не обнаружены, то вывод будет примерно такой:
$GPGGA,235958.800,,,,,0,0,,,M,,M,,*40
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,235958.800,V,,,,,0.00,0.00,050180,,,N*49

Эта программа использует для работы библиотеку serialport, поэтому ее надо указать в зависимостях в файле package.json:

Исходный код package.json
{
  "name": "OnboardLEDBlink",
  "description": "",
  "version": "0.0.0",
  "main": "main.js",
  "engines": {
    "node": ">=0.10.0"
  },
  "dependencies": {
      "serialport" : "1.7.4"
  }
}

Следующий пример, просто выводит на консоль данные получаемые от GPS модуля.

Исходный код main.js
var mraa = require('mraa'); //require mraa
var uartdev = new mraa.Uart(0);

var com = require('serialport');

// получим путь к UART
var portName = uartdev.getDevicePath();//  '/dev/ttyMFD1';

var serialPort = new com.SerialPort(portName, {
    baudrate: 9600,				
    dataBits: 8, 
    parity: 'none', 
    stopBits: 1, 
    flowControl: false 
  });

serialPort.on('open',function(){
    console.log('Port open');
    serialPort.write('\n');
});

serialPort.on('data', function(data){
    console.log(data.toString());
    console.log('---');
});

serialPort.on('close', function() {
  console.log('close');
});

serialPort.on('close', function(error) {
  console.log('error='+error);
});

Следующий пример посложнее, так как в нем сделан разбор получаемых данных, чтобы извлечь из них географические координаты и вывести их на ЖК-экран.

Исходный код main.js
var jsUpmI2cLcd = require ('jsupm_i2clcd');
var lcd = new jsUpmI2cLcd.Jhd1313m1(0, 0x3E, 0x62);
lcd.setColor(0,0,0);

var mraa = require('mraa'); //require mraa
var uartdev = new mraa.Uart(0);

var com = require('serialport');

var portName = uartdev.getDevicePath();//  '/dev/ttyMFD1';

var serialPort = new com.SerialPort(portName, {
    baudrate: 9600,				// default for serial communication
	dataBits: 8, 
	parity: 'none', 
	stopBits: 1, 
	flowControl: false,
    parser: com.parsers.readline('\r\n')
  });

serialPort.on('open',function() {
  console.log('Port open');

   serialPort.write('\n');
    
});

serialPort.on('data', function(data) {
  console.log(data.toString());
  console.log('---');
    
  var str = data.toString();
    
   var vals = str.split(',');
    
    if( vals[0] === '$GPRMC' )
    {
        var tm = vals[1].split('.')[0];
        var lat = parseFloat(parseFloat(vals[3])).toFixed(1);
        var latS = vals[4];

        var lon = parseFloat(parseFloat(vals[5])).toFixed(1);
        var lonS = vals[6];
        
        //var time= Math.floor(tm);
        
        var time = [tm.substring(0,2),
        tm.substring(2,4),
        tm.substring(4,6)].join(':');
        
        var str1 = 'time='+time;
        var str21 = latS+lat.substr(0,2) +' ' + lat.substr(2);
        var str22 = lonS+lon.substr(0,2) +' ' + lon.substr(2);
        
        var str2 = str21 + ' ' + str22;
        
        
        lcd.setCursor(0,0);
        lcd.write(str1);
        
        lcd.setCursor(1,0);
        lcd.write(str2);
        
        console.log('time=' + time + ' lat=' + lat + latS + ' lon=' + lon + lonS);

        console.log(str1);
        console.log(str2);
    }
});


serialPort.on('close', function() {
  console.log('close');
});

serialPort.on('close', function(error) {
  console.log('error='+error);
});

Драйвер мотора




Grove — I2C Motor Driver. SKU: ROB72212P

Драйвер мотора позволяет подключать или два обычных мотора или один четырех проводной двух фазный шаговый двигатель. Управление производится по шине I2C. Ток может быть до 2А на канал. При таком большом токе микросхемы могут нагреваться. На плате есть кнопка, которая позволяет остановить двигатели.
На плате есть переключатели, которые задают адрес I2C устройства на шине. По умолчанию он установлен в 1111, что равно 15.
На плате есть разъем для подключения питания. Двигатели запитываются от отдельного источника питания. Поэтому это могут быть двигатели на напряжение отличное от 5 В. В наших примерах, мы будем подавать на него напряжение с самой платы Intel Edison, так проще.



При работе с библиотекой UPM параметры для двигателей задаются сразу парой.
Вначале надо задать направление для каждого двигателя.

my_MotorDriver_obj1.setMotorDirections(
    groveMotorDriver_lib.GroveMD.DIR_CCW,
    groveMotorDriver_lib.GroveMD.DIR_CW);

После этой команды первый двигатель будет вращаться против часовой стрелки, а второй по часовой стрелке.

Затем можно задать скорость вращения 0-255. При значении 255 будет подано полное напряжение на двигатель.

my_MotorDriver_obj1.setMotorSpeeds(255, 127);

Первый двигатель будет вращаться на полной скорости, второй на половинной.

В следующем примере включим второй двигатель против часовой стрелки на половинном напряжении.

Исходный код main.js
var groveMotorDriver_lib = require('jsupm_grovemd');
var i2c_addr1 = 15;

var my_MotorDriver_obj1 = new groveMotorDriver_lib.GroveMD(
        groveMotorDriver_lib.GROVEMD_I2C_BUS, 
        i2c_addr1
    );

my_MotorDriver_obj1.setMotorDirections(
    groveMotorDriver_lib.GroveMD.DIR_CCW,
    groveMotorDriver_lib.GroveMD.DIR_CCW); 

my_MotorDriver_obj1.setMotorSpeeds(0, 127);

Двигатель




Planet Geared Motor F280. SKU: 316070006

Двигатель со встроенным редуктором. Рабочее напряжение 3-24 В. Частота вращения 80-800 об/мин. Мы будем подавать на него 5В, так как не используем внешнего источника питания. При работе от драйвера мотора и выставленном значении 255, его скорость вращения около 120 об/мин.

У мотора нет разъема для подключения, только контакты, поэтому надо припаять провода.

Следующий пример использует датчик поворота (энкодер), для управления скоростью и направлением вращения двигателя. На ЖК-экран выводится значение, подаваемое на мотор.
Датчик поворота подключаем к D4. ЖК-экран к I2C. Драйвер мотора к I2C.

Исходный код main.js
var groveMotorDriver_lib = require('jsupm_grovemd');

var rotaryEncoder = require("jsupm_rotaryencoder");
var myRotaryEncoder = new rotaryEncoder.RotaryEncoder(4, 5);

var jsUpmI2cLcd = require ('jsupm_i2clcd');
var lcd = new jsUpmI2cLcd.Jhd1313m1(0, 0x3E, 0x62);
lcd.setColor(0,0,0);

var i2c_addr1 = 15;

var my_MotorDriver_obj1 = new groveMotorDriver_lib.GroveMD(
groveMotorDriver_lib.GROVEMD_I2C_BUS, 
i2c_addr1
);

my_MotorDriver_obj1.setMotorDirections(
    groveMotorDriver_lib.GroveMD.DIR_CCW,
    groveMotorDriver_lib.GroveMD.DIR_CCW); 

    my_MotorDriver_obj1.setMotorSpeeds(0, 0);

checkButton();


function checkButton()
{
    var v = myRotaryEncoder.position();
    var speed = v*10;
    
    if( speed < -255 )
    {
        speed = -255;
    }
    
    if( speed > 255)
    {
       speed = 255;   
    }
        
    var dir;
    
    if( speed > 0)
    {
        dir = groveMotorDriver_lib.GroveMD.DIR_CCW;
    }
    else
    {
        speed = -speed;
        dir = groveMotorDriver_lib.GroveMD.DIR_CW;
    }
    
    my_MotorDriver_obj1.setMotorDirections( 0, dir);    
    my_MotorDriver_obj1.setMotorSpeeds(0, speed);

    lcd.setCursor(0,0);
    lcd.write('v='+v+'   ');

    lcd.setCursor(1,0);
    lcd.write('speed='+speed+'    ');
    
    setTimeout(checkButton,100);
}

Мини насос




6V mini water pump. SKU: 114990073

Водный насос. Содержит мотор, которым можно управлять через драйвер мотора.
Для подключения воды можно использовать 4 мм трубки.
У мотора нет разъема для подключения, только контакты, поэтому надо припаять провода.
Напряжение питания 6 В, поэтому можно воспользоваться напряжением 5 В с платы.
Не рекомендуется включать насос без воды, так как могут испортится пластмассовые лепестки внутри. При подключении питания надо соблюдать полярность. Положительный контакт помечен красной точкой. При таком подключении вода забирается через нижнее отверстие, а выходит через боковое. Можно ли включать в обратную сторону, в документации не сказано.

Следующий пример похож на предыдущий с мотором. В нем так же используется датчик поворота и ЖК-экран. Отличие в том, что двигатель не меняет направление вращения.

Исходный код main.js
var groveMotorDriver_lib = require('jsupm_grovemd');

var rotaryEncoder = require("jsupm_rotaryencoder");
var myRotaryEncoder = new rotaryEncoder.RotaryEncoder(4, 5);


var jsUpmI2cLcd = require ('jsupm_i2clcd');
var lcd = new jsUpmI2cLcd.Jhd1313m1(0, 0x3E, 0x62);
lcd.setColor(0,0,0);

var i2c_addr1 = 15;

var my_MotorDriver_obj1 = new groveMotorDriver_lib.GroveMD(
groveMotorDriver_lib.GROVEMD_I2C_BUS, 
i2c_addr1
);


my_MotorDriver_obj1.setMotorDirections(
    groveMotorDriver_lib.GroveMD.DIR_CCW,
    groveMotorDriver_lib.GroveMD.DIR_CCW); 


checkButton();

// 255 - 2 об в сек
//my_MotorDriver_obj1.setMotorSpeeds(0, 127); //set the speeds of the motors on board 1

function checkButton()
{
    
    var v = 10 * myRotaryEncoder.position();
    
    if( v < 0 )
    {
        v = 0;
    }
    
    if( v > 255)
    {
       v = 255;   
    }
        
    my_MotorDriver_obj1.setMotorSpeeds(0, v);

    lcd.setCursor(0,0);
    lcd.write('Speed='+v+'  ');
    
    setTimeout(checkButton,100);
}


Вот вам датчики, как говорится, на все случаи жизни. Экспериментируйте на здоровье!
Tags:
Hubs:
+24
Comments6

Articles

Change theme settings

Information

Website
www.intel.ru
Registered
Founded
Employees
5,001–10,000 employees
Location
США
Representative
Анастасия Казантаева