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

Стоит разбить экран и смартфон становится бесполезных хламом

Недавно LG Nexus 5 неудачно спланировал с высоты примерно 1.5 метров на пол. Результат разбитый сенсор и экран, показывающий ворох цветных линий.


Ремонтировать такой телефон экономически невыгодно - за неоригинальный экран в Минске просят 60-70 рублей (примерно 35$). А еще его нужно заменить, не угробив телефон окончательно. Б/у Nexus 5 стоит 150-200 рублей в зависимости от состояния. В общем имеет смысл скопировать информацию, очистить телефон и продать на запчасти.

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

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

Данные с телефона стер через веб-версию Play Market, использую функцию поиска телефона.

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

Есть возможность подключить телефон к телевизору или монитору через HDMI, но у меня нет такого переходника:


Теперь остался вопрос - что взять на замену. Скорее всего буду брать еще один Xiaomi Mi4c и прошивать его на LineageOS 14.1.

пятница, 10 ноября 2017 г.

Использование STM32F103C8T6 в Arduino IDE

Разобрался как использовать плату на базе контроллера STM32F103C8T6 в Arduino. Мой вариант платы выглядит вот так


В wiki сайта stm32duino.com такая плата называется Blue Pill. И эта плата имеет несколько недостатков, которые относительно просто устранить имея под рукой паяльник.

Крепление micro-usb разъема не внушает доверие - я пропаял его. USB D+ пин подтянут к питанию через резистор номиналом 10k, но чтобы устройство определилось на шине USB как Full Speed, нужно подтягивать USB D+ к питанию через резистор номиналом 1,5k. Гуру smd пайки могут заменить на плате резистор R10, но я выбрал вариант с подключением резистора номиналом 1,8k между пинами PA12 (на этот пин выведен USB D+) и 3.3v.

Прошивку можно заливать через USB-UART преобразователь. Для этого нужно переключить преобразователь в режим 3,3v и подключить выводы согласно таблице

USB-UARTBlue Pill
GndGnd
Vcc3.3V
RXPA9
TXPA10

В настройках Arduino IDE нужно добавить поддержку SMT32F103 (File / Preferences / Additional Boards Manager URL):

http://dan.drown.org/stm32duino/package_STM32duino_index.json

В Boards Manager (Tools / Board / Boards Manager) установить "SMT32F1xx/GD32F1xx boards by smt32duino" и активировать загрузку прошивки через Serial (Tools / Upload method / Serial). На плате нужно переключить перемычку BOOT0 в High, а BOOT1 в Low. После этого нужно сбросить плату и можно заливать скетчи. Для нормальной работы прошивки BOOT0 и BOOT1 должны быть в состоянии Low.

Но лично я рекомендую прошить STM32duino bootloader и пользоваться загрузкой скетча через USB. Для этого подключаем плату через USB-UART преобразователь, как описано выше. Затем в консоли выполняем команды

$ wget -P /tmp https://github.com/rogerclarkmelbourne/STM32duino-bootloader/raw/master/binaries/generic_boot20_pc13.bin
$ cd ~/.arduino15/packages/stm32duino/tools/stm32tools/2017.11.8/linux/stm32flash
$ ./stm32flash -w /tmp/generic_boot20_pc13.bin -v -g 0x0 /dev/ttyUSB0

Мне еще потребовалось подправить правила UDEV, чтобы ModemManager, libmtp и UDisks не трогали плату:

$ cat /etc/udev/rules.d/45-usbprog.rules
# STM32duino USB bootloader
ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="0660", GROUP="plugdev", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="0660", GROUP="plugdev", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="0660", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="0660", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"

В начале файла /lib/udev/rules.d/69-libmtp.rules добавить

# STM32duino USB bootloader
ATTR{idVendor}=="1eaf", GOTO="libmtp_rules_end"
ATTR{idVendor}=="0110", GOTO="libmtp_rules_end"

После этого выполнить

$ sudo udevadm control --reload-rules

Мне пришлось перезагрузить компьютер - в моем случае UDisks не отставал от платы без перезагрузки. После этого отключить USB-UART преобразователь, выставить перемычки BOOT0 и BOOT1 в Low и подключить плату к компьютеру через USB. Теперь выбираем в Arduino IDE тип загрузки "STM32duino bootloader" (Tools / Upload method / STM32duino bootloader).

Первую загрузку скетча нужно делать включив режим infinite в загрузчике. Для этого подключается резистор номиналом 10k между 3,3v и PC14. После сброса светодиод на плате начинает постоянно мигать, что означает что загрузчик будет ждать начала загрузки без ограничения по времени. После первой загрузки этот режим можно выключить и дальше пользоваться платой как обычно.

Последовательный порт платы опознается в Linux как /dev/ttyACM0 и его нужно выбрать в "Tools / Port" чтобы работал Serial Monitor.

В Arduino IDE 1.6.8 у меня были ошибки при компиляции и я обновился до Arduino IDE 1.8.5. Для проверки работы платы можно использовать пример Blink (File / Examples / 01.Basics / Blink).

OpenTasks не показывает задачи после запуска

Если вы используете OpenTasks (Play Market, F-Droid), то возможно столкнулись с ситуацией когда приложение показывает задачи не сразу после запуска, а секунд через 10-15. Если активно использовать задачи, то такое поведение начинает раздражать.

У меня эта проблема проявилась на LineageOS 14.1 (Android 7.1.2). Чтобы исправить ситуацию достаточно выдать приложению разрешения "Contacts" (Settings / Apps / OpenTasks / Permissions). Заодно я включил два разрешения, помеченных как дополнительные: "read tasks" и "write tasks" (Settings / Apps / OpenTasks / Permissions / Additional permissions).

Теперь список задач виден сразу после запуска приложения.

вторник, 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 соответственно (чем больше выдвинуты колена, тем ниже частота оптимального приема).