Compare commits

...

28 Commits
v2.0 ... master

Author SHA1 Message Date
wiebel 51605d8d1c before serial in 2 years ago
wiebel 4eece42354 images 3 years ago
wiebel d0fbfa4481 PCB fixed silkscreen 3 years ago
wiebel e1f4675ef8 pproaching v2.5 4 years ago
wiebel d32e0b6ee5 Merge branch 'master' of git.wiebel.org:OSS/CANNode 4 years ago
wiebel dded78cb83 latest additions 4 years ago
root 4fd5096c96 try for command to fix failure in unknowtry for command to fix failure in unknownn 4 years ago
root 41d2190488 new alli in one, 001 4 years ago
root d6f9989379 some toole refinery 4 years ago
root e30963a990 updated coilmap 4 years ago
root e6da99b4a6 fixed loop for shutter2can 4 years ago
root f241e7cf04 latest changes in tools 4 years ago
root dfab0e57be Merge branch 'master' of git.wiebel.org:OSS/CANNode 4 years ago
wiebel 8310c0dd7f second RS485 swapped with OW 4 years ago
wiebel d68451e48b double RS485 4 years ago
wiebel b1ae22b367 new images (pdf) 5 years ago
wiebel b26c97e136 last before adding current sensors 5 years ago
root 896580a239 Merge branch 'master' of git.wiebel.org:OSS/CANNode 5 years ago
mwaiblinger 6a76239f40 much better can bus writing 5 years ago
root 55817da407 added affinity groups 5 years ago
mwaiblinger 584c263eaa more tools 5 years ago
root 42db319ae9 added some tools 5 years ago
mwaiblinger 81cebe6472 more feedback in and out 5 years ago
mwaiblinger 732b91caef new switch in WZ 5 years ago
wiebel 35263d8595 ena I²C text 5 years ago
wiebel 15de286b3f corrected output port labels 5 years ago
wiebel 4b22b19ab6 images moved to webroot 5 years ago
wiebel 77b927d1fc cleanup after order 5 years ago
  1. 399
      Hardware/kicad/CANNode-cache.lib
  2. 22862
      Hardware/kicad/CANNode.kicad_pcb
  3. 266
      Hardware/kicad/CANNode.pro
  4. 1907
      Hardware/kicad/CANNode.sch
  5. 1326
      Hardware/kicad/DiffWS2811/DiffWS2811.kicad_pcb
  6. BIN
      Hardware/kicad/DiffWS2811/DiffWS2811.pdf
  7. 43
      Hardware/kicad/DiffWS2811/DiffWS2811.pro
  8. 419
      Hardware/kicad/DiffWS2811/DiffWS2811.sch
  9. 1256
      Hardware/kicad/DiffWS2811/DiffWS2811_min.kicad_pcb
  10. 33
      Hardware/kicad/DiffWS2811/DiffWS2811_min.pro
  11. 1554
      Hardware/kicad/Modified.lib
  12. BIN
      Hardware/kicad/images/CANNode.pdf
  13. 7260
      Hardware/kicad/images/CANNode.svg
  14. BIN
      Hardware/kicad/images/CANNode_plain.pdf
  15. 520
      Hardware/kicad/images/CANNode_plain.svg
  16. BIN
      Hardware/kicad/images/CANNode_rev2.0.jpg
  17. BIN
      Hardware/kicad/images/CANNode_rev2.0.pdf
  18. BIN
      Hardware/kicad/images/CANNode_rev2.0_jlcpcb_bottom.png
  19. BIN
      Hardware/kicad/images/CANNode_rev2.0_jlcpcb_top.png
  20. BIN
      Hardware/kicad/images/CANNode_rev2.0_small.jpg
  21. BIN
      Hardware/kicad/images/CANNode_rev2.0_top.png
  22. BIN
      Hardware/kicad/images/CANNode_rev2.5.pdf
  23. 24071
      Hardware/kicad/images/CANNode_rev2.5.svg
  24. BIN
      Hardware/kicad/images/CANNode_rev2.5_top.png
  25. 44
      Hardware/kicad/max481e.lib
  26. 29
      Hardware/kicad/pca9306.lib
  27. 121
      src/CANNode.cpp
  28. 2
      src/CANNode.h
  29. 4
      src/Node_1_def.h
  30. 7
      src/Node_2_def.h
  31. 62
      src/Node_3_def.h
  32. 109
      tools/can2coil.py
  33. 85
      tools/can2mqtt.py
  34. 63
      tools/canfixer.py
  35. 163
      tools/coil2can.py
  36. 41
      tools/data2obj.py
  37. 170
      tools/light2can.py
  38. 214
      tools/mqtt2can.py
  39. 55
      tools/obj2data.py
  40. 149
      tools/shutter2can.py
  41. 141
      tools/sunevents2can.py

399
Hardware/kicad/CANNode-cache.lib

@ -1,93 +1,120 @@
EESchema-LIBRARY Version 2.4 EESchema-LIBRARY Version 2.4
#encoding utf-8 #encoding utf-8
# #
# 000_my_lib:DSN-MINI-360 # 00_mylib_Logo
# #
DEF 000_my_lib:DSN-MINI-360 MOD 0 40 Y Y 1 F P DEF 00_mylib_Logo Log 0 0 N N 1 F N
F0 "MOD" 350 -50 50 H V C CNN F0 "Log" 0 0 50 H I C CNN
F1 "000_my_lib:DSN-MINI-360" 200 350 50 H V C CNN F1 "00_mylib_Logo" 0 100 50 H V C CNN
F2 "" 250 150 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 250 150 50 H I C CNN F3 "" 0 0 50 H I C CNN
DRAW
ENDDRAW
ENDDEF
#
# 00_mylib_OWN_DCDC-CANNode
#
DEF 00_mylib_OWN_DCDC-CANNode MOD 0 40 N N 1 L N
F0 "MOD" 0 0 45 H I C CNN
F1 "00_mylib_OWN_DCDC-CANNode" 0 0 45 H I C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
*OWN_DC-DC*
$ENDFPLIST
DRAW
T 0 -174 128 56 0 1 0 + Normal 0 C C
T 0 226 128 56 0 1 0 + Normal 0 C C
T 0 7 28 56 0 1 0 DCDC Normal 0 C C
S -150 100 150 -50 1 1 0 N
P 2 1 0 0 -300 -200 300 -200 N
P 2 1 0 0 -300 -100 -300 -200 N
P 2 1 0 0 -300 -100 0 -100 N
P 2 1 0 0 -300 200 -300 -100 N
P 2 1 0 0 -30 -150 30 -150 N
P 2 1 0 0 0 -100 0 -150 N
P 2 1 0 0 0 -100 300 -100 N
P 2 1 0 0 300 -200 300 -100 N
P 2 1 0 0 300 -100 300 200 N
P 2 1 0 0 300 200 -300 200 N
X IN+ IN+ -400 100 200 R 40 40 1 1 W
X IN- IN- -400 -100 200 R 40 40 1 1 W
X OUT+ OUT+ 400 100 200 L 40 40 1 1 w
X OUT- OUT- 400 -100 200 L 40 40 1 1 w
ENDDRAW
ENDDEF
#
# CANNode-rescue_Teensy3.2-teensy
#
DEF CANNode-rescue_Teensy3.2-teensy U 0 40 Y Y 1 F N
F0 "U" -700 -850 60 H V C CNN
F1 "CANNode-rescue_Teensy3.2-teensy" 550 -850 60 H V C CNN
F2 "" -200 -800 60 H V C CNN
F3 "" -200 -800 60 H V C CNN
DRAW DRAW
S 0 300 450 0 0 0 0 f S -750 800 750 -800 0 1 0 N
X GND ~ -100 50 100 R 50 50 1 1 P X GND 1 -950 700 200 R 50 50 1 1 W
X GND ~ 550 50 100 L 50 50 1 1 P X 8_TX3_DIN 10 -950 -200 200 R 50 50 1 1 B
X IN ~ -100 250 100 R 50 50 1 1 P X 9_RX2_CS_PWM 11 -950 -300 200 R 50 50 1 1 B
X OUT ~ 550 250 100 L 50 50 1 1 P X 10_TX2_CS_PWM 12 -950 -400 200 R 50 50 1 1 B
X 11_DOUT 13 -950 -500 200 R 50 50 1 1 B
X 12_DIN 14 -950 -600 200 R 50 50 1 1 B
X VBat 15 -350 -1000 200 U 50 50 1 1 W
X 3.3V 16 -250 -1000 200 U 50 50 1 1 P
X GND 17 -150 -1000 200 U 50 50 1 1 W
X Program 18 -50 -1000 200 U 50 50 1 1 I
X A14/DAC 19 50 -1000 200 U 50 50 1 1 B
X 0_RX1_Touch 2 -950 600 200 R 50 50 1 1 B
X 13_LED_SCK 20 950 -600 200 L 50 50 1 1 B
X 14_A0_SCK 21 950 -500 200 L 50 50 1 1 B
X 15_A1_CS_Touch 22 950 -400 200 L 50 50 1 1 B
X 16_A2_SCL0_Touch 23 950 -300 200 L 50 50 1 1 B
X 17_A3_SDA0_Touch 24 950 -200 200 L 50 50 1 1 B
X 18_A4_SDA0_Touch 25 950 -100 200 L 50 50 1 1 B
X 19_A5_SCL0_Touch 26 950 0 200 L 50 50 1 1 B
X 20_A6_CS_PWM 27 950 100 200 L 50 50 1 1 B
X 21_A7_RX1_CS_PWM 28 950 200 200 L 50 50 1 1 B
X 22_A8_Touch_PWM 29 950 300 200 L 50 50 1 1 B
X 1_TX1_Touch 3 -950 500 200 R 50 50 1 1 B
X 23_A9_Touch_PWM 30 950 400 200 L 50 50 1 1 B
X 3.3V_max100mA 31 950 500 200 L 50 50 1 1 w
X AGND 32 950 600 200 L 50 50 1 1 w
X Vin 33 950 700 200 L 50 50 1 1 W
X 2 4 -950 400 200 R 50 50 1 1 B
X 3_TX_PWM 5 -950 300 200 R 50 50 1 1 B
X 4_RX_PWM 6 -950 200 200 R 50 50 1 1 B
X 5_TX1_PWM 7 -950 100 200 R 50 50 1 1 B
X 6_PWM 8 -950 0 200 R 50 50 1 1 B
X 7_RX3_DOUT 9 -950 -100 200 R 50 50 1 1 B
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# 000_my_lib:MAX3032 # Connector_Generic_Conn_01x03
# #
DEF 000_my_lib:MAX3032 U 0 20 Y Y 1 F N DEF Connector_Generic_Conn_01x03 J 0 40 Y N 1 F N
F0 "U" -300 750 50 H V L CNN F0 "J" 0 200 50 H V C CNN
F1 "000_my_lib:MAX3032" 100 750 50 H V L CNN F1 "Connector_Generic_Conn_01x03" 0 -200 50 H V C CNN
F2 "Package_SO:SOIC-16_3.9x9.9mm_P1.27mm" -100 -800 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 50 -100 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
TSSOP*4.4x5mm*P0.65mm* Connector*:*_1x??_*
$ENDFPLIST $ENDFPLIST
DRAW DRAW
C 0 -300 14 1 0 0 F S -50 -95 0 -105 1 1 6 N
C 0 300 14 1 0 0 F S -50 5 0 -5 1 1 6 N
C 75 -500 20 1 0 0 N S -50 105 0 95 1 1 6 N
C 75 -200 20 1 0 0 N S -50 150 50 -150 1 1 10 f
C 75 100 20 1 0 0 N X Pin_1 1 -200 100 150 R 50 50 1 1 P
C 75 400 20 1 0 0 N X Pin_2 2 -200 0 150 R 50 50 1 1 P
T 0 -35 450 40 0 1 0 D1 Normal 0 C C X Pin_3 3 -200 -100 150 R 50 50 1 1 P
T 0 -35 150 40 0 1 0 D2 Normal 0 C C
T 0 -35 -150 40 0 1 0 D3 Normal 0 C C
T 0 -35 -450 40 0 1 0 D4 Normal 0 C C
S -350 700 400 -700 1 0 10 f
P 2 1 0 0 150 -500 95 -500 N
P 2 1 0 0 150 -200 95 -200 N
P 2 1 0 0 150 100 95 100 N
P 2 1 0 0 150 400 95 400 N
P 3 1 0 0 75 -435 75 -400 150 -400 N
P 3 1 0 0 75 165 75 200 150 200 N
P 3 1 0 0 75 465 75 500 150 500 N
P 2 0 1 0 -100 -450 -200 -450 N
P 2 0 1 0 -100 -150 -200 -150 N
P 2 0 1 0 -100 150 -200 150 N
P 2 0 1 0 -100 450 -200 450 N
P 2 0 1 0 0 -300 -100 -300 N
P 2 0 1 0 0 -200 0 -400 N
P 2 0 1 0 0 300 -100 300 N
P 2 0 1 0 0 400 0 200 N
P 2 0 1 0 75 -480 75 -465 N
P 2 0 1 0 75 -180 75 -165 N
P 2 0 1 0 75 120 75 135 N
P 2 0 1 0 75 420 75 435 N
P 2 0 1 0 350 -400 350 -400 N
P 3 0 1 0 150 -100 75 -100 75 -135 N
P 4 1 1 10 -100 -350 -100 -550 100 -450 -100 -350 N
P 4 1 1 10 -100 -50 -100 -250 100 -150 -100 -50 N
P 4 1 1 10 -100 250 -100 50 100 150 -100 250 N
P 4 1 1 10 -100 550 -100 350 100 450 -100 550 N
X DI1 1 -450 450 100 R 50 50 1 1 I
X DO3+ 10 500 -100 100 L 50 50 1 1 O
X DO3- 11 500 -200 100 L 50 50 1 1 O
X EN34 12 -450 -300 100 R 50 50 1 1 I
X DO4- 13 500 -500 100 L 50 50 1 1 O
X DO4+ 14 500 -400 100 L 50 50 1 1 O
X DI4 15 -450 -450 100 R 50 50 1 1 I
X VCC 16 0 800 100 D 50 50 1 1 W
X DO1+ 2 500 500 100 L 50 50 1 1 O
X DO1- 3 500 400 100 L 50 50 1 1 O
X EN12 4 -450 300 100 R 50 50 1 1 I
X DO2- 5 500 100 100 L 50 50 1 1 O
X DO2+ 6 500 200 100 L 50 50 1 1 O
X DI2 7 -450 150 100 R 50 50 1 1 I
X GND 8 0 -800 100 U 50 50 1 1 W
X DI3 9 -450 -150 100 R 50 50 1 1 I
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Connector_Generic:Conn_01x04 # Connector_Generic_Conn_01x04
# #
DEF Connector_Generic:Conn_01x04 J 0 40 Y N 1 F N DEF Connector_Generic_Conn_01x04 J 0 40 Y N 1 F N
F0 "J" 0 200 50 H V C CNN F0 "J" 0 200 50 H V C CNN
F1 "Connector_Generic:Conn_01x04" 0 -300 50 H V C CNN F1 "Connector_Generic_Conn_01x04" 0 -300 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
@ -106,11 +133,11 @@ X Pin_4 4 -200 -200 150 R 50 50 1 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Connector_Generic:Conn_01x10 # Connector_Generic_Conn_01x10
# #
DEF Connector_Generic:Conn_01x10 J 0 40 Y N 1 F N DEF Connector_Generic_Conn_01x10 J 0 40 Y N 1 F N
F0 "J" 0 500 50 H V C CNN F0 "J" 0 500 50 H V C CNN
F1 "Connector_Generic:Conn_01x10" 0 -600 50 H V C CNN F1 "Connector_Generic_Conn_01x10" 0 -600 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
@ -141,11 +168,11 @@ X Pin_9 9 -200 -400 150 R 50 50 1 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Connector_Generic:Conn_02x03_Odd_Even # Connector_Generic_Conn_02x03_Odd_Even
# #
DEF Connector_Generic:Conn_02x03_Odd_Even J 0 40 Y N 1 F N DEF Connector_Generic_Conn_02x03_Odd_Even J 0 40 Y N 1 F N
F0 "J" 50 200 50 H V C CNN F0 "J" 50 200 50 H V C CNN
F1 "Connector_Generic:Conn_02x03_Odd_Even" 50 -200 50 H V C CNN F1 "Connector_Generic_Conn_02x03_Odd_Even" 50 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
@ -168,11 +195,11 @@ X Pin_6 6 300 -100 150 L 50 50 1 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Connector_Generic:Conn_02x04_Odd_Even # Connector_Generic_Conn_02x04_Odd_Even
# #
DEF Connector_Generic:Conn_02x04_Odd_Even J 0 40 Y N 1 F N DEF Connector_Generic_Conn_02x04_Odd_Even J 0 40 Y N 1 F N
F0 "J" 50 200 50 H V C CNN F0 "J" 50 200 50 H V C CNN
F1 "Connector_Generic:Conn_02x04_Odd_Even" 50 -300 50 H V C CNN F1 "Connector_Generic_Conn_02x04_Odd_Even" 50 -300 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
@ -199,31 +226,11 @@ X Pin_8 8 300 -200 150 L 50 50 1 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Device:CP_Small # Device_C_Small
#
DEF Device:CP_Small C 0 10 N N 1 F N
F0 "C" 10 70 50 H V L CNN
F1 "Device:CP_Small" 10 -80 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
CP_*
$ENDFPLIST
DRAW
S -60 -12 60 -27 0 1 0 F
S -60 27 60 12 0 1 0 N
P 2 0 1 0 -50 60 -30 60 N
P 2 0 1 0 -40 50 -40 70 N
X ~ 1 0 100 73 D 50 50 1 1 P
X ~ 2 0 -100 73 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device:C_Small
# #
DEF Device:C_Small C 0 10 N N 1 F N DEF Device_C_Small C 0 10 N N 1 F N
F0 "C" 10 70 50 H V L CNN F0 "C" 10 70 50 H V L CNN
F1 "Device:C_Small" 10 -80 50 H V L CNN F1 "Device_C_Small" 10 -80 50 H V L CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
@ -237,13 +244,19 @@ X ~ 2 0 -100 80 U 50 50 1 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Device:Jumper_NC_Small # Device_Jumper_NC_Small
# #
DEF Device:Jumper_NC_Small JP 0 30 N N 1 F N DEF Device_Jumper_NC_Small JP 0 30 N N 1 F N
F0 "JP" 0 80 50 H V C CNN F0 "JP" 0 80 50 H V C CNN
F1 "Device:Jumper_NC_Small" 10 -60 50 H V C CNN F1 "Device_Jumper_NC_Small" 10 -60 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST
SolderJumper*Bridged*
Jumper*
TestPoint*2Pads*
TestPoint*Bridge*
$ENDFPLIST
DRAW DRAW
A 0 -10 57 450 1350 0 1 0 N 40 30 -40 30 A 0 -10 57 450 1350 0 1 0 N 40 30 -40 30
C -40 0 20 0 1 0 N C -40 0 20 0 1 0 N
@ -253,11 +266,11 @@ X 2 2 100 0 40 L 50 50 0 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Device:R_Small # Device_R_Small
# #
DEF Device:R_Small R 0 10 N N 1 F N DEF Device_R_Small R 0 10 N N 1 F N
F0 "R" 30 20 50 H V L CNN F0 "R" 30 20 50 H V L CNN
F1 "Device:R_Small" 30 -40 50 H V L CNN F1 "Device_R_Small" 30 -40 50 H V L CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
@ -270,11 +283,35 @@ X ~ 2 0 -100 30 U 50 50 1 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Interface:PCA9306 # Interface_CAN_LIN_SN65HVD230
# #
DEF Interface:PCA9306 U 0 40 Y Y 1 F N DEF Interface_CAN_LIN_SN65HVD230 U 0 40 Y Y 1 F N
F0 "U" -100 400 50 H V R CNN
F1 "Interface_CAN_LIN_SN65HVD230" -100 300 50 H V R CNN
F2 "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" 0 -500 50 H I C CNN
F3 "" -100 400 50 H I C CNN
ALIAS SN65HVD231
$FPLIST
SOIC*3.9x4.9mm*P1.27mm*
$ENDFPLIST
DRAW
S -300 200 300 -300 0 1 10 f
X D 1 -400 100 100 R 50 50 1 1 I
X GND 2 0 -400 100 U 50 50 1 1 W
X VCC 3 0 300 100 D 50 50 1 1 W
X R 4 -400 0 100 R 50 50 1 1 O
X Vref 5 -400 -100 100 R 50 50 1 1 O
X CANL 6 400 -100 100 L 50 50 1 1 B
X CANH 7 400 0 100 L 50 50 1 1 B
X Rs 8 -400 -200 100 R 50 50 1 1 I
ENDDRAW
ENDDEF
#
# Interface_PCA9306
#
DEF Interface_PCA9306 U 0 40 Y Y 1 F N
F0 "U" -300 450 50 H V L CNN F0 "U" -300 450 50 H V L CNN
F1 "Interface:PCA9306" 200 450 50 H V L CNN F1 "Interface_PCA9306" 200 450 50 H V L CNN
F2 "" -400 350 50 H I C CNN F2 "" -400 350 50 H I C CNN
F3 "" -300 450 50 H I C CNN F3 "" -300 450 50 H I C CNN
$FPLIST $FPLIST
@ -295,35 +332,11 @@ X EN 8 400 100 100 L 50 50 1 1 I
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Interface_CAN_LIN:SN65HVD230 # Interface_UART_MAX3485
#
DEF Interface_CAN_LIN:SN65HVD230 U 0 40 Y Y 1 F N
F0 "U" -100 400 50 H V R CNN
F1 "Interface_CAN_LIN:SN65HVD230" -100 300 50 H V R CNN
F2 "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" 0 -500 50 H I C CNN
F3 "" -100 400 50 H I C CNN
ALIAS SN65HVD231
$FPLIST
SOIC*3.9x4.9mm*P1.27mm*
$ENDFPLIST
DRAW
S -300 200 300 -300 0 1 10 f
X D 1 -400 100 100 R 50 50 1 1 I
X GND 2 0 -400 100 U 50 50 1 1 W
X VCC 3 0 300 100 D 50 50 1 1 W
X R 4 -400 0 100 R 50 50 1 1 O
X Vref 5 -400 -100 100 R 50 50 1 1 O
X CANL 6 400 -100 100 L 50 50 1 1 B
X CANH 7 400 0 100 L 50 50 1 1 B
X Rs 8 -400 -200 100 R 50 50 1 1 I
ENDDRAW
ENDDEF
#
# Interface_UART:MAX3485
# #
DEF Interface_UART:MAX3485 U 0 20 Y Y 1 F N DEF Interface_UART_MAX3485 U 0 20 Y Y 1 F N
F0 "U" -240 450 50 H V C CNN F0 "U" -240 450 50 H V C CNN
F1 "Interface_UART:MAX3485" 30 450 50 H V L CNN F1 "Interface_UART_MAX3485" 30 450 50 H V L CNN
F2 "" 0 -700 50 H I C CNN F2 "" 0 -700 50 H I C CNN
F3 "" 0 50 50 H I C CNN F3 "" 0 50 50 H I C CNN
ALIAS MAX483E MAX485E MAX487E MAX1487E MAX3485 MAX3483 MAX3486 ALIAS MAX483E MAX485E MAX487E MAX1487E MAX3485 MAX3483 MAX3486
@ -359,15 +372,17 @@ X VCC 8 0 500 100 D 50 50 1 1 W
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Jumper:Jumper_3_Bridged12 # Jumper_Jumper_3_Bridged12
# #
DEF Jumper:Jumper_3_Bridged12 JP 0 0 Y N 1 F N DEF Jumper_Jumper_3_Bridged12 JP 0 0 Y N 1 F N
F0 "JP" -100 -100 50 H V C CNN F0 "JP" -100 -100 50 H V C CNN
F1 "Jumper:Jumper_3_Bridged12" 0 110 50 H V C CNN F1 "Jumper_Jumper_3_Bridged12" 0 110 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
$FPLIST $FPLIST
Jumper*Bridged12* Jumper*
TestPoint*3Pads*
TestPoint*Bridge*
$ENDFPLIST $ENDFPLIST
DRAW DRAW
A -65 -50 89 1282 518 0 1 0 N -120 20 -10 20 A -65 -50 89 1282 518 0 1 0 N -120 20 -10 20
@ -381,33 +396,26 @@ X B 3 250 0 100 L 50 50 1 1 P
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# Regulator_Linear:LM1117-5.0 # Mechanical_MountingHole
# #
DEF Regulator_Linear:LM1117-5.0 U 0 10 Y Y 1 F N DEF Mechanical_MountingHole H 0 40 Y Y 1 F N
F0 "U" -150 125 50 H V C CNN F0 "H" 0 200 50 H V C CNN
F1 "Regulator_Linear:LM1117-5.0" 0 125 50 H V L CNN F1 "Mechanical_MountingHole" 0 125 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
ALIAS LM1117-2.5 LM1117-3.3 LM1117-5.0 TLV1117-15 TLV1117-18 TLV1117-25 TLV1117-33 TLV1117-50
$FPLIST $FPLIST
SOT?223* MountingHole*
TO?263*
TO?252*
TO?220*
$ENDFPLIST $ENDFPLIST
DRAW DRAW
S -200 -200 200 75 0 1 10 f C 0 0 50 0 1 50 N
X GND 1 0 -300 100 U 50 50 1 1 W
X VO 2 300 0 100 L 50 50 1 1 w
X VI 3 -300 0 100 R 50 50 1 1 W
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# power:+12V # power_+12V
# #
DEF power:+12V #PWR 0 0 Y Y 1 F P DEF power_+12V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN F0 "#PWR" 0 -150 50 H I C CNN
F1 "power:+12V" 0 140 50 H V C CNN F1 "power_+12V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
DRAW DRAW
@ -418,11 +426,11 @@ X +12V 1 0 0 0 U 50 50 1 1 W N
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# power:+3.3V # power_+3.3V
# #
DEF power:+3.3V #PWR 0 0 Y Y 1 F P DEF power_+3.3V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN F0 "#PWR" 0 -150 50 H I C CNN
F1 "power:+3.3V" 0 140 50 H V C CNN F1 "power_+3.3V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
ALIAS +3.3V ALIAS +3.3V
@ -434,11 +442,11 @@ X +3V3 1 0 0 0 U 50 50 1 1 W N
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# power:+5V # power_+5V
# #
DEF power:+5V #PWR 0 0 Y Y 1 F P DEF power_+5V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN F0 "#PWR" 0 -150 50 H I C CNN
F1 "power:+5V" 0 140 50 H V C CNN F1 "power_+5V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
DRAW DRAW
@ -449,11 +457,11 @@ X +5V 1 0 0 0 U 50 50 1 1 W N
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# power:GND # power_GND
# #
DEF power:GND #PWR 0 0 Y Y 1 F P DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN F0 "#PWR" 0 -250 50 H I C CNN
F1 "power:GND" 0 -150 50 H V C CNN F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
DRAW DRAW
@ -462,11 +470,11 @@ X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# power:PWR_FLAG # power_PWR_FLAG
# #
DEF power:PWR_FLAG #FLG 0 0 N N 1 F P DEF power_PWR_FLAG #FLG 0 0 N N 1 F P
F0 "#FLG" 0 75 50 H I C CNN F0 "#FLG" 0 75 50 H I C CNN
F1 "power:PWR_FLAG" 0 150 50 H V C CNN F1 "power_PWR_FLAG" 0 150 50 H V C CNN
F2 "" 0 0 50 H I C CNN F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN F3 "" 0 0 50 H I C CNN
DRAW DRAW
@ -475,49 +483,4 @@ X pwr 1 0 0 0 U 50 50 0 0 w
ENDDRAW ENDDRAW
ENDDEF ENDDEF
# #
# teensy:Teensy3.2
#
DEF teensy:Teensy3.2 U 0 40 Y Y 1 F N
F0 "U" -700 -850 60 H V C CNN
F1 "teensy:Teensy3.2" 550 -850 60 H V C CNN
F2 "" -200 -800 60 H V C CNN
F3 "" -200 -800 60 H V C CNN
DRAW
S -750 800 750 -800 0 1 0 N
X GND 1 -950 700 200 R 50 50 1 1 W
X 8_TX3_DIN 10 -950 -200 200 R 50 50 1 1 B
X 9_RX2_CS_PWM 11 -950 -300 200 R 50 50 1 1 B
X 10_TX2_CS_PWM 12 -950 -400 200 R 50 50 1 1 B
X 11_DOUT 13 -950 -500 200 R 50 50 1 1 B
X 12_DIN 14 -950 -600 200 R 50 50 1 1 B
X VBat 15 -350 -1000 200 U 50 50 1 1 W
X 3.3V 16 -250 -1000 200 U 50 50 1 1 P
X GND 17 -150 -1000 200 U 50 50 1 1 W
X Program 18 -50 -1000 200 U 50 50 1 1 I
X A14/DAC 19 50 -1000 200 U 50 50 1 1 B
X 0_RX1_Touch 2 -950 600 200 R 50 50 1 1 B
X 13_LED_SCK 20 950 -600 200 L 50 50 1 1 B
X 14_A0_SCK 21 950 -500 200 L 50 50 1 1 B
X 15_A1_CS_Touch 22 950 -400 200 L 50 50 1 1 B
X 16_A2_SCL0_Touch 23 950 -300 200 L 50 50 1 1 B
X 17_A3_SDA0_Touch 24 950 -200 200 L 50 50 1 1 B
X 18_A4_SDA0_Touch 25 950 -100 200 L 50 50 1 1 B
X 19_A5_SCL0_Touch 26 950 0 200 L 50 50 1 1 B
X 20_A6_CS_PWM 27 950 100 200 L 50 50 1 1 B
X 21_A7_RX1_CS_PWM 28 950 200 200 L 50 50 1 1 B
X 22_A8_Touch_PWM 29 950 300 200 L 50 50 1 1 B
X 1_TX1_Touch 3 -950 500 200 R 50 50 1 1 B
X 23_A9_Touch_PWM 30 950 400 200 L 50 50 1 1 B
X 3.3V_max100mA 31 950 500 200 L 50 50 1 1 w
X AGND 32 950 600 200 L 50 50 1 1 w
X Vin 33 950 700 200 L 50 50 1 1 W
X 2 4 -950 400 200 R 50 50 1 1 B
X 3_TX_PWM 5 -950 300 200 R 50 50 1 1 B
X 4_RX_PWM 6 -950 200 200 R 50 50 1 1 B
X 5_TX1_PWM 7 -950 100 200 R 50 50 1 1 B
X 6_PWM 8 -950 0 200 R 50 50 1 1 B
X 7_RX3_DOUT 9 -950 -100 200 R 50 50 1 1 B
ENDDRAW
ENDDEF
#
#End Library #End Library

22862
Hardware/kicad/CANNode.kicad_pcb

File diff suppressed because it is too large

266
Hardware/kicad/CANNode.pro

@ -1,29 +1,10 @@
update=Date update=Tue 30 Jun 2020 09:41:16 PM CEST
version=1 version=1
last_client=kicad last_client=kicad
[general] [general]
version=1 version=1
RootSch= RootSch=
BoardNm= BoardNm=
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb] [cvpcb]
version=1 version=1
NetIExt=net NetIExt=net
@ -37,7 +18,250 @@ PageLayoutDescrFile=
PlotDirectoryName=images/ PlotDirectoryName=images/
SubpartIdSeparator=0 SubpartIdSeparator=0
SubpartFirstId=65 SubpartFirstId=65
NetFmtName= NetFmtName=Pcbnew
SpiceAjustPassiveValues=0 SpiceAjustPassiveValues=0
LabSize=50 LabSize=50
ERC_TestSimilarLabels=1 ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=CANNode.net
CopperLayerCount=4
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.1524
MinViaDiameter=0.6858
MinViaDrill=0.3302
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.3
TrackWidth2=0.175
TrackWidth3=0.2
TrackWidth4=0.25
TrackWidth5=0.3
TrackWidth6=0.4
TrackWidth7=0.6
TrackWidth8=0.8
TrackWidth9=1.6
ViaDiameter1=0.6858
ViaDrill1=0.3302
dPairWidth1=0.3
dPairGap1=0.175
dPairViaGap1=0.25
SilkLineWidth=0.15
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.2
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0.2
SolderMaskMinWidth=0.25
SolderPasteClearance=0
SolderPasteRatio=-0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=1
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=1
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=0
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.175
TrackWidth=0.3
ViaDiameter=0.6858
ViaDrill=0.3302
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.3
dPairGap=0.175
dPairViaGap=0.25
[pcbnew/Netclasses/1]
Name=Power
Clearance=0.2
TrackWidth=0.5
ViaDiameter=1.25
ViaDrill=0.5
uViaDiameter=0.65
uViaDrill=0.2
dPairWidth=0.3
dPairGap=0.25
dPairViaGap=0.25

1907
Hardware/kicad/CANNode.sch

File diff suppressed because it is too large

1326
Hardware/kicad/DiffWS2811/DiffWS2811.kicad_pcb

File diff suppressed because it is too large

BIN
Hardware/kicad/DiffWS2811/DiffWS2811.pdf

Binary file not shown.

43
Hardware/kicad/DiffWS2811/DiffWS2811.pro

@ -0,0 +1,43 @@
update=Tue Oct 22 14:04:36 2019
version=1
last_client=eeschema
[general]
version=1
RootSch=
BoardNm=
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1

419
Hardware/kicad/DiffWS2811/DiffWS2811.sch

@ -0,0 +1,419 @@
EESchema Schematic File Version 4
LIBS:DiffWS2811-cache
EELAYER 26 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L 000_my_lib:DSN-MINI-360 MOD1
U 1 1 5C0664F1
P 2900 3550
F 0 "MOD1" H 2900 3500 50 0000 C CNN
F 1 "DSN-MINI-360" H 3125 3934 50 0001 C CNN
F 2 "000_my_footprints:DC-DC" H 3150 3700 50 0001 C CNN
F 3 "" H 3150 3700 50 0001 C CNN
1 2900 3550
1 0 0 -1
$EndComp
$Comp
L Interface_UART:MAX485E U1
U 1 1 5C06691A
P 3850 2300
F 0 "U1" H 4100 1750 50 0000 C CNN
F 1 "MAX485E" H 3650 1750 50 0000 C CNN
F 2 "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" H 3850 1600 50 0001 C CNN
F 3 "https://datasheets.maximintegrated.com/en/ds/MAX1487E-MAX491E.pdf" H 3850 2350 50 0001 C CNN
1 3850 2300
-1 0 0 -1
$EndComp
$Comp
L Device:R_Small R1
U 1 1 5C066BB7
P 3150 2350
F 0 "R1" H 3209 2350 50 0000 L CNN
F 1 "R_Small" H 3209 2305 50 0001 L CNN
F 2 "Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder" H 3150 2350 50 0001 C CNN
F 3 "~" H 3150 2350 50 0001 C CNN
1 3150 2350
1 0 0 -1
$EndComp
$Comp
L Connector_Generic:Conn_01x04 J1
U 1 1 5C066D15
P 2750 2400
F 0 "J1" H 2670 1975 50 0000 C CNN
F 1 "Conn_01x04" H 3200 2100 50 0001 C CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical" H 2750 2400 50 0001 C CNN
F 3 "~" H 2750 2400 50 0001 C CNN
1 2750 2400
-1 0 0 1
$EndComp
$Comp
L Connector_Generic:Conn_01x03 J2
U 1 1 5C066E44
P 4850 2200
F 0 "J2" H 4930 2196 50 0000 L CNN
F 1 "Conn_01x03" H 4930 2151 50 0001 L CNN
F 2 "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" H 4850 2200 50 0001 C CNN
F 3 "~" H 4850 2200 50 0001 C CNN
1 4850 2200
1 0 0 1
$EndComp
$Comp
L Device:C_Small C1
U 1 1 5C066F30
P 4150 3350
F 0 "C1" H 4242 3396 50 0000 L CNN
F 1 "C_Small" H 4242 3305 50 0001 L CNN
F 2 "Capacitor_SMD:C_0805_2012Metric_Pad1.15x1.40mm_HandSolder" H 4150 3350 50 0001 C CNN
F 3 "~" H 4150 3350 50 0001 C CNN
1 4150 3350
1 0 0 -1
$EndComp
$Comp
L Device:Jumper_NO_Small JP1
U 1 1 5C066FFC
P 3100 3200
F 0 "JP1" H 3100 3385 50 0000 C CNN
F 1 "Jumper" H 3100 3294 50 0000 C CNN
F 2 "Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm" H 3100 3200 50 0001 C CNN
F 3 "~" H 3100 3200 50 0001 C CNN
1 3100 3200
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0101
U 1 1 5C0670C6
P 3000 2550
F 0 "#PWR0101" H 3000 2300 50 0001 C CNN
F 1 "GND" H 3005 2377 50 0001 C CNN
F 2 "" H 3000 2550 50 0001 C CNN
F 3 "" H 3000 2550 50 0001 C CNN
1 3000 2550
1 0 0 -1
$EndComp
$Comp
L power:VCC #PWR0102
U 1 1 5C067142
P 3850 1750
F 0 "#PWR0102" H 3850 1600 50 0001 C CNN
F 1 "VCC" H 4000 1800 50 0000 C CNN
F 2 "" H 3850 1750 50 0001 C CNN
F 3 "" H 3850 1750 50 0001 C CNN
1 3850 1750
1 0 0 -1
$EndComp
$Comp
L power:-VSW #PWR0103
U 1 1 5C06719C
P 3000 2150
F 0 "#PWR0103" H 3000 2250 50 0001 C CNN
F 1 "-VSW" H 3015 2323 50 0000 C CNN
F 2 "" H 3000 2150 50 0001 C CNN
F 3 "" H 3000 2150 50 0001 C CNN
1 3000 2150
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0104
U 1 1 5C067280
P 3100 3700
F 0 "#PWR0104" H 3100 3450 50 0001 C CNN
F 1 "GND" H 3105 3527 50 0001 C CNN
F 2 "" H 3100 3700 50 0001 C CNN
F 3 "" H 3100 3700 50 0001 C CNN
1 3100 3700
1 0 0 -1
$EndComp
$Comp
L power:-VSW #PWR0106
U 1 1 5C0672B2
P 2750 3150
F 0 "#PWR0106" H 2750 3250 50 0001 C CNN
F 1 "-VSW" H 2765 3323 50 0000 C CNN
F 2 "" H 2750 3150 50 0001 C CNN
F 3 "" H 2750 3150 50 0001 C CNN
1 2750 3150
1 0 0 -1
$EndComp
$Comp
L power:VCC #PWR0107
U 1 1 5C0672DA
P 3450 3150
F 0 "#PWR0107" H 3450 3000 50 0001 C CNN
F 1 "VCC" H 3467 3323 50 0000 C CNN
F 2 "" H 3450 3150 50 0001 C CNN
F 3 "" H 3450 3150 50 0001 C CNN
1 3450 3150
1 0 0 -1
$EndComp
Wire Wire Line
3850 1750 3850 1800
Wire Wire Line
2750 3150 2750 3200
Wire Wire Line
2750 3200 2900 3200
Wire Wire Line
3200 3200 3300 3200
Wire Wire Line
3450 3200 3450 3150
Wire Wire Line
3450 3200 3450 3300
Connection ~ 3450 3200
Wire Wire Line
2800 3300 2750 3300
Connection ~ 2750 3200
Wire Wire Line
2950 2200 3000 2200
Wire Wire Line
3000 2200 3000 2150
Wire Wire Line
2950 2500 3000 2500
Wire Wire Line
3000 2500 3000 2550
Wire Wire Line
2950 2400 3050 2400
Wire Wire Line
3050 2400 3050 2500
Wire Wire Line
3050 2500 3150 2500
Wire Wire Line
3150 2500 3150 2450
Wire Wire Line
3150 2250 3150 2200
Wire Wire Line
3150 2200 3050 2200
Wire Wire Line
3050 2200 3050 2300
Wire Wire Line
3050 2300 2950 2300
Wire Wire Line
3450 2200 3150 2200
Connection ~ 3150 2200
Wire Wire Line
3450 2500 3150 2500
Connection ~ 3150 2500
$Comp
L power:VCC #PWR0108
U 1 1 5C069637
P 4150 3150
F 0 "#PWR0108" H 4150 3000 50 0001 C CNN
F 1 "VCC" H 4300 3200 50 0000 C CNN
F 2 "" H 4150 3150 50 0001 C CNN
F 3 "" H 4150 3150 50 0001 C CNN
1 4150 3150
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0109
U 1 1 5C069650
P 4150 3550
F 0 "#PWR0109" H 4150 3300 50 0001 C CNN
F 1 "GND" H 4155 3377 50 0001 C CNN
F 2 "" H 4150 3550 50 0001 C CNN
F 3 "" H 4150 3550 50 0001 C CNN
1 4150 3550
1 0 0 -1
$EndComp
Wire Wire Line
4150 3150 4150 3200
Wire Wire Line
4150 3450 4150 3500
$Comp
L power:GND #PWR0110
U 1 1 5C06A0D9
P 3850 2950
F 0 "#PWR0110" H 3850 2700 50 0001 C CNN
F 1 "GND" H 3855 2777 50 0001 C CNN
F 2 "" H 3850 2950 50 0001 C CNN
F 3 "" H 3850 2950 50 0001 C CNN
1 3850 2950
1 0 0 -1
$EndComp
Wire Wire Line
3850 2900 3850 2950
$Comp
L power:GND #PWR0111
U 1 1 5C06A85A
P 4300 2550
F 0 "#PWR0111" H 4300 2300 50 0001 C CNN
F 1 "GND" H 4305 2377 50 0001 C CNN
F 2 "" H 4300 2550 50 0001 C CNN
F 3 "" H 4300 2550 50 0001 C CNN
1 4300 2550
1 0 0 -1
$EndComp
Wire Wire Line
4250 2400 4300 2400
Wire Wire Line
4300 2400 4300 2500
Wire Wire Line
4300 2500 4250 2500
Wire Wire Line
4300 2300 4300 2400
Wire Wire Line
4300 2300 4250 2300
Connection ~ 4300 2400
Wire Wire Line
4300 2500 4300 2550
Connection ~ 4300 2500
$Comp
L power:VCC #PWR0112
U 1 1 5C06BD25
P 4600 2050
F 0 "#PWR0112" H 4600 1900 50 0001 C CNN
F 1 "VCC" H 4750 2100 50 0000 C CNN
F 2 "" H 4600 2050 50 0001 C CNN
F 3 "" H 4600 2050 50 0001 C CNN
1 4600 2050
1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0113
U 1 1 5C06CC4B
P 4600 2350
F 0 "#PWR0113" H 4600 2100 50 0001 C CNN
F 1 "GND" H 4605 2177 50 0001 C CNN
F 2 "" H 4600 2350 50 0001 C CNN
F 3 "" H 4600 2350 50 0001 C CNN
1 4600 2350
1 0 0 -1
$EndComp
Wire Wire Line
4650 2200 4500 2200
Wire Wire Line
4650 2100 4600 2100
Wire Wire Line
4600 2100 4600 2050
Wire Wire Line
4650 2300 4600 2300
Wire Wire Line
4600 2300 4600 2350
$Comp
L Device:R_Small R2
U 1 1 5C06E1D6
P 4400 2200
F 0 "R2" V 4296 2200 50 0000 C CNN
F 1 "R_Small" V 4295 2200 50 0001 C CNN
F 2 "Resistor_SMD:R_0805_2012Metric_Pad1.15x1.40mm_HandSolder" H 4400 2200 50 0001 C CNN
F 3 "~" H 4400 2200 50 0001 C CNN
1 4400 2200
0 1 1 0
$EndComp
Wire Wire Line
4250 2200 4300 2200
$Comp
L power:PWR_FLAG #FLG0101
U 1 1 5C07179E
P 2900 3150
F 0 "#FLG0101" H 2900 3225 50 0001 C CNN
F 1 "PWR_FLAG" H 2900 3324 50 0001 C CNN
F 2 "" H 2900 3150 50 0001 C CNN
F 3 "~" H 2900 3150 50 0001 C CNN
1 2900 3150
1 0 0 -1
$EndComp
$Comp
L power:PWR_FLAG #FLG0102
U 1 1 5C071EE6
P 3300 3150
F 0 "#FLG0102" H 3300 3225 50 0001 C CNN
F 1 "PWR_FLAG" H 3300 3324 50 0001 C CNN
F 2 "" H 3300 3150 50 0001 C CNN
F 3 "~" H 3300 3150 50 0001 C CNN
1 3300 3150
1 0 0 -1
$EndComp
Wire Wire Line
3300 3150 3300 3200
Connection ~ 3300 3200
Wire Wire Line
3300 3200 3450 3200
Wire Wire Line
2900 3150 2900 3200
Connection ~ 2900 3200
Wire Wire Line
2900 3200 3000 3200
Wire Wire Line
2750 3200 2750 3300
$Comp
L power:PWR_FLAG #FLG0103
U 1 1 5C07505B
P 3350 3600
F 0 "#FLG0103" H 3350 3675 50 0001 C CNN
F 1 "PWR_FLAG" H 3350 3774 50 0001 C CNN
F 2 "" H 3350 3600 50 0001 C CNN
F 3 "~" H 3350 3600 50 0001 C CNN
1 3350 3600
1 0 0 -1
$EndComp
Wire Wire Line
3400 3300 3450 3300
Wire Wire Line
3100 3700 3100 3650
Wire Wire Line
3350 3600 3350 3700
Wire Wire Line
3350 3700 3100 3700
Connection ~ 3100 3700
$Comp
L Device:C_Small C2
U 1 1 5C07E1E5
P 4400 3350
F 0 "C2" H 4492 3396 50 0000 L CNN
F 1 "C_Small" H 4492 3305 50 0001 L CNN
F 2 "Capacitor_SMD:C_0805_2012Metric_Pad1.15x1.40mm_HandSolder" H 4400 3350 50 0001 C CNN
F 3 "~" H 4400 3350 50 0001 C CNN
1 4400 3350
1 0 0 -1
$EndComp
Wire Wire Line
4150 3200 4400 3200
Wire Wire Line
4400 3200 4400 3250
Connection ~ 4150 3200
Wire Wire Line
4150 3200 4150 3250
Wire Wire Line
4400 3450 4400 3500
Wire Wire Line
4400 3500 4150 3500
Connection ~ 4150 3500
Wire Wire Line
4150 3500 4150 3550
$Comp
L Device:CP_Small C3
U 1 1 5C07F5DF
P 4600 3350
F 0 "C3" H 4688 3396 50 0000 L CNN
F 1 "CP_Small" H 4688 3305 50 0000 L CNN
F 2 "Capacitor_SMD:CP_Elec_3x5.4" H 4600 3350 50 0001 C CNN
F 3 "~" H 4600 3350 50 0001 C CNN
1 4600 3350
1 0 0 -1
$EndComp
Wire Wire Line
4400 3200 4600 3200
Wire Wire Line
4600 3200 4600 3250
Connection ~ 4400 3200
Wire Wire Line
4600 3450 4600 3500
Wire Wire Line
4600 3500 4400 3500
Connection ~ 4400 3500
Text Label 3300 2200 0 50 ~ 0
D+
Text Label 3300 2500 0 50 ~ 0
D-
$EndSCHEMATC

1256
Hardware/kicad/DiffWS2811/DiffWS2811_min.kicad_pcb

File diff suppressed because it is too large

33
Hardware/kicad/DiffWS2811/DiffWS2811_min.pro

@ -0,0 +1,33 @@
update=22/05/2015 07:44:53
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]

1554
Hardware/kicad/Modified.lib

File diff suppressed because it is too large

BIN
Hardware/kicad/images/CANNode.pdf

Binary file not shown.

7260
Hardware/kicad/images/CANNode_border.svg → Hardware/kicad/images/CANNode.svg

File diff suppressed because it is too large

Before

Width:  |  Height:  |  Size: 424 KiB

After

Width:  |  Height:  |  Size: 380 KiB

BIN
Hardware/kicad/images/CANNode_plain.pdf

Binary file not shown.

520
Hardware/kicad/images/CANNode_plain.svg

@ -3,7 +3,7 @@
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="25.0012cm" height="20cm" viewBox="0 0 98430 78740 "> width="25.0012cm" height="20cm" viewBox="0 0 98430 78740 ">
<title>SVG Picture created as CANNode.svg date 2018/11/17 02:32:52 </title> <title>SVG Picture created as CANNode.svg date 2018/11/19 11:19:47 </title>
<desc>Picture generated by Eeschema-SVG </desc> <desc>Picture generated by Eeschema-SVG </desc>
<g style="fill:#000000; fill-opacity:1;stroke:#000000; stroke-opacity:1; <g style="fill:#000000; fill-opacity:1;stroke:#000000; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round; " stroke-linecap:round; stroke-linejoin:round; "
@ -6587,136 +6587,137 @@ stroke-linecap:round; stroke-linejoin:round;">
stroke:#840000; stroke-width:0; stroke-opacity:1; stroke:#840000; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;"> stroke-linecap:round; stroke-linejoin:round;">
</g> </g>
<g style="fill:#FFFFC2; fill-opacity:0.0;
stroke:#FFFFC2; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#FFFFC2; fill-opacity:0.6;
stroke:#FFFFC2; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<rect x="24500" y="51500" width="4000" height="3000" rx="0" />
</g>
<g style="fill:#840000; fill-opacity:0.6;
stroke:#840000; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#840000; fill-opacity:0.0; <g style="fill:#840000; fill-opacity:0.0;
stroke:#840000; stroke-width:60; stroke-opacity:1; stroke:#840000; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;"> stroke-linecap:round; stroke-linejoin:round;">
<path d="M24540 51780 <rect x="24500" y="51500" width="4000" height="3000" rx="0" />
L24970 51780 <path d="M26500 54500
" /> L26500 55500
<path d="M24760 51990
L24760 51560
" />
<path d="M28540 51780
L28970 51780
" />
<path d="M28760 51990
L28760 51560
" />
<path d="M26580 52990
L26580 52430
L26710 52430
L26790 52460
L26850 52510
L26870 52560
L26900 52670
L26900 52750
L26870 52860
L26850 52910
L26790 52960
L26710 52990
L26580 52990
" />
<path d="M27460 52940
L27430 52960
L27350 52990
L27300 52990
L27220 52960
L27170 52910
L27140 52860
L27110 52750
L27110 52670
L27140 52560
L27170 52510
L27220 52460
L27300 52430
L27350 52430
L27430 52460
L27460 52480
" />
<path d="M27700 52990
L27700 52430
L27830 52430
L27910 52460
L27970 52510
L27990 52560
L28020 52670
L28020 52750
L27990 52860
L27970 52910
L27910 52960
L27830 52990
L27700 52990
" />
<path d="M28580 52940
L28550 52960
L28470 52990
L28420 52990
L28340 52960
L28290 52910
L28260 52860
L28230 52750
L28230 52670
L28260 52560
L28290 52510
L28340 52460
L28420 52430
L28470 52430
L28550 52460
L28580 52480
" /> " />
<polyline fill="none;" </g>
points="23500,55000 <g style="fill:#008484; fill-opacity:0.0;
29500,55000 stroke:#008484; stroke-width:60; stroke-opacity:1;
" /> stroke-linecap:round; stroke-linejoin:round;">
<polyline fill="none;" <path d="M26250 53680
points="23500,54000 L26220 53730
23500,55000 L26220 53800
" /> L26250 53870
<polyline fill="none;" L26290 53920
points="23500,54000 L26340 53950
26500,54000 L26440 53970
" /> L26510 53970
<polyline fill="none;" L26600 53950
points="23500,51000 L26650 53920
23500,54000 L26700 53870
" /> L26720 53800
<polyline fill="none;" L26720 53760
points="26200,54500 L26700 53680
26800,54500 L26670 53660
" /> L26510 53660
<polyline fill="none;" L26510 53760
points="26500,54000 " />
26500,54500 <path d="M26720 53450
" /> L26220 53450
<polyline fill="none;" L26720 53160
points="26500,54000 L26220 53160
29500,54000 " />
" /> <path d="M26720 52920
<polyline fill="none;" L26220 52920
points="29500,55000 L26220 52800
29500,54000 L26250 52730
" /> L26290 52680
<polyline fill="none;" L26340 52660
points="29500,54000 L26440 52640
29500,51000 L26510 52640
" /> L26600 52660
<polyline fill="none;" L26650 52680
points="29500,51000 L26700 52730
23500,51000 L26720 52800
" /> L26720 52920
" />
</g>
<g style="fill:#840000; fill-opacity:0.0;
stroke:#840000; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M24500 52000 <path d="M24500 52000
L22500 52000 L23500 52000
" />
</g>
<g style="fill:#008484; fill-opacity:0.0;
stroke:#008484; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M25040 52220
L25040 51720
" /> " />
<path d="M24500 54000 <path d="M25280 52220
L22500 54000 L25280 51720
L25570 52220
L25570 51720
" /> " />
</g>
<g style="fill:#840000; fill-opacity:0.0;
stroke:#840000; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M28500 52000 <path d="M28500 52000
L30500 52000 L29500 52000
" /> " />
<path d="M28500 54000 </g>
L30500 54000 <g style="fill:#008484; fill-opacity:0.0;
stroke:#008484; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M26850 51720
L26950 51720
L26990 51750
L27040 51790
L27070 51890
L27070 52050
L27040 52150
L26990 52200
L26950 52220
L26850 52220
L26800 52200
L26760 52150
L26730 52050
L26730 51890
L26760 51790
L26800 51750
L26850 51720
" />
<path d="M27280 51720
L27280 52130
L27300 52170
L27330 52200
L27370 52220
L27470 52220
L27520 52200
L27540 52170
L27570 52130
L27570 51720
" />
<path d="M27730 51720
L28020 51720
" />
<path d="M27870 52220
L27870 51720
" /> " />
</g> </g>
<g style="fill:#008484; fill-opacity:0.0;
stroke:#008484; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#840000; fill-opacity:0.0; <g style="fill:#840000; fill-opacity:0.0;
stroke:#840000; stroke-width:0; stroke-opacity:1; stroke:#840000; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;"> stroke-linecap:round; stroke-linejoin:round;">
@ -9206,24 +9207,12 @@ stroke-linecap:round; stroke-linejoin:round;">
<path d="M22000 52000 <path d="M22000 52000
L22000 51000 L22000 51000
" /> " />
<path d="M22500 52000
L22000 52000
" />
<path d="M22500 54000
L22000 54000
" />
<path d="M22000 55000 <path d="M22000 55000
L22000 54000 L22000 54000
" /> " />
<path d="M30500 54000
L31000 54000
" />
<path d="M31000 54000 <path d="M31000 54000
L31000 55000 L31000 55000
" /> " />
<path d="M30500 52000
L31000 52000
" />
<path d="M31000 52000 <path d="M31000 52000
L31000 51000 L31000 51000
" /> " />
@ -21374,5 +21363,272 @@ L60000 54000
<path d="M60000 54000 <path d="M60000 54000
L60000 54500 L60000 54500
" /> " />
</g>
<g style="fill:#008400; fill-opacity:0.0;
stroke:#008400; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#840000; fill-opacity:0.0;
stroke:#840000; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#840000; fill-opacity:1.0;
stroke:#840000; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<rect x="21400" y="53120" width="1200" height="150" rx="0" />
</g>
<g style="fill:#840000; fill-opacity:0.0;
stroke:#840000; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<rect x="21400" y="52730" width="1200" height="150" rx="0" />
<polyline fill="none;"
points="21500,52400
21700,52400
" />
<polyline fill="none;"
points="21600,52500
21600,52300
" />
<path d="M22000 52730
L22000 52000
" />
<path d="M22000 53270
L22000 54000
" />
</g>
<g style="fill:#008484; fill-opacity:0.0;
stroke:#008484; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M23300 52730
L23280 52760
L23210 52780
L23160 52780
L23090 52760
L23040 52710
L23020 52660
L22990 52570
L22990 52500
L23020 52400
L23040 52350
L23090 52310
L23160 52280
L23210 52280
L23280 52310
L23300 52330
" />
<path d="M23780 52780
L23490 52780
" />
<path d="M23640 52780
L23640 52280
L23590 52350
L23540 52400
L23490 52420
" />
<path d="M24260 52780
L23970 52780
" />
<path d="M24110 52780
L24110 52280
L24070 52350
L24020 52400
L23970 52420
" />
<path d="M23310 53640
L23290 53670
L23210 53690
L23170 53690
L23100 53670
L23050 53620
L23020 53570
L23000 53480
L23000 53410
L23020 53310
L23050 53260
L23100 53220
L23170 53190
L23210 53190
L23290 53220
L23310 53240
" />
<path d="M23520 53690
L23520 53190
L23710 53190
L23760 53220
L23790 53240
L23810 53290
L23810 53360
L23790 53410
L23760 53430
L23710 53450
L23520 53450
" />
</g>
<g style="fill:#008484; fill-opacity:0.0;
stroke:#008484; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#008400; fill-opacity:0.0;
stroke:#008400; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:100; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<circle cx="22000" cy="52000" r="200" />
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:100; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<circle cx="22000" cy="54000" r="200" />
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#840000; fill-opacity:1.0;
stroke:#840000; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#840000; fill-opacity:1.0;
stroke:#840000; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<rect x="30400" y="53120" width="1200" height="150" rx="0" />
</g>
<g style="fill:#840000; fill-opacity:0.0;
stroke:#840000; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<rect x="30400" y="52730" width="1200" height="150" rx="0" />
<polyline fill="none;"
points="30500,52400
30700,52400
" />
<polyline fill="none;"
points="30600,52500
30600,52300
" />
<path d="M31000 52730
L31000 52000
" />
<path d="M31000 53270
L31000 54000
" />
</g>
<g style="fill:#008484; fill-opacity:0.0;
stroke:#008484; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M32300 52730
L32280 52760
L32210 52780
L32160 52780
L32090 52760
L32040 52710
L32020 52660
L31990 52570
L31990 52500
L32020 52400
L32040 52350
L32090 52310
L32160 52280
L32210 52280
L32280 52310
L32300 52330
" />
<path d="M32780 52780
L32490 52780
" />
<path d="M32640 52780
L32640 52280
L32590 52350
L32540 52400
L32490 52420
" />
<path d="M32970 52330
L32990 52310
L33040 52280
L33160 52280
L33210 52310
L33230 52330
L33260 52380
L33260 52420
L33230 52500
L32950 52780
L33260 52780
" />
<path d="M32310 53640
L32290 53670
L32210 53690
L32170 53690
L32100 53670
L32050 53620
L32020 53570
L32000 53480
L32000 53410
L32020 53310
L32050 53260
L32100 53220
L32170 53190
L32210 53190
L32290 53220
L32310 53240
" />
<path d="M32520 53690
L32520 53190
L32710 53190
L32760 53220
L32790 53240
L32810 53290
L32810 53360
L32790 53410
L32760 53430
L32710 53450
L32520 53450
" />
</g>
<g style="fill:#008484; fill-opacity:0.0;
stroke:#008484; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#008400; fill-opacity:0.0;
stroke:#008400; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:100; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<circle cx="31000" cy="52000" r="200" />
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:0; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:100; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<circle cx="31000" cy="54000" r="200" />
</g>
<g style="fill:#008400; fill-opacity:1.0;
stroke:#008400; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
</g>
<g style="fill:#008400; fill-opacity:0.0;
stroke:#008400; stroke-width:60; stroke-opacity:1;
stroke-linecap:round; stroke-linejoin:round;">
<path d="M30000 52000
L31000 52000
" />
<path d="M30000 54000
L31000 54000
" />
<path d="M22000 52000
L23500 52000
" />
<path d="M22000 54000
L23500 54000
" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 371 KiB

After

Width:  |  Height:  |  Size: 378 KiB

BIN
Hardware/kicad/images/CANNode_rev2.0.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
Hardware/kicad/images/CANNode_rev2.0.pdf

Binary file not shown.

BIN
Hardware/kicad/images/CANNode_rev2.0_jlcpcb_bottom.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
Hardware/kicad/images/CANNode_rev2.0_jlcpcb_top.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
Hardware/kicad/images/CANNode_rev2.0_small.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
Hardware/kicad/images/CANNode_rev2.0_top.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 KiB

After

Width:  |  Height:  |  Size: 696 KiB

BIN
Hardware/kicad/images/CANNode_rev2.5.pdf

Binary file not shown.

24071
Hardware/kicad/images/CANNode_rev2.5.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 445 KiB

BIN
Hardware/kicad/images/CANNode_rev2.5_top.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

44
Hardware/kicad/max481e.lib

@ -0,0 +1,44 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# MAX481E
#
DEF MAX481E U 0 20 Y Y 1 F N
F0 "U" -240 450 50 H V C CNN
F1 "MAX481E" 30 450 50 H V L CNN
F2 "" 0 -700 50 H I C CNN
F3 "" 0 50 50 H I C CNN
ALIAS MAX483E MAX485E MAX487E MAX1487E MAX3485 MAX3483 MAX3486
$FPLIST
DIP*W7.62mm*
SOIC*3.9x4.9mm*P1.27mm*
$ENDFPLIST
DRAW
C -12 -145 14 0 1 10 F
C -1 59 14 0 1 10 F
C 65 75 14 0 1 10 F
S -300 400 300 -500 0 1 10 f
S 50 125 50 125 0 1 0 N
P 2 0 1 10 -160 -200 -75 -200 N
P 2 0 1 10 -160 100 -50 100 N
P 2 0 1 10 -50 -126 -50 -136 N
P 2 0 1 10 -25 -200 210 -200 N
P 3 0 1 10 -160 -100 -50 -100 -50 -125 N
P 3 0 1 10 0 50 0 0 -160 0 N
P 3 0 1 10 50 125 150 125 150 -200 N
P 3 0 1 10 100 75 100 -150 0 -150 N
P 4 0 1 10 -75 -125 -75 -225 25 -175 -75 -125 N
P 4 0 1 10 -50 100 50 150 50 50 -50 100 N
P 4 0 1 10 75 75 175 75 175 100 210 100 N
X RO 1 -400 100 100 R 50 50 1 1 O
X ~RE 2 -400 0 100 R 50 50 1 1 I
X DE 3 -400 -100 100 R 50 50 1 1 I
X DI 4 -400 -200 100 R 50 50 1 1 I
X GND 5 0 -600 100 U 50 50 1 1 W
X A 6 400 -200 100 L 50 50 1 1 B
X B 7 400 100 100 L 50 50 1 1 B
X VCC 8 0 500 100 D 50 50 1 1 W
ENDDRAW
ENDDEF
#
#End Library

29
Hardware/kicad/pca9306.lib

@ -0,0 +1,29 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# PCA9306
#
DEF PCA9306 U 0 40 Y Y 1 F N
F0 "U" -300 450 50 H V L CNN
F1 "PCA9306" 200 450 50 H V L CNN
F2 "" -400 350 50 H I C CNN
F3 "" -300 450 50 H I C CNN
$FPLIST
SSOP*2.95x2.8mm*P0.65mm*
VSSOP*2.3x2mm*P0.5mm*
X2SON*1.4x1mm*P0.35mm*
$ENDFPLIST
DRAW
S -300 400 300 -400 0 1 10 f
X GND 1 0 -500 100 U 50 50 1 1 W
X VREF1 2 -100 500 100 D 50 50 1 1 W
X SCL1 3 -400 -100 100 R 50 50 1 1 B
X SDA1 4 -400 0 100 R 50 50 1 1 B
X SDA2 5 400 0 100 L 50 50 1 1 B
X SCL2 6 400 -100 100 L 50 50 1 1 B
X VREF2 7 100 500 100 D 50 50 1 1 W
X EN 8 400 100 100 L 50 50 1 1 I
ENDDRAW
ENDDEF
#
#End Library

121
src/CANNode.cpp

@ -1,10 +1,9 @@
#include <Arduino.h> // #include <Arduino.h>
// ------------------------------------------------------------- // -------------------------------------------------------------
// CANNode for Teensy 3.1/3.2 // CANNode for Teensy 3.1/3.2
// GPLv2 // GPLv2
// by wiebel (c) 2015-2018 // by wiebel (c) 2015-2018
// github_push_test_01
#include <vector> #include <vector>
#include <Metro.h> #include <Metro.h>
@ -14,7 +13,9 @@
// For Node definition: // For Node definition:
#include "Node_2_def.h" //#include "Node_1_def.h" // Dachstuhl
#include "Node_2_def.h" // Werkstatt
//#include "Node_3_def.h" // Keller
// Metro ticks in ms // Metro ticks in ms
#define METRO_CAN_tick 1 #define METRO_CAN_tick 1
@ -64,13 +65,15 @@ FlexCAN CANbus(CAN_speed);
// FLEXCAN0_MCR &= ~FLEXCAN_MCR_SRX_DIS; // FLEXCAN0_MCR &= ~FLEXCAN_MCR_SRX_DIS;
// OneWire // OneWire
uint8_t addr[8]; uint8_t addr[8];
uint8_t data[8];
uint8_t buffer[DS2406_BUF_LEN]; uint8_t buffer[DS2406_BUF_LEN];
uint8_t readout,trig_event,event_idx,tmp; uint8_t readout,recheck,trig_event,event_idx,tmp;
OneWire OW_1(OW_pin); OneWire OW_1(OW_pin);
telegram_comp_t mesg_comp; telegram_comp_t mesg_comp;
static CAN_message_t txmsg,rxmsg; static CAN_message_t global_txmsg,rxmsg;
CAN_message_t txmsg;
static uint8_t hex[17] = "0123456789abcdef"; static uint8_t hex[17] = "0123456789abcdef";
int txCount,rxCount; int txCount,rxCount;
@ -131,19 +134,27 @@ uint32_t forgeid(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t type=0){
// Type: 0: SINGLE, 1: FIRST, 2: CONT, 3: LAST // Type: 0: SINGLE, 1: FIRST, 2: CONT, 3: LAST
return (prio<<26)+(type<<24)+(dst<<16)+(NODE_ID<<8)+cmd; return (prio<<26)+(type<<24)+(dst<<16)+(NODE_ID<<8)+cmd;
} }
int CAN_send(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t data[], uint8_t type=0){
int CAN_send(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t* data, uint8_t data_size, uint8_t type=0){
txmsg.ext = 1;
txmsg.timeout = 100;
txmsg.id = forgeid(prio, dst, cmd, type); txmsg.id = forgeid(prio, dst, cmd, type);
txmsg.len = sizeof(data); txmsg.len = data_size;
for (uint8_t i = 0; i < txmsg.len; i++) { txmsg.buf[i] = data[i]; } for (uint8_t i = 0; i < txmsg.len; i++) { txmsg.buf[i] = data[i]; }
CANbus.write(txmsg); return CANbus.write(txmsg);
// txmsg.buf[0]++;
// txmsg.len = 0;
} }
int CAN_send(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t data, uint8_t type=0){ int CAN_send(uint8_t prio, uint8_t dst, uint8_t cmd, uint8_t data, uint8_t type=0){
txmsg.ext = 1;
txmsg.timeout = 100;
txmsg.id = forgeid(prio, dst, cmd, type); txmsg.id = forgeid(prio, dst, cmd, type);
//txmsg.len = sizeof(data);
txmsg.len = 1; txmsg.len = 1;
txmsg.buf[0] = data; txmsg.buf[0] = data;
CANbus.write(txmsg); return CANbus.write(txmsg);
// txmsg.buf[0]++;
// txmsg.len = 0;
} }
@ -164,16 +175,18 @@ void send_event (uint8_t trig_event){
for (uint8_t e_idx = 0; tx_events[e_idx].tag != 0; e_idx++) for (uint8_t e_idx = 0; tx_events[e_idx].tag != 0; e_idx++)
if ( tx_events[e_idx].tag == trig_event ) { if ( tx_events[e_idx].tag == trig_event ) {
txmsg.ext = 1;
txmsg.timeout = 100;
txmsg.id = event2id(tx_events[e_idx]); txmsg.id = event2id(tx_events[e_idx]);
txmsg.len = 1; txmsg.len = 1;
// txmsg.timeout = 100;
txmsg.buf[0]= tx_events[e_idx].data; txmsg.buf[0]= tx_events[e_idx].data;
CANbus.write(txmsg); CANbus.write(txmsg);
Serial.print(F("Sending to CAN ID: ")); Serial.print(F("Sending to CAN ID: "));
Serial.print(txmsg.id); Serial.print(txmsg.id);
Serial.print(F("DATA: ")); Serial.print(F("DATA: "));
Serial.println(txmsg.buf[0]); Serial.println(txmsg.buf[0]);
txmsg.len = 0; // txmsg.buf[0]++;
// txmsg.len = 0;
} }
} }
@ -205,20 +218,16 @@ for (uint8_t i = 0; action_map[i].tag != 0 ; i++) {
} }
bool new_state = digitalRead(outputs[action_map[i].outputs_idx].address); bool new_state = digitalRead(outputs[action_map[i].outputs_idx].address);
if ( old_state == new_state) { if ( old_state == new_state) {
switch ( new_state ) { data[0]=action_map[i].outputs_idx;
case 0: data[1]=new_state ^ outputs[action_map[i].outputs_idx].invert;
CAN_send(NOTIFY, 0xFF, OFF, action_map[i].outputs_idx); Serial.println(F("Sending nochange to CAN"));
case 1: CAN_send(NOTIFY, 0x0, STATE_OUT, data, 2);
CAN_send(NOTIFY, 0xFF, ON, action_map[i].outputs_idx);
}
} }
else { else {
switch ( new_state ) { data[0]=action_map[i].outputs_idx;
case 0: data[1]=new_state ^ outputs[action_map[i].outputs_idx].invert;
CAN_send(NOTIFY, 0xFF, T_OFF, action_map[i].outputs_idx); Serial.println(F("Sending change to CAN"));
case 1: CAN_send(NOTIFY, 0x0, NEWSTATE_OUT, data, 2);
CAN_send(NOTIFY, 0xFF, T_ON, action_map[i].outputs_idx);
}
} }
} }
} }
@ -237,8 +246,6 @@ void setup(void)
pinMode(CAN_RS_PIN,OUTPUT); pinMode(CAN_RS_PIN,OUTPUT);
digitalWrite(CAN_RS_PIN,0); digitalWrite(CAN_RS_PIN,0);
CANbus.begin(); CANbus.begin();
txmsg.ext = 1;
txmsg.timeout = 100;
// outputs // outputs
for (size_t i = 0; outputs[i].type != NOP; i++) { for (size_t i = 0; outputs[i].type != NOP; i++) {
@ -294,13 +301,11 @@ void loop(void)
} }
if (new_owd) { if (new_owd) {
// send new ID to all // send new ID to all
CAN_send(NOTIFY, 0xFF, NEW_TWID, addr);
Serial.print("Found a device: "); Serial.print("Found a device: ");
print_OW_Device(addr); print_OW_Device(addr);
Serial.println(); Serial.println();
CAN_send(NOTIFY, 0x0, NEW_TWID, addr, sizeof(addr));
} }
} }
} }
if (METRO_OW_read.check() ) { if (METRO_OW_read.check() ) {
@ -324,19 +329,29 @@ void loop(void)
} }
// if ((switches_state[s_idx] != readout) && (readout != 255 )) { // if ((switches_state[s_idx] != readout) && (readout != 255 )) {
if (switches_state[s_idx] != readout) { if (switches_state[s_idx] != readout) {
tmp = readout ^ switches_state[s_idx]; delay(1);
switches_state[s_idx] = readout; recheck = read_DS2406(switches[s_idx].addr);
action[0] = tmp & 0x08; if (readout == recheck) {
action[1] = tmp & 0x04; tmp = readout ^ switches_state[s_idx];
switches_state[s_idx] = readout;
action[0] = tmp & 0x08;
action[1] = tmp & 0x04;
}
} }
if (action[0]) { if (action[0]) {
Serial.print("pioA of switch "); Serial.print("pioA of switch ");
Serial.print(switches[s_idx].nick); Serial.print(switches[s_idx].nick);
if (readout & 0x08) { if (readout & 0x08) {
Serial.println(F(" is now OFF")); Serial.println(F(" is now OFF"));
data[0]=switches[s_idx].nick;
data[1]=0;
CAN_send(NOTIFY, 0x0, STATE_IN, data, 2);
send_event(switches[s_idx].event_tag[0]); send_event(switches[s_idx].event_tag[0]);
} else { } else {
Serial.println(F(" is now ON")); Serial.println(F(" is now ON"));
data[0]=switches[s_idx].nick;
data[1]=1;
CAN_send(NOTIFY, 0x0, STATE_IN, data, 2);
send_event(switches[s_idx].event_tag[1]); send_event(switches[s_idx].event_tag[1]);
} }
action[0] = 0; action[0] = 0;
@ -346,9 +361,15 @@ void loop(void)
Serial.print(switches[s_idx].nick); Serial.print(switches[s_idx].nick);
if (readout & 0x04) { if (readout & 0x04) {
Serial.println(F(" is now OFF")); Serial.println(F(" is now OFF"));
data[0]=switches[s_idx].nick;
data[1]=2;
CAN_send(NOTIFY, 0x0, STATE_IN, data, 2);
send_event(switches[s_idx].event_tag[2]); send_event(switches[s_idx].event_tag[2]);
} else { } else {
Serial.println(F(" is now ON")); Serial.println(F(" is now ON"));
data[0]=switches[s_idx].nick;
data[1]=3;
CAN_send(NOTIFY, 0x0, STATE_IN, data, 2);
send_event(switches[s_idx].event_tag[3]); send_event(switches[s_idx].event_tag[3]);
} }
action[1] = 0; action[1] = 0;
@ -397,18 +418,18 @@ void loop(void)
} }
rxCount = 0; rxCount = 0;
} }
txTimer = 100;//milliseconds // txTimer = 10;//milliseconds
if (txmsg.len != 0){ // if (txmsg.len != 0){
Serial.print("PUT="); // Serial.print("PUT=");
Serial.print(txmsg.id,HEX); // Serial.print(txmsg.id,HEX);
for (uint8_t i=0; i<txmsg.len; i++){ // for (uint8_t i=0; i<txmsg.len; i++){
Serial.print(":"); // Serial.print(":");
Serial.print(txmsg.buf[i],HEX); // Serial.print(txmsg.buf[i],HEX);
} // }
Serial.print("\n"); // Serial.print("\n");
CANbus.write(txmsg); // CANbus.write(txmsg);
txmsg.buf[0]++; // txmsg.buf[0]++;
txmsg.len = 0; // txmsg.len = 0;
} // }
} }

2
src/CANNode.h

@ -4,7 +4,7 @@
enum out_type { GPIO, PWM, OW, I2C, SPI, WS2811, DMX, NOP }; enum out_type { GPIO, PWM, OW, I2C, SPI, WS2811, DMX, NOP };
enum event_type { LOCAL, SEND}; enum event_type { LOCAL, SEND};
enum cmd_type { OFF, ON, VALUE, TOGGLE, T_OFF, T_ON, BIN_DUMP, NEW_TWID }; enum cmd_type { OFF, ON, VALUE, TOGGLE, STATE_OUT, STATE_IN, NEWSTATE_OUT, NEWSTATE_IN, BIN_DUMP, NEW_TWID };
enum telegram_prio { ALERT, EVENT, NOTIFY, INFO }; enum telegram_prio { ALERT, EVENT, NOTIFY, INFO };
typedef struct CAN_telegram_t { typedef struct CAN_telegram_t {

4
src/Node_1_def.h

@ -29,7 +29,7 @@
static uint8_t node_id PROGMEM= { NODE_ID }; static uint8_t node_id PROGMEM= { NODE_ID };
static OW_switch_t switches[N_SWITCHES] PROGMEM={ static OW_switch_t switches[N_SWITCHES] PROGMEM={
// nick, addr[8], event_tag[sw1, sw2] // nick, addr[8], event_tag[sw1, sw2]
{ 255, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } }, // { 255, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } },
{ 201, { 0x12, 0x5b, 0x27, 0x50, 0x0, 0x0, 0x0, 0x26 }, { 1, 11, 2, 12 } }, // Flur -> Bad { 201, { 0x12, 0x5b, 0x27, 0x50, 0x0, 0x0, 0x0, 0x26 }, { 1, 11, 2, 12 } }, // Flur -> Bad
{ 202, { 0x12, 0xF7, 0x95, 0x4F, 0x0, 0x0, 0x0, 0x69 }, { 9, 9, 7, 7 } }, // Treppe Unten { 202, { 0x12, 0xF7, 0x95, 0x4F, 0x0, 0x0, 0x0, 0x69 }, { 9, 9, 7, 7 } }, // Treppe Unten
// { 203, { 0x12, 0x68, 0x31, 0x67, 0x0, 0x0, 0x0, 0xBC }, { 5, 6 } }, // { 203, { 0x12, 0x68, 0x31, 0x67, 0x0, 0x0, 0x0, 0xBC }, { 5, 6 } },
@ -40,7 +40,7 @@ static OW_switch_t switches[N_SWITCHES] PROGMEM={
{ 011, { 0x12, 0x9A, 0x94, 0x4F, 0x0, 0x0, 0x0, 0x2D }, { 6, 6, 255, 254 } }, // Bjarne { 011, { 0x12, 0x9A, 0x94, 0x4F, 0x0, 0x0, 0x0, 0x2D }, { 6, 6, 255, 254 } }, // Bjarne
{ 012, { 0x12, 0x2F, 0x98, 0x4F, 0x0, 0x0, 0x0, 0xE0 }, { 8, 8, 0, 0 } }, // SZ { 012, { 0x12, 0x2F, 0x98, 0x4F, 0x0, 0x0, 0x0, 0xE0 }, { 8, 8, 0, 0 } }, // SZ
{ 255, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } }, { 255, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } },
{ 0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } } { 0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } } // END MARK
}; };
static uint8_t switches_state[N_SWITCHES]; static uint8_t switches_state[N_SWITCHES];
static outputs_t outputs[N_OUTPUTS] PROGMEM={ static outputs_t outputs[N_OUTPUTS] PROGMEM={

7
src/Node_2_def.h

@ -29,11 +29,12 @@
static uint8_t node_id PROGMEM= { NODE_ID }; static uint8_t node_id PROGMEM= { NODE_ID };
static OW_switch_t switches[N_SWITCHES] PROGMEM={ static OW_switch_t switches[N_SWITCHES] PROGMEM={
// nick, addr[8], event_tag[pioA_FALL, pioA_RISE, pioB_FALL, pioB_RISE] // nick, addr[8], event_tag[pioA_FALL, pioA_RISE, pioB_FALL, pioB_RISE]
{ 255, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } }, // { 255, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } },
{ 21, { 0x12, 0x86, 0xB4, 0x54, 0x0, 0x0, 0x0, 0x5F }, { 23, 23, 37, 37 } }, // Flur { 21, { 0x12, 0x86, 0xB4, 0x54, 0x0, 0x0, 0x0, 0x5F }, { 23, 23, 37, 37 } }, // Flur
{ 22, { 0x12, 0xC7, 0x2F, 0xCF, 0x0, 0x0, 0x0, 0xAF }, { 22, 22, 21, 21 } }, // WZ { 22, { 0x12, 0xCE, 0x6E, 0xCA, 0x0, 0x0, 0x0, 0x9C }, { 22, 22, 21, 21 } }, // WZ
// { 22, { 0x12, 0xC7, 0x2F, 0xCF, 0x0, 0x0, 0x0, 0xAF }, { 22, 22, 21, 21 } }, // WZ
// { 22, { 0x12, 0x5E, 0xFF, 0x55, 0x0, 0x0, 0x0, 0x2C }, { 21, 21, 22, 22 } }, // WZ // { 22, { 0x12, 0x5E, 0xFF, 0x55, 0x0, 0x0, 0x0, 0x2C }, { 21, 21, 22, 22 } }, // WZ
{ 0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } } { 0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } } // END MARK
}; };
static uint8_t switches_state[N_SWITCHES]; static uint8_t switches_state[N_SWITCHES];
static outputs_t outputs[N_OUTPUTS] PROGMEM={ static outputs_t outputs[N_OUTPUTS] PROGMEM={

62
src/Node_3_def.h

@ -13,14 +13,14 @@
#define DEBUG 0 // 1 for noisy serial #define DEBUG 0 // 1 for noisy serial
#define LED 13 #define LED 13
#define RELAY1 0 #define RELAY1 0 // EZ
#define RELAY2 1 #define RELAY2 1 // Küche
#define RELAY3 23 #define RELAY3 23 // Terrasse
#define RELAY4 22 #define RELAY4 22 // RO_Garten
#define RELAY5 17 #define RELAY5 17 // RO_Garten
#define RELAY6 16 #define RELAY6 16 //
#define RELAY7 9 #define RELAY7 19 // EG Flur
#define RELAY8 10 #define RELAY8 18 //
// OneWire // OneWire
#define OW_pin 14 #define OW_pin 14
@ -32,26 +32,24 @@ static OW_switch_t switches[N_SWITCHES] PROGMEM={
{ 11, { 0x12, 0xF2, 0x2A, 0x66, 0x0, 0x0, 0x0, 0x41 }, { 1, 1, 0, 0 } }, // EZ -> Flur { 11, { 0x12, 0xF2, 0x2A, 0x66, 0x0, 0x0, 0x0, 0x41 }, { 1, 1, 0, 0 } }, // EZ -> Flur
{ 12, { 0x12, 0x37, 0x8A, 0x4F, 0x0, 0x0, 0x0, 0xE5 }, { 2, 2, 2, 2 } }, // im keller TEST { 12, { 0x12, 0x37, 0x8A, 0x4F, 0x0, 0x0, 0x0, 0xE5 }, { 2, 2, 2, 2 } }, // im keller TEST
{ 13, { 0x12, 0x71, 0x51, 0x57, 0x0, 0x0, 0x0, 0x28 }, { 2, 2, 0, 0 } }, // Küche Kühlschank { 13, { 0x12, 0x71, 0x51, 0x57, 0x0, 0x0, 0x0, 0x28 }, { 2, 2, 0, 0 } }, // Küche Kühlschank
{ 14, { 0x12, 0x5e, 0xff, 0x55, 0x0, 0x0, 0x0, 0x2c }, { 2, 2, 3, 3 } }, // Küche Terasse
//{ 21, { 0x12, 0x86, 0xB4, 0x54, 0x0, 0x0, 0x0, 0x5F }, { 3, 3, 4, 4 } }, //{ 21, { 0x12, 0x86, 0xB4, 0x54, 0x0, 0x0, 0x0, 0x5F }, { 3, 3, 4, 4 } },
{ 22, { 0x12, 0x84, 0xAD, 0x4F, 0x0, 0x0, 0x0, 0x12 }, { 1, 1, 2, 2 } }, // EZ -> Küche { 22, { 0x12, 0x84, 0xAD, 0x4F, 0x0, 0x0, 0x0, 0x12 }, { 1, 1, 2, 2 } }, // EZ -> Küche
// { 31, { 0x12, 0x88, 0xDD, 0x53, 0x0, 0x0, 0x0, 0x28 }, { 210, 211, 220, 221 } }, // Roldenschalter (A - UP, B - DOWN) // { 31, { 0x12, 0x88, 0xDD, 0x53, 0x0, 0x0, 0x0, 0x28 }, { 210, 211, 220, 221 } }, // Rolladenschalter (A - UP, B - DOWN)
{ 31, { 0x12, 0x8F, 0xE2, 0x86 ,0x0, 0x0, 0x0, 0xC6}, { 220, 221, 210, 211 } }, // Rolladenschalter (A - UP, B - DOWN)
{ 0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0, 0, 0, 0 } } // END MARK
}; };
static uint8_t switches_state[N_SWITCHES]; static uint8_t switches_state[N_SWITCHES];
static outputs_t outputs[N_OUTPUTS] PROGMEM={ static outputs_t outputs[N_OUTPUTS] PROGMEM={
// type, address(PIN), initial value, inverted // type, address(PIN), initial value, inverted
{ GPIO, 0, 0, true }, // 0 { GPIO, RELAY1, 0, true },
{ GPIO, 1, 0, true }, // 1 { GPIO, RELAY2, 0, true },
{ GPIO, 23, 0, true }, // 2 { GPIO, RELAY3, 0, true },
{ GPIO, 22, 0, true }, // 3 { GPIO, RELAY4, 0, true },
{ GPIO, 17, 0, true }, // 4 { GPIO, RELAY5, 0, true },
{ GPIO, 16, 0, true }, // 5 { GPIO, RELAY6, 0, true },
<<<<<<< HEAD { GPIO, RELAY7, 0, true },
{ GPIO, 9, 255, true }, // 6 { GPIO, RELAY8, 0, true },
{ GPIO, 10, 0, true }, // 7
=======
{ GPIO, 19, 0, true }, // 6
{ GPIO, 18, 0, true }, // 7
>>>>>>> led
{ NOP, 0xFF, 0, 0 } { NOP, 0xFF, 0, 0 }
}; };
static uint8_t outputs_state[N_OUTPUTS]; static uint8_t outputs_state[N_OUTPUTS];
@ -72,10 +70,10 @@ static event_t tx_events[N_EVENTS] PROGMEM={
{ 8, 0x03, 0x03, TOGGLE, 0x08}, { 8, 0x03, 0x03, TOGGLE, 0x08},
{ 11, 0x03, 0x01, ON, 0x01}, { 11, 0x03, 0x01, ON, 0x01},
{ 12, 0x03, 0x01, ON, 0x02}, { 12, 0x03, 0x01, ON, 0x02},
{ 210, 0x03, 0xff, OFF, 0x06}, { 210, 0x03, 0x03, OFF, 0x04},
{ 211, 0x03, 0xff, ON, 0x06}, { 211, 0x03, 0x03, ON, 0x04},
{ 220, 0x03, 0xff, OFF, 0x07}, { 220, 0x03, 0x03, OFF, 0x05},
{ 221, 0x03, 0xff, ON, 0x07}, { 221, 0x03, 0x03, ON, 0x05},
{ 255, 0x03, 0xff, OFF, 0x09}, { 255, 0x03, 0xff, OFF, 0x09},
{ 254, 0x03, 0xff, ON, 0x09}, { 254, 0x03, 0xff, ON, 0x09},
{ 10, 0x03, 0xff, TOGGLE, 0x01}, { 10, 0x03, 0xff, TOGGLE, 0x01},
@ -95,13 +93,13 @@ static event_t tx_events[N_EVENTS] PROGMEM={
static action_t action_map[N_ACTIONS] PROGMEM={ static action_t action_map[N_ACTIONS] PROGMEM={
// tag, output_idx // tag, output_idx
{1, 0}, {1, 0}, // EZ
{2, 1}, {2, 1}, // Küche
{3, 2}, {3, 2}, // Terrasse
{4, 3}, {4, 3}, // RO_Garten
{5, 4}, {5, 4}, // RO_Garten
{6, 5}, {6, 5},
{7, 6}, {7, 6}, // EG_Flur
{8, 7}, {8, 7},
{9, 0},{9, 1},{9, 2},{9, 3},{9, 4},{9, 5},{9, 6},{9, 7}, {9, 0},{9, 1},{9, 2},{9, 3},{9, 4},{9, 5},{9, 6},{9, 7},
{210, 210}, {210, 210},

109
tools/can2coil.py

@ -0,0 +1,109 @@
#!/usr/bin/env python3
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
from datetime import datetime
import can
from can import Bus, BusState, Logger
import paho.mqtt.client as mqtt
sub_topic = "coil"
coil_map = {
'EZ': [ 0x03, 0x01 ],
'K': [ 0x03, 0x02 ],
'WZ1': [ 0x02, 0x01 ],
'WZ2': [ 0x02, 0x02 ],
'TER': [ 0x03, 0x03 ],
'FE': [ 0x03, 0x07 ],
'TRE': [ 0x02, 0x03 ],
'FO': [ 0x01, 0x03 ],
'TRO': [ 0x01, 0x07 ],
'KI1': [ 0x01, 0x06 ],
'KI2': [ 0x01, 0x04 ],
'SCH': [ 0x01, 0x08 ],
'B1': [ 0x01, 0x01 ],
'B2': [ 0x01, 0x02 ],
'ROL_EZ_G_DOWN': [0x03, 0x05],
'ROL_EZ_G_UP': [0x03,0x04],
'ROL_EZ_N_DOWN': [0x03, 0x06],
'ROL_EZ_N_UP': [0x03,0x08],
'EG1': [ 0x02, 0x09 ],
'EG2': [ 0x03, 0x09 ],
'OG': [ 0x01, 0x09 ],
'ALL': [ 0xFF, 0x09 ],
}
cmd_map = {
'off': 0,
'0': 0,
'on': 1,
'1': 1,
'value': 2,
'toggle': 3
}
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
# print("msg_id: ", hex(msg_id), "prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def con(msg_dst,msg_cmd,msg_prio=3,msg_type=0,msg_src=11, ):
msg_id=(msg_prio<<26) + \
((msg_type&0x03)<<24) +\
((msg_dst&0xFF)<<16) +\
((msg_src&0xFF)<<8) +\
(msg_cmd&0xFF)
print("Constructed ID: "+hex(msg_id))
return msg_id
def on_connect(mcp_mqtt, userdata, flags, rc):
print("Connected with result code "+str(rc))
mcp_mqtt.subscribe(sub_topic+"/+")
def main():
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan_native"
config["bitrate"] = 125000
canbus = can.Bus("can1", **config)
# canBuffer= canbus.BufferedReader()
print('Connected to {}: {}'.format(canbus.__class__.__name__, canbus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
mcp_mqtt = mqtt.Client()
mcp_mqtt.on_connect = on_connect
mcp_mqtt.user_data_set(canbus)
mcp_mqtt.connect("mcp", 1883, 60)
mcp_mqtt.publish("coil/welcome", "1" , retain=0)
try:
while True:
msg = canbus.recv(1)
# msg = canBuffer.get_message()
if msg is not None:
de=decon(msg.arbitration_id)
m= { "prio": hex(de[0]), "type": hex(de[1]), "dst": hex(de[2]), "src": hex(de[3]), "cmd": hex(de[4]), "action": hex(msg.data[0]) }
if de[2]==0 and de[4] == 6:
print("received state: ", hex(de[3]), hex(msg.data[0]), hex(msg.data[1]))
for key, address in coil_map.items():
if address[0] == de[3] and address[1] == msg.data[0]+1:
print("coil/"+key+" changed to "+str(msg.data[1]))
mcp_mqtt.publish("coil/"+key+"/state", msg.data[1] , retain=1)
except KeyboardInterrupt:
pass
finally:
canbus.shutdown()
if __name__ == "__main__":
main()

85
tools/can2mqtt.py

@ -0,0 +1,85 @@
#!/usr/bin/env python3
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
from datetime import datetime
import can
from can import Bus, BusState, Logger
import paho.mqtt.client as mqtt
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
print("prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def on_connect(mcp_mqtt, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
mcp_mqtt.subscribe("can/raw")
mcp_mqtt.subscribe("ctest/#")
def on_message(mcp_mqtt, userdata, msg):
local_bus=userdata
topic=msg.topic
print("data Received topic: ", topic)
m_decode=str(msg.payload.decode("utf-8","ignore"))
print("data Received",m_decode)
msg_id=int(m_decode.split('#')[0],16)
msg_data=int(m_decode.split('#')[1],16)
print(msg_data)
m = can.Message(arbitration_id=msg_id,
data=[msg_data],
extended_id=True)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
def main():
verbosity = 2
logging_level_name = ['critical', 'error', 'warning', 'info', 'debug', 'subdebug'][min(5, verbosity)]
can.set_logging_level(logging_level_name)
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan"
config["bitrate"] = 125000
bus = Bus("can1", **config)
print('Connected to {}: {}'.format(bus.__class__.__name__, bus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
mcp_mqtt = mqtt.Client()
mcp_mqtt.on_connect = on_connect
mcp_mqtt.on_message = on_message
mcp_mqtt.user_data_set(bus)
mcp_mqtt.connect("mcp", 1883, 60)
try:
while True:
mcp_mqtt.loop_start()
msg = bus.recv(1)
if msg is not None:
de=decon(msg.arbitration_id)
m= { "prio": hex(de[0]), "type": hex(de[1]), "dst": hex(de[2]), "src": hex(de[3]), "cmd": hex(de[4]), "data": "".join("%02x" % b for b in msg.data) }
print(m)
mcp_mqtt.publish("can/rx", str(m))
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()

63
tools/canfixer.py

@ -0,0 +1,63 @@
#!/usr/bin/env python3
# coding: utf-8
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
from datetime import datetime
import can
from can import Bus, BusState, Logger
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
print("prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def main():
verbosity = 2
logging_level_name = ['critical', 'error', 'warning', 'info', 'debug', 'subdebug'][min(5, verbosity)]
can.set_logging_level(logging_level_name)
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan"
config["bitrate"] = 125000
bus = Bus("can1", **config)
print('Connected to {}: {}'.format(bus.__class__.__name__, bus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
try:
while True:
msg = bus.recv(1)
if msg is not None:
de=decon(msg.arbitration_id)
m= { "prio": hex(de[0]), "type": hex(de[1]), "dst": hex(de[2]), "src": hex(de[3]), "cmd": hex(de[4]), "target": hex(msg.data[0]) }
if de[2] is 3 and msg.data[0] is 3 and de[1] is 0 and de[3] is 3 and de[4] is 3 :
print(m)
m = can.Message(arbitration_id=0x0C030900,
data=[3],
extended_id=True)
try:
bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()

163
tools/coil2can.py

@ -0,0 +1,163 @@
#!/usr/bin/env python3
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
from datetime import datetime
import can
from can import Bus, BusState, Logger
import paho.mqtt.client as mqtt
sub_topic = "coil"
coil_map = {
'EZ': [ 0x03, 0x01 ],
'K': [ 0x03, 0x02 ],
'WZ1': [ 0x02, 0x01 ],
'WZ2': [ 0x02, 0x02 ],
'TER': [ 0x03, 0x03 ],
'FE': [ 0x03, 0x07 ],
'TRE': [ 0x02, 0x03 ],
'FO': [ 0x01, 0x03 ],
'TRO': [ 0x01, 0x07 ],
'KI1': [ 0x01, 0x06 ],
'KI2': [ 0x01, 0x04 ],
'SCH': [ 0x01, 0x08 ],
'B1': [ 0x01, 0x01 ],
'B2': [ 0x01, 0x02 ],
'ROL_EZ_G_DOWN': [0x03, 0x05, -1],
'ROL_EZ_G_UP': [0x03,0x04, -1],
'ROL_EZ_N_DOWN': [0x03, 0x06, -2],
'ROL_EZ_N_UP': [0x03,0x08, -2],
'EG1': [ 0x02, 0x09 ],
'EG2': [ 0x03, 0x09 ],
'OG': [ 0x01, 0x09 ],
'ALL': [ 0xFF, 0x09 ],
}
cmd_map = {
'off': 0,
'0': 0,
'on': 1,
'1': 1,
'value': 2,
'toggle': 3
}
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
# print("msg_id: ", hex(msg_id), "prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def con(msg_dst,msg_cmd,msg_prio=3,msg_type=0,msg_src=11, ):
msg_id=(msg_prio<<26) + \
((msg_type&0x03)<<24) +\
((msg_dst&0xFF)<<16) +\
((msg_src&0xFF)<<8) +\
(msg_cmd&0xFF)
print("Constructed ID: "+hex(msg_id))
return msg_id
def on_connect(mcp_mqtt, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
mcp_mqtt.subscribe(sub_topic+"/+")
print("Subscribed to:"+sub_topic+"/+")
def on_message(mcp_mqtt, userdata, msg):
local_bus=userdata
print("data Received topic: ", msg.topic)
m_decode=str(msg.payload.decode("utf-8","ignore"))
print("data Received",m_decode)
msg_cmd=cmd_map[m_decode]
sub=msg.topic[len(sub_topic)+1:]
coil=sub
print("substring: "+coil)
addr = coil_map[coil]
print("Addr:", addr)
if msg_cmd == 2:
msg_data.append(value)
print("msg_cmd",msg_cmd, len(addr))
if msg_cmd is not 0 and len(addr) is 3:
print("hello 001")
for key, value in coil_map.items():
print("checking: ", key)
if len(value) is 3:
print("value_2 is", value[2], "Addr: ", addr[2])
if value[2] is addr[2]:
msg_id=con(msg_dst=value[0],msg_cmd=0)
msg_data=[value[1]]
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
msg_id=con(msg_dst=addr[0],msg_cmd=msg_cmd)
msg_data=[addr[1]]
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
def main():
verbosity = 2
logging_level_name = ['critical', 'error', 'warning', 'info', 'debug', 'subdebug'][min(5, verbosity)]
can.set_logging_level(logging_level_name)
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan"
config["bitrate"] = 125000
bus = Bus("can1", **config)
print('Connected to {}: {}'.format(bus.__class__.__name__, bus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
mcp_mqtt = mqtt.Client()
mcp_mqtt.on_connect = on_connect
mcp_mqtt.on_message = on_message
mcp_mqtt.user_data_set(bus)
mcp_mqtt.connect("mcp", 1883, 60)
mcp_mqtt.loop_start()
try:
while True:
msg = bus.recv(1)
if msg is not None:
de=decon(msg.arbitration_id)
m= { "prio": hex(de[0]), "type": hex(de[1]), "dst": hex(de[2]), "src": hex(de[3]), "cmd": hex(de[4]), "action": hex(msg.data[0]) }
if de[2]==0 and de[4] == 6:
print("received state: ", hex(de[3]), hex(msg.data[0]), hex(msg.data[1]))
for key in coil_map:
address=coil_map[key]
if address[0] == de[3] and address[1] == msg.data[0]+1:
print("coil/"+key+" changed to "+str(msg.data[1]))
mcp_mqtt.publish("coil/"+key+"/state", msg.data[1] , retain=1)
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()

41
tools/data2obj.py

@ -0,0 +1,41 @@
#! /usr/bin/env python
import sys
msg_id=int(str(sys.argv[1]),0) & 0x1FFFFFFF
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
#print('id: {0:b}'.format(msg_id))
print('id: {0:#010x} {0:#031b}'.format(msg_id ,msg_id))
#print("id:", hex(msg_id), format(40,str(bin(msg_id))))
print('prio: {0:#03x} {0:#04b}'.format(msg_prio))
print('type: {0:#03x} {0:#04b}'.format(msg_type))
print('dst: {0:#04x} {0:#010b}'.format(msg_dst))
print('src: {0:#04x} {0:#010b}'.format(msg_src))
print('cmd: {0:#04x} {0:#010b}'.format(msg_cmd))
nmsg_prio=msg_id>>26
nmsg_type=(msg_id>>24) & 0x03
nmsg_src=(msg_id>>18) & 0x3F
nmsg_dst=(msg_id>>12) & 0x3F
nmsg_targ=(msg_id>>6) & 0x3F
nmsg_cmd=msg_id & 0x1F
print('New schema')
#print('id: {0:b}'.format(msg_id))
print('id: {0:#010x} {0:#031b}'.format(msg_id))
#print("id:", hex(msg_id), format(40,str(bin(msg_id))))
print('prio: {0:#04x} {0:#04b}'.format(nmsg_prio))
print('type: {0:#04x} {0:#04b}'.format(nmsg_type))
print('src: {0:#04x} {0:#08b}'.format(nmsg_src))
print('dst: {0:#04x} {0:#08b}'.format(nmsg_dst))
print('target: {0:#04x} {0:#08b}'.format(nmsg_targ))
print('cmd: {0:#04x} {0:#07b}'.format(nmsg_cmd))

170
tools/light2can.py

@ -0,0 +1,170 @@
#!/usr/bin/env python3
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
from datetime import datetime
import can
from can import Bus, BusState, Logger
import paho.mqtt.client as mqtt
sub_topic = "light"
aliases = {
'Esszimmer': 'EZ',
'Esszimmer oben': 'EZ',
'Küche': 'K',
'Wohnzimmer1': 'WZ1',
'Wohnzimmer2': 'WZ2',
'Wohnzimmer Nord': 'WZ1',
'Wohnzimmer Süd': 'WZ2',
'Wohnzimmer Tür': 'WZ1',
'Wohnzimmer TV': 'WZ2',
'Wohnzimmer Fernseher': 'WZ2',
'Bad Decke': 'B1',
'Bad Spiegel': 'B2',
'Bjarne': 'K1',
'Inka': 'K2',
'Schlafzimmer': 'SCH',
'Flur EG': 'FE',
'Flur unten': 'FE',
'Flur OG': 'FO',
'Flur oben': 'FO',
'Treppe EG': 'TRE',
'Treppe unten': 'TRE',
'Treppe OG': 'TRO',
'Treppe oben': 'TRO'
}
light_map = {
'EZ': [ 0x03, 0x01 ],
'K': [ 0x03, 0x02 ],
'WZ1': [ 0x02, 0x01 ],
'WZ2': [ 0x02, 0x02 ],
'TER': [ 0x03, 0x03 ],
'FE': [ 0x03, 0x07 ],
'TRE': [ 0x02, 0x03 ],
'FO': [ 0x01, 0x03 ],
'TRO': [ 0x01, 0x07 ],
'KI1': [ 0x01, 0x06 ],
'KI2': [ 0x01, 0x04 ],
'SCH': [ 0x01, 0x08 ],
'B1': [ 0x01, 0x01 ],
'B2': [ 0x01, 0x02 ],
'EG1': [ 0x02, 0x09 ],
'EG2': [ 0x03, 0x09 ],
'OG': [ 0x01, 0x09 ],
'ALL': [ 0xFF, 0x09 ],
}
cmd_map = {
'off': 0,
'0': 0,
'on': 1,
'1': 1,
'value': 2,
'toggle': 3
}
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
# print("msg_id: ", hex(msg_id), "prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def con(msg_dst,msg_cmd,msg_prio=3,msg_type=0,msg_src=11, ):
msg_id=(msg_prio<<26) + \
((msg_type&0x03)<<24) +\
((msg_dst&0xFF)<<16) +\
((msg_src&0xFF)<<8) +\
(msg_cmd&0xFF)
print("Constructed ID: "+hex(msg_id))
return msg_id
def on_connect(mcp_mqtt, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
mcp_mqtt.subscribe(sub_topic+"/+")
print("Subscribed to:"+sub_topic+"/+")
def on_message(mcp_mqtt, userdata, msg):
local_bus=userdata
print("data Received topic: ", msg.topic)
m_decode=str(msg.payload.decode("utf-8","ignore"))
print("data Received",m_decode)
msg_cmd=cmd_map[m_decode]
sub=msg.topic[len(sub_topic)+1:]
light=aliases.get(sub,None)
if light is None:
light=sub
print("substring: "+light)
addr = light_map[light]
msg_id=con(msg_dst=addr[0],msg_cmd=msg_cmd)
msg_data=[addr[1]]
print(msg_data)
if msg_cmd == 2:
msg_data.append(value)
print(msg_data)
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
if light == 'ALL':
print("ALL detected")
for key in light_map:
mcp_mqtt.publish("light/"+key+"/state", msg_cmd, retain=1)
def main():
verbosity = 2
logging_level_name = ['critical', 'error', 'warning', 'info', 'debug', 'subdebug'][min(5, verbosity)]
can.set_logging_level(logging_level_name)
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan_native"
config["bitrate"] = 125000
bus = Bus("can1", **config)
print('Connected to {}: {}'.format(bus.__class__.__name__, bus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
mcp_mqtt = mqtt.Client()
mcp_mqtt.on_connect = on_connect
mcp_mqtt.on_message = on_message
mcp_mqtt.user_data_set(bus)
mcp_mqtt.connect("mcp", 1883, 60)
mcp_mqtt.loop_start()
try:
while True:
msg = bus.recv(1)
if msg is not None:
de=decon(msg.arbitration_id)
m= { "prio": hex(de[0]), "type": hex(de[1]), "dst": hex(de[2]), "src": hex(de[3]), "cmd": hex(de[4]), "action": hex(msg.data[0]) }
if de[2]==0 and de[4] == 6:
print("received state: ", hex(de[3]), hex(msg.data[0]), hex(msg.data[1]))
for key in light_map:
address=light_map[key]
if address[0] == de[3] and address[1] == msg.data[0]+1:
print("light/"+key+" changed to "+str(msg.data[1]))
mcp_mqtt.publish("light/"+key+"/state", msg.data[1] , retain=1)
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()

214
tools/mqtt2can.py

@ -0,0 +1,214 @@
#!/usr/bin/env python3
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
import logging
from datetime import datetime
import can
from can import Bus, BusState, Logger
import paho.mqtt.client as mqtt
base_topic="house"
coil_topic = "coil"
light_topic = "light"
switch_topic = "switch"
coil_map = {
# tag, node, address, affinity
# tag: (L)ight, (E)G, (O)G, (F)lur, (S)chlaf, (A)ussen
'EZ': [ "LE", 0x03, 0x01 ],
'K': [ "LE", 0x03, 0x02 ],
'WZ1': [ "LE", 0x02, 0x01 ],
'WZ2': [ "LE", 0x02, 0x02 ],
'TER': [ "LEA", 0x03, 0x03 ],
'FE': [ "LFE", 0x03, 0x07 ],
'TRE': [ "LFE", 0x02, 0x03 ],
'FO': [ "LFO", 0x01, 0x03 ],
'TRO': [ "LFO", 0x01, 0x07 ],
'KI1': [ "LSO", 0x01, 0x06 ],
'KI2': [ "LSO", 0x01, 0x04 ],
'SCH': [ "LSO", 0x01, 0x08 ],
'B1': [ "LO", 0x01, 0x01 ],
'B2': [ "LO", 0x01, 0x02 ],
'ROL_EZ_G_DOWN': [ "", 0x03, 0x05, -1],
'ROL_EZ_G_UP': [ "", 0x03, 0x04, -1],
'ROL_EZ_N_DOWN': [ "", 0x03, 0x06, -2],
'ROL_EZ_N_UP': [ "", 0x03, 0x08, -2],
# 'EG1': [ 0, 0x02, 0x09 ],
# 'EG2': [ 0, 0x03, 0x09 ],
# 'OG': [ 0, 0x01, 0x09 ],
'ALL': [ "", 0xFF, 0x09 ],
}
cmd_map = {
'off': 0,
'0': 0,
'on': 1,
'1': 1,
'value': 2,
'toggle': 3
}
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
# print("msg_id: ", hex(msg_id), "prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def con(msg_dst,msg_cmd,msg_prio=3,msg_type=0,msg_src=11, ):
msg_id=(msg_prio<<26) + \
((msg_type&0x03)<<24) +\
((msg_dst&0xFF)<<16) +\
((msg_src&0xFF)<<8) +\
(msg_cmd&0xFF)
print("Constructed ID: "+hex(msg_id))
return msg_id
def coil_action(coil, payload, bus, tag=0 ):
try:
cmd=cmd_map[payload]
except BaseException as e:
logging.error("Error finding command {%s}: %s" % (payload, e))
print("Coil: ",coil,"cmd:", payload)
try:
addr = coil_map[coil]
print("Addr:", addr)
if cmd == 2:
print("TBD")
# msg_data.append(value)
print("cmd", cmd,"length: ", len(addr))
if tag is not 0:
if tag not in addr[0]:
print("not tagged with: ",tag)
return
if cmd is not 0 and len(addr) is 4:
print("Applying affinity")
for key, value in coil_map.items():
print("checking: ", key)
if len(value) is 4:
print("value_2 is", value[3], "Addr: ", addr[3])
if value[3] is addr[3]:
msg_id=con(msg_dst=value[1],msg_cmd=0)
msg_data=[value[2]]
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
try:
bus.send(m)
print("data sent to CAN",m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
msg_id=con(msg_dst=addr[1],msg_cmd=cmd)
msg_data=[addr[2]]
print(msg_id)
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
try:
bus.send(m)
print("data sent to CAN",m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
except BaseException as e:
logging.error("Error finding coil %s" % (coil))
def on_connect(mcp_mqtt, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
mcp_mqtt.subscribe(base_topic+"/#", 0)
print("Subscribed to: "+base_topic+"/#")
def on_message_coil(mcp_mqtt, bus, msg):
print("data Received topic: ", msg.topic)
m_decode=str(msg.payload.decode("utf-8","ignore"))
print("data Received",m_decode)
sub=msg.topic[len(base_topic)+len(coil_topic)+2:]
coil_action(sub, m_decode, bus)
def on_message_light(mcp_mqtt, bus, msg):
print("data Received topic: ", msg.topic)
m_decode=str(msg.payload.decode("utf-8","ignore"))
print("data Received",m_decode)
sub=msg.topic[len(base_topic)+len(light_topic)+2:]
coil_action(sub, m_decode, bus, "L")
def on_message(mcp_mqtt, obj, msg):
# This callback will be called for messages that we receive that do not
# match any patterns defined in topic specific callbacks, i.e. in this case
print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
def main():
verbosity = 2
logging_level_name = ['critical', 'error', 'warning', 'info', 'debug', 'subdebug'][min(5, verbosity)]
can.set_logging_level(logging_level_name)
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan"
config["bitrate"] = 125000
bus = Bus("can1", **config)
print('Connected to {}: {}'.format(bus.__class__.__name__, bus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
mcp_mqtt = mqtt.Client()
mcp_mqtt.on_connect = on_connect
# mcp_mqtt.on_message = on_message
mcp_mqtt.user_data_set(bus)
mcp_mqtt.loop_start()
mcp_mqtt.message_callback_add(base_topic+"/"+coil_topic+"/+", on_message_coil)
mcp_mqtt.message_callback_add(base_topic+"/"+light_topic+"/+", on_message_light)
mcp_mqtt.on_message = on_message
mcp_mqtt.connect("mcp", 1883, 60)
mcp_mqtt.loop_start()
#mcp_mqtt.loop_forever()
try:
while True:
msg = bus.recv(1)
if msg is not None:
de=decon(msg.arbitration_id)
m= { "prio": hex(de[0]), "type": hex(de[1]), "dst": hex(de[2]), "src": hex(de[3]), "cmd": hex(de[4]), "action": hex(msg.data[0]) }
if de[2]==0 and de[4] == 6:
print("received state: ", hex(de[3]), hex(msg.data[0]), hex(msg.data[1]))
for key in coil_map:
address=coil_map[key]
if address[1] == de[3] and address[2] == msg.data[0]+1:
print("coil/"+key+" changed to "+str(msg.data[1]))
mcp_mqtt.publish(base_topic+"/"+coil_topic+"/"+key+"/state", msg.data[1] , retain=1)
if "L" in address[0]:
print("light/"+key+" changed to "+str(msg.data[1]))
mcp_mqtt.publish(base_topic+"/"+light_topic+"/"+key+"/state", msg.data[1] , retain=1)
elif de[2]==0 and de[4] == 5:
print("received state: ", de[3], msg.data[0], bin(msg.data[1]))
mcp_mqtt.publish(base_topic+"/"+switch_topic+"/"+str(de[3])+"-"+str(msg.data[0]), bin(msg.data[1]) , retain=1)
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()

55
tools/obj2data.py

@ -0,0 +1,55 @@
#! /usr/bin/env python
import sys
import json
#stuff = json.loads(sys.argv[1])
#data = json.load(sys.stdin)
#print(json.dumps(sys.stdin, sort_keys=True, indent=4))
###print str(sys.argv[1])
#print(stuff['foo'])
#print(json.dumps(data, indent=4))
#msg_id=int(str(sys.argv[1]),0)
#msg_prio=msg_id>>26
#msg_type=(msg_id>>24) & 0x03
#msg_dst=(msg_id>>16) & 0xFF
#msg_src=(msg_id>>8) & 0xFF
#msg_cmd=msg_id & 0xFF
#print "id:", hex(msg_id), bin(msg_id)
#print "prio:", hex(msg_prio), bin(msg_prio)
#print "type:", hex(msg_type), bin(msg_type)
#print "dst:", hex(msg_dst), bin(msg_dst)
#print "src:", hex(msg_src), bin(msg_src)
#print "cmd:", hex(msg_cmd), bin(msg_cmd)
import sys
import simplejson as json
def main(args):
try:
inputFile = open(args[1])
input = json.load(inputFile)
inputFile.close()
except IndexError:
usage()
return False
if len(args) < 3:
print json.dumps(input, sort_keys = False, indent = 10)
else:
outputFile = open(args[2], "w")
json.dump(input, outputFile, sort_keys = False, indent = 4)
outputFile.close()
return True
def usage():
print __doc__
if __name__ == "__main__":
sys.exit(not main(sys.argv))

149
tools/shutter2can.py

@ -0,0 +1,149 @@
#!/usr/bin/env python3
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
from datetime import datetime
import can
from can import Bus, BusState, Logger
import paho.mqtt.client as mqtt
sub_topic = "shutter"
aliases = {
'Esszimmer_Garten': 'EZ_G',
'Esszimmer_Nachbar': 'EZ_N',
'Wohnzimmer1': 'WZ1',
'Wohnzimmer2': 'WZ2',
'Wohnzimmer3': 'WZ3',
'Wohnzimmer4': 'WZ4',
}
event_map = {
'stop': 0,
'off': 0,
'up': 1,
'down': 2
}
coil_map = {
# up , down
'EZ_G': [ 0x03, 0x04 , 0x03, 0x05 ],
'EZ_N': [ 0x03, 0x08 , 0x03, 0x06 ],
'WZ1': [ 0x00, 0x01 , 0x00, 0x01 ],
'WZ2': [ 0x00, 0x01 , 0x00, 0x01 ],
'WZ3': [ 0x00, 0x01 , 0x00, 0x01 ],
'WZ4': [ 0x00, 0x01 , 0x00, 0x01 ]
}
cmd_map = {
'off': 0,
'on': 1,
'value': 2,
'toggle': 3
}
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
print("msg_id: ", hex(msg_id), "prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def con(msg_dst,msg_cmd,msg_prio=3,msg_type=0,msg_src=11, ):
msg_id=(msg_prio<<26) + \
((msg_type&0x03)<<24) +\
((msg_dst&0xFF)<<16) +\
((msg_src&0xFF)<<8) +\
(msg_cmd&0xFF)
print("Constructed ID: "+hex(msg_id))
return msg_id
def on_connect(mcp_mqtt, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
mcp_mqtt.subscribe(sub_topic+"/+")
print("Subscribed to:"+sub_topic+"/+")
def on_message(mcp_mqtt, userdata, msg):
local_bus=userdata
print("data Received topic: ", msg.topic)
m_decode=str(msg.payload.decode("utf-8","ignore"))
print("data Received",m_decode)
data=m_decode
sub=msg.topic[len(sub_topic)+1:]
event=event_map[data]
coils={
'up': [ coil_map[sub][0], coil_map[sub][1] ],
'down': [ coil_map[sub][2], coil_map[sub][3] ]
}
if event is not None: # it's 0,1,2
for key, value in coils.items():
msg_id=con(msg_dst=value[0],msg_cmd=0)
msg_data=[value[1]]
print("turning off: ",sub,value[0],value[1])
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
print("going to sent to CAN",m)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
if event is not 0:
addr = coils[data]
print("turning on: ",addr[0],addr[1])
msg_id=con(msg_dst=addr[0],msg_cmd=1)
msg_data=[addr[1]]
print(msg_data)
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
print("going to sent to CAN",m)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
def main():
verbosity = 2
logging_level_name = ['critical', 'error', 'warning', 'info', 'debug', 'subdebug'][min(5, verbosity)]
can.set_logging_level(logging_level_name)
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan"
config["bitrate"] = 125000
bus = Bus("can1", **config)
print('Connected to {}: {}'.format(bus.__class__.__name__, bus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
mcp_mqtt = mqtt.Client()
mcp_mqtt.on_connect = on_connect
mcp_mqtt.on_message = on_message
mcp_mqtt.user_data_set(bus)
mcp_mqtt.connect("mcp", 1883, 60)
try:
while True:
mcp_mqtt.loop()
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()

141
tools/sunevents2can.py

@ -0,0 +1,141 @@
#!/usr/bin/env python3
# coding: utf-8
from __future__ import absolute_import, print_function
import sys
import argparse
import socket
from datetime import datetime
import can
from can import Bus, BusState, Logger
import paho.mqtt.client as mqtt
topic = "sunevents"
event_map = {
'sunrise': "up",
'night': "down",
}
coil_map = {
'ROL_EZ_DOWN': [0x03,0x05],
'ROL_EZ_UP': [0x03,0x04]
}
group_map = {
'up': ['ROL_EZ_UP'],
'down': ['ROL_EZ_DOWN']
}
cmd_map = {
'off': 0,
'on': 1,
'value': 2,
'toggle': 3
}
def decon(msg_id):
msg_prio=msg_id>>26
msg_type=(msg_id>>24) & 0x03
msg_dst=(msg_id>>16) & 0xFF
msg_src=(msg_id>>8) & 0xFF
msg_cmd=msg_id & 0xFF
# print("msg_id: ", hex(msg_id), "prio: ", hex(msg_prio),"type: ", hex(msg_type)," dst: ", hex(msg_dst)," src: ", hex(msg_src)," cmd: ",hex(msg_cmd))
return [msg_prio, msg_type, msg_dst, msg_src, msg_cmd]
def con(msg_dst,msg_cmd,msg_prio=3,msg_type=0,msg_src=11, ):
msg_id=(msg_prio<<26) + \
((msg_type&0x03)<<24) +\
((msg_dst&0xFF)<<16) +\
((msg_src&0xFF)<<8) +\
(msg_cmd&0xFF)
print("Constructed ID: "+hex(msg_id))
return msg_id
def on_connect(mcp_mqtt, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
mcp_mqtt.subscribe(topic)
print("Subscribed to:",topic)
def on_message(mcp_mqtt, userdata, msg):
local_bus=userdata
print("data Received topic: ", msg.topic)
m_decode=str(msg.payload.decode("utf-8","ignore"))
print("data Received",m_decode)
data=m_decode
event=event_map[data]
if event is not None:
# event=sub
for key, value in coil_map.items():
msg_id=con(msg_dst=value[0],msg_cmd=0)
msg_data=[value[1]]
print("turning off: ",key,value[0],value[1])
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
print("going to sent to CAN",m)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
print("Group: ",event)
for coil in group_map[event]:
print("turning on", coil)
addr = coil_map[coil]
msg_id=con(msg_dst=addr[0],msg_cmd=1)
msg_data=[addr[1]]
print(msg_data)
m = can.Message(arbitration_id=msg_id,
data=msg_data,
extended_id=True)
print("going to sent to CAN",m)
try:
local_bus.send(m)
except BaseException as e:
logging.error("Error sending can message {%s}: %s" % (m, e))
print("data sent to CAN",m)
def main():
verbosity = 2
logging_level_name = ['critical', 'error', 'warning', 'info', 'debug', 'subdebug'][min(5, verbosity)]
can.set_logging_level(logging_level_name)
can_filters = []
config = {"can_filters": can_filters, "single_handle": True}
config["interface"] = "socketcan"
config["bitrate"] = 125000
bus = Bus("can1", **config)
print('Connected to {}: {}'.format(bus.__class__.__name__, bus.channel_info))
print('Can Logger (Started on {})\n'.format(datetime.now()))
mcp_mqtt = mqtt.Client()
mcp_mqtt.on_connect = on_connect
mcp_mqtt.on_message = on_message
mcp_mqtt.user_data_set(bus)
mcp_mqtt.connect("mcp", 1883, 60)
try:
while True:
mcp_mqtt.loop_start()
msg = bus.recv(1)
if msg is not None:
de=decon(msg.arbitration_id)
m= { "prio": hex(de[0]), "type": hex(de[1]), "dst": hex(de[2]), "src": hex(de[3]), "cmd": hex(de[4]), "action": hex(msg.data[0]) }
# print(m)
# mcp_mqtt.publish("can/rx", str(m))
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()
Loading…
Cancel
Save