• Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal

Don_Arturos

Moderators
  • Content count

    8
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by Don_Arturos


  1. Возможности микрокомпьютера Omega2 довольно большие! В этом руководстве я покажу Вам, как использовать Onion Omega2 с промышленными датчиками (4-20 мА).

    Датчики 4-20 мА эффективно использовать в промышленных проектах. Такие датчики используют изменение силы тока для отправки данных. Это позволяет отправлять информацию на большие расстояния, поскольку ток не затухает на протяжении всей длины проводника.

    Почему именно 4-20 мА — стандартный диапазон силы тока?

    На этот вопрос есть очень простой ответ. Датчик использует в качестве нулевого показания значение в 4 мА. Если бы для этой цели использовались 0 мА, то не было бы никакого способа обнаружить неисправность датчика по сравнению с оборванным проводом.При использовании диапазона 4-20 мА оборванный провод будет показывать 0 мА. Работающий датчик подает ток на линии минимум от 4 мА, что указывает на готовность датчика к работе. Этот стандарт уже давно используется в промышленности, чтобы легко устранять проблемы с проводкой на больших расстояниях. Самое главное — стандарт 4-20 мА не имеет ничего общего с 4:20, это просто "счастливое" совпадение:)

    Существует множество промышленных датчиков с выходом 4-20 мА. Наиболее распространенными являются датчики расстояния, давления, температуры, расходомеры, датчики веса и многие другие. Из этой статьи Вы узнаете, как можно считать данные со всех этих датчиков с помощью микрокомпьютера Омега2 и платы для считывания входного сигнала 4-20 мА на основе чипа MCP3428 с 4-х удаленных датчиков.

    Необходимый набор электронных устройств для повторения проекта

    Предполагаю, что датчики у Вас уже есть. Также понадобятся: 

    • Onion Omega2+

    Onion_Omega2_1.png.78597e521018d31a742294f1a707f57e.png

    • Адаптер с поддержкой интерфейса для интернета вещей (IoT)

    OA_A_1.thumb.png.26b07ba2e54ad7d42ad12918ae67eac2.png

    • 4-х канальный 4-20 мА модуль MCP3428

    PE_4-20mA_4C_1.thumb.png.241e88e843a50e6f3160aa3c1a6add4c.png

    Все модули подключаются очень просто, по принципу "включай и работай", поэтому дополнительные провода и, тем более, пайка. Все, что Вам нужно — это вставить Omega2+ в адаптер IoT, а адаптер вставляется в плату расширения на основе MCP3428, а затем к плате подключаются датчики.

    Настройка Omega2+

    Считыватель тока (4-20 мА) имеет чип MCP3428 для преобразования аналоговых значений в цифровые, которые этот MCP3428 по I2C отправит на Omega2. Для работы с интерфейсом I2C потребуется установить драйвер Python I2C в Onion Omega2 при помощи следующих команд:

    opkg update
    opkg install python-light pyOnionI2C

    Наш считыватель данных с датчиков очень прост в использовании, поскольку в принципе его работы лежит обычный цифрово-аналоговый преобразователь (АЦП). Это устройство имеет 4 входных канала со встроенным усилителем для формирования сигнала. Для считывания сигналов с датчиков необходимо настроить следующие параметры:

    1. Установить MCP3428 Gain на 2
    2. Установите битовое разрешение MCP3428 на 12 (поддерживает до 16 бит, если Вам нужно лучшее разрешение)

    Почему 12-битное разрешение лучше?

    MCP3428 поставляется с настройкой трех возможных уровней разрешений: 12, 14 и 16 бит. В 12-битном режиме MCP3428 берет до 240 выборок в секунду для вычисления значения на АЦП. В 14-битном режиме MCP3428 отбирает до 60 выборок в секунду. Наконец, в 16-битном разрешении скорость выборок значительно замедляется до 15 в секунду. Для считывания аналоговых значений MCP3428 измеряет время разряда встроенных конденсаторов. Соответственно, чем выше разрешение, тем дольше времени требуется на разрядку конденсаторов, чтобы завершить показания. 

    Если Вам требуется лучшее разрешение (речь про 16 бит), а потраченное время проблемой не является, то можете его использовать. Также советуем для 16-битного режима внимательно ознакомиться с таблицей данных MCP3428, так как быстрое чтение может привести к появлению ошибочных данных.

    Библиотека Python для чтения входов 4-20 мА

    Библиотека доступна на GitHub по ссылке.

    # Distributed with a free-will license.
    # Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
    # MCP3428
    # This code is designed to work with the MCP3428_I2CADC I2C Mini Module available from ControlEverything.com.
    # https://shop.controleverything.com/collections/4-20-ma-current-loop-input
    import smbus
    import time
    DL = 0.01
    DL1 = 0.01
    # Get I2C bus
    address = 0x68
    bus = smbus.SMBus(1)
     
    # MCP3428 address, 0x68(104)
    # Send configuration command
    # 0x11(17)Continuous conversion mode, Channel-1, 12-bit Resolution,gain2
     
    while True:
            bus.write_byte(address, 0x11)
            time.sleep(DL1)
    # MCP3428 address, 0x68(104)
    # Read data back from 0x00(0), 2 bytes
    # raw_adc MSB, raw_adc LSB
            data = bus.read_i2c_block_data(address, 0x00, 2)
     
    # Convert the data to 12-bits
            raw_adc = (data[0] & 0x0F) * 256 + data[1]
            if raw_adc > 2047 :
                    raw_adc -= 4095
            current = (raw_adc * 0.01109)
    # Output data to screen
            print "Current Output channel 1 : %.2f" %current
            time.sleep(DL)
     
    ####### channel 2
            bus.write_byte(address, 0x31)
            time.sleep(DL1)
    # MCP3428 address, 0x68(104)
    # Read data back from 0x00(0), 2 bytes
    # raw_adc MSB, raw_adc LSB
            data = bus.read_i2c_block_data(address, 0x00, 2)
     
    # Convert the data to 12-bits
            raw_adc = (data[0] & 0x0F) * 256 + data[1]
            if raw_adc > 2047 :
                    raw_adc -= 4095
            current = (raw_adc * 0.01109)
    # Output data to screen
            print "Current Output channel 2 : %.2f" %current
            time.sleep(DL)
    ############ channel 3
            bus.write_byte(address, 0x51)
            time.sleep(DL1)
    # MCP3428 address, 0x68(104)
    # Read data back from 0x00(0), 2 bytes
    # raw_adc MSB, raw_adc LSB
            data = bus.read_i2c_block_data(address, 0x00, 2)
     
    # Convert the data to 12-bits
            raw_adc = (data[0] & 0x0F) * 256 + data[1]
            if raw_adc > 2047 :
                    raw_adc -= 4095
            current = (raw_adc * 0.01101)
    # Output data to screen
            print "Current Output channel 3 : %.2f" %current
            time.sleep(DL)
    ####### channel 4
            bus.write_byte(address, 0x71)
            time.sleep(DL1)
    # MCP3428 address, 0x68(104)
    # Read data back from 0x00(0), 2 bytes
    # raw_adc MSB, raw_adc LSB
            data = bus.read_i2c_block_data(address, 0x00, 2)
     
    # Convert the data to 12-bits
            raw_adc = (data[0] & 0x0F) * 256 + data[1]
            if raw_adc > 2047 :
                    raw_adc -= 4095
            current = (raw_adc * 0.01094)
    # Output data to screen
            print "Current Output channel 4 : %.2f" %current
            time.sleep(DL)
    from OmegaExpansion import onionI2C
    import time
    # Get I2C bus
    i2c = onionI2C.OnionI2C()

    Приведенный выше пример предназначен для импорта модуля Onion Omega I2C

    long MCP3426::readADC()
    {
     
        raw_adc = 0;
     
        while(CheckConversion() == 1);
     
        switch (SPS)
        {
      
            case 12:
                    raw_adc = data[0];
                    raw_adc &= 0b00001111;
                    raw_adc = raw_adc << 8;
                    raw_adc |= data[1];
     
                    if(raw_adc > 2047)
                    {
                        raw_adc = raw_adc - 4096;
                    }
            
                    // raw_adc = raw_adc * LSB(1 mV)/PGA for PGA = 1;
            
                    break;
        
            case 14:
                    raw_adc = data[0];
                    raw_adc &= 0b00111111;
                    raw_adc = raw_adc << 8;
                    raw_adc |= data[1];
     
                    if(raw_adc > 8191)
                    {
                        raw_adc = raw_adc - 16384;
                    }
            
                    // raw_adc = raw_adc * LSB(250 µV)/PGA for PGA = 1;
           
                    break;
        
            case 16:
     
                    raw_adc = data[0];
                    raw_adc = raw_adc << 8;
                    raw_adc |= data[1];
     
                    if(raw_adc > 32767)
                    {
                        raw_adc = raw_adc - 65536;
                    }
                
                    // raw_adc = raw_adc * LSB(62.5 µV)/PGA for PGA = 1;
          
                    break;
        }
        return raw_adc;
    }

    Приведенный выше раздел используется для настройки MCP3428 на считывание первого канала с 12-битным разрешением и усилением 2 (это очень важный момент). После того, как будут записаны байты настройки, вводится небольшая задержка, чтобы дать каналу некоторое время для настройки и успеть взять достаточно выборок для вычисления значения АЦП. Если задержка будет слишком маленькой, то могут возникнуть колебания показаний. При работе MCP3428 в 16-битном режиме необходимо установить более высокое значение задержки (около 1 секунды). Таблицу значений можно посмотреть здесь.

    Адресация MCP3428

    Плата приемника 4-20 мА имеет 2 перемычки с поддержкой плавающего значения адреса. Чтобы узнать больше о настройке адреса, смотрите приведенную ниже схему подключения:

    sFuagQ2Fj9LXTLXoq92FJfw.thumb.png.040a01e16ef249974067437cadc7752d.png

    Конфигурация MCP3428 и примеры настроек

    Регистр конфигурации MCP3428 используется для настройки выбора канала , режима преобразования, частоты дискретизации и усиления. Этот регистр имеет 8 битов, которые можно изменить для получения определенной настройки. Наиболее распространенные биты, о которых важно знать, это:

    1. Выбор канала — биты 5 и 6 регистра конфигурации
    2. Режим преобразования — бит 4 (оставьте его установленным, чтобы использовать MCP3428 в непрерывном режиме
    3. Частота дискретизации — бит 3 и бит 2 для выбора частоты
    4. Gain — биты 1 и 0 (оставьте их равными 0, 1) для чтения входа 4-20 мА

     

    • Допустим мы хотим прочитать данные с первого канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

    Бит 7 — 0, бит 6 — 00, бит 5 — 00, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 00010001 === 0x11

    • Допустим мы хотим прочитать данные со второго канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

    Бит 7 — 0, бит 6 — 01, бит 5 — 01, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 00110001 === 0x31

    • Допустим мы хотим прочитать данные с третьего канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

    Бит 7 — 0, бит 6 — 10, бит 5 — 10, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 01010001 === 0x51

    • Допустим мы хотим прочитать данные с 4-го канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

    Бит 7 — 0, бит 6 — 11, бит 5 — 11, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 01110001 === 0x71

    • Допустим мы хотим прочитать данные с первого канала с 16-битным разрешением. В таком случае наши биты будут выглядеть вот так:

    Бит 7 — 0, бит 6 — 00, бит 5 — 00, бит 4 — 1, бит 3 — 10, бит 2 — 10, бит 1 — 01, бит 0 — 01 ====== 00011001 === 0x19

    Смотреть биты конфигурации можно также в таблице:

    MCP3428_setip.thumb.jpg.431ff82fc03abf86792185b43b583227.jpg

    Как только все это будет установлено, запустите библиотеку Python. По итогу Вы должны будете увидеть показания со всех четырех каналов, один за другим. Если ко входу 4-20 мА не будет подключен датчик, то Вы увидите следующие показания:

    Onion-Omega-No-input-1038x882.thumb.png.35bdb25e8b53f7be1e00900052fdb8e4.png 

    Показания при подключенном датчик 4мА выглядят так:

    4mA-input.thumb.png.efc26ae2450032ba14ef1a05adcfc9da.png

    Angle2.thumb.png.a837e76e92793636917c5e845e914a4f.png

     


  2. Все началось с того, что мне захотелось создать портативное устройство с подключением к Wi-Fi при небольшом бюджете. Omega2 отлично подходила для моих целей, но прежде мне не доводилось работать с подобными девайсами — самое маленькое, с чем я работал, было ноутбуком!

    Данная статья — гайд для начинающих, который позволит настроить Omega2 и использовать его в качестве базы для портативного устройства. Разберемся с этим микрокомпьютером на примере устройства с часами реального времени и LCD дисплеем, на который будет выводиться текущее время.

    1_dqgU6rfiCB_Hj0AltGJerA.gif.65f071005f63caa15defe206f4c619a2.gif

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

    Почему Omega2 ?

    Omega2 — это золотая середина между низкопроизводительной Arduino и мощным, но сложным для начинающих микрокомпьютером Raspberry Pi. Омега2, как и Raspberry Pi, оснащена полноценной операционной системой Linux, которая позволяет выполнять сложные вычислительные операции. А еще Omega2 имеет встроенный Wi-Fi модуль, что делает ее идеальным решением для определенного типа проектов: небольшие мобильные устройства с питанием от батареи, со встроенным Wi-Fi и мощным процессором!

    Проект будет собираться на устройстве Omega2+. Есть также версия Omega2, но в плюсовой версии больше объем встроенной памяти и ОЗУ, а также имеется слот для SD карт. В остальном платы ничем не отличаются, и любые проекты будут отлично работать на обеих версиях. 

    Настройка Omega2+

    Первоначальная настройка Омега2 требует подключения его к сети Wi-Fi, чтобы обновить прошивку и пользоваться всем его функционалом.

    Примечание: Если Вы пытаетесь подключиться к Wi-Fi сети (например, в университете или транспорте), при доступе к которой есть портал входа в систему — постарайтесь избежать этого, иначе ничего не получится. Подключайтесь напрямую, без окон авторизации.

    Чтобы включить Ваше устройство, используйте переключатель на боковой панели Omega2 — загорится светодиод (индикатор подачи питания).

    0_yHRKruiFbIFeHBgn.thumb.jpg.a544842480f253918ac64d1a072db31b.jpg

    К слову, для удобного подключения Omega2 к компьютеру, можно использовать док-станцию (Power Dock, она изображена на картинке выше). Несмотря на то, что док-станция питается от компьютера по USB кабелю, Wi-Fi соединение устанавливается через собственную Wi-Fi сеть микрокомпьютера Omega2. По умолчанию эта сеть называется "Omega-XXXX", где последние четыре символа являются последними четырьмя цифрами в MAC-адресе Omega2 (помечены на устройстве: на картинке выше это цифры — 5931). Со своего ноутбука я подключился к устройству, а затем получил доступ к Omega2 через SSH команду (подробнее об этом можно прочитать здесь):

    ssh root@192.168.3.1

    Как только я подключился к Омега2, я обновил пароль с помощью команды: 

    passwd

    Следующий шаг — обновить прошивку Omega2, что выполняется при помощи команды:

    oupgrade

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

    Подключение батареи к док-станции

    Omega2 может отлично работать и без док-станции (об этом рассказано здесь), но это очень неудобно. Док-станции облегчают возможность питания устройства, а также повышают общую функциональность. Также Power Dock позволяет подключить внешнюю батарею в виде аккумулятора — отличное решение для создания портативного девайса. Для батареи есть отдельные коннекторы на боковой стороне. Они, вместе с другими важными составляющими док-станции, отмечены на картинке ниже: 

    1_V1-jrynWVfDz_pohjDmj-Q.png.5a34e64c845663aceb3bbda33801a964.png

    В своем проекте я использовал в качестве автономного питания LiPo батарею (3,7 В и 1800 мАч). Подключать ее также просто, как и кабель питания от компьютера. Батареи мне хватило примерно на 4-6 часов работы. 

    1_iZFoRmHHPGPPWJGXl_QTrQ.png.ca2953a33a2a64c2d20627aa7ca80fdb.png

    Подключение LCD дисплея к Omega2

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

    1_cGCJB2Vw581pf7OyQyqSmg.thumb.png.c05bebd8bc8cb31b0471120b2293776a.png

    Чтобы можно было принимать и отправлять данные между экраном и Omega2, необходимо знать название драйвера — под него можно будет найти библиотеку для написания кода. В моем случае, это оказался TFT LCD дисплей на основе драйвера ILI9225.

    0_9Xyjp8kRywpYvzOW.thumb.jpg.bd3c32a00a2e262c56d41de074e86abf.jpg

    Но прежде, чем браться за поиск библиотеки, подключим дисплей к Omega2. Я нашел распиновку всех 11 выводов дисплея, чтобы с подключением не возникло ошибок.

    0_dhtlM_Xjzmruja9r.png.4764c42b7f49aba0f160553b6aae3711.png

    Такую информацию всегда стоит искать в технической документации (datasheet) к устройству — в моем случае это написано вот здесь.

    Сначала я подключил дисплей к Omega2 через макетную плату, чтобы не пришлось брать в руки паяльник (ведь сначала нужно убедиться в правильности подключения, и только потом создавать готовое устройство). Получилось как-то так:

    1_d9hohi1huix93wE5Rcwafg.png.b4c113c0e6f9c7b2f02703fb1b172f9a.png

    Можно заметить, что вывод SPI с названием MISO не используется в данном проекте. Почему? Дело в том, что MISO расшифровывается, как Master Input, Slave Output) — это то, как подключенное устройство будет отправлять сигналы обратно на наш микрокомпьютер. Но от дисплея не требуется такой задачи, поэтому и контакт MISO также задействован не будет.

    Шестой вывод с дисплея (он отвечает за подсветку) у меня подключен к источнику питания. Но при желании его можно подключить к любому из свободных цифровых выводов на Омега2, чтобы регулировать яркость подсветки.

    Управление дисплеем с помощью Omega2

    Для удобного управления дисплеем воспользуемся уже готовой библиотекой под драйвер ILI9225, с помощью которой можно очень легко выполнять такие действия, как вывод текста или рисование фигур. Чтобы библиотека подружилась с Omega2, проделаем несколько несложных операций. Библиотека написана на С и ее необходимо добавить в набор команд процессора Omega2. Но из-за большого количества зависимостей, необходимых для этой операции, Onion рекомендует собирать на другом компьютере, а затем передавать скомпилированный исполняемый файл в Omega2. Это означает, что нам придется выполнять кросс-компиляцию с процессора нашего компьютера на процессор в Omega2.

    Это делается из-за того, что архитектура процессора Омега2 — MIPS будет конфликтовать с библиотекой драйвера, которая написана под более распространенные процессоры с архитектурой x86 и ARM. Для настройки кросс-компиляции можно прочитать инструкцию. В целом компиляция может занять до нескольких часов (у меня на весь этот процесс ушло около часа), и иногда может пройти не очень успешно.

    Далее необходимо было выполнить следующие шаги: 

    1. Следуйте инструкциям к библиотеке ILI9225 для создания демонстрационного исполняемого файла;
    2. Для создания оптимальных условий для успешной сборки: эта инструкция;
    3. Установка Git на Omega2 делается вот так.

    В итоге удалось сделать следующее: 

    1_OdrytIJeeWHz_nLudgfSrA.png.4164501f6afad39f5e3507c32fc5a599.png

    Отлично! Теперь у нас есть рабочая система сборки для библиотеки ILI9225. Теперь можно сделать что-нибудь посложнее:)

    Кодирование дисплея часов 

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

    1. Установить часовой пояс на Omega2
    2. Получить растровое изображение, которое мы хотим отобразить

    Установить часовой пояс можно путем редактирования файла:

    /var/TZ

    По умолчанию стоит часовой пояс GMT0, но можете ознакомиться с этим списком часовых поясов.

    Библиотека SPI ILI9225 не имеет встроенной функции для отображения общих изображений, но может отображать растровые, представленные в виде массивов. Adafruit, к счастью, предоставляет отличную утилиту для преобразования изображений в uint8_t растровые массивы, которые будут легко обработаны библиотекой SPI дисплея. 

    Я выбрал случайное изображение с логотипом одного из университетов (не путать с московским метро). 

    1_i_TZS4cqZjHfjhXs_Tflbg.png.2f13db469e9b79d36dffcadb36d3a5d9.png

    Преобразователь от Adafruit принимает исходное изображение и преобразует его в массив для обработки в растр. 

    Итоговый вариант моего кода можно скачать по ссылке.

    Я назначил сгенерированный битовый код массиву const uint8_tili9225_umnlogo_img[], а затем использовал команды библиотеки SPI для его отображения:

    ILI9225_ClearFramebuffer (); 
    ILI9225_SetBackgroundColor (COLOR_BLACK); 
    ILI9225_DrawBitmap (0,0, ili9225_umnlogo_img, 180220, COLOR_RED); 
    ILI9225_CopyFramebuffer ();

    Затем необходимо дополнить код строчками об отображении времени каждую секунду:

    while (1) {
      time_t rawtime;
      time ( &rawtime );
      struct tm * timeinfo = localtime ( &rawtime );
      
      char time_buf [20];
      strftime(time_buf, 20, "%I:%M:%S %p", timeinfo);
      ILI9225_DrawText2(10, 10, &time_buf[0]);
      ILI9225_CopyFramebuffer();
      
      usleep(1000 * 1000);
     }
    

    1_wUFlHTwxIJXcs59cUSdzBw.thumb.jpeg.c4c0efbe191a31decd43cf1b06650a6e.jpeg

    Завершение

    Я оказался в полном восторге, ведь всего за несколько часов мне удалось сделать готовое портативное устройство на батарейках! Следующим шагом может стать изготовление корпуса для этого девайса, а дальше — более сложные проекты с Wi-Fi соединением, добавлением кнопок ввода и многими другими крутыми функциями!

    Данная статья является переводом с уникальным почерком автора перевода:)  Оригинал по этой ссылке.


  3.  

    Данная статья поможет Вам наладить связь между микрокомпьютером Omega2 и платой Arduino Uno, чтобы совместить последнюю с интернетом вещей (IoT), а заодно и с преимуществами, которые он дает.

    BB6A6JEFQrr1aXSOgMoWuduKFQWIuuPVKy20dn2iHxSkgqZ8m5-DrsyARvHNibqLy5iqiMnL2qayq8ZpvOLTzaC2Zt2GEeSDMwQOwrxxBUPag3617ku_yNqmAbgvkEzHDMxzYZ53

    Вам понадобятся следующие компоненты:

    • Плата Arduino Uno
    • Микрокомпьютер Onion Omega2+
    • Резистор номиналом 3,3 кОм
    • Резистор номиналом 1,7 кОм
    • Перемычки типа "папа-папа"
    • Беспаечная макетная плата

    Предыстория

    Как только я узнал, что самая популярная у мейкеров плата Arduino и самый доступный микрокомпьютер Omega2+ поддерживают связь по UART интерфейсу, то мне сразу же захотелось связать оба этих устройств, чтобы совместить их преимущества воедино! Таким образом можно будет создать проект на Arduino, а затем совместить его с возможностями Омега2 — на базе первой создаем колесного робота, а вторую используем, чтобы добавить в проект управление по Wi-Fi или облачное хранилище (например, от Amazon).

    А вообще UART (Universal Asynchronous Receiver-Transmitter: универсальный асинхронный приемопередатчик) — это последовательный интерфейс передачи данных между двумя устройствами, которые взаимодействуют по трем каналам. Первый служит для передачи данных, второй, соответственно, для приема данных, а третий — для общей связи (можно сказать, ищет точки соприкосновения) между этими устройствами. 

    Шаг 1: Подключение

    Ниже на схеме показано такое соединение. Резисторы нам понадобятся для того, чтобы собрать что-то вроде делителя напряжения, поскольку пятивольтовое (5V) напряжение на контактах платы Arduino совершенно не подходит для Omega2: его необходимо преобразовать в 3,3V. Подключать  Омега2+ желательно через док-станцию, но если ее нет, то следуйте этой инструкции.

    2.jpg.f538982e6b80f3ed8b7aba1844a69f07.jpg

    Шаг 2: Включение

    Подключите плату Arduino Uno к компьютеру через USB порт, а затем включить микрокомпьютер Omega2+.

    Шаг 3: Программный код

    Откройте на компьютере Arduino IDE, а затем загрузите через нее в плату Arduino следующий код:

    #include <SoftwareSerial.h>
    
    SoftwareSerial gtSerial(8, 7); 
    
    void setup() {
      Serial.begin(9600);    
      gtSerial.begin(9600);  
    }
    
    byte rx_byte = 0;       
    
    void loop() {
      if (Serial.available()) {
        rx_byte = Serial.read();
        gtSerial.write(rx_byte);
      }
      if (gtSerial.available()) {
        rx_byte = gtSerial.read();
        Serial.write(rx_byte);
      }
    }

    Отлично! Плата Arduino готова к работе.

    Шаг 4: Тестирование

    Для проверки связи через последовательный порт воспользуемся монитором порта (открывается через раздел "инструменты" в Arduino IDE, либо сочетанием клавиш (Ctrl + Shift + M).

    3.jpeg.e6f5050f43bb7c2776ef01435734dd6d.jpeg

    Для того, чтобы написать и загрузить программу для Омега2, можно воспользоваться протоколом SSH, либо использовать утилиту терминала по настройке Omega2+. Для этого можете воспользоваться следующей инструкцией.

    Введите в терминал следующие команды, чтобы установить инструмент "экран".

    opkg update
    opkg install screen

    Для мониторинга данных с последовательного порта, подключенного к плате Arduino, введите следующую команду:

    screen /dev/ttyS1 9600
    

    После запуска этой команды Вы увидите пустой экран. Попробуйте что-нибудь набрать на этом экране — эти данные отобразятся на мониторе порта в Arduino IDE. Точно также это работает и в обратном порядке: если отправить в последовательный порт информацию через поле для ввода в мониторе порта, то на пустом экране Вы увидите то же самое. Работает! Вы успешно установили UART соединение между двумя устройствами! 

    Для более подробного ознакомления с возможностями UART протокола можно узнать здесь.

    Шаг 5: Используем библиотеку pySerial

    На практике чаще всего приходится работать с датчиками, обрабатывать массивы данных и прочее. Это лучше всего делать через скрипт, написанный на языке Python, поскольку он подходит для работы как с Arduino, так и с Omega2.

    На помощь приходит библиотека pySerial, которая включает в себя основные команды и функции. К примеру, можно использовать ее для программы считывания данных с датчиков и отправки полученных значений в облачное хранилище (например, AWS) через протокол MQTT.

    Для демонстрации возможностей этой библиотеки я написал простой код на Python, который считывает однозначные целые числа с последовательного сигнала с Arduino и отображает на экране консоли. Он показан ниже. Можете смело использовать его в своих проектах и экспериментировать с ним.

    import serial
    
    ser = serial.Serial('/dev/ttyS1', 9600, timeout = None)
    
    while True:
            input = ser.read()
            print(int(input))

    На этом у меня все. Желаю успехов и удачной компиляции!

     

     

     

    1.jpg


  4. 21Oq3SGSoEsk00R0f-pgYo2rJw5_ni9CbN7bQWbEZvrRY2zuQs5gqvtExrboUAewHw5xqktNUoGkRodgS-etrOw2TFqYhnuUCGLIjjBTADRSdXIYi59pfQZ4FiYLMcCuv1MWyasC

    Всем привет! В данной статье речь пойдет о том, как подключить любое электронное устройство к Google Assistant, тот самый, что откликается на фразу “Окей, Google!”

    Все началось с того, что я приобрел электрический стол-трансформер E2B фирмы FlexiSpot. Очень классная штука - можно менять размеры и высоту под самые разные задачи при помощи двух двигателей. Для управления используется встроенная в стол клавиатура.

    1Am7YTyhar7rNOgLWizaIKTmtTwFev6Ru00s_M2f0TkHrs4IRGlNnzIod7U7-6Bjg151cyu-xjNQSvd3wXwfp3ER3XSHU_CMCLi36r_FHBeJ2o76Jpzc8W8sBq7tkpB81Mr0WJVC

    В один из вечеров я подумал, а почему бы мне не использовать Google Assistant для голосового управления девайсом? Так зарождался этот проект...

    На воплощение плана мне понадобилось 5 часов упорного инженерного труда. Интерес моего проекта заключается в том, что вместо стола можно взять любое другое электронное устройство и точно также настроить управление. Теперь я поделюсь решением с вами.

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

    ЭТАП ПЕРВЫЙ: “Как это устроено?”

    Для подключения вашего устройства к умному помощнику необходимо посмотреть на его внутреннее устройство. Обращаю ваше внимание, что в случае “вскрытия” вы теряете гарантию на свое устройство. Было бы неплохо держать при себе запасное устройство, если что-то пойдет не так. Внешняя часть моего контроллера выглядела как на фото ниже:

    Y8Rrt-8fp74wcknBBmPyR5g89Jw4q7wfaR4zzDCLYUdDYPv61VUtoO1TDclwlQVCniBQw2c5pb3tUluGgofCAHT65kLAdVDvvdgJEVxdeAfjrhACPRpzFz1tJ7M0ni_qXZMEzGwR

    Давайте посмотрим на внутренности.

    mpND2dMuM9dRX3qDpgIdXyoCM0LpEeqQiESTs4QeEU0KtJpu43yPPPWJm57KKJPe9U_orYRuHYlueZ0gh9EckXb9LZceTdWYyxoHaZvTmvORwuZHDtj9fJeRGUBcuR2ysyOE1NeM

    Для начала расскажу вам о каждом элементе платы.

    • UP Button и DOWN Button отвечают за поднятие или опускание стола с 70 см до 120 см (от 42,1 до 63 дюймов);

    • Кнопка Setting Modes настраивает определенный режим для стола. Можно использовать кнопки Mode 1, Mode 2, Mode 3 для сохранения настроек определенной высоты;

    • Auto Tracking Mode служит для слежения за положением человека и напоминает о том, когда пора вставать;

    • TM1650: светодиодный контроллер, отвечающий за работу дисплея слева;

    • STM8S (STM8S103F2): основные “мозги” устройства. Даташит на микроконтроллер можно посмотреть здесь.

    Теперь начинается самое интересное: необходимо залезть в те самые “мозги” стола и разобраться какие сигналы с микроконтроллера отвечают за команды поворотов двигателей. Этот способ не сработал - мой паяльник был слишком большой мощности и не оставил живого места на пине №14 моего контроллера.

    rFS_s_cva_YSX5y-nXTrAPnovI346nPeWhQEaBD-Uq8j9-z07Xls87GEhi0aWowUYyBMyMiKAJ3XIX8ID-w5L93GBtY1jI-rdy9KDrHYA5gM7Nr8zSVGbT811xb3OlOKoAJ6OQeN

    Рисковать дальше я не стал и придумал другой, как оказалось, более простой способ. Я просто взломал кнопки M1, M2 и M3. Я уже говорил, что они хранят значения высоты и при срабатывании отдают соответствующую команду столу.

    rQeZs1CNcMOEJYDkXGi5YvMVnQpHCSWEvlvNgxR6F7TQNo0XO-c8bsEj4mxPYxohFCYIpb8Bj0eT423p1bysg65qRrvrN_74o3cEqa8Uk-lSIRRKbtgOk4P4wE2gvyO3tvD0-xOH

    Теперь нам нужен электронный переключатель, чтобы сымитировать нажатие кнопок.

    ЭТАП ВТОРОЙ: “Ручная отладка”

    Перед тем, как начать все автоматизировать, попробуем протестировать наш способ вручную. Для этого я построил NPN транзисторную схему переключателя. Он идеально подходит для низковольтных устройств постоянного тока, а значит и для нашего случая тоже. Повторюсь: наша задача смоделировать кнопку, для питания которой требуется несколько миллиампер.

    Наша транзисторная схема будет выглядеть именно так:

    PIfKEmOcyA62WMba09F0eKXVZWgApUS73lfO3vXGxbQ8lLS9Qk_xzlOwkznm2Cm5Hr6XoTgKgXkH1N1FFGsbAO5SkiXHNcCpz8g-vYDbyx2ru3o_sJjd31PgKVfoCQhK41Dfl1yE

    Все работает, отлично! 

    M37SaJ6vGEiTC8_Rf74xD6qE4dFxS4xApUQTLK3U8bbohLbQtYXPi7A_t28ts-_tczB85QWHEFzvCiTa4-YrHoZo0tmZSUN_jiR2K6BwKZMf-d1ZhcoPuoLXHtoLtTerf33pGVJb

    Теперь подключим настольный контролер по этой схеме:

    aNoJsDLYTBjrEhmNEs7XNaWD_RN1B2QeYfH5842roo8GgAHF4bjpgUSrD-St_n1PSUBEdPakfRuLlYgdn7uWejGBUmL8ibUu71tfhXKSg3GnizKqMO6P0V6M1iKBpehRSfY92lUI

    На этой схеме J1, J2 и J3 - перемычки, которые мы совсем недавно припаяли к настольному контроллеру (к M1, M2 и M3 соответственно). На макетной плате это выглядит так:

    k3nnBH9Mhy70RLd33FoWE2wPOnAgZNkRH8fz49VHkQiDKnfah83vvGunKc-FrUSzbfinl5-gUU4Zx-Z_ARKSDAEKKED2EiJ8ZYWBIir_6_rskX_dJO3A1pNOv-vyZzIPmq9yOvhj

    Обратите внимание, что провода V1, V2, V3 на данный момент подключать не нужно.

    ЭТАП ТРЕТИЙ: “Используем программируемый микроконтроллер”

    Для этого этапа вам понадобится любая плата разработки, которая имеет поддержку Wi-Fi соединения. Arduino здесь сразу отпадает (покупать плату расширения не очень разумно), Raspberry Pi - довольно дорогой вариант, и поэтому я остановился на Omega2+ - небольшом, но мощном микроконтроллере со скромным ценником в $15. Купить его можно тут.

     

    xtiVbZIk0VhucejsB5YbXnddU5wbU0HX-X5d7edhuykgO3fcpx28RX5fufUku_9fIBJAqABC7Q8gwr81OyrFG2qcrUv3D48U6Fi1ogEH3rNnjQ5_P5iwXawfmt5jthDR-Dm_IrkS

    Я подключаю кнопки по схеме ниже (обратите внимание, что провода V1, V2, V3 теперь подключены к пинам 1,2, 3 соответственно).

    -YynEVCxNOUq45SHdamp2IgMmpC75W2_KgQ7quCB81EGXqL9EZtS6S5y9gdjnovWwgzS_zZp9r9yp7gmXe1VPK-E_iVf6zG7nYWIDrlyM4Tnt7cz8HA8Wd5TLGoSzmonuxCaWznQ

    Так выглядит макет моего проекта:

    HIFmylHDrdy5ca3J86zauldmRWmyMsQMzsRG9zzWHMkW4bjiHND4owJAFyLauKpa93x24kkOKmyEfYav6NGcNKsiZ9i1eiS1bl7nxFj2yqm53mFZZk17UCpGrMR0WO0PofZcQ_Xf

    Теперь нам нужно написать простую программу, которая превратит пины 1,2 и 3 в переключатели для кнопок. Например, если установить на первом пине высокий логический уровень, то он будет подавать 3,3В через транзистор, замыкая контакты  и имитируя нажатие кнопки: сигнал будет принят контроллером STM8S и двигатель выполнит определенную команду.

    Первоначальный код имеет следующий вид:

    const omega2gpio = require('omega2-gpio');
    const gpio = new omega2gpio();
    gpio.tests().then( ()  => {
      const p = g.pin({pin: 1, mode: 'output'});
      
      p.set(1); // set to HIGH
      
      setTimeout( () => {
        p.set(0); // set to LOW
      }, 800);
    });

    Омега2 имеет встроенную команду для управления пинами (правильнее называть их GPIO). Например, для установки пина №1 в режим OUTPUT при высоком логическом уровне нужно прописать следующее: gpioctl dirout-high 1

    Но мне посчастливилось найти NPM модуль, который упрощает работу с ними.

    Также нам необходимо прописать управление через WiFi, чтобы подстроить под эту систему Google Assistant:

    const http = require('http');
    const heartbeat = 'echo heartbeat > /sys/class/leds/omega2p\:amber\:system/trigger';
    
    const o = require('omega2-gpio');
    const g = new o();
    
    const run = (pin, done) => {
    
            g.tests().then( ()  => {
                    const p = g.pin({pin: pin, debug: true, mode: 'output'});
                    p.set(1);
                    setTimeout( () => {
                            p.set(0);
                            done();
                    }, 800);
            });
    };
    
    const send = (rs, text, status) => {
            rs.writeHead(status, { 'Content-Type': 'application/json' });
            rs.end(text, 'utf-8');
    };
    
    http.createServer( (rq, rs) => {
            console.log('request: ', rq.url);
    
            if (rq.url === '/mode/1') {
                    run(1, () => send(rs, '{"mode": 1, "status": "OK"}', 200));
            }
            else if (rq.url === '/mode/2') {
                    run(2, () => send(rs, '{"mode": 2, "status": "OK"}', 200));
            }
            else if (rq.url === '/mode/3') {
                    run(3, () => send(rs, '{"mode": 3, "status": "OK"}', 200));
            }
            else {
                    send(rs, '404', 404);
            }
    
    
    }).listen(1337, '0.0.0.0', (err) => {
            if (err) {
                    console.error('Unable to start the server', err);
                    return false;
            }
            console.log('Server running at http://0.0.0.0:1337');
    
            const exec = require('child_process').execSync(heartbeat);
    
    });

    После загрузки кода можно отправить запрос http://192.168.80.84:1337/mode/1 для установки пина 1 на HIGH в течение 800 мс, после чего обратно вернётся на уровень LOW. Аналогичные действия можно проделать и с остальными пинами.

    Последним действие нужно запланировать автоматический запуск сценария во время загрузки. Для этого редактируем файл скрипта /etc/rc.local:

    node /root/desk-controller-assistant-server.js &

    exit 0

    Разработка завершена - переходим к финальному этапу!

    K8wye6bkxUBFfw-1313hM7Z90K7v5ryVP84rxUXISg2wBEYfg2EVS2xFpQ8oIOtnsCb39vawQ_rP_yW2se6Sexmg-eMf9oRZjnK4P39a_jKdfq_9r0tWgzMQLxsCUPkMRISdbkJl

    ЭТАП ЧЕТВЕРТЫЙ: “Взаимодействие с Google Assistant”

    Рекомендую перед выполнением данного этапа назначить статический IP-адрес для вашего устройства.

    Для взаимодействия устройства с Google Assistant по локальной сети я использую ngrok. Откроем с его помощью HTTP страницу по адресу: http://198.168.80.84:1337

    Для этого используем команду:

    ngrok http -subdomain = wassimchegham 192.168.86.84:1337

    После запуска ngrok я получил публичный URL: https://wassimchegham.ngrok.io/

    И теперь я могу отправлять HTTP-запросы на мое устройство, чтобы установить нужный режим: https://wassimchegham.ngrok.io/mode/1

    Внимание! ngrok выставит ваш локальный компьютер в Интернет, так что убедитесь, что выключили его, если вы его не используете.

    Настройка Google Assistant. СПОСОБ ПЕРВЫЙ.

    Быстрее всего настроить Google Assistant можно через печально известный IFTTT. Вот как это делал я:

    ЕСЛИ...

    aEbKE5Zn5rVUfh23lyIFnhG_I4-eWPw5YFBuJgb12Urx4iGkGpWczIvH2fjFDFu2Ux4I5RZNsT_8ReUiTRRSvsX5WbWXo6xtMiEbX7Ixc-RIn5KnsNRleCE570Hirzs0lhLMSEEl

    ЗАТЕМ…

    MpW7RRGkjGShOzT2Cl6T5nDmukevRtSZ2hCVU5OwiRPG603O1dbR5RlFfZwWkJ6D5KXQQuvxxpX_oMpj6r0u0atnn5f-wBKwVIwYRu88OtZADmSsSeD4ujKD2PLadNXFkY_fRjbI

    Настройка Google Assistant. СПОСОБ ВТОРОЙ.

    Рекомендую использовать именно этот способ. Он осуществляется через Smart Home API. Для начала необходимо создать действие в Smart Home (Smart Home Action )., которое синхронизирует вашего устройство с голосовым помощником.

    О том, как работает данный метод, следует прочитать здесь: https://codelabs.developers.google.com/codelabs/smarthome-washer/#0

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

    'use strict';
    
    const fetch = require('node-fetch');
    const functions = require('firebase-functions');
    const { smarthome } = require('actions-on-google');
    const util = require('util');
    const admin = require('firebase-admin');
    admin.initializeApp();
    
    const firebaseRef = admin.database().ref('/');
    
    const agentUserId = '23213213131321321321';
    
    exports.auth = functions.https.onRequest((request, response) => {
      const responseurl = util.format(
        '%s?code=%s&state=%s',
        decodeURIComponent(request.query.redirect_uri),
        'xxxxxx',
        request.query.state
      );
      console.log(responseurl);
      return response.redirect(responseurl);
    });
    
    exports.token = functions.https.onRequest((request, response) => {
      const grantType = request.query.grant_type
        ? request.query.grant_type
        : request.body.grant_type;
      const secondsInDay = 86400; // 60 * 60 * 24
      const HTTP_STATUS_OK = 200;
      console.log(`Grant type ${grantType}`);
    
      let obj;
      if (grantType === 'authorization_code') {
        obj = {
          token_type: 'bearer',
          access_token: '123access',
          refresh_token: '123refresh',
          expires_in: secondsInDay
        };
      } else if (grantType === 'refresh_token') {
        obj = {
          token_type: 'bearer',
          access_token: '123access',
          expires_in: secondsInDay
        };
      }
      response.status(HTTP_STATUS_OK).json(obj);
    });
    
    let jwt;
    try {
      jwt = require('./key.json');
    } catch (e) {
      console.warn('Service account key is not found');
      console.warn('Report state will be unavailable');
    }
    
    const queryFirebase = deviceId =>
      firebaseRef
        .child(deviceId)
        .once('value')
        .then(snapshot => {
          const snapshotVal = snapshot.val();
          return {
            on: snapshotVal.on,
            online: snapshotVal.online,
          };
        });
    
    const queryDevice = deviceId =>
      queryFirebase(deviceId).then(data => ({
        on: data.on
      }));
    
    const app = smarthome({
      debug: true,
      key: jwt.key,
      jwt: jwt
    });
    
    app.onSync((body, headers) => {
      return {
        requestId: body.requestId,
        payload: {
          agentUserId,
          devices: [
            {
              id: 'standing-desk-123',
              type: 'action.devices.types.SWITCH',
              traits: ['action.devices.traits.OnOff'],
              name: {
                defaultNames: ['My Standing Desk'],
                name: 'Standing Desk',
                nicknames: ['Standing Desk']
              },
              deviceInfo: {
                manufacturer: 'Wassim Chegham',
                model: '123456789',
                hwVersion: '1.0',
                swVersion: '1.0'
              }
            }
          ]
        }
      };
    });
    
    app.onQuery(body => {
      const { requestId } = body;
      const device = body.inputs.pop().payload.devices.pop();
      const deviceId = device.id;
    
      return queryDevice(deviceId).then(data => {
        return {
          requestId,
          payload: {
            devices: {
              [deviceId]: data
            }
          }
        };
      });
    });
    
    app.onExecute((body, headers) => {
      const { requestId } = body;
      const commands = body.inputs.pop().payload.commands;
      const command = commands.pop();
      const device = command.devices.pop();
      const deviceId = device.id;
      const exec = command.execution.pop();
      const { params } = exec;
    
      console.log(body);
    
      firebaseRef
        .child(deviceId)
        .child('state')
        .update({
          on: params.on
        });
    
      return {
        requestId,
        payload: {
          commands: [
            {
              ids: [deviceId],
              status: 'SUCCESS',
              states: {
                online: true
              }
            }
          ]
        }
      };
    });
    
    app.onDisconnect((body, headers) => {
      return {};
    });
    
    exports.smarthome = functions.https.onRequest(app);
    
    exports.requestsync = functions.https.onRequest((request, response) => {
      return app.requestSync(agentUserId)
      .then((res) => {
        console.log('Request sync was successful', res);
      })
      .catch((res) => {
        console.error('Request sync failed', res);
      });
    });
    
    /**
     * Send a REPORT STATE call to the homegraph when data for any device id
     * has been changed.
     */
    exports.reportstate = functions.database.ref('{deviceId}/state').onWrite(event => {
      console.info('Firebase write event triggered this cloud function');
      if (!app.jwt) {
        console.warn('Service account key is not configured');
        console.warn('Report state is unavailable');
        return;
      }
      const snapshotVal = event.after.val();
      console.log('snapshotVal', snapshotVal);
      const mode = snapshotVal.on == true ? '3' : '1';
    
      return fetch(`https://wassimchegham.ngrok.io/mode/${mode}`)
        .then(res => {
          console.log(res.ok, res.status, res.statusText, res.headers.raw(), res.headers.get('content-type'));
          return res;
        })
        .then(res => (res.status == '404' ? null : res.json()))
        .then(json => {
          if (json) {
            return {
              requestId: 'xxxxxxxxxx',
              agentUserId,
              payload: {
                devices: {
                  states: {
                    [event.params.deviceId]: {
                      on: snapshotVal.on
                    }
                  }
                }
              }
            };
          } else {
            throw new Error('deviceOffline');
          }
        })
        .then(postData => app.reportState(postData))
        .then(data => {
          console.log('Report state came back');
          console.info(data);
        })
        .catch((res) => {
          return {
            requestId: 'xxxxxxxxxx',
            agentUserId,
            payload: {
              errorCode: 'deviceOffline'
            }
          };
        });
    });
    

    По сути, наш код делают следующее: мы отправляем команды в “Умный дом”, каждое текущее состояние сохраняется в базе данных Firebase Realtime. В случае изменения состояния мы отправляем HTTP запрос на наше локальное устройство через ngrok.

    XegWIimeLiiR5qhZ1AV6ARoTxDLdoXtaXo_ySsP6vGXeP7M6Ti7Bd3t4tuQ_1X6xAA75PDHeAVlD28-Vb6ScCZFJPz7geKB3Okez7nS0c5T7KnMqnlq0brZFET6XZf_9XL96e9NY

    Теперь нам остается подключить готовое устройство к помощнику Google и наслаждаться беззаботным настоящим:)

    Данная статья является переводом: https://medium.com/google-developer-experts/hey-google-set-my-desk-to-standing-mode-b21dcc40d4b5

    1 person likes this

  5. Разработчики Onion сделали нам отличный подарок к Новому 2019 Году и выпустили новый микрокомпьютер из семейства Omega2 - более мощный и эффективный Pro! ;)

    UEBvbLhCBatGHA_5fNuFeiPXspWOCtOBtl-lVSMHR8XnsRrucm5UZh7L5KXnuTfZtexH3E4xNw70qaZ92K_r1W6Kkf-BpE0xgy2HTC85iCWf0eOsGDFP5zxDwhZhs3XKtE28SFeG

    Вот несколько ключевых моментов, которые вам стоит знать об этом компьютере:

    - Объем памяти был увеличен до 512Мб (по сравнению с 128 Мб у Omega2 с док-станцией расширения). Теперь её хватит на проекты любого масштаба!

    - Питать плату можно с помощью встроенного разъема под LiPo батарею - это сделает ваш проект портативным или будет служить источником резервного питания. Для зарядки батареи просто подключите Omega2 Pro к источнику питания с помощью кабеля MicroUSB.

    - Совместим со всеми существующими на данный момент расширениями.

    - Omega2 Pro поставляется с предустановленным OnionOS.Теперь начинать работу с компьютером можно без дополнительной процедуры установки.

    Некоторое время назад команда Onion начала сбор средств на запуск производства Omega2 Pro на краудфандинговой платформе Crowd Supply и всего за 5 дней собрала 150% от необходимой суммы!

    Благодаря нашей с вами поддержке уже в 2019 году компьютер поступит в продажу!

    А команда нашего форума желает вам больше новых проектов и разработок, успехов и всего наилучшего в Новом Году! :D


  6. Привет, друзья! У нас есть интересные новости: вышла новая прошивка для Omega2, которая поставляется вместе с OnionOS !

    В новом релизе  v0.2.1 b198 есть множество новых функций и улучшений, о которых нам не терпится рассказать!

    А для тех, кто не знаком с OnionOS, поясним: это графический веб-интерфейс для семейства Omega2 с множеством приложений, которые можно использовать для настройки и управления вашим устройством.

    eZJsJMaSbXN7J00rGcblIyemJa5K6NcydJ2c4mp-1O0nxtg5SbIW81hwQ_VLskMU1XA-VbtjDjdWemVr0A9cgJQt9UeivoWAA5MkEAM3ah6DmTpuru5YoaV79hGiGgfCKu2AWaJt

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

    Что нового?

    Многое изменилось со времени предыдущего основного выпуска v0.1.10 b160, вот небольшой обзор:

    • Появился новый драйвер WiFi под названием WiFi Warp Core;

    • Увеличена скорость по SPI соединению за счет нового драйвера;

    • Omega2 может генерировать два аппаратных PWM сигнала;

    • Драйвер I2c был значительно улучшен, что повысило эффективность работы с данным интерфейсом;

    • Добавлен многоцелевой onion скрипт: теперь при запуске onion --help откроются все доступные функции;

    • И последнее, но не менее важное: OnionOS поставляется в комплекте с прошивкой Омега! Сама OnionOS тоже была существенно доработана и вот небольшой обзор того, что нового в ней:

    • Старую версию заменяет встроенный мастер установки;

    • Появился диспетчер приложений для оптимизации работы с приложениями в OnionOS;

    • Редактор кода больше не установлен по умолчанию в качестве меры экономии пространства.

    А теперь погрузимся в детали!

    Новый мастер установки

    Разработчики согласились с  пожеланиями пользователей сделать установку OnionOS максимально простой. Вот почему появился новый мастер установки в составе OnionOS, который оптимизирует первую настройку вашей Omega2.

    Мастер установки - это графический способ подключения вашей Oмега2 к Wi-Fi, при помощи браузера, а затем последующее обновление прошивки, если вы используете не самую последнюю версию. Работать с ним очень просто.

    • Подключитесь к точке доступа Wi-Fi Omega;

    • Используйте браузер, чтобы перейти  по адресу: http://Omega-XXXX.local/ (где  XXXX - это последние четыре цифры со стикера на Omega2), и если ваша Омега2 еще не настроена, появится Мастер установки.

    EUJnWYGYKKx3GUc6Zz5Vzk1QQmxuNWvRV4xgRt01eEXDaRoPKNG38kqm1RIWbthysy6qBGh1TSuXDYdC0nqH384o3_7ImyZrAESi4o4RvqaWFyNSzCZ24THjRGJ--D7AxH3uJniF

    Как только установка будет завершена, ваша Omega2 запомнит, что она настроена и автоматически загрузит OnionOS!

    Чтобы вернуться в мастер установки, запустите uci set onion.console.setup='0' ; uci commit onion в командной строке Омега. В следующий раз, когда вы укажете свой браузер на Omega2, мастер установки вернется. Просто отметьте, что после завершения Мастера  onion.console.setup будет установлено  1 значение, то есть вместо него будет загружен OnionOS.

    Диспетчер приложений

    App Manager - еще одно новое дополнение к OnionOS. С его помощью пользователи теперь могут устанавливать и удалять приложения на OnionOS в несколько кликов, не прибегая к использованию командной строки.

    pC_aNeWBn2_M5eip6-srtqXrQ3u7PDjt281aOW4Db_oDj_nsTlVRJxQLB8_gDmw6MwIbyz5oCOsbICLD157OpHwh56LFEKeWyevtwYI93fAs5CXyOQUNf_fCBv-8eaESRvfGVugn

    При нажатии кнопки Install рядом с приложением, начнется процесс установки, а на месте кнопки появится значок загрузки. Он будет вращаться до тех пор, пока приложение не будет установлено.

    Нажмите на логотип Onion в верхней части боковой панели, чтобы вернуться на главную страницу, и вы увидите новое приложение. Установленные приложения будут иметь кнопку Remove, которую можно использовать для их удаления.

    Диспетчер приложений проверяет онлайн-репозитории Onion для OnionOS Apps, поэтому все новые приложения и обновления к ним автоматически появится в Диспетчере приложений.

    В качестве наших рекомендаций попробуйте в первую очередь установить Редактор кода. Редактор кода и приложения для терминалов делают OnionOS отличной средой разработки для Omega2. Посмотрите это короткое видео для краткого руководства по использованию редактора кода.

    Legacy Console

    За предшественника OnionOS беспокоиться не стоит - консоль все еще доступна. Установить ее можно через диспетчер приложений, а открыть через OnionOS в вашем браузере.

    Как получить новую версию?

    Чтобы установить самую последнюю прошивку на Omega2, выполните команду oupgrade. Для этого вы должны подключиться к командной строке Omega2 с  помощью SSH или через  Serial. Команда не будет работать из приложения «Терминал» на консоли.

    Как только ваша Omega2 завершит обновление, вам нужно будет выполнить команду: onion os update.

    Поздравляем! Теперь вам доступна самая крутая на текущий момент версия OnionOS!

    Важное примечание

    Поскольку в версии v0.1.10 b160 будет обновленный драйвер WiFi, то если вы обновляетесь с прошивки v0.1.10 b160 или более ранней - вам, возможно, придется пройти несколько дополнительных шагов, чтобы настроить вашу Omega2 и поработать с новым драйвером.

    Во-первых,  вам нужно сбросить настройки беспроводной сети, выполнив команду: wifisetup -reset

    Во-вторых,  вам нужно будет настроить, какие WiFi-сети вы хотите подключить к Omega. Это можно выполнить с помощью мастера установки или путем запуска  wifisetup в командной строке.

    Обратная связь

    Ваши отзывы или замечания по поводу новой прошивки вы можете оставлять в сообществе Onion или через специальный твит tweeting @OnionIoT .

    В команде разработчиков Omega хотят создать действительно потрясающий продукт для различных проектов, поэтому прислушиваются к любым пожеланиям!

    Спасибо за внимание, и удачной компиляции!