Initial commit
This commit is contained in:
commit
caec46621e
13 changed files with 3558 additions and 0 deletions
33
README.md
Normal file
33
README.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
## ESP8266 Firmware
|
||||||
|
|
||||||
|
### Building
|
||||||
|
|
||||||
|
Edit esp/src/main.cpp and set the configuration (WiFi credentials, MQTT broker & topic)!
|
||||||
|
|
||||||
|
For Sanyo Z4:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd esp
|
||||||
|
pio run -e sanyoz4 -t upload --upload-port /dev/ttyUSB0
|
||||||
|
```
|
||||||
|
|
||||||
|
For Benq X3000i
|
||||||
|
|
||||||
|
```
|
||||||
|
cd esp
|
||||||
|
pio run -e benqx3000i -t upload --upload-port /dev/ttyUSB0
|
||||||
|
```
|
||||||
|
|
||||||
|
## PCB
|
||||||
|
|
||||||
|
* ESP-01
|
||||||
|
* [This specific MAX3232-Board from AliExpress][max3232]
|
||||||
|
* 1x 10k 0805 SMD Resistor
|
||||||
|
* 1x 2x2 2.54mm pin header
|
||||||
|
* 1x 2x4 2.54mm socket header
|
||||||
|
* 1x 1x4 2.54mm socket header
|
||||||
|
* USB Micro-B socket
|
||||||
|
* SOT-223 3v3 voltage regulator
|
||||||
|
|
||||||
|
[max3232]: https://de.aliexpress.com/item/1005001548466845.html?spm=a2g0o.productlist.0.0.29142932HtTivS&algo_pvid=37640f61-ffd9-40fb-b468-f261709c162b&algo_exp_id=37640f61-ffd9-40fb-b468-f261709c162b-1&pdp_ext_f=%7B%22sku_id%22%3A%2212000016543520800%22%7D&pdp_npi=2%40dis%21CHF%21%210.41%21%21%21%21%21%402101d8b516564877891056410e1251%2112000016543520800%21sea
|
1
esp/.gitignore
vendored
Normal file
1
esp/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
.pio
|
39
esp/include/README
Normal file
39
esp/include/README
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
|
||||||
|
This directory is intended for project header files.
|
||||||
|
|
||||||
|
A header file is a file containing C declarations and macro definitions
|
||||||
|
to be shared between several project source files. You request the use of a
|
||||||
|
header file in your project source file (C, C++, etc) located in `src` folder
|
||||||
|
by including it, with the C preprocessing directive `#include'.
|
||||||
|
|
||||||
|
```src/main.c
|
||||||
|
|
||||||
|
#include "header.h"
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Including a header file produces the same results as copying the header file
|
||||||
|
into each source file that needs it. Such copying would be time-consuming
|
||||||
|
and error-prone. With a header file, the related declarations appear
|
||||||
|
in only one place. If they need to be changed, they can be changed in one
|
||||||
|
place, and programs that include the header file will automatically use the
|
||||||
|
new version when next recompiled. The header file eliminates the labor of
|
||||||
|
finding and changing all the copies as well as the risk that a failure to
|
||||||
|
find one copy will result in inconsistencies within a program.
|
||||||
|
|
||||||
|
In C, the usual convention is to give header files names that end with `.h'.
|
||||||
|
It is most portable to use only letters, digits, dashes, and underscores in
|
||||||
|
header file names, and at most one dot.
|
||||||
|
|
||||||
|
Read more about using header files in official GCC documentation:
|
||||||
|
|
||||||
|
* Include Syntax
|
||||||
|
* Include Operation
|
||||||
|
* Once-Only Headers
|
||||||
|
* Computed Includes
|
||||||
|
|
||||||
|
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
153
esp/include/benqx3000i.cpp
Normal file
153
esp/include/benqx3000i.cpp
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
#ifndef _BENQ_X3000I_H_
|
||||||
|
#define _BENQ_X3000I_H_
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
|
||||||
|
enum Input {
|
||||||
|
HDMI1 = 1,
|
||||||
|
HDMI2 = 2,
|
||||||
|
HDMI3 = 3,
|
||||||
|
UNKNOWN = 127,
|
||||||
|
};
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.setTimeout(1000);
|
||||||
|
client.enableLastWillMessage("tele/" TOPIC "/LWT", "Offline");
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t queryPower() {
|
||||||
|
Serial.print("\r*pow=?#\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
String line = Serial.readStringUntil('\r');
|
||||||
|
if (line.length() < 6) {
|
||||||
|
Serial.print("\r*pow=?#\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
line = Serial.readStringUntil('\r');
|
||||||
|
}
|
||||||
|
if (line == "*pow=on#") {
|
||||||
|
return 1;
|
||||||
|
} else if (line == "*pow==off#") {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Input parseInput(const String& input) {
|
||||||
|
if (input == "HDMI1") return HDMI1;
|
||||||
|
if (input == "HDMI2") return HDMI2;
|
||||||
|
if (input == "HDMI3") return HDMI3;
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
String inputToString(Input input) {
|
||||||
|
if (input == HDMI1) return "HDMI1";
|
||||||
|
if (input == HDMI2) return "HDMI2";
|
||||||
|
if (input == HDMI3) return "HDMI3";
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendInputCommand(Input input) {
|
||||||
|
switch(input) {
|
||||||
|
case HDMI1:
|
||||||
|
Serial.print("\r*sour=hdmi#\r");
|
||||||
|
break;
|
||||||
|
case HDMI2:
|
||||||
|
Serial.print("\r*sour=hdmi2#\r");
|
||||||
|
break;
|
||||||
|
case HDMI3:
|
||||||
|
Serial.print("\r*sour=smartsystem#\r");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
}
|
||||||
|
|
||||||
|
Input parseInputState(const String& line) {
|
||||||
|
if (line == "*sour=hdmi#") return HDMI1;
|
||||||
|
if (line == "*sour=hdmi2#") return HDMI2;
|
||||||
|
if (line == "*sour=smartsystem#") return HDMI3;
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
Input queryInput() {
|
||||||
|
Serial.print("\r*sour=?\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
String line = Serial.readStringUntil('\r');
|
||||||
|
if (line.length() < 8) {
|
||||||
|
Serial.print("\r*sour=?\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
line = Serial.readStringUntil('\r');
|
||||||
|
}
|
||||||
|
if (line.length() <8) {
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
return parseInputState(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onInput(const String& message) {
|
||||||
|
Input state = queryInput();
|
||||||
|
Input desiredState = parseInput(message);
|
||||||
|
if (state != desiredState && desiredState != UNKNOWN) {
|
||||||
|
sendInputCommand(desiredState);
|
||||||
|
state = queryInput();
|
||||||
|
}
|
||||||
|
client.publish("resp/" TOPIC "/input", inputToString(state), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onPower(const String& message) {
|
||||||
|
bool state = queryPower();
|
||||||
|
if (message == "ON" || message == "OFF") {
|
||||||
|
bool desiredState = message == "ON";
|
||||||
|
if (state != desiredState) {
|
||||||
|
if (desiredState) {
|
||||||
|
Serial.print("\r*pow=on#\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
for (uint8_t i = 0; i < 5; ++i) {
|
||||||
|
state = queryPower();
|
||||||
|
if (state) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (uint8_t i = 0; i < 3; ++i) {
|
||||||
|
Serial.print("\r*pow=on#\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
for (uint8_t i = 0; i < 5; ++i) {
|
||||||
|
state = queryPower();
|
||||||
|
if (!state) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
client.publish("resp/" TOPIC "/power", state ? "ON" : "OFF", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onConnectionEstablished() {
|
||||||
|
client.subscribe("cmnd/" TOPIC "/power", onPower);
|
||||||
|
client.subscribe("cmnd/" TOPIC "/input", onInput);
|
||||||
|
client.publish("tele/" TOPIC "/LWT", "Online", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
client.loop();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
164
esp/include/sanyoz4.cpp
Normal file
164
esp/include/sanyoz4.cpp
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
#ifndef _SANYO_Z4_H_
|
||||||
|
#define _SANYO_Z4_H_
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
|
||||||
|
enum Input {
|
||||||
|
VIDEO = 0,
|
||||||
|
S_VIDEO = 1,
|
||||||
|
COMP1 = 2,
|
||||||
|
COMP2 = 3,
|
||||||
|
HDMI = 4,
|
||||||
|
VGA = 5,
|
||||||
|
UNKNOWN = 127,
|
||||||
|
};
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(19200);
|
||||||
|
Serial.setTimeout(1000);
|
||||||
|
client.enableLastWillMessage("tele/" TOPIC "/LWT", "Offline");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool queryPower() {
|
||||||
|
Serial.print("CR0\r");
|
||||||
|
Serial.flush();
|
||||||
|
String line = Serial.readStringUntil('\r');
|
||||||
|
if (line.length() != 2) {
|
||||||
|
Serial.print("CR0\r");
|
||||||
|
Serial.flush();
|
||||||
|
line = Serial.readStringUntil('\r');
|
||||||
|
}
|
||||||
|
return line == "00" || line == "40";
|
||||||
|
}
|
||||||
|
|
||||||
|
Input parseInput(const String& input) {
|
||||||
|
if (input == "VIDEO") return VIDEO;
|
||||||
|
if (input == "S-VIDEO") return S_VIDEO;
|
||||||
|
if (input == "COMP1") return COMP1;
|
||||||
|
if (input == "COMP2") return COMP2;
|
||||||
|
if (input == "VGA") return VGA;
|
||||||
|
if (input == "HDMI") return HDMI;
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
String inputToString(Input input) {
|
||||||
|
if (input == VIDEO) return "VIDEO";
|
||||||
|
if (input == S_VIDEO) return "S-VIDEO";
|
||||||
|
if (input == COMP1) return "COMP1";
|
||||||
|
if (input == COMP2) return "COMP2";
|
||||||
|
if (input == VGA) return "VGA";
|
||||||
|
if (input == HDMI) return "HDMI";
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendInputCommand(Input input) {
|
||||||
|
switch(input) {
|
||||||
|
case VIDEO:
|
||||||
|
Serial.print("C23\r");
|
||||||
|
break;
|
||||||
|
case S_VIDEO:
|
||||||
|
Serial.print("C24\r");
|
||||||
|
break;
|
||||||
|
case COMP1:
|
||||||
|
Serial.print("C25\r");
|
||||||
|
break;
|
||||||
|
case COMP2:
|
||||||
|
Serial.print("C26\r");
|
||||||
|
break;
|
||||||
|
case HDMI:
|
||||||
|
Serial.print("C53\r");
|
||||||
|
break;
|
||||||
|
case VGA:
|
||||||
|
Serial.print("C50\r");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
}
|
||||||
|
|
||||||
|
Input parseInputState(const String& line) {
|
||||||
|
if (line == "0") return VIDEO;
|
||||||
|
if (line == "1") return S_VIDEO;
|
||||||
|
if (line == "2") return COMP1;
|
||||||
|
if (line == "3") return COMP2;
|
||||||
|
if (line == "4") return HDMI;
|
||||||
|
if (line == "5") return VGA;
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
Input queryInput() {
|
||||||
|
Serial.print("CR1\r");
|
||||||
|
Serial.flush();
|
||||||
|
String line = Serial.readStringUntil('\r');
|
||||||
|
if (line.length() != 1) {
|
||||||
|
Serial.print("CR1\r");
|
||||||
|
Serial.flush();
|
||||||
|
line = Serial.readStringUntil('\r');
|
||||||
|
}
|
||||||
|
if (line.length() != 1) {
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
return parseInputState(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onInput(const String& message) {
|
||||||
|
Input state = queryInput();
|
||||||
|
Input desiredState = parseInput(message);
|
||||||
|
if (state != desiredState && desiredState != UNKNOWN) {
|
||||||
|
sendInputCommand(desiredState);
|
||||||
|
state = queryInput();
|
||||||
|
}
|
||||||
|
client.publish("resp/" TOPIC "/input", inputToString(state), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onPower(const String& message) {
|
||||||
|
bool state = queryPower();
|
||||||
|
if (message == "ON" || message == "OFF") {
|
||||||
|
bool desiredState = message == "ON";
|
||||||
|
if (state != desiredState) {
|
||||||
|
if (desiredState) {
|
||||||
|
client.publish("cmnd/sonoff/irrc/IRSend", "{\"Protocol\":\"NEC\",\"Bits\":32,\"Data\":\"0xCC0000FF\"}");
|
||||||
|
Serial.print("C00\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
for (uint8_t i = 0; i < 5; ++i) {
|
||||||
|
state = queryPower();
|
||||||
|
if (state) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (uint8_t i = 0; i < 3; ++i) {
|
||||||
|
Serial.print("C02\r");
|
||||||
|
Serial.flush();
|
||||||
|
Serial.readStringUntil('\r');
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
for (uint8_t i = 0; i < 5; ++i) {
|
||||||
|
state = queryPower();
|
||||||
|
if (!state) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
client.publish("resp/" TOPIC "/power", state ? "ON" : "OFF", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onConnectionEstablished() {
|
||||||
|
client.subscribe("cmnd/" TOPIC "/power", onPower);
|
||||||
|
client.subscribe("cmnd/" TOPIC "/input", onInput);
|
||||||
|
client.publish("tele/" TOPIC "/LWT", "Online", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
client.loop();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
46
esp/lib/README
Normal file
46
esp/lib/README
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
|
||||||
|
This directory is intended for project specific (private) libraries.
|
||||||
|
PlatformIO will compile them to static libraries and link into executable file.
|
||||||
|
|
||||||
|
The source code of each library should be placed in a an own separate directory
|
||||||
|
("lib/your_library_name/[here are source files]").
|
||||||
|
|
||||||
|
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||||
|
|
||||||
|
|--lib
|
||||||
|
| |
|
||||||
|
| |--Bar
|
||||||
|
| | |--docs
|
||||||
|
| | |--examples
|
||||||
|
| | |--src
|
||||||
|
| | |- Bar.c
|
||||||
|
| | |- Bar.h
|
||||||
|
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||||
|
| |
|
||||||
|
| |--Foo
|
||||||
|
| | |- Foo.c
|
||||||
|
| | |- Foo.h
|
||||||
|
| |
|
||||||
|
| |- README --> THIS FILE
|
||||||
|
|
|
||||||
|
|- platformio.ini
|
||||||
|
|--src
|
||||||
|
|- main.c
|
||||||
|
|
||||||
|
and a contents of `src/main.c`:
|
||||||
|
```
|
||||||
|
#include <Foo.h>
|
||||||
|
#include <Bar.h>
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
PlatformIO Library Dependency Finder will find automatically dependent
|
||||||
|
libraries scanning project source files.
|
||||||
|
|
||||||
|
More information about PlatformIO Library Dependency Finder
|
||||||
|
- https://docs.platformio.org/page/librarymanager/ldf.html
|
25
esp/platformio.ini
Normal file
25
esp/platformio.ini
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
; PlatformIO Project Configuration File
|
||||||
|
;
|
||||||
|
; Build options: build flags, source filter
|
||||||
|
; Upload options: custom upload port, speed and extra flags
|
||||||
|
; Library options: dependencies, extra library storages
|
||||||
|
; Advanced options: extra scripting
|
||||||
|
;
|
||||||
|
; Please visit documentation for the other options and examples
|
||||||
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
|
[env:sanyoz4]
|
||||||
|
build_flags = -D SANYO_Z4
|
||||||
|
platform = espressif8266
|
||||||
|
board = nodemcuv2
|
||||||
|
framework = arduino
|
||||||
|
upload_protocol = esptool
|
||||||
|
lib_deps = plapointe6/EspMQTTClient@^1.13.3
|
||||||
|
|
||||||
|
[env:benqx3000i]
|
||||||
|
build_flags = -D BENQ_X3000I
|
||||||
|
platform = espressif8266
|
||||||
|
board = nodemcuv2
|
||||||
|
framework = arduino
|
||||||
|
upload_protocol = esptool
|
||||||
|
lib_deps = plapointe6/EspMQTTClient@^1.13.3
|
19
esp/src/main.cpp
Normal file
19
esp/src/main.cpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#include <Arduino.h>
|
||||||
|
// https://registry.platformio.org/libraries/plapointe6/EspMQTTClient
|
||||||
|
#include "EspMQTTClient.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define TOPIC "choose a topic"
|
||||||
|
#define BROKER "mqtt broker ip"
|
||||||
|
#define SSID "your wifi ssid here"
|
||||||
|
#define PSK "your wifi psk here"
|
||||||
|
|
||||||
|
EspMQTTClient client(SSID, PSK, BROKER, TOPIC);
|
||||||
|
|
||||||
|
#ifdef SANYO_Z4
|
||||||
|
#include "sanyoz4.cpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BENQ_X3000I
|
||||||
|
#include "benqx3000i.cpp"
|
||||||
|
#endif
|
11
esp/test/README
Normal file
11
esp/test/README
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
This directory is intended for PlatformIO Unit Testing and project tests.
|
||||||
|
|
||||||
|
Unit Testing is a software testing method by which individual units of
|
||||||
|
source code, sets of one or more MCU program modules together with associated
|
||||||
|
control data, usage procedures, and operating procedures, are tested to
|
||||||
|
determine whether they are fit for use. Unit testing finds problems early
|
||||||
|
in the development cycle.
|
||||||
|
|
||||||
|
More information about PlatformIO Unit Testing:
|
||||||
|
- https://docs.platformio.org/page/plus/unit-testing.html
|
31
pcb/.gitignore
vendored
Normal file
31
pcb/.gitignore
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# https://github.com/github/gitignore/blob/main/KiCad.gitignore
|
||||||
|
|
||||||
|
# For PCBs designed using KiCad: https://www.kicad.org/
|
||||||
|
# Format documentation: https://kicad.org/help/file-formats/
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*.000
|
||||||
|
*.bak
|
||||||
|
*.bck
|
||||||
|
*.kicad_pcb-bak
|
||||||
|
*.kicad_sch-bak
|
||||||
|
*-backups
|
||||||
|
*.kicad_prl
|
||||||
|
*.sch-bak
|
||||||
|
*~
|
||||||
|
_autosave-*
|
||||||
|
*.tmp
|
||||||
|
*-save.pro
|
||||||
|
*-save.kicad_pcb
|
||||||
|
fp-info-cache
|
||||||
|
|
||||||
|
# Netlist files (exported from Eeschema)
|
||||||
|
*.net
|
||||||
|
|
||||||
|
# Autorouter files (exported from Pcbnew)
|
||||||
|
*.dsn
|
||||||
|
*.ses
|
||||||
|
|
||||||
|
# Exported BOM files
|
||||||
|
*.xml
|
||||||
|
*.csv
|
1359
pcb/pcb.kicad_pcb
Normal file
1359
pcb/pcb.kicad_pcb
Normal file
File diff suppressed because it is too large
Load diff
436
pcb/pcb.kicad_pro
Normal file
436
pcb/pcb.kicad_pro
Normal file
|
@ -0,0 +1,436 @@
|
||||||
|
{
|
||||||
|
"board": {
|
||||||
|
"design_settings": {
|
||||||
|
"defaults": {
|
||||||
|
"board_outline_line_width": 0.09999999999999999,
|
||||||
|
"copper_line_width": 0.19999999999999998,
|
||||||
|
"copper_text_italic": false,
|
||||||
|
"copper_text_size_h": 1.5,
|
||||||
|
"copper_text_size_v": 1.5,
|
||||||
|
"copper_text_thickness": 0.3,
|
||||||
|
"copper_text_upright": false,
|
||||||
|
"courtyard_line_width": 0.049999999999999996,
|
||||||
|
"dimension_precision": 4,
|
||||||
|
"dimension_units": 3,
|
||||||
|
"dimensions": {
|
||||||
|
"arrow_length": 1270000,
|
||||||
|
"extension_offset": 500000,
|
||||||
|
"keep_text_aligned": true,
|
||||||
|
"suppress_zeroes": false,
|
||||||
|
"text_position": 0,
|
||||||
|
"units_format": 1
|
||||||
|
},
|
||||||
|
"fab_line_width": 0.09999999999999999,
|
||||||
|
"fab_text_italic": false,
|
||||||
|
"fab_text_size_h": 1.0,
|
||||||
|
"fab_text_size_v": 1.0,
|
||||||
|
"fab_text_thickness": 0.15,
|
||||||
|
"fab_text_upright": false,
|
||||||
|
"other_line_width": 0.15,
|
||||||
|
"other_text_italic": false,
|
||||||
|
"other_text_size_h": 1.0,
|
||||||
|
"other_text_size_v": 1.0,
|
||||||
|
"other_text_thickness": 0.15,
|
||||||
|
"other_text_upright": false,
|
||||||
|
"pads": {
|
||||||
|
"drill": 0.762,
|
||||||
|
"height": 1.524,
|
||||||
|
"width": 1.524
|
||||||
|
},
|
||||||
|
"silk_line_width": 0.15,
|
||||||
|
"silk_text_italic": false,
|
||||||
|
"silk_text_size_h": 1.0,
|
||||||
|
"silk_text_size_v": 1.0,
|
||||||
|
"silk_text_thickness": 0.15,
|
||||||
|
"silk_text_upright": false,
|
||||||
|
"zones": {
|
||||||
|
"45_degree_only": false,
|
||||||
|
"min_clearance": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"diff_pair_dimensions": [
|
||||||
|
{
|
||||||
|
"gap": 0.0,
|
||||||
|
"via_gap": 0.0,
|
||||||
|
"width": 0.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"drc_exclusions": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
"rule_severities": {
|
||||||
|
"annular_width": "error",
|
||||||
|
"clearance": "error",
|
||||||
|
"copper_edge_clearance": "error",
|
||||||
|
"courtyards_overlap": "error",
|
||||||
|
"diff_pair_gap_out_of_range": "error",
|
||||||
|
"diff_pair_uncoupled_length_too_long": "error",
|
||||||
|
"drill_out_of_range": "error",
|
||||||
|
"duplicate_footprints": "warning",
|
||||||
|
"extra_footprint": "warning",
|
||||||
|
"footprint_type_mismatch": "error",
|
||||||
|
"hole_clearance": "error",
|
||||||
|
"hole_near_hole": "error",
|
||||||
|
"invalid_outline": "error",
|
||||||
|
"item_on_disabled_layer": "error",
|
||||||
|
"items_not_allowed": "error",
|
||||||
|
"length_out_of_range": "error",
|
||||||
|
"malformed_courtyard": "error",
|
||||||
|
"microvia_drill_out_of_range": "error",
|
||||||
|
"missing_courtyard": "ignore",
|
||||||
|
"missing_footprint": "warning",
|
||||||
|
"net_conflict": "warning",
|
||||||
|
"npth_inside_courtyard": "ignore",
|
||||||
|
"padstack": "error",
|
||||||
|
"pth_inside_courtyard": "ignore",
|
||||||
|
"shorting_items": "error",
|
||||||
|
"silk_over_copper": "warning",
|
||||||
|
"silk_overlap": "warning",
|
||||||
|
"skew_out_of_range": "error",
|
||||||
|
"through_hole_pad_without_hole": "error",
|
||||||
|
"too_many_vias": "error",
|
||||||
|
"track_dangling": "warning",
|
||||||
|
"track_width": "error",
|
||||||
|
"tracks_crossing": "error",
|
||||||
|
"unconnected_items": "error",
|
||||||
|
"unresolved_variable": "error",
|
||||||
|
"via_dangling": "warning",
|
||||||
|
"zone_has_empty_net": "error",
|
||||||
|
"zones_intersect": "error"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"allow_blind_buried_vias": false,
|
||||||
|
"allow_microvias": false,
|
||||||
|
"max_error": 0.005,
|
||||||
|
"min_clearance": 0.0,
|
||||||
|
"min_copper_edge_clearance": 0.0,
|
||||||
|
"min_hole_clearance": 0.25,
|
||||||
|
"min_hole_to_hole": 0.25,
|
||||||
|
"min_microvia_diameter": 0.19999999999999998,
|
||||||
|
"min_microvia_drill": 0.09999999999999999,
|
||||||
|
"min_silk_clearance": 0.0,
|
||||||
|
"min_through_hole_diameter": 0.3,
|
||||||
|
"min_track_width": 0.19999999999999998,
|
||||||
|
"min_via_annular_width": 0.049999999999999996,
|
||||||
|
"min_via_diameter": 0.39999999999999997,
|
||||||
|
"solder_mask_clearance": 0.0,
|
||||||
|
"solder_mask_min_width": 0.0,
|
||||||
|
"use_height_for_length_calcs": true
|
||||||
|
},
|
||||||
|
"track_widths": [
|
||||||
|
0.0,
|
||||||
|
0.25,
|
||||||
|
0.4,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"via_dimensions": [
|
||||||
|
{
|
||||||
|
"diameter": 0.0,
|
||||||
|
"drill": 0.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zones_allow_external_fillets": false,
|
||||||
|
"zones_use_no_outline": true
|
||||||
|
},
|
||||||
|
"layer_presets": []
|
||||||
|
},
|
||||||
|
"boards": [],
|
||||||
|
"cvpcb": {
|
||||||
|
"equivalence_files": []
|
||||||
|
},
|
||||||
|
"erc": {
|
||||||
|
"erc_exclusions": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 0
|
||||||
|
},
|
||||||
|
"pin_map": [
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"rule_severities": {
|
||||||
|
"bus_definition_conflict": "error",
|
||||||
|
"bus_entry_needed": "error",
|
||||||
|
"bus_label_syntax": "error",
|
||||||
|
"bus_to_bus_conflict": "error",
|
||||||
|
"bus_to_net_conflict": "error",
|
||||||
|
"different_unit_footprint": "error",
|
||||||
|
"different_unit_net": "error",
|
||||||
|
"duplicate_reference": "error",
|
||||||
|
"duplicate_sheet_names": "error",
|
||||||
|
"extra_units": "error",
|
||||||
|
"global_label_dangling": "warning",
|
||||||
|
"hier_label_mismatch": "error",
|
||||||
|
"label_dangling": "error",
|
||||||
|
"lib_symbol_issues": "warning",
|
||||||
|
"multiple_net_names": "warning",
|
||||||
|
"net_not_bus_member": "warning",
|
||||||
|
"no_connect_connected": "warning",
|
||||||
|
"no_connect_dangling": "warning",
|
||||||
|
"pin_not_connected": "error",
|
||||||
|
"pin_not_driven": "error",
|
||||||
|
"pin_to_pin": "warning",
|
||||||
|
"power_pin_not_driven": "error",
|
||||||
|
"similar_labels": "warning",
|
||||||
|
"unannotated": "error",
|
||||||
|
"unit_value_mismatch": "error",
|
||||||
|
"unresolved_variable": "error",
|
||||||
|
"wire_dangling": "error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"pinned_footprint_libs": [],
|
||||||
|
"pinned_symbol_libs": []
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"filename": "pcb.kicad_pro",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"net_settings": {
|
||||||
|
"classes": [
|
||||||
|
{
|
||||||
|
"bus_width": 12.0,
|
||||||
|
"clearance": 0.2,
|
||||||
|
"diff_pair_gap": 0.25,
|
||||||
|
"diff_pair_via_gap": 0.25,
|
||||||
|
"diff_pair_width": 0.2,
|
||||||
|
"line_style": 0,
|
||||||
|
"microvia_diameter": 0.3,
|
||||||
|
"microvia_drill": 0.1,
|
||||||
|
"name": "Default",
|
||||||
|
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||||
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
|
"track_width": 0.25,
|
||||||
|
"via_diameter": 0.8,
|
||||||
|
"via_drill": 0.4,
|
||||||
|
"wire_width": 6.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
"net_colors": null
|
||||||
|
},
|
||||||
|
"pcbnew": {
|
||||||
|
"last_paths": {
|
||||||
|
"gencad": "",
|
||||||
|
"idf": "",
|
||||||
|
"netlist": "",
|
||||||
|
"specctra_dsn": "",
|
||||||
|
"step": "",
|
||||||
|
"vrml": ""
|
||||||
|
},
|
||||||
|
"page_layout_descr_file": ""
|
||||||
|
},
|
||||||
|
"schematic": {
|
||||||
|
"annotate_start_num": 0,
|
||||||
|
"drawing": {
|
||||||
|
"default_line_thickness": 6.0,
|
||||||
|
"default_text_size": 50.0,
|
||||||
|
"field_names": [],
|
||||||
|
"intersheets_ref_own_page": false,
|
||||||
|
"intersheets_ref_prefix": "",
|
||||||
|
"intersheets_ref_short": false,
|
||||||
|
"intersheets_ref_show": false,
|
||||||
|
"intersheets_ref_suffix": "",
|
||||||
|
"junction_size_choice": 3,
|
||||||
|
"label_size_ratio": 0.375,
|
||||||
|
"pin_symbol_size": 25.0,
|
||||||
|
"text_offset_ratio": 0.15
|
||||||
|
},
|
||||||
|
"legacy_lib_dir": "",
|
||||||
|
"legacy_lib_list": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"net_format_name": "",
|
||||||
|
"ngspice": {
|
||||||
|
"fix_include_paths": true,
|
||||||
|
"fix_passive_vals": false,
|
||||||
|
"meta": {
|
||||||
|
"version": 0
|
||||||
|
},
|
||||||
|
"model_mode": 0,
|
||||||
|
"workbook_filename": ""
|
||||||
|
},
|
||||||
|
"page_layout_descr_file": "",
|
||||||
|
"plot_directory": "",
|
||||||
|
"spice_adjust_passive_values": false,
|
||||||
|
"spice_external_command": "spice \"%I\"",
|
||||||
|
"subpart_first_id": 65,
|
||||||
|
"subpart_id_separator": 0
|
||||||
|
},
|
||||||
|
"sheets": [
|
||||||
|
[
|
||||||
|
"78a16d3a-21cc-459c-881d-94d53fce7eac",
|
||||||
|
""
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"text_variables": {}
|
||||||
|
}
|
1241
pcb/pcb.kicad_sch
Normal file
1241
pcb/pcb.kicad_sch
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue