Ethernet модуль розумного будинку

Основним компонентом розумного будинку є пристрої які збирають якісь дані та відправляють до центрального модуля чи виконують команди центрального модуля. Зв’язок з центральним модулем може бути як дротовий так й бездротовий. Мої експеріменти:

MODBUS – центральний модуль повинен послідовно опитувати усі пристрої. Для збору даних з лічильника електроенергії гарний вибір (особливо якщо лічильник не має інших інтерфейсів), для збору інформації про стан вимикача освітлення та керування освітленням – на мій погляд поганий вибір. Мій тестовий стенд мав лічильник електроенергії, 1 вимикач та одне реле. Між вмиканням світла та спрацьовуванням реле проходив досить великий інтервал часу (у порівняні з роботою звичайного некерованого вимикача, іноді це займало десь пів секунди чи більше)

MQTT via WiFi – у якості пристроїв я використовував ESP8266 з прошивкою від Letscontrolit.  У цілому усе працювало, але іноді WiFi зв’язок пропадав, що приводило до затримок у передаванні команд (заходиш на кухню, а світло не вмикається). Та й потенційно ці система може бути виведена з ладу при наявності завад у радіоканалі.

Тому вже з пів року чи більше я дивлюсь як можна зробити пристрій, який буде працювати по Ethernet та отримувати живлення через Ethernet (досить часто у місті розташування пристрою немає 220В та пристрій не керує мережею 220В, тому окремий блок живлення це зайве). Перша спроба була узяти W5500, готовий модуль для отримання живлення з мережі Ethernet (наприклад такий), підключити це до ESP8266 та спробувати запустити. Я навіть замовив та отримав увесь цей комплект, але так й не запустив. Як виявилось ESp8266  не дуже дружить з W5500. Під час пошуків було знайдено ESP32. На відміну від ESP8266 ESP32 має підтримку Ethernet з коробки,  тому не довго вагаючись я замовив на aliexpress ESP32, готовий модуль на LAN8720, та кілька Ethernet модулів з підтримкою POE на провсяк випадок. Але модуль LAN8720 десь загубився та не дійшов, інший я вирішив не замовляти та просто вирішив зробити свій модуль на базі ESP32 з підтримкою POE.

У інтернеті можна знайти кілька готових комерційних модулів. Найбільш привабливим є wesp32 (він продається, але я не впевнений що він комерційний). Мені їх буде потрібний не один, тому було вирішено зібрати самостійно. Бистрий пошук SI3404-A привів до висновку, що її придбати неможливо ні у локальних дістріб’юторів ні на aliexpress. Тому було вирішено збирати повністю свій на базі wesp32.

Після пошуків на сайті Texas Instruments була знайдена мікросхема TPS23753 (наступні версії можливо будуть використовувати TPS23755, але поки її придбати неможливо).  Якщо ви спробуєте самостійно зібрати кілька таких модулів в вас буде 2 проблеми – де узяти Ethernet роз’єм та трансформатор. Усе інше у кількості від 5 штук за нормальними цінами можна знайти на aliexpres.  (можна пошукати на mouser чи аналогічних, але чи замовлення мінімум на $1000 чи вартість доставки $120 – не варіант). Довгі пошуки на aliexpress вирішили це питання, найскладніше було знайти RJ45 розетку з підтримкою PoE. 

Читання документації по wESP32 привело до проблеми зі сбросом. Проблема у тому, що вивід IO0 під час старту використовується для встановлення режиму завантаження/програмування, а після старту ESP32 вимагає 50МГц для роботи ethernet. З проекту wesp32 була узята ідея як вирішити цю проблему. Я навіть спитав  чи можна придбати кілька мікросхем PMS150C у розробника, на що отримав відповідь, що так. Нажаль я десь загубив відповідь, але виходило що сотня мікросхем з доставкою коштувала біля $40. Ціна цілком нормальна, але витрачати $40 на 3 плати (саме стільки я планував зробити як першу спробу) не входило у мої плани, тому було знайдено такий контролер – ATtiny10 (можна й 4/6/8, але їх не було у наявності, програма займає усього 130 байт).  Програма виглядає ось так:

/*
 * reset-monitor.cpp
 *
 * Created: 23.06.2019 10:44:34
 * Author : maxx
 */ 
#define F_CPU 8000000


#include <avr/io.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>

#define PHY_RES_PIN	PB1
#define OSC_EN_PIN	PB0

#define IO0_PIN		PB2	

void setup() {
	 DDRB = (1<<PHY_RES_PIN) | (1<<OSC_EN_PIN);	// PB1 and PB2 as output

	
}

int main(void)
{
	setup();
	_delay_ms(50);
	
	if (PINB & (1<<IO0_PIN)) {
		//GPIO0 = 1, Normal execution mode
		PORTB |= (1 << OSC_EN_PIN);		//	enable 50 MHz OSC
		_delay_ms(100);
		PORTB |= (1 << PHY_RES_PIN);	//	enable PHY
	}
		
    while (1) 
    {
		// We can sleep
		set_sleep_mode(SLEEP_MODE_PWR_DOWN);
		ACSR |= (1 << ACD);                   //Analog comparator off
		ACSR = ADMUX = ADCSRA = 0;
		//GIMSK |= (1 << INT0);
		cli();
		sleep_enable();
		sei();
		sleep_cpu();
		sleep_disable();
		cli();
    }
}

У якості Ethernet PHYs обираємо LAN8720A  бо для неї є підтримка у бібліотеках ESP32.

Далі беремо reference design for TPS23753, LAN8720 та малюємо таку схему:

 

Ну а далі усе просто – малюємо плату та замовляємо на pcbway,  замовляємо усі компоненти:

паяємо, знаходячи помилки та оновлюючи схему, та на виході отримуємо:

Вмикаємо – 3.3 вольта отримаємо, але ip адреса чомусь не отримується. Виправляємо усі помилки, та замовляємо плату другої ревізії, але вже на jlpcb. Це було перше замовлення на цьому сайті, тому 5 плат коштували всього $2 разом з доставкою. Паяемо, створюємо тестовий конфіг для ESPHome (ця плата повністю сумісна з wesp32):

esphome:
  name: etheresp32_1
  platform: ESP32
  board: wesp32

ethernet:
  type: LAN8720
  mdc_pin: GPIO16
  mdio_pin: GPIO17
  clk_mode: GPIO0_IN
  phy_addr: 0
  domain: .local

mqtt:
  broker: 192.168.0.101

i2c:
  sda: 33
  scl: 5
  scan: True

sensor:
  - platform: bmp085
    temperature:
      name: "Outside Temperature"
    pressure:
      name: "Outside Pressure"
    update_interval: 60s


# Enable logging
logger:

ota:
  password: "******************"

У результаті отримаємо таку плату:

10.01.2021 оновлення

Після кількох ітерацій схема трохи оновилась. Поточна схема виглядає так: schematic-esp32-module schematic-poe-eth schematic-poe-tps