Duet3D Logo Duet3D
    • Tags
    • Documentation
    • Order
    • Register
    • Login

    Connection issue with 3.5-rc2

    Scheduled Pinned Locked Moved
    Duet Hardware and wiring
    sbc mode can bus connection
    2
    19
    528
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • chrishammundefined
      chrishamm administrators @e4d
      last edited by

      @e4d Please post your full config.g as well.

      Duet software engineer

      e4dundefined 1 Reply Last reply Reply Quote 0
      • e4dundefined
        e4d @chrishamm
        last edited by

        @chrishamm

        ; Duet 3 Configuration File
        
        G21 																		; Work in millimetres
        G90 																		; Send absolute coordinates...
        M83 																		; ...but relative extruder moves
        
        M669 K1																		; Set Core XY mode
        G4 S5
        ;##################################################### Steppers ####################################################################################
        
        ;Definition
        M569 P0.0 S0	            ; Driver X
        M569 P0.1 S0	            ; Driver Y
        M569 P0.2 S0	            ; Driver Z3
        M569 P0.3 S0	            ; Driver Z1
        M569 P0.4 S1	            ; Driver A
        M569 P0.5 S0	            ; Driver Z2
        M569 P1.0 S0	            ; E0 Direct Drive
        M569 P1.1 S0	            ; E0 Bowden
        M569 P1.2 S0	            ; E1 Direct Drive
        M569 P2.0 S1	            ; E1 Bowden
        M569 P2.1 S0	            ; E2 Direct Drive
        M569 P2.2 S0	            ; E2 Bowden
        M569 P3.0 S1	            ; E3 Direct Drive
        M569 P3.1 S1	            ; E3 Bowden
        
        ;Parametres
        M584 X0.0 Y0.1 Z0.3:0.5:0.2 E1.0:1.1:1.2:2.0:2.1:2.2:3.0:3.1 A0.4				; Apply custom drive mapping
        M208 X-40.5:396 Y-32.8:370.0 A0:132.0 Z0:395 			    					; Set axis maxima & minima
        M350 X16 Y16 Z16 A16 E16:16:16:16:16:16:16:16 I1								; Configure microstepping with interpolation
        M566 X240 Y240 Z400 E1500:1500:1500:1500:1500:1500:1500:1500 A400	      		; Set maximum instantaneous speed changes (mm/min)
        M203 X30000 Y30000 Z1000 E5000:5000:5000:5000:5000:5000:5000:5000 A2000   		; Set maximum speeds (mm/min)
        M201 X4000 Y4000 Z500 E4000:4000:4000:4000:4000:4000:4000:4000 A500 		    ; Set accelerations (mm/s^2)
        M906 X1800 Y1800 Z1200 A400 I30                         			    		; Idle motion motors to 30%
        M906 E650:650:650:650:650:650:650:650 I10   							    	; Idle extruder motors to 10%
        M92 X80 Y80 Z800 E400:400:400:400:400:400:400:400 A400   			    		; Set steps per mm assuming x16 microstepping
        
        ; ENDSTOPS
        M574 X1 S1	P"0.io1.in"				                                            ; Set X endstop switch detection
        M574 Y1 S1	P"0.io2.in"				                                            ; Set Y endstop switch detection
        M574 Z1 S2				                                                        ; Set Z endstop switch detection
        M574 A1 S2                                                                      ; Set A endstop switch detection
        
        ;Z clic probe
        M558 K0 P8 C"0.io0.in" H5 F700 I0 T10000 		                                ; Set Z probe type to switch, the axes for which it is used and the dive height + speeds
        G31 K0 P200 X0 Y0 Z0 A0				    		                                ; Set Z probe trigger value, offset and trigger height
        M557 K0 X5:295 Y5:295 P10:10 			    	                                ; Define mesh grid
        
        ;FSR offset probe
        M558 K1 P8 C"!0.io3.in" H5 F80 T500     		                                ; Configure Z probe offset 
        G31 K1 P125 X0 Y0 Z0                        	                                ; Set Z probe trigger value, offset and trigger height
        M950 P18 C"0.io3.out" 							                                ; reset pin
        M42 P18 S1										                                ; Init reset pin
        
        ;##################################################### Pneumatic ####################################################################################
        ;Coupler Pump
        M950 P14 C"2.out1"
        M42 P14 S0
        
        
        ; Soufflage copeaux
        M950 P22 c"2.out0"
        M42 P22 S0
        
        ; Blower solenoid
        M950 P15 C"2.out7" ;M2
        M42 P15 S0
        
        ; Aspiration solenoid
        M950 P16 C"2.out6" ;M1
        M42 P16 S0
        
        ; Pneumatic sensor
        M950 J2 C"!1.io1.in" 
        
        ;##################################################### Heaters ####################################################################################
        
        ;Bed
        M308 S0 P"0.temp0" Y"thermistor" A"Bed" T100000 B4725 C7.06e-8      ; configure sensor 0 as thermistor on pin temp0
        M950 H0 C"0.out0" T0 Q10                                            ; create bed heater output on out0 and map it to sensor 0
        M307 H0 R0.605 K0.237:0.000 D2.36 E1.35 S1.00 B0                         ; enable PID mode for the bed heater and set PWM limit
        M140 H0                                                             ; map heated bed to heater 0
        M143 H0 S215                                                        ; set temperature limit for heater 0 to 215C
        
        ;Chamber
        M308 S5 P"1.temp0" Y"pt1000" A"Chamber" T100000 B4725 C7.06e-8  	; Set thermistor
        M950 H5 C"1.out2" T5												; Chamber heater
        M950 P17 C"1.out3"													; Chamber heater fan
        M307 H5 B0 S1.00 					                          		; Bang bang tuning
        M141 H5                                                         	; Define heated chamber
        M143 H5 S75 														; Set temperature limit for heater 5 to 70C
        M570 H5 P999999 T50                                                 ; configure heater fault on H4
        
        
        ;##################################################### Capteurs de blocs matériaux ###############################################################
        
        M308 S6 P"1.temp1" Y"linear-analog" A"Bloc_0"
        M308 S7 P"1.temp2" Y"linear-analog" A"Bloc_1"
        M308 S8 P"2.temp0" Y"linear-analog" A"Bloc_2"
        M308 S9 P"2.temp1" Y"linear-analog" A"Bloc_3"
        
        global bloc_0 = "vide"
        global bloc_1 = "vide"
        global bloc_2 = "vide"
        global bloc_3 = "vide"
        
        G4 S1
        
        global Bval_0 = sensors.analog[6].lastReading
        global Bval_1 = sensors.analog[7].lastReading
        global Bval_2 = sensors.analog[8].lastReading
        global Bval_3 = sensors.analog[9].lastReading
        
        M98 P"0:/sys/macros/bloc_id.gcode"
        ;##################################################### Bloc 0 ####################################################################################
        
        if sensors.analog[6].lastReading >= 0 && sensors.analog[6].lastReading < 10
        	set global.bloc_0 = "Filament"
        
        	; Heater 0
        	M308 S1 P"0.temp1" Y"pt1000" A"Heater 0" T100000 B4725 C7.06e-8  	; Set thermistor
        	M950 H1 C"0.out1" T1												; H1 heater
        	M143 H1 S400 														; Set temperature limit for heater 1 to 400C
        	M307 H1 R1.554 K0.205:0.000 D5.28 E1.35 S1.00 B0 V23.8				; PID setup
        
        	;Fans
        	M950 F0 C"0.out4"               									; part cooling fan
        	M950 F1 C"0.out5"               									; heatsink fan
        	M106 P1 S1.0 H1 T70	           										; fan full if heater 1 > 70C
        	M106 P0 S0 															; print cooling fan stop
        
        	; Define tool 
        	M563 P0 S"Extruder" D0:1 H1 F0
        	G10 P0 S0 R0
        	M567 P0 E1.0:1.0
        
        	; Filament monitor    
        	M591 D0 P7 C"1.io0.in" L7 R75:125 E22 S1
        	
        elif sensors.analog[6].lastReading >= 10  && sensors.analog[6].lastReading < 20
        	set global.bloc_0 = "Incompatible"
        
        elif sensors.analog[6].lastReading >= 20 && sensors.analog[6].lastReading < 30
        	set global.bloc_0 = "Soustractif"
        
        	; Define tool
            M563 P0 S"Fraise"    
        
            M950 P0 C"0.io4.out" Q1000             	    						; Define unsoll pin output
            M42 P0 S0			 	                    						; Init ESC
            M950 P7 C"2.io3.out"                        						; Define direction pin output
            M42 P7 S0															; Init direction
        
        
        ;##################################################### Bloc 1 ####################################################################################
        
        if sensors.analog[7].lastReading >= 0 && sensors.analog[7].lastReading < 10
        	set global.bloc_1 = "Filament"
        
        	; Heater 1
        	M308 S2 P"0.temp2" Y"pt1000" A"Heater 1" T100000 B4725 C7.06e-8  	; Set thermistor
        	M950 H2 C"0.out2" T2												; H2 heater
        	M143 H2 S400 														; Set temperature limit for heater 2 to 400C
        	M307 H2 R1.554 K0.205:0.000 D5.28 E1.35 S1.00 B0 V23.8				; PID setup
        
        	; Fans
        	M950 F2 C"0.out6"               									; part cooling fan
        	M950 F3 C"0.out7"               									; heatsink fan
        	M106 P3 S1.0 H2 T70	           										; fan full if heater 1 > 70C
        	M106 P2 S0 															; print cooling fan stop
        
        	;Define tool
        	M563 P1 S"Extruder" D2:3 H2 F2
        	M567 P1 E1.0:1.0
            G10 P1 S0 R0
        
        	; Filament monitor
        	M591 D2 P7 C"1.io5.in" L7 R75:125 E22 S1
        	
        	
        elif sensors.analog[7].lastReading >= 10  && sensors.analog[7].lastReading < 20
        	set global.bloc_1 = "Incompatible"
        	
        elif sensors.analog[7].lastReading >= 20 && sensors.analog[7].lastReading < 30
        	set global.bloc_1 = "Soustractif"
        
        	; Define tool
        	M563 P1 S"Fraise"													; Define tool
        	M950 P1 C"0.io4.out" Q1000 											; Define unsoll pin output
        	M42 P1 S0			 	                							; Init ESC
         	M950 P8 C"2.io4.out"                    							; Define direction pin output
            M42 P8 S0															; Init direction
        	
        ;##################################################### Bloc 2 ####################################################################################
        
        if sensors.analog[8].lastReading >= 0 && sensors.analog[8].lastReading < 10
        	set global.bloc_2 = "Filament"
        
        	; Heater 2
        	M308 S3 P"0.temp3" Y"pt1000" A"Heater 2" T100000 B4725 C7.06e-8  	; Set thermistor
        	M950 H3 C"0.out3" T3												; H3 heater
        	M143 H3 S400 														; Set temperature limit for heater 3 to 400C
        	M307 H3 R1.554 K0.205:0.000 D5.28 E1.35 S1.00 B0 V23.8				; PID setup
        
        	; Fans
        	M950 F4 C"0.out8"               									; part cooling fan
        	M950 F5 C"0.out9"               									; heatsink fan
        	M106 P5 S1.0 H3 T70	           										; fan full if heater 3 > 70C
        	M106 P4 S0 															; print cooling fan stop
        
        	; Define tool
        	M563 P2 S"Extruder" D4:5 H3 F4
        	M567 P2 E1.0:1.0
            G10 P2 S0 R0
        	
        	; Filament monitor
        	M591 D4 P7 C"2.io0.in" L7 R75:125 E22 S1
        	
        elif sensors.analog[8].lastReading >= 10  && sensors.analog[8].lastReading < 20
        	set global.bloc_2 = "Pellet"
        
        	; Heater 2
        	M308 S3 P"0.temp3" Y"pt1000" A"Heater 2" T100000 B4725 C7.06e-8  	; Set thermistor
        	M950 H3 C"0.out3" T3												; H3 heater
        	M143 H3 S400 														; Set temperature limit for heater 3 to 400C
        	M307 H3 R1.554 K0.205:0.000 D5.28 E1.35 S1.00 B0 V23.8				; PID setup
        
        	; Fans
        	M950 F4 C"0.out8"               									; part cooling fan
        	M950 F5 C"0.out9"               									; heatsink fan
        	M106 P5 S1.0 H3 T70	           										; fan full if heater 1 > 70C
        	M106 P4 S0 															; print cooling fan stop
        	M950 F11 C"3.out3"  												; TEMPORAIRE !!!!!!
        	M106 P11 S1 														; TEMPORAIRE !!!!!!
        
        	; Define tool
        	M906 E650:650:650:650:1400:650:650:650 I10							; Set stepper current to 1A
            M563 P2 S"Pellet" D4 H3 F4
            G10 P2 S0 R0
        
        	
        elif sensors.analog[8].lastReading >= 20 && sensors.analog[8].lastReading < 30
        	set global.bloc_2 = "Soustractif"
        	M563 P2 S"Fraise"						                			; Define tool
        	M950 P2 C"0.io7.out" Q1000 				               				; Define unsoll output
        	M42 P2 S0			 	                                			; Init ESC
         	M950 P9 C"2.io5.out"                                    			; Define direction pin output
        	M42 P9 S0															; Init direction
        
        ;##################################################### Bloc 3 ####################################################################################
        
        if sensors.analog[9].lastReading >= 0 && sensors.analog[9].lastReading < 10
        	set global.bloc_3 = "Filament"
        
        	; Heater 3
        	M308 S4 P"3.temp0" Y"pt1000" A"Heater 3" T100000 B4725 C7.06e-8  	; Set thermistor
        	M950 H4 C"3.out0" T4												; H4 heater
        	M143 H4 S400 														; Set temperature limit for heater 4 to 400C
        	M307 H4 R1.554 K0.205:0.000 D5.28 E1.35 S1.00 B0 V23.8				; PID setup
        
        	; Fans
        	M950 F6 C"3.out5"               									; part cooling fan
        	M950 F7 C"3.out4"               									; heatsink fan
        	M106 P7 S1.0 H4 T70	           										; fan full if heater 1 > 70C
        	M106 P6 S0 															; print cooling fan stop
        
        	;Define tool
        	M563 P3 S"Extruder" D6:7 H4 F6
            M567 P3 E1.0:1.0
            G10 P3 S0 R0
        
        	; Filament monitor
        	M591 D6 P7 C"3.io0.in" L7 R75:125 E22 S1
        	
        
        elif sensors.analog[9].lastReading >= 10  && sensors.analog[9].lastReading < 20
        	set global.bloc_3 = "Pellet"
        
        	; Heater 3
        	M308 S4 P"3.temp0" Y"pt1000" A"Heater 3" T100000 B4725 C7.06e-8  	; Set thermistor
        	M950 H4 C"3.out0" T4												; H4 heater
        	M143 H4 S400 														; Set temperature limit for heater 4 to 400C
        	M307 H4 R1.554 K0.205:0.000 D5.28 E1.35 S1.00 B0 V23.8				; PID setup
        	M570 H3 P300 T99999													; TEMPORAIRE !!!!!!!!!!!!!!!
        
        	; Fans
        	M950 F6 C"3.out5"               									; part cooling fan
        	M950 F7 C"3.out4"               									; heatsink fan
        	M106 P7 S1.0 H4 T70	           										; fan full if heater 1 > 70C
        	M106 P6 S0 															; print cooling fan stop
        
        	;Define tool
        	if move.extruders[4].current == 1000 
        		M906 E650:650:650:650:1400:650:1400:650 I10						; Set stepper current to 1A
        	else
        		M906 E650:650:650:650:650:650:1400:650 I10
        	M563 P3 S"Pellet" D6 H4 F6
            G10 P3 S0 R0
        	
        elif sensors.analog[9].lastReading >= 20 && sensors.analog[9].lastReading < 30
            set global.bloc_3 = "Incompatible"
        
        ;##################################################### IO ####################################################################################
        
        ;led strip 
        M950 E0 C"led" T1 Q3000000 U100
        M150 E0 B255 R0 U0 P100 S100
        
        ;Pebble Wiper
        M950 S21 C"2.io1.out"
        M280 P21 S50
        
        ;Capteurs ouverture de portes
        ;M950 J5 C"2.io1.in" 													;ouverture de porte
        ;M950 J6 C"2.io2.in"														;ouverture du couvercle
        M308 S25 P"2.io2.in" Y"linear-analog"
        
        ; Bloc 48V alim
        M950 P19 C"2.out5"														; Relais de contrôle des alimentations 48V
        M42 P19 S0
        
        ; TESTS COLINE
        M950 P30 C"3.io5.out"
        
        ; BME 280  armoire à matériaux
        M308 S10 P"spi.cs0" Y"bme280" A"Temperature" 
        ;M308 S11 P"S10.1" Y"bme-pressure" A"pressure[hPa]"
        M308 S12 P"S10.2" Y"bme-humidity" A"Humidity[%]"
        
        ; Filtre à air
        M950 P20 C"3.out2"
        M42 P20 S0
        
        ; Accelerometer Input Shaping
        ;M955 P0 C"spi.cs2+spi.cs3" I14											; Temporaire
        ;##################################################### Variables ##############################################################################
        
        global fan_chamber = false
        global pneumatic_debug = 0
        global iteration = 0
        global togglePneumatic = false
        global runDaemon = true
        global timeBed = 0
        global x_pos = 0
        global y_pos = 0
        global z_pos = 0
        global x_off = 0
        global y_off = 0
        global z_off = 0
        global z_plateau_ref = 0
        global outil_select = 99
        global seuils_definis = false
        global homeall = false
        global timer_filtre = 0
        global timer_filtre_incr = 0
        global pwm_fraise = 0
        global ip_addr = ""
        
        global tool_T0_posX = 0
        global tool_T0_posY = 0
        global tool_T1_posX = 0
        global tool_T1_posY = 0
        global tool_T2_posX = 0
        global tool_T2_posY = 0
        global tool_T3_posX = 0
        global tool_T3_posY = 0
        
        global tool_T0_posX_mes = 0
        global tool_T0_posY_mes = 0
        global tool_T1_posX_mes = 0
        global tool_T1_posY_mes = 0
        global tool_T2_posX_mes = 0
        global tool_T2_posY_mes = 0
        global tool_T3_posX_mes = 0
        global tool_T3_posY_mes = 0
        ;##################################################### Post Config ############################################################################
        ;M586 P1 S1 R80 C"*"
        M501
        M911 S21.0 R23.0 P"M913 X0 Y0 G91 M83 G1 Z3 E-5 F1000"
        ;##################################################### Affichage #############################################################################
        
        M291 S4 R"Configuration outils" P"Blocs presents" K{"Bloc 0 : "^{global.bloc_0},"Bloc 1 : "^{global.bloc_1},"Bloc 2 : "^{global.bloc_2},"Bloc 3 : "^{global.bloc_3}, " OK"}
        
        
        
        
        chrishammundefined 1 Reply Last reply Reply Quote 0
        • chrishammundefined
          chrishamm administrators @e4d
          last edited by chrishamm

          @e4d The panel of the temperature graph looks odd to me. Perhaps try to disable your ad-blocker (if any) and if that doesn't help, open the dev tools via F12 and check the JS Console for errors.

          Duet software engineer

          e4dundefined 1 Reply Last reply Reply Quote 0
          • e4dundefined
            e4d @chrishamm
            last edited by

            @chrishamm my adblocker is already disabled, here's the output of the dev console on 3 differents browser Chrome, Opera and Edge :

            index.ts:420 TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
                at window.Node.appendChild (vue-fragment.esm.js:1:4055)
                at window.Node.insertBefore (vue-fragment.esm.js:1:3770)
                at Object.insertBefore (vue.runtime.esm.js:6311:16)
                at updateChildren (vue.runtime.esm.js:6800:29)
                at patchVnode (vue.runtime.esm.js:6913:21)
                at updateChildren (vue.runtime.esm.js:6787:17)
                at patchVnode (vue.runtime.esm.js:6913:21)
                at VueComponent.patch [as __patch__] (vue.runtime.esm.js:7081:17)
                at v._update (vue.runtime.esm.js:3769:25)
                at VueComponent.ne (vue.runtime.esm.js:3875:16)
            
            chrishammundefined 1 Reply Last reply Reply Quote 0
            • chrishammundefined
              chrishamm administrators @e4d
              last edited by

              @e4d Okay, the new version 3.5.0-rc.3 should have a bug fix for this error message, although I don't think it's the reason why DWC stays in "Connecting". Can you try to upgrade your SBC using apt update/apt upgrade and check if that helps?

              Duet software engineer

              e4dundefined 1 Reply Last reply Reply Quote 0
              • e4dundefined
                e4d @chrishamm
                last edited by

                @chrishamm thanks for the release, the error message is fixed in the dev console on the browser.

                The connection issue was still there sadly. I identified that the issue is caused by the line

                M141 H5
                

                If I have it in the config.g file, impossible to connect and when I comment it I can connect on the board as usual. If I comment it on the config, power up and then write "M141 H5" in the console it goes on connection screen.

                Is it a known bug or something new ? I can't figure out how to have the control on the heated chamber without using M141 to declare it. Is there a workaround or do you plan a bug fix soon ?

                chrishammundefined 1 Reply Last reply Reply Quote 0
                • chrishammundefined
                  chrishamm administrators @e4d
                  last edited by

                  @e4d Is there any way you could provide a minimal config.g that lets you reproduce this problem? I just put M141 H5 in my config.g and after a restart my machine came up as expected.

                  Duet software engineer

                  e4dundefined 1 Reply Last reply Reply Quote 0
                  • e4dundefined
                    e4d @chrishamm
                    last edited by

                    @chrishamm

                    This config let us reproduce the problem :

                    ; Duet 3 Configuration File
                     
                    G21                                                                                                                                             ; Work in millimetres
                    G90                                                                                                                                             ; Send absolute coordinates...
                    M83                                                                                                                                             ; ...but relative extruder moves
                     
                    M669 K1                                                                                                                                         ; Set Core XY mode
                     
                     
                    ;Bed
                    M308 S0 P"0.temp0" Y"thermistor" A"Bed" T100000 B4725 C7.06e-8      ; configure sensor 0 as thermistor on pin temp0
                    M950 H0 C"0.out0" T0 Q10                                            ; create bed heater output on out0 and map it to sensor 0
                    M307 H0 R0.605 K0.237:0.000 D2.36 E1.35 S1.00 B0                         ; enable PID mode for the bed heater and set PWM limit
                    M140 H0                                                             ; map heated bed to heater 0
                    M143 H0 S215                                                        ; set temperature limit for heater 0 to 215C
                     
                    ;Chamber
                    M308 S5 P"1.temp0" Y"pt1000" A"Chamber" T100000 B4725 C7.06e-8          ; Set thermistor
                    M950 H5 C"1.out2" T5                                                                                            ; Chamber heater
                    M950 P17 C"1.out3"                                                                                                      ; Chamber heater fan
                    M307 H5 B0 S1.00                                                                                ; Bang bang tuning
                    M141 H5                                                                 ; Define heated chamber
                    M143 H5 S75                                                                                                             ; Set temperature limit for heater 5 to 70C
                    M570 H5 P999999 T50                                                 ; configure heater fault on H4
                    

                    To test this I did :

                    • Put this config with "M141 H5" commented
                    • Access the DWC in Chrome browser
                    • Execute "M141 H5" in the console
                    • Refresh the webpage
                    chrishammundefined 2 Replies Last reply Reply Quote 1
                    • chrishammundefined
                      chrishamm administrators @e4d
                      last edited by

                      @e4d Thanks! I could reproduce and fix it. The fix will be included in the next DWC version, so probably 3.5.0 stable.

                      Duet software engineer

                      e4dundefined 1 Reply Last reply Reply Quote 1
                      • e4dundefined
                        e4d @chrishamm
                        last edited by

                        @chrishamm thank you for your quick inputs on my issue. Do you have any timeline on the release of 3.5 stable ? I can't use an heated chamber in the meantime ?

                        1 Reply Last reply Reply Quote 0
                        • chrishammundefined
                          chrishamm administrators @e4d
                          last edited by

                          @e4d You can replace DWC in SBC mode by uploading DuetWebControl-SBC.zip from here on the Files -> System page. This build should fix the problem again (it was actually caused by the JS error you reported).

                          Duet software engineer

                          e4dundefined 1 Reply Last reply Reply Quote 0
                          • chrishammundefined chrishamm referenced this topic
                          • e4dundefined
                            e4d @chrishamm
                            last edited by

                            @chrishamm it works well on my machines, thank you again for your time on my issue

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post
                            Unless otherwise noted, all forum content is licensed under CC-BY-SA