Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gen2.1.4 (ex2.3) #20

Open
mateuszfcg opened this issue Sep 17, 2023 · 134 comments
Open

Gen2.1.4 (ex2.3) #20

mateuszfcg opened this issue Sep 17, 2023 · 134 comments

Comments

@mateuszfcg
Copy link

Hello. Has anyone run the disc version 2.3? At first I had a problem with uploading any batch, but I managed to do it for a while. now I have trouble starting it. when I connect the power supply, the engine only starts slightly and holds it in one position. I cannot establish communication with Arduino. I tried on different GD pins. please help. Does anyone have the file already configured for this disc? Regards

@RoboDurden RoboDurden changed the title version 2.3 Layout 2.3 Sep 17, 2023
@RoboDurden
Copy link
Owner

This is a bad translation engine, surely not Google ?

I guess it was me who did add the 2.3 layout so i might have such a board laying aorund somewhere here.
But no-one yet has begun with a defines-2_3.h file.
If you start tracing the 3 hall sensor and 6 mosfet pins, i will support you. If i find my 2.3 boards i might build just another test setup.
But you should do some work yourself first.

@DerPinguin77
Copy link

Hi im new here but i also have one of these Hoverboards.
I would love to help with finding tracing those hall sensor and mosfet pins. But im fairly inexperienced so i cant really help with programming. I have flashed one Hoverboard before but it had the more common single motherboards.
I also have some other questions:
Are there plans in integrating something like a PWM control and would it be possible to integrate in the version for this board?
Can u use both boards standalone by just flashing both boards with the Master version?

@RoboDurden
Copy link
Owner

If you have a new layout, please post some hi-res photos here.
I might be happy to finally program an pin-auto-detect firmware that creates a new defines_2-xy.h file.
No, i will not add further control methods beside the existing uart.
But i am currently working on an i2c control for our new simpleFOC firmware: Candas1/Split_Hoverboard_SimpleFOC#11
When this is ready, people might add new Pilot classes..

Yes, slave board can be flashed with the master firmware. But it needs the CHECK_BUTTON define to be disabled whenthe slave board ist dircetly powered and has no on button:

#define CHECK_BUTTON // disable = add '//' if you use a slave board as master

@DerPinguin77
Copy link

DerPinguin77 commented Sep 18, 2023

Im currently working on the pinout. Sadly the firmware woult be pretty useless to me without eiter ADC or PWM control. I dont know much about Github so i will post my results here when im done.

@RoboDurden
Copy link
Owner

ADC would not be a big problem.
If one of the two uart rx/tx pins can work as an anlaog input (like the long cable of the gen1 board), the reading the adc value and turn it into +-1000 will only take a few lines.

PWM would need some few timing calculations to translate the high/low times to a pwm ratio..

If your board is not the layout 2.3 that this issue is dedicated to, please create your own issue and attach high res photos there so i can assign a new layout number.
You can attach high-res fotos to this issue and i will

@DerPinguin77
Copy link

DerPinguin77 commented Sep 18, 2023

My board has the Layout 2.3. I used your original photo and drew in the connections I tested. Hope this is enough. If not please tell me what you need and i will try to find the connections. It would be cool if you could add the few lines you need for ADC control because I dont have the knowlege to do that.
Schaltplan

@RoboDurden
Copy link
Owner

Would be nice if you could uplad an aligned fornt/back image like 2.7 front-back
Then some led pins etc can be traced on the photo.

@mateuszfcg
Copy link
Author

mateuszfcg commented Sep 18, 2023

#ifdef SLAVE	// this layout has buzzer on the slave board !
	#define BUZZER
#endif

#define TODO_PORT GPIOA				// this should be a pin that does no harm if input or output
#define TODO_PIN	GPIO_PIN_15	// B15 is not accessibla on the smaller QFN32 32 pin MCU version


#define DEBUG_LED_PIN 	GPIO_PIN_1	// lerwinDE: blue led panel
#define DEBUG_LED_PORT 	GPIOF				// lerwinDE: blue led panel


// LED defines
#define LED_GREEN 			TODO_PIN	// lerwinDE: GPIO_PIN_14 - in conflict with flash pins DIO and CLK !!!
#define LED_GREEN_PORT 	TODO_PORT	// lerwinDE: GPIOA
#define LED_ORANGE 			TODO_PIN	// TODO
#define LED_ORANGE_PORT	TODO_PORT	// TODO
#define LED_RED 				TODO_PIN		// lerwinDE: GPIO_PIN_13 - in conflict with flash pins DIO and CLK !!!
#define LED_RED_PORT 		TODO_PORT		// lerwinDE: GPIOA

#define UPPER_LED_PIN 	TODO_PIN	// TODO
#define UPPER_LED_PORT 	TODO_PORT	// TODO
#define LOWER_LED_PIN 	TODO_PIN	// TODO
#define LOWER_LED_PORT 	TODO_PORT	// TODO




// Mosfet output
// seems to be an ordinary LED output ?
// led.c:91	gpio_bit_write(MOSFET_OUT_PORT, MOSFET_OUT_PIN, counter_Blue >= setValue_Blue ? RESET : SET); 
#define MOSFET_OUT_PIN TODO_PIN		// TODO
#define MOSFET_OUT_PORT TODO_PORT	// TODO

// Brushless Control DC (BLDC) defines
#define TIMER_BLDC_PULLUP	GPIO_PUPD_PULLUP	// robo, based on Herleybob:defines.h
// Channel G
#define RCU_TIMER_BLDC RCU_TIMER0
#define TIMER_BLDC TIMER0
#define TIMER_BLDC_CHANNEL_G TIMER_CH_2
#define TIMER_BLDC_GH_PIN GPIO_PIN_8		// GPIO_PIN_8	robo, based on Herleybob:defines.h
#define TIMER_BLDC_GH_PORT GPIOA				// GPIOA robo, based on Herleybob:defines.h
#define TIMER_BLDC_GL_PIN GPIO_PIN_13		// robo, based on Herleybob:defines.h
#define TIMER_BLDC_GL_PORT GPIOB				// robo, based on Herleybob:defines.h
// Channel B
#define TIMER_BLDC_CHANNEL_B TIMER_CH_1
#define TIMER_BLDC_BH_PIN GPIO_PIN_9		// robo, based on Herleybob:defines.h
#define TIMER_BLDC_BH_PORT GPIOA				// robo, based on Herleybob:defines.h
#define TIMER_BLDC_BL_PIN GPIO_PIN_14		// robo, based on Herleybob:defines.h
#define TIMER_BLDC_BL_PORT GPIOB				// robo, based on Herleybob:defines.h
// Channel Y
#define TIMER_BLDC_CHANNEL_Y TIMER_CH_0
#define TIMER_BLDC_YH_PIN GPIO_PIN_10		// robo, based on Herleybob:defines.h
#define TIMER_BLDC_YH_PORT GPIOA				// robo, based on Herleybob:defines.h
#define TIMER_BLDC_YL_PIN GPIO_PIN_15		// robo, based on Herleybob:defines.h
#define TIMER_BLDC_YL_PORT GPIOB				// robo, based on Herleybob:defines.h

// Timer BLDC short circuit emergency shutoff define
// Is initialized here but never used somewhere else in code.
// setup.c:176	gpio_mode_set(TIMER_BLDC_EMERGENCY_SHUTDOWN_PORT , GPIO_MODE_AF, GPIO_PUPD_NONE, TIMER_BLDC_EMERGENCY_SHUTDOWN_PIN);  
#define TIMER_BLDC_EMERGENCY_SHUTDOWN_PIN TODO_PIN	// TODO
#define TIMER_BLDC_EMERGENCY_SHUTDOWN_PORT TODO_PORT		// TODO

// Hall sensor defines
#define HALL_A_PIN GPIO_PIN_1	// robo, based on Herleybob:defines.h A = U ?
#define HALL_A_PORT GPIOA				// robo, based on Herleybob:defines.h A =  U ?
#define HALL_B_PIN GPIO_PIN_2	// robo, based on Herleybob:defines.h B = V ?
#define HALL_B_PORT GPIOA				// robo, based on Herleybob:defines.h B = V ?
#define HALL_C_PIN GPIO_PIN_0		// robo, based on Herleybob:defines.h C = W ?
#define HALL_C_PORT GPIOA				// robo, based on Herleybob:defines.h C = W ?

// Usart master slave defines
#define USART_MASTERSLAVE USART1	// robo no second uart port yet.
#ifdef USART_MASTERSLAVE
	#define USART_MASTERSLAVE_TX_PIN GPIO_PIN_6		// lerwinDE :-)
	#define USART_MASTERSLAVE_TX_PORT GPIOB				// lerwinDE :-)
	#define USART_MASTERSLAVE_RX_PIN GPIO_PIN_7	// lerwinDE :-)
	#define USART_MASTERSLAVE_RX_PORT  GPIOB				// lerwinDE :-)
#endif

// ADC defines
//#define VBATT_PIN	GPIO_PIN_0				// robo, no gpio_mode_set() inHerleybob:setup.c
#define VBATT_PORT GPIOA						// robo, no gpio_mode_set() inHerleybob:setup.c
#define VBATT_CHANNEL ADC_CHANNEL_17	// robo, based on Herleybob:setup.c: adc_regular_channel_config(2,ADC_CHANNEL_17,ADC_SAMPLETIME_13POINT5);
//#define CURRENT_DC_PIN	GPIO_PIN_1	// robo, no gpio_mode_set() inHerleybob:setup.c
#define CURRENT_DC_PORT GPIOA				// robo, no gpio_mode_set() inHerleybob:setup.c
#define CURRENT_DC_CHANNEL ADC_CHANNEL_2	// robo, maybe adc_buf_t:adc is potentiometer input

// Self hold defines
// important pin keeps the mosfet open after the on/off button got pushed !
// main.c:306: gpio_bit_write(SELF_HOLD_PORT, SELF_HOLD_PIN, SET); 
// and turns off power on Shutdown:
// main.c:513:	 gpio_bit_write(SELF_HOLD_PORT, SELF_HOLD_PIN, RESET); 
#define SELF_HOLD_PIN GPIO_PIN_13		// lerwinDE: master: A11 is used a hold bin, slave: A11 is buzzer pini
#define SELF_HOLD_PORT GPIOA				// TODO

// Button defines
// on/off (POW) push-button. So also a connection (i guess with some smd resistor in between) to a MCU pin.
// main.c:457: if (gpio_input_bit_get(BUTTON_PORT, BUTTON_PIN)) 
#define BUTTON_PIN GPIO_PIN_2			// robo, based on Herleybob:defines.h
#define BUTTON_PORT GPIOB						// robo, based on Herleybob:defines.h

// Usart steer defines
#define USART_STEER_COM USART0					
#define USART_STEER_RCU RCU_USART0			
#define USART_STEER_AF	GPIO_AF_0				
#define USART_STEER_COM_TX_PIN GPIO_PIN_11		// lerwinDE :-) 11
#define USART_STEER_COM_TX_PORT GPIOB				// lerwinDE :-)
#define USART_STEER_COM_RX_PIN GPIO_PIN_10	// lerwinDE :-) 10
#define USART_STEER_COM_RX_PORT GPIOB				// lerwinDE :-)

//#ifdef BUZZER
	// Buzzer defines
	#define BUZZER_PIN GPIO_PIN_11		// robo, based on Herleybob:defines.h
	#define BUZZER_PORT GPIOA				// robo, based on Herleybob:defines.h
//#endif

#ifdef MASTER

	// Charge state defines
	// This seems to be a digital input that hast to be high in order to enable the motors. 
	// main.c:381: chargeStateLowActive = gpio_input_bit_get(CHARGE_STATE_PORT, CHARGE_STATE_PIN);
	// If not found it should be okay to simply comment this line because chargeStateLowActive in initialised as set = true
	#define CHARGE_STATE_PIN GPIO_PIN_0		// TODO
	#define CHARGE_STATE_PORT GPIOF				// TODO
#endif

// Debug pin defines - seems to be never used in code.
#define DEBUG_PIN TODO_PIN	// TODO
#define DEBUG_PORT TODO_PORT			// TODO`

Above is the code of my configuration but not everything is ok
-UART does not work
-Motor does not run stably (sound like skipping steps in a stepper motor but it is rotating) mosfets are heating up
-Starting the board requires a jumper all the time
-buzzer works as soon as I change to SLAVE in config

any ideas ?

Sorry for the translation but I have a hard time with languages :)

@RoboDurden
Copy link
Owner

Always use a CC constant current power supply with max 2A when testing new boards !!!!!!!!!

@mateuszfcg
Copy link
Author

I powered it initially via inverters to limit the current.

@DerPinguin77
Copy link

These are the best images i could get in the dark. I acidentally photographed the Slave board and i forgot to remove the sticker on the back. If its not good enoungh i can try again tomorrow
FrontBack

@RoboDurden
Copy link
Owner

Thank you. I mirrored the backside vertically and added it to the 2.3 folder.
The 5 led pins should be no problem:
5 transistors for 5 leds

21:15 here in Germany, i go to bed.

@RoboDurden
Copy link
Owner

@DerPinguin77 i do not see a seconde uart header on this layout :-/
The primary uart header normally is needed to connect master with slave.
Without at least one additional input pin for speed, you would need an additional Arduino or Esp anyway to calculate speedL and speedR and send them via the only UART to the two boards.

In the bottom left i see a 4 pin header with GND | DATA | 5V. But on the photo i see that the two DATA pins are connected.
So at best one input pin.

The 4 pin header to the top right i guess is the charging connector ?
The 2 pin header to the right is the on/off button ? With the slave, this header would not have any function as it is powered directly over the uart cable ? Then the slave board might have that DATA pin and the BUTTON pin to receive speed and steer data.

I stick to my understanding that adding a cheap ESP S2 Mini with bluetooth and wlan is always the better choice.

@RoboDurden
Copy link
Owner

@mateuszfcg i have added your defines_2-3.h to my repo and updated the defines.h and config.h.
If you want to make changes to the code (main.c , setup.c , bldc.c , etc.), please fork this repo by clicking on
grafik
Then you can make change to your own copy of this repo and start a "pull request" so i can incooperate your changes with a single click :-)

@DerPinguin77 if you have a constant current power supply it would be great if you start testing the new defines_2-3.h

I will check the defines later this day if they confirm with your drawing.

P.S. the two photo sensors (light barriers) on the backside could be used as digital inputs. The last board i tested allowed one input to be used as analog input.

@RoboDurden
Copy link
Owner

okay i updated https://github.com/RoboDurden/Hoverboard-Firmware-Hack-Gen2.x/blob/main/HoverBoardGigaDevice/Inc/defines_2-3.h

Am not sure if the ordering is right:

// Hall sensor defines
// mateuszfcg tested with PA1,PA2,PA0 
#define HALL_A_PIN	GPIO_PIN_1
#define HALL_A_PORT	GPIOA
#define HALL_B_PIN	GPIO_PIN_2
#define HALL_B_PORT	GPIOA
#define HALL_C_PIN	GPIO_PIN_0
#define HALL_C_PORT	GPIOA

I added the led pins by looking on the photo:

// LED defines, colors probably mismatch !
#define LED_GREEN 			GPIO_PIN_15
#define LED_GREEN_PORT 	GPIOA
#define LED_ORANGE 			GPIO_PIN_14
#define LED_ORANGE_PORT	GPIOA
#define LED_RED 				GPIO_PIN_3
#define LED_RED_PORT 		GPIOB

#define UPPER_LED_PIN 	GPIO_PIN_4
#define UPPER_LED_PORT 	GPIOB
#define LOWER_LED_PIN 	GPIO_PIN_5
#define LOWER_LED_PORT 	GPIOB

#define DEBUG_LED_PIN 	LED_RED
#define DEBUG_LED_PORT 	LED_RED_PORT

I disabled both uart ports.

//#define USART_MASTERSLAVE USART1	// robo no second uart port yet.
//#define USART_STEER_COM USART0					

Please someone check the rx tx pins of the white uart header below the GD32 MCU :-)

@DerPinguin77
Copy link

DerPinguin77 commented Sep 19, 2023

Hi, came home from work just now. I think it would not be a problem if each of those boards only had one free input pin. It isnt as nice but you could just use the one pin of each board to control the motor connected to it. I can understand that for robotic projects the esp uart thing is much more practical, but I would prefer to use the board standalone without any extra stuff, cause I just need basic speed control.
I can start testing later this day but it could take a while until i figure out how to flash and compile all of this. Do i need the esp for testing or is there some kind of test mode?
I will continue to test the header you have asked for and i will also test the pins od the infrared gates.
Also i have another question. Will there be a way to calibrate the end points of the adc? On the other firmware i have used, you could press the powerbutton for a long time and you would enter calibration mode. There you could move the pot to the max and min positions.
I am also from Germany btw. :)

@RoboDurden
Copy link
Owner

This nice guy just today added rc remote control which i will implement tomorrow: #24

Then there will already be two different control methods.
So adding adc now looks appealing to me. Adding calibration would just mean some 10 lines of code..

Indeed you are correct, if we only have one input pin per board, the slave could transmit the steer value to the master, the master calculates the speedL and speedR and send the speedR back to the slave :-)

Be sure to use a 2A cc power supply (or a dc dc step down or up converter with cc).

@DerPinguin77
Copy link

DerPinguin77 commented Sep 19, 2023

Hi i probed all the other mentioned pins now. Here is the updated picture:

Schaltplan

Also the steering feature is not really impotant to me. I just need to be able to control the different motors speeds seperately, so they dont even have to be connected via uart.
The ELRS feature is definetly very interesting.
For compiling i need this right?
https://www.keil.com/demo/eval/arm.htm#/DOWNLOAD
I am relatively new to all this compiling stuff so i dont really know what to do to get the bin file i can flash

@RoboDurden
Copy link
Owner

yes i think that is the correct download.
You may also need st-link-utility to unlock the MCU.
It looks like the red DATA pin is either pulled to 3.3V or GND. Then it is not that useful for adc
Any idea what the yellow pin you added is for ? Might be analog read of battery voltage.
To later also make use of the coming SimpleFOC firmware, you also need the two adc outputs of this dual op-amp:

grafik

@DerPinguin77
Copy link

DerPinguin77 commented Sep 19, 2023

The yellow wire is the pin of the second Infrared thingy. I think it would be possible to remove the resistor that pulls the red pin high.
I will test the pins of the opamp later/tomorrow
Right now i am trying to get the firmware running on one of my boards. Is it possible to directly flash the firmware with the keil software?

@RoboDurden
Copy link
Owner

yes, but i am not sure if Keil will be able to unlock the MCU.
Watch my youtube tutorial for that firmware.
If you only want to control one motor with a potentiometer, one of the uart pins might do.
But please confirm the

	#define USART_MASTERSLAVE_TX_PIN	GPIO_PIN_6
	#define USART_MASTERSLAVE_TX_PORT	GPIOB
	#define USART_MASTERSLAVE_RX_PIN	GPIO_PIN_7
	#define USART_MASTERSLAVE_RX_PORT	GPIOB

Then i will look in the MCU user manual to see if one of these pins can also do adc.

@mateuszfcg
Copy link
Author

mateuszfcg commented Sep 19, 2023

@DerPinguin77 1. unlock the GD32 via ST-LINK Utility (this will remove the preloaded firmware)
2. Start keil and upload the firmware directly from keil.
If you don't want to load (e.g. "no target conection" message pops up) you have to short NRST pin to GND and after approx. 1sec after pressing DOWNLOAD let go.
The second option instead of manually connecting to GND is to add a transistor to ST-LINK to the RST pin.
Resistor R72 closer to the white connector.
Good luck

And getting back to the topic of the UART the white connector is:
TX=PB6
RX=PB7

So far I have established a connection to the Arduino with these pins.

I still have a problem with VBat and IAMP. No matter what voltage I put on the power supply it is still Iamp=0.42, IVolt 36.0 in the serial monitor.

Another issue is the hold up when a button is pressed. The button is definitely on PB2

@RoboDurden
image
are not ADC pins

@RoboDurden
Copy link
Owner

RoboDurden commented Sep 19, 2023

Thanks, so no adc on these pins.

So you use

	#define USART_STEER_COM_TX_PIN	GPIO_PIN_6
	#define USART_STEER_COM_TX_PORT	GPIOB
	#define USART_STEER_COM_RX_PIN	GPIO_PIN_7
	#define USART_STEER_COM_RX_PORT	GPIOB

and
#define USART_STEER_RCU RCU_USART0
i guess.

@RoboDurden
Copy link
Owner

0.42 is because of bldc.c :

// Calculate current DC
	#ifdef CURRENT_DC_PIN
		currentDC = ABS((adc_buffer.current_dc - offsetdc) * MOTOR_AMP_CONV_DC_AMP);
	#else
		currentDC = 0.42; 	// testing with no CURRENT_DC_PIN yet
	#endif
	

@RoboDurden
Copy link
Owner

36V also set in bldc.c

	// Calculate battery voltage every 100 cycles
	#ifdef VBATT_PIN
		if (buzzerTimer % 100 == 0)
			batteryVoltage = batteryVoltage * 0.999 + ((float)adc_buffer.v_batt * ADC_BATTERY_VOLT) * 0.001;
	#else
		batteryVoltage = BAT_CELLS * 3.6;		// testing with no VBATT_PIN yet
	#endif

@RoboDurden
Copy link
Owner

If you indeed have serial connection between arduino and hoverboard please post your new values of:

// Usart steer defines
//#define USART_STEER_COM USART0					
#ifdef USART_STEER_COM
	#define USART_STEER_RCU RCU_USART0			
	#define USART_STEER_AF	GPIO_AF_0				
	#define USART_STEER_COM_TX_PIN	GPIO_PIN_11
	#define USART_STEER_COM_TX_PORT	GPIOB
	#define USART_STEER_COM_RX_PIN	GPIO_PIN_10
	#define USART_STEER_COM_RX_PORT	GPIOB
#endif

@mateuszfcg
Copy link
Author

mateuszfcg commented Sep 19, 2023

defines_2-3.h

// Usart steer defines
#define USART_STEER_COM USART0					
#ifdef USART_STEER_COM
	#define USART_STEER_RCU RCU_USART0			
	#define USART_STEER_AF	GPIO_AF_0				
	#define USART_STEER_COM_TX_PIN	GPIO_PIN_6//11
	#define USART_STEER_COM_TX_PORT	GPIOB
	#define USART_STEER_COM_RX_PIN	GPIO_PIN_7//10
	#define USART_STEER_COM_RX_PORT	GPIOB
#endif

commsStering.c

#ifdef MASTER
#define USART_STEER_TX_BYTES 2   // Transmit byte count including start '/' and stop character '\n'
#define USART_STEER_RX_BYTES 7   // Receive byte count including start '/' and stop character '\n'
...

However, I would like to know the current and voltage reading of the current

@RoboDurden
Copy link
Owner

RoboDurden commented Sep 19, 2023

Then you need to find the correct adc pins:

// ADC defines
//#define VBATT_PIN	GPIO_PIN_0
#define VBATT_PORT GPIOA			
#define VBATT_CHANNEL ADC_CHANNEL_17
//#define CURRENT_DC_PIN	GPIO_PIN_1	
#define CURRENT_DC_PORT GPIOA		
#define CURRENT_DC_CHANNEL ADC_CHANNEL_2	

@RoboDurden
Copy link
Owner

Why did you uncomment

//#define USART_STEER_TX_BYTES 2 // Transmit byte count including start '/' and stop character '\n'

it is no longer used in my code.

@mateuszfcg
Copy link
Author

I will upload my code in the evening.

@DerPinguin77
Copy link

Im sorry i am just dumb. I forgot to build the software after changing the version, so I always flashe the software for the wrong board. Now it is working. In my case the one of the leds is not lighting up and it younds like its skippikg steps so maybe its a problem with one the hall sensors either in software or on the hardware. I will try another motor and let you know.

@RoboDurden
Copy link
Owner

RoboDurden commented Sep 23, 2023

Check the hall sensors with a multimeter.
You need to test the hall pins on the three little smd resistors you have trace.
But the red probe of the multimeter should be thin enoug the go into the female header:
grafik

They need 5V to send their state.

I have never come across a motor being broken.

@DerPinguin77
Copy link

DerPinguin77 commented Sep 23, 2023

Yeah i tested it and the motor is fine. But I think may be something messed up in the code with the hall sensors.

@RoboDurden
Copy link
Owner

@DerPinguin77 you really should start using your brain.

In my case the one of the leds is not lighting

Which color ??

And by now you should be able to turn this led on in main() using DEBUG_LedSet(SET)

And when you are sure the led pin is correct,
then there must be something wrong with the hall pin that should turn this led on.

@DerPinguin77
Copy link

@RoboDurden Im just trying my best. I have never worked with this Software nor programmed anything in C. I thy my best to help with stuff that I can do like for exampe measuring stuff, or suggestions that i can give (maybe theire dumb or wrong but i try my best).
Red and Green LEDs are lighting up when i spin the motor yellow is not working.
I am using the software right from your git without any changes.

@mateuszfcg
Copy link
Author

mateuszfcg commented Sep 23, 2023

#ifdef test_hall 
gpio_bit_write(LED_GREEN_PORT,LED_GREEN,hall_a);
gpio_bit_write(LED_ORANGE_PORT,LED_ORANGE,hall_b);
gpio_bit_write(LED_RED_PORT,LED_RED,hall_c);	
	
#endif

Check if you have it running. In my case the LED pointing was not working so I added simple code.
In config.h you must have
#define test_hall
And check the LED pins carefully to make sure they are ok.

Another issue maybe something is defective with the control of the orange LED. Try swapping pins, e.g. red and orange, to see if it lights up

@DerPinguin77
Copy link

Hi i think i found the problem. The hall or the motor pins seem to be swapped. In the Video you can see the "wrongly" connectad motor phases to make it work.

Motor_test_2.mp4

@DerPinguin77
Copy link

Here is another photo of the combination that worked.
WhatsApp Bild 2023-09-28 um 17 27 22

@DerPinguin77
Copy link

DerPinguin77 commented Oct 1, 2023

Hi,
@RoboDurden Today i spent some time finding the right pins and changing them in the code. I no got the motor running smoothly. I downloaded the zip and exept for the version i only changed some wrong pins in defines_2.3.h.
Stuff i changed:

  • Changed the Hall Pin Order => Motor runs smoothy now
  • Changed the Led Pins => Orange LED works now, Led colors are like they are named in the Code
  • changed the Power latch pin=> Powerlatch works now and you dont need tho hold the button to keep it on.

For the last one I just copied the code from @mateuszfcg
Would be cool if someone could get the Voltage and Current sense pins working as I am not skilled enough to do so.

I also got the UART control running with the ESP and I was able to control the motor with a poti.

This is my defines 2.3.h:

#ifdef MASTER	// this layout has buzzer on the master board !
	#define BUZZER
#endif

//#define TODO_PORT GPIOA				// this should be a pin that does no harm if input or output
//#define TODO_PIN	GPIO_PIN_15	// B15 is not accessibla on the smaller QFN32 32 pin MCU version
#define TODO_PORT 	GPIOF		// this should be a pin that does no harm if input or output
#define TODO_PIN	GPIO_PIN_4	// PF4 is only accessible on the largest GD32F130Rx LQFP64 pinouts mcu


// LED defines, colors probably mismatch !
#define LED_GREEN 			GPIO_PIN_3
#define LED_GREEN_PORT 	GPIOB
#define LED_ORANGE 			GPIO_PIN_4
#define LED_ORANGE_PORT	GPIOB
#define LED_RED 				GPIO_PIN_15
#define LED_RED_PORT 		GPIOA

#define UPPER_LED_PIN 	GPIO_PIN_4
#define UPPER_LED_PORT 	GPIOB
#define LOWER_LED_PIN 	GPIO_PIN_5
#define LOWER_LED_PORT 	GPIOB

#define DEBUG_LED_PIN 	LED_RED
#define DEBUG_LED_PORT 	LED_RED_PORT


// Mosfet output
// seems to be an ordinary LED output ?
// led.c:91	gpio_bit_write(MOSFET_OUT_PORT, MOSFET_OUT_PIN, counter_Blue >= setValue_Blue ? RESET : SET); 
#define MOSFET_OUT_PIN TODO_PIN		// TODO
#define MOSFET_OUT_PORT TODO_PORT	// TODO

// Brushless Control DC (BLDC) defines
#define TIMER_BLDC_PULLUP	GPIO_PUPD_PULLUP	// robo, based on Herleybob:defines.h
// Channel G
#define RCU_TIMER_BLDC RCU_TIMER0
#define TIMER_BLDC TIMER0
#define TIMER_BLDC_CHANNEL_G TIMER_CH_2
#define TIMER_BLDC_GH_PIN		GPIO_PIN_8		// channels G=green and Y=yellow swopped compared to 2.0
#define TIMER_BLDC_GH_PORT	GPIOA
#define TIMER_BLDC_GL_PIN		GPIO_PIN_13
#define TIMER_BLDC_GL_PORT	GPIOB
// Channel B
#define TIMER_BLDC_CHANNEL_B TIMER_CH_1
#define TIMER_BLDC_BH_PIN		GPIO_PIN_9
#define TIMER_BLDC_BH_PORT	GPIOA
#define TIMER_BLDC_BL_PIN		GPIO_PIN_14
#define TIMER_BLDC_BL_PORT	GPIOB
// Channel Y
#define TIMER_BLDC_CHANNEL_Y TIMER_CH_0
#define TIMER_BLDC_YH_PIN		GPIO_PIN_10
#define TIMER_BLDC_YH_PORT	GPIOA
#define TIMER_BLDC_YL_PIN		GPIO_PIN_15
#define TIMER_BLDC_YL_PORT	GPIOB

// Timer BLDC short circuit emergency shutoff define
// Is initialized here but never used somewhere else in code.
// setup.c:176	gpio_mode_set(TIMER_BLDC_EMERGENCY_SHUTDOWN_PORT , GPIO_MODE_AF, GPIO_PUPD_NONE, TIMER_BLDC_EMERGENCY_SHUTDOWN_PIN);  
#define TIMER_BLDC_EMERGENCY_SHUTDOWN_PIN		TODO_PIN	// TODO
#define TIMER_BLDC_EMERGENCY_SHUTDOWN_PORT	TODO_PORT		// TODO

// Hall sensor defines
// Der_Pinguin tested with PA0,PA1,PA2 and it works fine now 
#define HALL_A_PIN	GPIO_PIN_0
#define HALL_A_PORT	GPIOA
#define HALL_B_PIN	GPIO_PIN_1
#define HALL_B_PORT	GPIOA
#define HALL_C_PIN	GPIO_PIN_2
#define HALL_C_PORT	GPIOA

// Usart master slave defines
//#define USART_MASTERSLAVE USART1	// robo no second uart port for this board
#ifdef USART_MASTERSLAVE
	#define USART_MASTERSLAVE_TX_PIN	TODO_PIN
	#define USART_MASTERSLAVE_TX_PORT	TODO_PORT
	#define USART_MASTERSLAVE_RX_PIN	TODO_PIN
	#define USART_MASTERSLAVE_RX_PORT	TODO_PORT
#endif

// Usart steer defines
#define USART_STEER_COM USART0					
#ifdef USART_STEER_COM
	#define USART_STEER_RCU RCU_USART0			
	#define USART_STEER_AF	GPIO_AF_0				
	#define USART_STEER_COM_TX_PIN	GPIO_PIN_6
	#define USART_STEER_COM_TX_PORT	GPIOB
	#define USART_STEER_COM_RX_PIN	GPIO_PIN_7
	#define USART_STEER_COM_RX_PORT	GPIOB
#endif

// ADC defines
//#define VBATT_PIN	GPIO_PIN_0		// uncomment this line when you have verified the pin/port
#define VBATT_PORT GPIOA			
#define VBATT_CHANNEL ADC_CHANNEL_17
//#define CURRENT_DC_PIN	GPIO_PIN_1	// uncomment this line when you have verified the pin/port
#define CURRENT_DC_PORT GPIOA
#define CURRENT_DC_CHANNEL ADC_CHANNEL_2

// Self hold defines
// important pin keeps the mosfet open after the on/off button got pushed !
// main.c:306: gpio_bit_write(SELF_HOLD_PORT, SELF_HOLD_PIN, SET); 
// and turns off power on Shutdown:
// main.c:513:	 gpio_bit_write(SELF_HOLD_PORT, SELF_HOLD_PIN, RESET); 
#define SELF_HOLD_PIN		GPIO_PIN_3		// lerwinDE: master: A11 is used a hold bin, slave: A11 is buzzer pini
#define SELF_HOLD_PORT	GPIOA				// TODO

// Button defines
// on/off (POW) push-button. So also a connection (i guess with some smd resistor in between) to a MCU pin.
// main.c:457: if (gpio_input_bit_get(BUTTON_PORT, BUTTON_PIN)) 
#define BUTTON_PIN	GPIO_PIN_4			// robo, based on Herleybob:defines.h
#define BUTTON_PORT	GPIOA						// robo, based on Herleybob:defines.h

#ifdef BUZZER
	// Buzzer defines
	#define BUZZER_PIN	GPIO_PIN_11		// robo, based on Herleybob:defines.h
	#define BUZZER_PORT	GPIOA				// robo, based on Herleybob:defines.h
#endif

#ifdef MASTER

	// Charge state defines
	// This seems to be a digital input that hast to be high in order to enable the motors. 
	// main.c:381: chargeStateLowActive = gpio_input_bit_get(CHARGE_STATE_PORT, CHARGE_STATE_PIN);
	// If not found it should be okay to simply comment this line because chargeStateLowActive in initialised as set = true
	#define CHARGE_STATE_PIN GPIO_PIN_0		// TODO
	#define CHARGE_STATE_PORT GPIOF				// TODO
#endif

// photo diodes / light barriers on the backside
#define PHOTO_L_PIN		GPIO_PIN_15
#define PHOTO_L_PORT	GPIOC
#define PHOTO_R_PIN		GPIO_PIN_14
#define PHOTO_R_PORT	GPIOC



// Debug pin defines - seems to be never used in code.
#define DEBUG_PIN TODO_PIN	// TODO
#define DEBUG_PORT TODO_PORT			// TODO`

@RoboDurden
Copy link
Owner

RoboDurden commented Oct 1, 2023

Great you succeeded with the motor pins, led pins, esp32 communication and also adding a potentiometer to the ESP32 :-)
Possible adc pins are

PA0	6	 ADC_IN0
PA1	11	 ADC_IN1
PA2	12	 ADC_IN2
PA3	13	 ADC_IN3
PA4	14	 ADC_IN4
PA5	15	 ADC_IN5
PA6	16	 ADC_IN6
PA7	17	 ADC_IN7
PB0	18	 ADC_IN8
PB1	19	 ADC_IN9

of which you have traced 7:

PA3	13	 ADC_IN3
PA4	14	 ADC_IN4
PA5	15	 ADC_IN5
PA6	16	 ADC_IN6
PA7	17	 ADC_IN7
PB0	18	 ADC_IN8
PB1	19	 ADC_IN9

PA3 and PA4 are already taken for BUTTON_PIN and HOLD_PIN

grafik

That leaves 5 pins to test wise assign to

#define VBATT_PIN	GPIO_PIN_X
#define VBATT_PORT GPIOY
#define VBATT_CHANNEL ADC_INZ

and read the log data from the ESP32 while changing the voltage of the power supply.

I guess that PB0 and PB1 will be the mosfet lowside gate currents.
PA7 and PA6 also come from a dual opamp chip so maybe the third lowside gate current (which is not really needed) and the overal currentDC.

So i would start with PA5 to be the battery voltage:

#define VBATT_PIN	GPIO_PIN_5
#define VBATT_PORT GPIOA
#define VBATT_CHANNEL ADC_IN5

@DerPinguin77
Copy link

DerPinguin77 commented Oct 1, 2023

I have already tried those pins but i only changed the VBATT_CHANNEL ADC_CHANNEL. I was afraid to break somethin because of the uncommented comment. So is it safe to uncomment this line and try all the pins out?
With only the Vbat_Channel nothing happened with any ot the pins.

//#define VBATT_PIN GPIO_PIN_0 // uncomment this line when you have verified the pin/port
#define VBATT_PORT GPIOA
#define VBATT_CHANNEL ADC_CHANNEL_17

@RoboDurden
Copy link
Owner

i have updated my pervious comment !

if you do not uncomment the VBATT_PIN definition, no battery voltage will be calculated in bldc.c :

	#ifdef VBATT_PIN
		if (buzzerTimer % 100 == 0)
			batteryVoltage = batteryVoltage * 0.999 + ((float)adc_buffer.v_batt * ADC_BATTERY_VOLT) * 0.001;
	#else
		batteryVoltage = BAT_CELLS * 3.6;		// testing with no VBATT_PIN yet
	#endif

@DerPinguin77
Copy link

DerPinguin77 commented Oct 1, 2023

So i tested all of the 7 traced pins. The voltage pin is definetly right. I tested it with different voltages and it was only about 1V off. Maybe it need a little calibration.
With the current sense pin i am not quite shure. The numbers seem right but one decimal to the left. They fluctuate quite a bit but it seems right.
All of the other pins just gave random values of about -200 so i dont think it has anything to do with the current.
These are the final pins i came up with:

// ADC defines
#define VBATT_PIN GPIO_PIN_5 // uncomment this line when you have verified the pin/port
#define VBATT_PORT GPIOA
#define VBATT_CHANNEL ADC_CHANNEL_5
#define CURRENT_DC_PIN GPIO_PIN_6 // uncomment this line when you have verified the pin/port
#define CURRENT_DC_PORT GPIOA
#define CURRENT_DC_CHANNEL ADC_CHANNEL_6

I also have another question. What is the max value you can send over uart for the maximum speed? 1024 or something different. Also how fast is the motor supposed to be at max speed?

I also made a Video of the Serial Monitor

WhatsApp.Video.2023-10-01.um.20.58.22.mp4

@RoboDurden
Copy link
Owner

log data looks good to me.
The lowside mosfet currents will be AC sine curves. Not needed for this firmware.

speed can go from -1000 to +1000
accelleration should be nearly instantly. Those motors are quite powerful.

@RoboDurden
Copy link
Owner

If you do not measure 5V on the DATA pin or the two PHOTO pins, you could try to replace

	#define USART_STEER_COM_RX_PIN	GPIO_PIN_7
	#define USART_STEER_COM_RX_PORT	GPIOB

with one of these three. And see if the ESP32 is still able to control the speed. But the ESP32 should not really be connected to a pin that is pulled to +5V by the hoverboard controller !

When you succeed with hte RX pin you could try the remaining two pins for

	#define USART_STEER_COM_TX_PIN	GPIO_PIN_6
	#define USART_STEER_COM_TX_PORT	GPIOB

and see if the ESP32 is still receiving log data.

The uart header you currently use is normally meant for the master-slave communication between the two split boards.

I just noticed, that the ESP32 S2 only seems to have two hardware serial, the first normally used for log output.
With the original ESP32 you have three hardware serials and could control each split board via hardware uart.
Of course there is still SoftwareSerial for the ESP32 S2..

The PHOTO pins might need an unsoldering of the photo light barriers. But maybe the pins will already work for rx or tx without unsoldering them.

@RoboDurden
Copy link
Owner

Yes i have a 2.3 layout and if you two continue here, i will join you with another test setup of mine:
gen 2 3 test setup

@DerPinguin77
Copy link

Sorry for my late reply. I didn't have much time last week and I dont know how it will be next week. If I find some time i will test the PHOTO pins and let you know. I will try to help as much as I can.

@mateuszfcg
Copy link
Author

mateuszfcg commented Oct 9, 2023

I was away from home for a while so I couldn't test anything, but today I sat down anyway:
-USART on slotted sensor pins is impossible(unless you use a solution like in Arduino "software serial).
-PA15 and PA14 are USART1 pins 14A is the CLK pin which acts as tx and 15A RX. The problem is that 15 is the control of the red LED and even after soldering the transistor and resistor there is no communication on this pin.Maybe the problem would be solved by software serial then you could use the tx pin with CLK at the stlink connector and the "data" pin which is free altogether or the DIO pin.
-referring to the voltage I recalculated the variable ADC_BATTERY_VOLT in the defines.h file. In my case it is 0.025827164959 As for the current on the connectors from the adc from the mosfets, I didn't measure it, but if you need it, with incorrect values, recalculate the variable MOTOR_AMP_CONV_DC_AMP in the defines.h file
-I also tried to combine master/slave boards when controlling dummy but then only the master board works. I don't know what this is caused by.
-Currently, I have connected both boards to Arduino mega and I use serial1 and serial2 in Arduino for communication and each separately set speeds.
-one more thing puzzles me, well I would like to work on 12-14v power supply(motors with controllers will be used for a lawn mower, in the future autonomous) and I do not want to add any more inverters but the problem is that without external power supply uc does not want to wake up after pressing the button(when I power from 36v) everything is ok

@RoboDurden
Copy link
Owner

RoboDurden commented Oct 9, 2023

On the Gen1 boards there is a 30k:2k voltage divider for the on-off button:
grafik

You need to add a second resistor in parallel to the 30k to make the button work at 12V.
Try another 30k resistor.
But be careful to no longer attach a 36V battery to such a modification as it very well could kill your board with overvoltage on the onoff input.

@mateuszfcg
Copy link
Author

@RoboDurden
I would also like to send the command to switch off the board via uart. do you have any ideas?

@RoboDurden
Copy link
Owner

At the moment you do not use the steer command.
So you could add to main.c

if (steer == 42) ShutOff();

@mateuszfcg
Copy link
Author

Ok I didn't think about that. And actually what is the steer variable used for ?

@RoboDurden
Copy link
Owner

	  // Each speedvalue or steervalue between 50 and -50 means absolutely no pwm
		// -> to get the device calm 'around zero speed'
		scaledSpeed = speed < 50 && speed > -50 ? 0 : CLAMP(speed, -speedLimit, speedLimit) * SPEED_COEFFICIENT;
		scaledSteer = steer < 50 && steer > -50 ? 0 : CLAMP(steer, -speedLimit, speedLimit) * STEER_COEFFICIENT * expo;
		
		// Map to an angle of 180 degress to 0 degrees for array access (means angle -90 to 90 degrees)
		steerAngle = MAP((float)scaledSteer, -1000, 1000, 180, 0);
		xScale = lookUpTableAngle[(uint16_t)steerAngle];

		// Mix steering and speed value for right and left speed
		if(steerAngle >= 90)
		{
			pwmSlave = CLAMP(scaledSpeed, -1000, 1000);
			pwmMaster = CLAMP(pwmSlave / xScale, -1000, 1000);
		}
		else
		{
			pwmMaster = CLAMP(scaledSpeed, -1000, 1000);
			pwmSlave = CLAMP(xScale * pwmMaster, -1000, 1000);
		}

@RoboDurden
Copy link
Owner

There are different sets of pins available for USART0 and USART1 i think. But yes, no free re-asignment like with the ESP32 i fear.

The 2.0 layout uses

#define USART_MASTERSLAVE USART1
#define USART_MASTERSLAVE_TX_PIN GPIO_PIN_2
#define USART_MASTERSLAVE_TX_PORT GPIOA
#define USART_MASTERSLAVE_RX_PIN GPIO_PIN_3
#define USART_MASTERSLAVE_RX_PORT GPIOA

grafik

Possible RX pins for USART_1 would be PA3, PB0 and PA15 but they are all used already for the 2.3 layout.

USART0 is the 2.3 mater/slave header which we currently use for steering:

grafik

	#define USART_STEER_COM_TX_PIN	GPIO_PIN_6
	#define USART_STEER_COM_TX_PORT	GPIOB
	#define USART_STEER_COM_RX_PIN	GPIO_PIN_7
	#define USART_STEER_COM_RX_PORT	GPIOB

Luckily these two pins are also used for I2C.
So my SimpleFOC firmware should already work for this 2.3 layout. It should already work for you: https://github.com/RoboDurden/Split_Hoverboard_SimpleFOC
You would only need to add a defines_2-3.h file.

I am not fully happy with that i2c firmware as you need to restart the hoverboard once the i2c connection fails.

It might be possible to use multiple slaves with the USART0 protocol ???

The ESP32 (master) would not only send speed and steer but also a slave ID.
Then all attached hoverboards would receive the message and would discard it if their ID does not match.
And then only the matching id would send the Feedback-data back to the master. As only the ESP32 has its RX pin connected to the TX pins of all the slaves, only the ESP32 would receive the Feedback message.

@RoboDurden
Copy link
Owner

Okay the master-remoteDummy is working on both boards.
But the master-slave UART communication is not working.
I will focus on that and later test the remoteUart with an esp s2 mini.
PXL_20231011_102744568_copy_3024x2268

@RoboDurden
Copy link
Owner

Okay, serial communication from ESP32 S2 Mini works and master-slave also works.
I have not updated my repo yet as i have reworked the usart0/usart1 code :-/
Need to tidy up the code and also make sure that the 2.0 layout with its two available usart ports still work. Unfortunately i have not a 2.0 setup here at my train station..

In config.h you will have to choose between three possible modes:

//#define MASTER		// uncomment if firmware is for master board
#define SLAVE			// uncomment if firmware is for slave board
//#define SINGLE			// uncomment if firmware is for single board and no master-slave dual board setup

Now i could try to connect both boards via the only one available usart to the ESP32 as i have suggested above. like i2c.
Or you find some free pins that we somehow could use to at least send a speed value from ESP32 to each board.
Like PWM or PPM..

@mateuszfcg
Copy link
Author

mateuszfcg commented Oct 12, 2023

In the Arduino IDE there is a library "software serial" maybe something like that could be used here, then we could use the stlink programming pins

@RoboDurden
Copy link
Owner

RoboDurden commented Oct 13, 2023

Yes :-)
I have introduced a
#define REMOTE_UARTBUS // ESP32 as master and multiple boards as multiple slaves ESP.tx-Hovers.rx and ESP.rx-Hovers.tx

and it works nicely:

millis: 5	iSlave: 2	iOdom: -1112		iSpeed: 0.00		iAmp: 0.60		iVolt: 23.25
millis: 101	iSlave: 2	iOdom: -1109		iSpeed: 0.00		iAmp: 0.80		iVolt: 23.25
millis: 96	iSlave: 1	iOdom: 7374		iSpeed: 0.49		iAmp: 1.20		iVolt: 22.85
millis: 5	iSlave: 2	iOdom: -1106		iSpeed: 0.00		iAmp: 0.40		iVolt: 23.25
millis: 96	iSlave: 1	iOdom: 7367		iSpeed: 0.49		iAmp: 0.60		iVolt: 22.85
millis: 101	iSlave: 1	iOdom: 7361		iSpeed: 0.49		iAmp: 0.60		iVolt: 22.86
millis: 5	iSlave: 2	iOdom: -1102		iSpeed: 0.00		iAmp: 0.40		iVolt: 23.26
millis: 96	iSlave: 1	iOdom: 7356		iSpeed: 0.49		iAmp: 0.20		iVolt: 22.86
millis: 5	iSlave: 2	iOdom: -1102		iSpeed: 0.00		iAmp: 1.20		iVolt: 23.26
millis: 96	iSlave: 1	iOdom: 7352		iSpeed: 0.49		iAmp: 0.40		iVolt: 22.86
millis: 5	iSlave: 2	iOdom: -1102		iSpeed: 0.00		iAmp: 0.80		iVolt: 23.19
millis: 96	iSlave: 1	iOdom: 7349		iSpeed: 0.00		iAmp: 0.20		iVolt: 22.77

I will only upload to my github repo when i have tested the code with a test setup that has two usart buses.

But you can download my work here:
HoverBoardGigaDevice.zip
and
TestSpeed.zip

arduino code:

  boolean bReceived = Receive(oSerialHover,oHoverFeedback);   
  if (bReceived)
  {
    DEBUGT("millis",iNow-iLast);
    HoverLog(oHoverFeedback);
    iLast = iNow;
   }

  #ifdef REMOTE_UARTBUS
    if (iNow > iNext)
    {
      iNext = iNow + 100;
      //DEBUGLN("time",iNow)
      HoverSend(oSerialHover,2,-iSpeed/2);
      delay(10);
      HoverSend(oSerialHover,1,iSpeed);   // hoverboard will answer immediatly on having received this message
    }
  #else
    if (bReceived)  // Reply only when you receive data
      HoverSend(oSerialHover,iSteer,iSpeed);
  #endif

config.h :

//#define MASTER		// uncomment if firmware is for master board
//#define SLAVE			// uncomment if firmware is for slave board
#define SINGLE			// uncomment if firmware is for single board and no master-slave dual board setup


//#define TEST_HALL2LED	// led the 3-led panel blink according to the hall sensors

#if defined(MASTER) || defined(SINGLE)
	#define MASTER_OR_SINGLE
	
	//#define REMOTE_DUMMY
	//#define REMOTE_UART
	#define REMOTE_UARTBUS	// ESP32 as master and multiple boards as multiple slaves ESP.tx-Hovers.rx and ESP.rx-Hovers.tx
	//#define REMOTE_CRSF

	#ifdef REMOTE_UARTBUS
		#define SLAVE_ID	2		// must be unique for all hoverboards connected to the bus
	#endif

by software, up to 255 split hoverboards can be connected to the bus.

enjoy :-)

PXL_20231013_145704497_copy_3024x2268

@RoboDurden RoboDurden changed the title Layout 2.3 Gen2.1.4 (ex2.3) Feb 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants