MVM-IT: Difference between revisions
Jump to navigation
Jump to search
Line 316: | Line 316: | ||
= MVM-Firmware = | = MVM-Firmware = | ||
== Prepare == | |||
* install arduino: https://daq.triumf.ca/DaqWiki/index.php/ESP32#Arduino_IDE | |||
* ssh pi@... | * ssh pi@... |
Revision as of 15:12, 15 April 2020
Links
- https://gitlab.triumf.ca/mvmdev - TRIUMF gitlab repository
- https://gitlab.triumf.ca/mvmdev/gui - TRIUMF copy of mvm_gui (use branch ko_test)
- https://gitlab.triumf.ca/mvmdev/MVMFirmware - TRIUMF copy of mvm firmware (use branch ko_test)
- https://gitlab.triumf.ca/mvmdev/mvmcontroller
- https://gitlab.triumf.ca/mvmdev/mvmcontroller/-/tree/dev-esp32 - ESP32 development branch
- https://gitlab.triumf.ca/mvmdev/hwrev0/-/blob/master/Altium/COVID19%20-%20Ventilator/Project%20Outputs/Schematic%20PDF/COVID19%20-%20Ventilator%20Control%20SCHEMATIC.pdf - board schematics
- https://gitlab.triumf.ca/mvmdev/hwrev0/-/blob/master/Altium/COVID19%20-%20Ventilator/Project%20Outputs/Board%20PDF/COVID19%20-%20Ventilator%20Control%20BOARD.PDF - board layout
- Italian repositories:
- https://github.com/NuclearInstruments/MVMFirmware - Firmware git repository
- https://github.com/MVMSoftware/gui - GUI git repository (forwards to https://github.com/MechanicalVentilatorMilano/gui)
- https://github.com/MechanicalVentilatorMilano - combined repository
- https://github.com/ManuelBeschi/MVMFirmware - Beschi pressure controller development, branch unibs
- https://gitlab.triumf.ca/mvmdev/controlboard/-/blob/master/board.pdf - board schematics from ControlBoard git repo
- https://edev-group.triumf.ca/hw/ventilator-controller/rev0 - TRIUMF edev repository
- https://edev-group.triumf.ca/hw/ventilator-controller/rev0/-/blob/master/Altium/COVID19%20-%20Ventilator/Project%20Outputs/Schematic%20PDF/COVID19%20-%20Ventilator%20Control%20SCHEMATIC.pdf - board schematics
- https://edev-group.triumf.ca/hw/ventilator-controller/rev0/-/blob/master/Altium/COVID19%20-%20Ventilator/Project%20Outputs/Board%20PDF/COVID19%20-%20Ventilator%20Control%20BOARD.PDF - board layout
- ESP32 - ESP32 information: adafruit HUZZA32 and ESP-WROOM32 modules
- RPI3 - RaspberryPi3 information: install Raspbian, etc
- TL,AC,BV Requirements document on sharepoint
General information
- external power supply: 24 VDC screw terminals
- regulated down to 5V USB power (+5V_USB) which is
- regulated down to 3.3V (+3V_CPU)
- 4 channels of relay drivers
- 2 screw terminals (CPU_BUZZ/BUZZ and CPU_AUX/AUX1)
- 2 screw terminals (CPU_LED1/AUX2 and CPU_LED2/AUX3)
- connection for "featherwing 2.4in" display
- 7 screw terminals for I2C (I2C 0..6)
- 1 screw terminal for SPI (EXT_SPI_CS0)
- 1 pressure sensor
- 3 sites for microcontroller (only 1 at a time): Adafruit HUZZA32, NanoPi, RaspberryPi
Switches and Jumpers
- JMP3/JMP4 - select +3V_CPU from our regulator or from ESP32 internal regulator
- SW1/SW2/SW3/SW4 - select I2C power +3V_CPU or +5V_USB
- JMP1_DRV1/JMP2_DRV1 (DRV1..DRV4) - select relay driver
Connectors
- power: 24VDC two pin screw terminal
- adafruit huzzah32 socket
- nanopi socket
- raspberry pi 3B socket (40 pin J8)
- SPI: six pin screw teminal
- I2C0..I2C6: four pin screw terminals. i2c switch port order is: SPI, I2C0, I2C1, ... I2C6
- 4x two pin screw terminals: CPU_BUZZ, AUX1, AUX2, AUX3.
Test plan
Done:
- ESP32 I2C communication with pressure sensor (standalone): [BS 2020apr2].
- board powered 24V: [DB/BS 2020apr4]
- ESP32 runs: [BS 2020apr4, KO 2020apr5]
- RaspberryPi runs: [LM 2020apr5, KO 2020apr5]
- ESP32 to RPi3 USB connection ok, ESP32 powered from USB or 24VDC ok, no crash when 24VDC power is cycled [KO 2020apr5]
- ESP32 featherwing TFT display ok (standalone): [KO 2020apr5]
- control and readback of relays (valves): ESP32 [BS 2020apr4], RPi [LM 2020apr5, KO 2020apr5]
- I2C communication: ESP32 [BS 2020apr4], RPi [LM 2020apr5]
- ESP32 Wifi radio works: [KO 2020apr5]
- ESP32 Wifi communication: [BS 2020apr7]
Problems found:
- SPI communication: ESP32 [BS 2020apr4], RPi [KO 2020apr9]
Partial:
- Pressure sensor readout (I2C): ESP32 [BS 2020apr4], RPi [...]
- flow meter readout (I2C): ESP32 [BS 2020apr7], RPi [...]
- external I2C: ESP32 [BS 2020apr7], RPi [...]
- BUZZ, AUX1: ESP32 [...], RPi [KO 2020apr4]
- CPU DRV RSTn works: ESP32 [...], RPi [KO 2020apr9]
Pending:
- AUX2, AUX3: ESP32 [...], RPi [...]
- featherwing display: ESP32 [...], RPi [...]
- proportional valve control (DAC): ESP32 [...]
- proportional valve control (PWM): ESP32 [...], RPi [...]
- RPi Wifi client: [...]
- RPi Wifi hotspot: [...]
- RPi touch screen: [...]
System configurations permitted by hardware
- "Italian model": [ MVM-VC + ESP32 ] ---- usb-serial ---- [ RPi3 + GUI ] (remote control) ---- wifi or cat5 or SD/USB flash for data collection
- "one ESP32": [ MVM-VC + ESP32 + small LCD + mini-GUI ] ---- wifi for data collection (no cat5, no SDflash)
- "one Pi": [ MVM-VC + RPi + GUI ] ---- wifi or cat5 or SD/USB flash for data collection
- "two Pi": [ MVM-VC + RPi/NanoPi ] ---- cat5 ---- [ RPi + GUI ] ---- wifi or SD/USB flash for data collection
- "three Pi": [ MVM-VC + RPi/NanoPi (control) ---???--- RPi + GUI (local control) ] ---???--- [ RPi + GUI ] (remote control)
- "2.5 Pi": [ MVM-VC + ESP32 --- usb-serial --- RPi + GUI (local control) ] ---- cat5 ---- [ RPi + GUI ] (remote control)
Notable hardware limitations:
- MVM-VC can be fully operated by ESP32 or RPi or NanoPi (not at the same time)
- ESP32: yes wifi, no cat5 ethernet, no usb, no sd flash (sd flash maybe via adafruit LCD "feather")
- NanoPi: maybe wifi, maybe HDMI/DP connector to drive monitor (NanoPi to be confirmed)
- RPi is the most capable: cat5/rj45 ethernet, wifi, HDMI/DP, USB, SD flash slot.
Abbreviations: MVM-VC - TRIUMF PCB, ESP32 - adafruit HUZZA32/WROOM32/ESP32 icrocontroller, RPi - RaspberryPi, NanoPi - NanoPi, GUI - medium size LCD running the MVM python GUI, mini-GUI - small size LCD running minimal GUI coded in ESP32.
ESP32 connections
!!! ALL GPIO PINS are 3.3V, NOT 5V safe !!!
ESP32 - link to the ESP32 page
- ESP32 power: per https://learn.adafruit.com/adafruit-huzzah32-esp32-feather/power-management, last "not recommended" option: "Connect an external 5V power supply to the USB and GND pins"
- Pinouts Rev 2020apr5
ESP32 pin and name - WROOM32 - HUZZA32 - header - baseboard - function "bottom row" 42 - GPIO21 - IO21 - 21 - JP1-1 - A1 - CPU SPI CS (SPI) - (output) SPI nCS - mux GPIO21 or VSPIHD 41 - U0TXD - TXD0 - TX/17 - JP1-2 - A2 - FTHR CPU TX - N/C - mux GPIO1 or U0TXD 40 - U0RXD - RXD0 - RX/16 - JP1-3 - A3 - FTHR CPU RX - N/C - mux GPIO3 or U0RXD 38 - GPIO19 - IO19 - MISO/19 - JP1-4 - A4 - CPU MISO (SPI) - (input) SPI MISO - mux GPIO19 or U0CTS or VSPIQ 35 - GPIO18 - IO18 - MOSI/18 - JP1-5 - A5 - CPU MOSI (SPI) - (output) SPI MOSI - mux GPIO18 or VSPICLK 34 - GPIO5 - IO5 - SCK/5 - JP1-6 - A6 - CPU SCK (SPI) - (output) SPI CLK - mux GPIO5 or VSPICS0 24 - GPIO4 - IO4/A2_0 - ADC2/A5/4 - JP1-7 - A7 - CPU DRV STAT4 - (open drain 3.3V input) - mux GPIO4 or RTC_GPIO10 5 - SENSOR_VP C16/270pF - IO36/SEN_VP/A1_0 - ADC1/A4/36 - JP1-8 - A8 - CPU DRV STAT3 - (same) - mux GPIO36 or RTC_GPIO0 (input only) 8 - SENSOR_VN C17/270pF - IO39/SEN_VN/A1_3 - ADC1/A3/39 - JP1-9 - A9 - CPU DRV STAT2 - (same) - mux GPIO39 or RTC_GPIO3 (input only) 10 - VDET_1 - I34/A1_6 - "input only" ADC1/A2/34 - JP1-10 - A10 - CPU DRV STAT1 - (same) - mux GPIO34 or RTC_GPIO4 (input only) 14 - GPIO25 - IO25/DAC1/A2_8 - ADC2/A1/DAC1/25 - JP1-11 - A11 - N/C - reserved for DAC output - mux GPIO25 or RTC_GPIO6 or DAC1 15 - GPIO26 - IO26/DAC2/A2_9 - ADC2/A0/DAC2/26 - JP1-12 - A12 - CPU BUZZ - (maybe output) direct connection to BUZZ screw terminal - mux GPIO26 or RTC_GPIO7 or DAC2 none - none - GND - JP1-13 - A13 - GND none - none - NC - JP1-14 - A14 - N/C none - none - "3V" - JP1-15 - A15 - "+3V_CPU2" none - none - RST - JP1-16 - A16 - CPU RESET - N/C "top row" none - none - BAT - JP3-1 - B1 - N/C none - none - EN - JP3-2 - B2 - N/C none - none - USB - JP3-3 - B3 - "+5V_USB" 20 - MTCK - IO13/A2_4 - "red LED" ADC2/13/A12 - JP3-4 - B4 - CPU_LED1 - (output) drives open-drain 3.3V AUX2 - mux GPIO13 or RTC_GPIO14 18 - MTDI - IO12/A2_5 - "internal pulldown, output only" ADC2/12/A11 - JP3-5 - B5 - CPU_LED2 - (output) same, AUX3 - mux GPIO12 or RTC_GPIO15 - "boot fail if pulled high" 16 - GPIO27 - IO27/A2_7 - ADC2/27/A10 - JP3-6 - B6 - CPU DRV CH1 - (output) drives buffer - mux GPIO27 or RTC_GPIO17 13 - 32K_XN - IO33/A1_5/X32N - ADC1/33/A9 - JP3-7 - B7 - CPU DRV CH2 - (same) - mux GPIO33 or RTC_GPIO8 21 - MTDO - IO15/A2_3 - ADC2/15/A8 - JP3-8 - B8 - CPU DRV CH3 - (same) - mux GPIO15 or RTC_GPIO13 12 - 32K_XP - IO32/A1_4/X32P - ADC1/32/A7 - JP3-9 - B9 - CPU DRV CH4 - (same) - mux GPIO32 or RTC_GPIO9 17 - MTMS - IO14/A2_6 - ADC2/14/A6 - JP3-10 - B10 - CPU DRV RSTn - (output, pull up to 3.3V) drives nRESET of I2C and SPI chips, mux GPIO14 or RTC_GPIO16 39 - GPIO22 - IO22 - SCL/22 - JP3-11 - B11 - CPU SCL - (I2C, pull up to 3.3V) - mux GPIO22 or U0RTS 36 - GPIO23 - IO23 - SDA/23 - JP3-12 - B12 - CPU SDA - (I2C, pull up to 3.3V) - mux GPIO23 not on header, internally connected on HUZZA32: 11 - VDET_2 - I35/A1_7 - ADC1/35/A13 - N/C - VBAT voltmeter (through divider) - mux GPIO35 or ADC1_CH7 or RTC_GPIO5 (input only) not clear what function: 23 - GPIO0 - IO0/A2_1 - GPIO0 - serial RTS - mux GPIO0 or RTC_GPIO11 22 - GPIO2 - IO2/A2_2 - GPIO2 - serial DTR (looks like mistake on schematic) - mux GPIO2 or RTC_GPIO12 25 - GPIO16 - IO16 - IO16 - not connected? - mux GPIO16 or U2RXD 27 - GPIO17 - IO17 - IO17 - not connected? - mux GPIO17 or U2TXD 9 - CHIP_PU - EN - RESET - push button - no mux WROOM32 flash memory connection ("U3"): 28 - SD_DATA_2 - SD2 - n/c - mux SD_DATA2 or GPIO9 29 - SD_DATA_3 - SD3 - n/c - mux SD_DATA3 or GPIO10 30 - SD_CMD - CMD - n/c - mux SD_CMD or GPIO11 31 - SD_CLK - CLK - n/c - mux SD_CLK or GPIO6 32 - SD_DATA_0 - SD0 - n/c - mux SD_DATA0 or GPIO7 33 - SD_DATA_1 - SD1 - n/c - mux SD_DATA1 or GPIO8 Not connected to ESP32: CPU AUX - (maybe output) direct connection to AUX screw terminal Note: - I2C controller can use any/all GPIO pins - SPI controller can use any/all GPIO pins
I2C addresses
- 0x70 - I2C switch - U1 - TI TCA9548APWR [Datasheet]
- 0x76 - pressure sensor - i2c switch port 7 mask 0x80 - "TE Connectivity Measurement Specialties" 5525DSO-DB001DS [Datasheet]
- 0x80 - flow meter - i2c switch port 0 mask 0x01 - SFM3000 - https://gitlab.triumf.ca/mvmdev/mvmcontroller/-/blob/dev-esp32/docs/datasheets/Sensirion-Mass-Flow-Meters-SFM3000-I2C-Functional-Description.pdf https://gitlab.triumf.ca/mvmdev/mvmcontroller/-/blob/dev-esp32/docs/datasheets/Sensirion_Mass_Flow_Meters_SFM3000_Datasheet.pdf https://gitlab.triumf.ca/mvmdev/mvmcontroller/-/blob/dev-esp32/docs/datasheets/SFM3xxx_Extended_I2C_Command_Set.pdf
To probe the pressure sensor:
$ i2cset -y 1 0x70 0 0x80 $ i2cget -y 1 0x70 0x80 $ i2cdetect -y 1 ### detects: 0x70 (switch) and 0x76 (pressure sensor) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- 76 --
Pressure sensor
Calibration constants (chip on KO's board):
read by i2cget (addr 0xa0 through 0xae)
pi@raspberrypi:~ $ i2cget -y 1 0x76 0xa0 w 0x0100
read by sensors.exe (branch dev-linux)
pressure sensor PROM 0x00: 0x0001 pressure sensor PROM 0x01: 0x392b pressure sensor PROM 0x02: 0x1e52 pressure sensor PROM 0x03: 0x0e25 pressure sensor PROM 0x04: 0x071a pressure sensor PROM 0x05: 0x943d pressure sensor PROM 0x06: 0x1f6b pressure sensor PROM 0x07: 0x000c mvm_hal_init: PS1 CRC4 OK!
- read ADC, no conversion
root@raspberrypi:~/i2c-tools-4.1/tools# ./i2cget3 -y 1 0x76 0 write returned 1 read returned 4, value 0x3f000000
- read ADC, pressure
i2cset -y 1 0x76 0x48 root@raspberrypi:~/i2c-tools-4.1/tools# ./i2cget3 -y 1 0x76 0 write returned 1 read returned 4, value 0x3f900a44
- read ADC, temperature
i2cset -y 1 0x76 0x58 root@raspberrypi:~/i2c-tools-4.1/tools# ./i2cget3 -y 1 0x76 0 write returned 1 read returned 4, value 0x3f9c424d
Flow sensor
TBW
Proportional Valve Italian firmware
- From Bryerton:
The Italian's use the PWM on DAC1 / A0 / IO25 pin. The API is the ledc API used to control an LED via PWM
- see ArduinoCorePP_PWM_hw_v3.ino
- function setup() attach pin "DAC1" to ledc
ledcSetup(0, 10000, 12); // KO: chan 0, freq in kHz, how many bits of PWM 12 bits = range 0..4095 ledcAttachPin(DAC1, 0); // KO: IO25/A0/DAC1 ledcWrite(0, 0);
- function PressureControlLoop_PRESSIN() see ledcWrite()
if (Pset == 0) { ledcWrite(0, 0); } else { pid_outb = ...; // KO: looks like a digital PID controller if (pid_outb<0) pid_outb=0; // KO: low limit pid_outb = pid_outb + 500; // KO: what is this?!? if (pid_outb>4090) pid_outb=4090; // KO: high limit ledcWrite(0, pid_outb); // KO: value 500..4090 }
- also see valve_control() commented absent code for PWM.
MVM-GUI
Install
- as root:
- apt-get update
- apt-get install python3-pyqt5 python3-numpy python3-pyqtgraph python3-serial
- ### does not work, installs wrong pip: apt-get install python3-pip
- curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
- python3 get-pip.py --force-reinstall
- ### does not work, installs too-old version of yaml 3.13: apt-get install python3-yaml
- pip3 install PyYAML ### version 5.3.1
- ssh pi@rpi
- ### use TRIUMF gitlab branch ko_test instead ### git clone git clone https://github.com/MechanicalVentilatorMilano/gui.git
- git clone https://gitlab.triumf.ca/mvmdev/gui.git
- git checkout ko_test
Run with python simulator
- cd gui
- ./mvm_gui.py fakeESP32
Run with ESP32 simulator
- load the ardiuno sketch mock/mock.ino into ESP32 (see instructions below)
- ./mvm_gui.py ### default connection is /dev/ttyUSB0 at 115200 bps, change it in default_settings.yaml
MVM-Firmware
Prepare
- install arduino: https://daq.triumf.ca/DaqWiki/index.php/ESP32#Arduino_IDE
- ssh pi@...
- ### use TRIUMF gitlab branch ko_test instead ### git clone https://github.com/NuclearInstruments/MVMFirmware.git
- git clone https://gitlab.triumf.ca/mvmdev/MVMFirmware.git
- git checkout ko_test
- cd arduino; ./ardiuno
- open .../MVMFirmware/ArduinoCorePP_PWM_hw_v3/ArduinoCorePP_PWM_hw_v3.ino
- install library SimpleCLI (1.0.9), aREST (2.8.0)
- build sketch (there is warnings about TwoWire::requestFrom())
- load sketch
- serial 115200
- output
ets Jun 8 2016 00:22:57 rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:8896 load:0x40080400,len:5816 entry 0x400806ac SCAN I2C BUS: 0 Scanning... I2C No I2C devices found SCAN I2C BUS: 1 Scanning... I2C No I2C devices found SCAN I2C BUS: 2 Scanning... I2C No I2C devices found SCAN I2C BUS: 3 Scanning... I2C No I2C devices found SCAN I2C BUS: 4 Scanning... I2C No I2C devices found SCAN I2C BUS: 5 Scanning... I2C No I2C devices found SCAN I2C BUS: 6 Scanning... I2C No I2C devices found SCAN I2C BUS: 7 Scanning... I2C No I2C devices found SENSOR: 0 SENS_T1: 65535 OFF_T1: 65535 TCS: 65535 TCO: 65535 TREF: 65535 TEMPSENS: 65535 OFFSET: 0.00 SENSOR: 1 SENS_T1: 65535 OFF_T1: 65535 TCS: 65535 TCO: 65535 TREF: 65535 TEMPSENS: 65535 OFFSET: 0.00 SENSOR: 2 SENS_T1: 65535 OFF_T1: 65535 TCS: 65535 TCO: 65535 TREF: 65535 TEMPSENS: 65535 OFFSET: 0.00 SENSOR: 3 SENS_T1: 65535 OFF_T1: 65535 TCS: 65535 TCO: 65535 TREF: 65535 TEMPSENS: 65535 OFFSET: 0.00 SFM driver version 0.1.0 SFM sensor probing failed ... Measure Flow Sensor initialized!
- send: "get all", reply: "valore=0.00,0.00,0,0,0,0,0,0,1"