diff --git a/pkg/schema/Magefile.go b/pkg/schema/Magefile.go new file mode 100644 index 0000000..b90056c --- /dev/null +++ b/pkg/schema/Magefile.go @@ -0,0 +1,87 @@ +//go:build mage +// +build mage + +package main + +import ( + "fmt" + + // mage:import + . "magefile/docker" +) + +func init() { + AppName = "kicad" + UpperAppName = "Kicad" + ImageName = "my/kicad" + + RunFn = run +} + +func Generate() { + GeneratePySkidl() + GenerateNetlist() +} +func GeneratePySkidl() { + Bash(`go-tr -p schema.go schema.py`) +} +func GenerateNetlist() { + Bash(`sudo docker run -ti --rm \ + --net=none \ + \ + -v /etc/localtime:/etc/localtime:ro \ + \ + -v $PWD:/app \ + \ + -w /app \ + --entrypoint=/bin/bash \ + \ + ` + ImageName + ` -c '\ + python schema.py + '`) +} + +func run() { + Bash(`sudo docker run -d \ + --restart=no \ + -h ` + AppName + ` \ + --name=` + AppName + ` \ + --net=` + NetName + ` \ + \ + -v /etc/localtime:/etc/localtime:ro \ + \ + -v ` + AppName + `:/home/user \ + \ + -e LANG=ru_RU.UTF-8 \ + -v /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 \ + -e DISPLAY=:0 \ + \ + -w / \ + \ + ` + ImageName) +} + +// Как пользовать: +// https://devbisme.github.io/skidl/ + +func SkidlShell() { + fmt.Println(` +from skidl import * +search("ESP32") +show("RF_Module", "ESP32-WROOM-32") +search_footprints("ESP32") +`) + Bash(`sudo docker run -ti --rm \ + --net=none \ + \ + -v /etc/localtime:/etc/localtime:ro \ + \ + -v $PWD:/app \ + \ + -w /app \ + --entrypoint=/bin/bash \ + \ + ` + ImageName + ` -c '\ + python \ + '`) +} diff --git a/pkg/schema/runonsave.sh b/pkg/schema/runonsave.sh new file mode 100755 index 0000000..c6d3702 --- /dev/null +++ b/pkg/schema/runonsave.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +go-tr -p schema.go schema.py + +tail -10 schema.py diff --git a/pkg/schema/schema.go b/pkg/schema/schema.go new file mode 100644 index 0000000..ac127e5 --- /dev/null +++ b/pkg/schema/schema.go @@ -0,0 +1,255 @@ +package dvizhenie + +import ( + "skidl" + . "skidl" +) + +func init() { + _ = skidl.X +} + +func main() { + vin := Net("3.3в") + gnd := Net("GND") + xl4016_fb := Net("XL4016 fb pin") + vkl := Net("Вкл") + vfb := Net("Обратная связь") + mk_onoff := Net("МК OnOff") + Nets := Interface( + vin == vin, + gnd == gnd, + xl4016_fb == xl4016_fb, + vkl == vkl, + vfb == vfb, + mk_onoff == mk_onoff, + ) + n := Nets + + ESP32 := Part("RF_Module", "ESP32-WROOM-32", TEMPLATE, footprint == "RF_Module:ESP32-WROOM-32") + Клема := Part("Connector_Generic", "Conn_01x01", TEMPLATE, footprint == "Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Vertical") + tr_fet := Part("Transistor_FET", "BSS138", TEMPLATE, footprint == "SOT-23_Handsoldering") + r := Part("Device", "R", TEMPLATE, footprint == "Resistor_SMD:R_0805_2012Metric") + r_jmp := Part("Device", "R", TEMPLATE, footprint == "Resistor_SMD:R_1206_3216Metric") + r_jmp_big := Part("Device", "R", TEMPLATE, footprint == "Resistor_SMD:R_1812_4532Metric") + diode := Part("Diode", "1N4001", TEMPLATE, footprint == "Diode_SMD:D_0805_2012Metric") + stabilitron := Part("Device", "D_Zener", TEMPLATE, footprint == "Diode_SMD:D_0805_2012Metric") + condensator := Part("Device", "C", TEMPLATE, footprint == "Capacitor_SMD:C_0805_2012Metric") + conn2 := Part("Connector_Generic", "Conn_01x02", TEMPLATE, footprint == "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + conn3 := Part("Connector_Generic", "Conn_01x03", TEMPLATE, footprint == "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical") + conn3_big := Part("Connector_Generic", "Conn_01x03", TEMPLATE, footprint == "Package_TO_SOT_THT:TO-3P-3_Vertical") + conn4 := Part("Connector_Generic", "Conn_01x04", TEMPLATE, footprint == "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical") + Parts := Interface( + ESP32 == ESP32, + Клема == Клема, + tr_fet == tr_fet, + r == r, + r_jmp == r_jmp, + r_jmp_big == r_jmp_big, + condensator == condensator, + diode == diode, + stabilitron == stabilitron, + conn2 == conn2, + conn3 == conn3, + conn3_big == conn3_big, + conn4 == conn4, + ) + p := Parts + + dcdc_3_3_v(Nets, Parts) + n.gnd & + p.r_jmp_big(ref == "main_gnd", value == "0") & + n.gnd + + esp32 := NewESP32(Nets, Parts) + + xl4016_driver(Nets, Parts, mk_vkl_net == esp32["IO18"], mk_yark_net == esp32["IO19"]) + + z1 := NewPinZaschita(name == "z1", n == n, p == p) + dvizh_verh := NewDvizh(name == "dvizh_verh", n == n, p == p) + dvizh_verh.out & z1.i + z1.o & + // p.r_jmp_big(ref == "esp32_dv_rj", value == "0") & + esp32["IO4"] + z1.g & n.gnd + + z2 := NewPinZaschita(name == "z2", n == n, p == p) + dvizh_niz := NewDvizh(name == "dvizh_niz", n == n, p == p) + dvizh_niz.out & z2.i + z2.o & esp32["IO16"] + z2.g & n.gnd + + generate_netlist() +} + +// @subcircuit +func NewESP32(n, p any) any { + esp32 := p.ESP32(ref == "ESP32", value == " ") + + // lgnd := Net("ESP32_GND") + // lvin := Net("ESP32_VIN") + lgnd := n.gnd + lvin := n.vin + + esp32["GND"] += lgnd + lgnd & + // p.r_jmp_big(ref == "rj_esp32_gnd", value == "0") & + n.gnd + esp32["VDD"] += lvin + lvin & + // p.r_jmp_big(ref == "rj_esp32_vin", value == "0") & + n.vin + + esp32["VDD"] & + p.r(ref == "r_esp32_en", value == "10k") & + esp32["EN"] + + z1 := NewPinZaschita(name == "esp32_z1", n == n, p == p) + z2 := NewPinZaschita(name == "esp32_z2", n == n, p == p) + z3 := NewPinZaschita(name == "esp32_z3", n == n, p == p) + z4 := NewPinZaschita(name == "esp32_z4", n == n, p == p) + + rxtx := p.conn4(ref == "rxtx", value == " ") + rxtx[1] & z1.i + z1.o & + // p.r_jmp_big(ref == "rj_rx", value == "0") & + esp32["RXD0/IO3"] + z1.g & lgnd + + rxtx[2] & z2.i + z2.o & esp32["TXD0/IO1"] + z2.g & lgnd + + rxtx[3] & z3.i + z3.o & + // p.r_jmp_big(ref == "rj_en", value == "0") & + esp32["EN"] + z3.g & lgnd + + rxtx[4] & z4.i + z4.o & + // p.r_jmp_big(ref == "rj_dl", value == "0") & + esp32["IO0"] + z4.g & lgnd + + vin_gnd := p.conn2(ref == "vin_gnd", value == " ") + vin_gnd[1] & lvin + vin_gnd[2] & lgnd + + return esp32 +} + +// @subcircuit +func xl4016_driver(n, p, mk_vkl_net, mk_yark_net any) { + // полевики для включателя, МК и яркости + tr_mk := p.tr_fet(ref == "tr_mk", value == "тр МК") + tr_yark := p.tr_fet(ref == "tr_yark", value == "тр ярк P-тип") + + // Диод с выключателя на полевик МК + d_vkl := p.diode(ref == "d_vkl", value == "диод вкл") + + // Обратная связь с резистора + k_vfb := p.Клема(ref == "k_vfb", value == " ") + // Выход на обратную связь микрухи + k_xl4016_fb := p.Клема(ref == "k_xl4016_fb", value == " ") + + k_xl4016_fb & + // p.r_jmp_big(ref == "rj_xl4016_fb", value == "0") & + tr_mk["S"] + // n.xl4016_fb + k_vfb & + // p.r_jmp_big(ref == "rj_vfb", value == "0") & + n.vfb + + vkl_iface := p.conn2(ref == "vkl_iface", value == "Вкл") + n.vkl & vkl_iface & n.vin + + r_fb := p.r(ref == "r_fb", value == "100k") // Или 1M + r_mk := p.r(ref == "r_mk", value == "10k") + + // Потягушка FB ноги на 3.3в - по умолчанию всё выключено + // n.vin & r_fb & n.xl4016_fb + n.vin & r_fb & tr_mk["S"] + + // Выходы полевиков + n.xl4016_fb & + // p.r_jmp_big(ref == "rj_tr_mk", value == "0") & + tr_mk["S"] + tr_mk["D"] & n.vfb + + // Полевик МК + tr_mk["G"] & r_mk & n.gnd + tr_mk["G"] & mk_vkl_net + // Диод с выключателя + n.vkl & d_vkl & tr_mk["G"] + + // Полевик яркости + tr_yark["G"] & n.vkl + mk_yark_net & + // p.r_jmp_big(ref == "rj_tr_yark", value == "0") & + tr_yark["S"] + + r_diode := p.r(ref == "r_yark_pre_diode", value == "100") + diode := p.diode(ref == "yark_diode", value == " ") + + tr_yark["D"] & r_diode & diode & n.vfb + + // От выключателя потягушка на землю + r_tr_g_yark := p.r(ref == "r_tr_g_yark", value == "10k") + n.vkl & r_tr_g_yark & n.gnd +} + +// @subcircuit +func dcdc_3_3_v(n, p any) { + high_vin := p.conn2(ref == "high_vin", value == "24В") + + lgnd := n.gnd + // lgnd := p.r_jmp_big(ref == "rj_dcdc_gnd", value == "0") + + dcdc := p.conn4(ref == "dcdc", value == "3.3В") + dcdc[1] & + // p.r_jmp_big(ref == "rj_dcdc_vin", value == "0") & + n.vin + dcdc[2] & lgnd & n.gnd + dcdc[3] & high_vin & lgnd +} + +// @package +func NewDvizh(out, name, n, p any) any { + d := p.conn3_big(ref == name, value == " ") + d[1] & + n.vin + d[2] & + out + d[3] & + n.gnd +} + +// @package +func NewPinZaschita(i, o, g, name, n, p any) any { + r := p.r(ref == name+"_r_in", value == "1k") + d_vin := p.diode(ref == name+"_d_vin", value == " ") + d_gnd := p.diode(ref == name+"_d_gnd", value == " ") + stabil := p.stabilitron(ref == name+"_stabil", value == " ") + cond := p.condensator(ref == name+"_cond", value == " ") + + // Первый резистор + i & + p.r_jmp_big(ref == name+"_rj1", value == "0") & + r + + // Диоды Шоттки в обратном включении + r & d_vin & n.vin + r & d_gnd & g + + // Стабилитрон - тоже в обратном включении (он, собсно, тока так и используется) + r & stabil & g + + // Конденсатор - фильтр по частоте. Ставить тока на низкочастотные линии (на RX/TX - оставлять пустыми). + r & cond & g + + // Выход на пин МК + r & + p.r_jmp_big(ref == name+"_rj2", value == "0") & + o +} diff --git a/pkg/schema/variables.go b/pkg/schema/variables.go new file mode 100644 index 0000000..10f1bd4 --- /dev/null +++ b/pkg/schema/variables.go @@ -0,0 +1,19 @@ +package dvizhenie + +const ( + TEMPLATE = "" + footprint = "" + value = "" +) + +func Net(string) func(...any) any { + return func(...any) any { + + } +} + +func Part(string, string, string, bool) func(...any) any { + return func(...any) any { + + } +}