вторник, 31 октября 2017 г.

Тестирование OLED экрана 128x64

Сегодня пришли два монохромных OLED экрана с диагональю 0.96" и разрешением 128x64. Один из экранов собираюсь добавить в мой проект arduino-air-sensors, а второй - в радио-будильник для детей. О последнем я напишу отдельно, когда будет готово управление и индикация.

Модуль экрана использует контроллер SSD1306 и имеет четыре вывода: Gnd, Vcc, SCL, SDA. Подключение к Arduino выглядит так:

OLEDArduino
GndGnd
Vcc5V
SCLA4
SDAA5

Скачал библиотеки Adafruit_GFX и Adafruit_SSD1306. В последней нужно отредактировать файл Adafruit_SSD1306.h чтобы выбрать i2c адрес 0x3C и разрешение 128x64.

#define SSD1306_I2C_ADDRESS   0x3C
#define SSD1306_128_64

После этого залил минимальный скетч для инициализации экрана

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
}

void loop() {

}

Результат работы скетча:


В примерах библиотеки Adafruit_SSD1306 есть неплохая демка с элементами анимации.

воскресенье, 29 октября 2017 г.

ESP8266 + AM2302 + MH-Z19

Это продолжение поста про слежение за "погодой" в доме. Пришли заказанные в августе модули ESP8266 ESP-12S. Запаял их на платы и приступил к переделке проекта arduino-air-sensors.



На плате есть два резистора по 10k и один резистор-перемычка. Один из резисторов на 10k подтягивает ch_pd к питанию, а второй - gpio15 к земле. Чтобы плата запускалась без проблем еще нужно подтянуть gpio0 и gpio2 к питанию через резисторы номиналом 10k. Во время заливки прошивки нужно подтянуть gpio0 к земле.

Bootloader Modes
Modegpio0gpio2gpio15
UART Download Mode (Programming)010
Flash Startup (Normal)110
SD-Card Boot001

На нижней стороне платы есть место для стабилизатора напряжения на 3,3V и при его отстутствии нужен резистор-перемычка, который соединяет вход и выход питания для стабилизатора.

Но не спешите запаивать туда популярный AMS1117-3.3. Нужен стабилизатор, имеющий порядок выводов "Gnd, Vin, Vout", а у AMS1117 порядок выводов "Gnd, Vout, Vin". Можно попробовать MCP1700 в корпусе SOT-23 или SOT-89, но в этом случае максимальное входное напряжение не должно превышать 6V, а выходной ток - 250mA. Я не пробовал такое подключение, но при работе от USB или 3-х батареек AA должно работать.

Переписал скетч с Ethernet Shield на ESP8266 и добавил в проект схему в формате Eagle и PNG.

Для проверки надежности запустил siege на список урлов, которые поддерживает прошивка. Если за сутки ничего не отвалится и не зависнет, то можно говорить о какой-то надежности. Напомню, что версия на Ethernet Shield зависала случайным образом проработав от нескольких часов до суток и более.

воскресенье, 22 октября 2017 г.

Слежу за погодой в доме: DHT22 + MH-Z19

С наступлением холодов условия в помещении меняются. В качестве показателей "погоды" в доме я решил использовать температуру, относительную влажность и содержание углекислого газа. За показания температуры и влажности отвечает датчик AM2302 (DHT22), а за показания углекислоты - MH-Z19. При покупке на AliExpress оба сенсора обойдутся примерно 22$ - львиную долю составляет стоимость датчика MH-Z19. Химические датчики вроде MG811 я не рассматривал т.к. они довольно быстро деградируют и имеют невысокую точность.

Схема подключения и вид самой платы



К плате подключены два источника питания: USB порт, который питает саму Arduino и Ethernet shield, и AC-DC блок питания, подключенный через модуль питания макетной платы. Последний требуется из-за значительной просадки напряжения при питании MH-Z19 от внутреннего стабилизатора Arduino.

Изначально планировал использовать ESP8266 ESP-12S в качестве контроллера, но из-за проблем с покупкой пока собрал временный вариант на базе Arduino + Ethernet Shield. Показания сенсоров собираются в Munin а доступность платы по сети контролирует Nagios.


На графике хорошо заметны моменты, когда окно в комнате открывалось для проветривания. За время измерений уровень CO2 не превысил 1262 ppm (parts per million). Хотя это и не слишком много, но достаточно чтобы чувствовать себя уставшим. С одной стороны слеклопакеты дают отличную тепло- и звукоизоляцию, но расплата за это - фактически полное отсутствие вентиляции помещения.

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


Оказалось, что при запуске прошивки все строки копирутся в оперативную память и поэтому ее не хватает. Но если обернуть строку в макрос F(), то такая строка читается из флеш памяти с использованием функций доступа без копирования в оперативную. Использование памяти значительно снизилось


Но проблему зависаний это не решило. Подключил библиотеку MemoryFree - до момента зависания показывает больше килобайта свободной памяти. Сейчас хочу загрузить самый минимальный скетч, который не будет опрашивать сенсоры, а только отдавать OK на health check.

Если плата зависнет, то скорее всего либо проблема в самом Ethernet shield либо в библиотеке Ethernet. В последнем случае можно попробовать проверить стабильность работы заменив общение по сети на работу через Serial.

вторник, 17 октября 2017 г.

SDR приемник на базе RTL2838U

Приобрел DVB-T приемник на базе чипа RTL2838U, который собираюсь использовать как SDR приемник.





Чтобы ядро Linux не пыталось использовать его как dvb устройство, нужно запретить загрузку модуля dvb_usb_rtl28xxu

$ echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/rtl2838u-sdr.conf
$ sudo modprobe -r dvb_usb_rtl28xxu
$ sudo udevadm control --reload-rules

После этого нужно подключить приемник или переподключить его.

В системе устройство опозналось так:

$ lsusb -d 0bda:2838 -v

Bus 001 Device 030: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0bda Realtek Semiconductor Corp.
  idProduct          0x2838 RTL2838 DVB-T
  bcdDevice            1.00
  iManufacturer           1 Realtek
  iProduct                2 RTL2838UHIDIR
  iSerial                 3 00000001
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          4 USB2.0-Bulk&Iso
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              5 Bulk-In, Interface
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              5 Bulk-In, Interface
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  bNumConfigurations      2
Device Status:     0x0000
  (Bus Powered)

На первое время установил GNU Radio и Gqrx

sudo apt-get update
sudo apt-get install -t jessie-backports rtl-sdr gqrx-sdr gnuradio gr-osmosdr

Так выглядит FM станция при приеме на самодельную антенну четвертьволновой диполь из двух телескопических колен (каждое 19 см - 110 см) и одежной вешалки.



Регулируя длину колен такую антенну можно настраивать на оптимальный прием нужной частоты. Для приема FM частот нужно выдвинуть оба плеча антенны на 80 см - это будет соответствовать середине частоты FM диапазона.

В моем варианте длина телескопических колен регулируется от 19 см до 110 см, что соответствует частотам от 394MHz до 68MHz соответственно (чем больше выдвинуты колена, тем ниже частота оптимального приема).

воскресенье, 15 октября 2017 г.

Не везет с покупкой ESP8266 ESP-12S

С весны пытаюсь заказать два модуля ESP8266 в варианте ESP-12S.


ESP-12S - последний вариант эволюции модулей ESP-12E и ESP-12F. От двух последних отличается отсутствием падов для SPI flash на торце и наличием 4MB flash памяти (по непроверенным слухам).

В мае заказал два модуля на eBay у продавца kingelectronics15. Высокий рейтинг продавца и много продаж внушали доверие. В августе начал пинать продавца на предмет "а где моя посылка" - в итоге возврат средств без каких либо дополнительных вопросов.

Ну бывает, подумал я, и заказал эти модули у продавца caelectronics8. Аналогично высокий рейтинг и много продаж. На этой неделе я обратился к продавцу с тем же вопросом - где моя посылка? В итоге возрат средств.

Появилась мысль, что на почте завелся электронщик, которому приглянулись мои модули. Но эта мысль развеялась, когда я заглянул в транзакции Paypal - оба продавца имеют одинаковый email! В принципе если бы я был более внимателен к мелочам, то в самом начале можно было заметить одинаковый текст в оповещении о заказе. Как там говорят - в одну воронку снаряд дважды не попадает?

В этот раз испытываю удачу на Aliexpress. Теперь заказал пересылку с треком. Надеюсь я не настолько "везуч", чтобы в третий раз наткнуться на этого продавца.

Update 2017-10-24: Сегодня забрал на почте посылку от caelectronics8. Пересылка составила больше 60 дней, но подозрения в нечестности продавца развеялись. Возможно первая посылка от kingelectronics15 действительно потерялась на почте.

воскресенье, 8 октября 2017 г.

Dell Latitude e6430 включается со второго раза

На прошлой неделе заметил, что ноутбук жены (Dell Latitude e6430) включается со второго раза. После нажатия кнопки питания на порт-репликаторе на мониторе появляется логотип Dell, висит секунд 15, а затем ноутбук отключается. Если включить еще раз, то логотип пропадает быстро и начинается загрузка системы.

Попробовал узнать когда это появилось - говорит, что давно и поскольку ноутбук в итоге включается и работает без проблем, то проблемы как бы и нет. Но я так не играю - полез в BIOS чтобы глянуть какие события записывает в момент отключения питания.


Собственно наибольший интерес представляет событие "Power Off - ASF2 force off". Поиск в интернете привел на форумы Dell, где пишут что это очень общая ошибка, которая может значить любые проблемы. Но один из советов - проверить защелкнуты ли замки аккумулятора.

Достал ноутбук из дока и оказалось, что один из замков батареи открыт. Достал и снова установил батарею чтобы оба замка штатно закрылись.

За несколько дней проблема больше не повторилась - посмотрю как будет дальше.