openastrotech / openastrotracker-firmware Goto Github PK
View Code? Open in Web Editor NEWOfficial firmware for the OpenAstroTracker.
Home Page: https://wiki.openastrotech.com
License: MIT License
Official firmware for the OpenAstroTracker.
Home Page: https://wiki.openastrotech.com
License: MIT License
I have a problem with the RA motor in sidereal tracking. Motor does not run smoothly. I can hear (but it's very slight) little clicks (about 10-15), then the motor stops, then it runs steadily (1-2 seconds) and it starts again like this. I am with arduino MEGA, A4988, NEMA17 1.8°. I tried different stepper motor cards, different motors, to play on the value of the microstepping, nothing changes.
I have built both develop and release version, created Configuration_local.hpp with Weblink and followed
https://wiki.openastrotech.com/Boards/MKS_Gen_L
to wire up the display but the display stays empty.
I have also tweaked debugging to
#define DEBUG_LEVEL (DEBUG_ANY)
but I do not see any feedback on serial as well (set to 19200)
Is there a pre-compiled firmware somewhere that I can try?
To build I used Arduino IDE and set BOARD:
#ifndef BOARD
#define BOARD BOARD_AVR_MKS_GEN_L_V21
#endif
the "AccelStepper" library can be improved. This one accumulates in time a software error. It can be interesting to mathematically integrate this one. Where the "AccelStepper" lib makes
unsigned long time = micros();
if (time - _lastStepTime >= _stepInterval)
{
if (_direction == DIRECTION_CW)
{
_currentPos += 1;
}
else
{
_currentPos -= 1;
}
step(_currentPos);
_lastStepTime = time;
return true;
}
I had coded a version with this fix, my lib is much less complete than AccelStepper but takes into account the software error. As a comparison in my lib I did like this . "this->m_ei" is integrate error
unsigned long r_elsp= micros() - this->m_elaps;
if( (_mv_type == MOVE_TYPE::HALF_STEP ? this->m_inter_delay/2.0 : this->m_inter_delay) <=r_elsp-this->m_ie)
{
this->next_step(_mv_type);
this->m_elaps = micros();
this->m_ie += this->m_inter_delay-r_elsp;
step++;
}
Hi,
so i just finnished my mechanical build of this project. Now its time to jump into the firmware.
Is there a reason, why i can't compile the firmware for a ESP32 with the default "LCD Keypad Shield"?
Normamly these two should work, or is there something i missed?
Hello.
I'm making an OAT.
The firmware is up to date on the MKS Gen L V2.1 board.
I'm going to use the motor as the Close loop motor I had.
It works with the same input as A4988.
So I tested it, but it didn't move, so I checked it.
Result. Minimum pulse width is too small to be recognized.
I tried to modify the source, but I don't know where to modify it.
Thank you for your help.
Needs to be updated.
The firmware doesn't properly enable A4988 drivers when using the generic driver option. Using TMC2209 standalone works for those drivers.
The enable pins are inverted states between those two options.
Apparently there's a 180 deg offset considered when parsing the longitude which is not actually sent, at least not from KStars. KStars simply sends "-11.4" when you're at "11.4" which what's expected from the Meade spec.
Please remove that offset so that LST and HA can be calculated correctly.
You might need to fix the ASCOM driver too and tell all users to upgrade or send the version of the driver in a special command and either add or not add the offset.
My design uses an esp32 with a 20x4 I2C LCD. When I added startup code for the new display type in b_setup.hpp (~ line 24) I used the display's size, 20 columns and 4 rows. LcdMenu lcdMenu(20, 4, MAXMENUITEMS);
This causes the firmware to crash because in the file LcdMenu.cpp the function LcdMenu::updateDisplay() allocates a char buffer (bufMenu[17]) with a size that is based on a column size of 16 (all hard coded). This buffer should instead be sized based on the LCD configuration provided in LcdMenu::lcdMenu(col, row, maxmenuitems)
OR
better yet the display size should be defined in Configuration_local.hpp.
I am attempting to correct this and at the same time I am separating the display and input (buttons) configurations so that any combination of display and input devices can be accommodated.
Coming up as:
[platformio] ; default_envs = mega2560
Causing it to compile all platforms.
Hello,
After setting DEC up and low limits in CAL, it seems that the limits are not storred : limits remain = 0 in INFO.
I'm trying to build the OpenAstroTech firmware for a Makerbase V2.1 board with TMC2209 stepper drivers. I am unclear if these are UART drivers or not, however thats a different problem.
I downloaded the OAT dev branch and unpacked it to a folder.
I then went to https://config.openastrotech.com/ and went through each step to create the Configuration_local.hpp file. I have guessed that the TMC2209 are UART.
I created the file 'Configuration_local.hpp' and pasted in the output from the https://config.openastrotech.com/ tool. This looks OK on the surface but what do I know .... It has the right board definitions in and the rest look sensible.
I renamed Configuration_sample_local.hpp to OLD_Configuration_sample_local.XXX to avoid any conflicts.
I click on the blue tick button the bottom left of VSC and a build process starts. Indeed it appears that a build process starts in turn for every motherboard
mega2560 SUCCESS 00:00:12.378
mksgenlv21 SUCCESS 00:00:11.255
mksgenlv2 SUCCESS 00:00:11.009
mksgenlv1 SUCCESS 00:00:11.110
esp32 SUCCESS 00:00:36.410
I'm sure there is something I have done wrong but unclear what mistkae I have made.
Any help welcomed.
Thanks
Rob
Here's the Configuration_local.hpp if that helps....
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// This configuration file was generated by the OAT Configurator at https://config.openastrotech.com for
// firmware V1.9.00 and later.
// Save this as Configuration_local.hpp in the folder where you placed the firmware code.
// We live in the Northern Hemisphere
#define NORTHERN_HEMISPHERE 1
// We are using the MKS GEN L V2.1 board
#define BOARD BOARD_AVR_MKS_GEN_L_V21
////////////////////////////////
// RA Stepper configuration
// See supported stepper values. Change according to the steppers you are using
// Using the NEMA 17, 0.9°/step stepper for RA
#define RA_STEPPER_TYPE STEPPER_TYPE_NEMA17
// Using the TMC2209-UART driver for RA stepper motor
#define RA_DRIVER_TYPE DRIVER_TYPE_TMC2209_UART
// Define some RA stepper motor settings
#define RA_MOTOR_CURRENT_RATING 900 // mA
#define RA_OPERATING_CURRENT_SETTING 80 // %
#define RA_STEPPER_ACCELERATION 3000
#define RA_STEPPER_SPEED 1200
#define RA_SLEW_MICROSTEPPING 8
#define RA_TRACKING_MICROSTEPPING 64
// #define RA_SERIAL_PORT Serial3 // You may need to uncomment or change this, depending on how you wired the UART
// TMC2209 Stealth Mode (spreadCycle) - More precise tracking when not in stealth mode (set to 0), but steppers will make a high-pitched sound.
#define RA_UART_STEALTH_MODE 1
// Using the 16 tooth purchased gear for RA belt
#define RA_PULLEY_TEETH 16
////////////////////////////////
// DEC Stepper configuration
// See supported stepper values. Change according to the steppers you are using
// Using the NEMA 14, 0.9°/step stepper for DEC
#define DEC_STEPPER_TYPE STEPPER_TYPE_NEMA17
// Using the TMC2209-UART driver for DEC stepper
#define DEC_DRIVER_TYPE DRIVER_TYPE_TMC2209_UART
// Define some DEC stepper motor settings
#define DEC_MOTOR_CURRENT_RATING 900 // mA
#define DEC_OPERATING_CURRENT_SETTING 80 // %
#define DEC_STEPPER_ACCELERATION 3000
#define DEC_STEPPER_SPEED 1200
#define DEC_SLEW_MICROSTEPPING 16
#define DEC_GUIDE_MICROSTEPPING 64
// #define DEC_SERIAL_PORT Serial3 // You may need to uncomment or change this, depending on how you wired the UART
// TMC2209 Stealth Mode (spreadCycle) - More precise tracking when not in stealth mode (set to 0), but steppers will make a high-pitched sound.
#define DEC_UART_STEALTH_MODE 1
// Using the 16 tooth purchased gear for DEC belt
#define DEC_PULLEY_TEETH 16
////////////////////////////////
// Display configuration
// Define the type of display we are using. Currently: LCD Shield w/ keypad
#define DISPLAY_TYPE DISPLAY_TYPE_LCD_KEYPAD
////////////////////////////////
// GPS Addon configuration
// Define whether we have the GPS addon or not. Currently: No GPS
#define USE_GPS 0
////////////////////////////////
// Digital Level Addon configuration
// Define whether we have the Digital Level or not. Currently: No Digital Level
#define USE_GYRO_LEVEL 0
////////////////////////////////
// AutoPA Addon configuration
// Define whether we have the AutoPA add on or not. Currently: No AutoPA
#define USE_AZIMUTH_ALTITUDE_MOTORS 0
Hi,
When I have a look at the board configuration for the MEGA2560 board I see double pin assignments and I wonder which one are correct:
pins_MEGA2560.hpp
FOCUS_STEP_PIN 32 is the same pin as RA_MS1_PIN 32
FOCUS_DIR_PIN 33 is the same pin as DEC_MS1_PIN 33
FOCUS_EN_PIN 34 is the same pin as RA_MS2_PIN 34
Thanks
Ansgar
i have some trouble to get the ESP32 config to work with Skysafari on iOS.
every time, when I connect the ESP with the iPhone the Esp gets into panic and reboot.
does anyone have a working config file, I could test?
Hi. My name is Armando Leonardo.
Sorry for the English, but I'm using Google Translate to help me.
I live in the southern hemisphere, in Brazil, and I have a problem moving the DEC axis. As expected and described on the website, the DEC axis appears on the LCD -90º. However, when I move it to a target, only the DOWN button obeys, negatively incrementing the value, that is, the OAT only increments values from -91 to -270, when it should implement values from -89 to 0 and 360 to 270.
I've already checked the behavior of the buttons, as per the troubleshooting guidelines, but everything is OK with the buttons.
It seems to me that there is a problem in the programming, which does not include the southern hemisphere, because of the use of the (-) sign.
Would you be able to help me?
Thanks.
Trying to build V1.10.2
I use the the online firmware configurator and get the attached Configuration_local.hpp
Configuration_local_hpp.txt
When I try to build using PIO it fails for all environments.
If I use the Configuration_sample_local.hpp instead, then the mega2560 environment successfully builds.
If I change the line
#define BOARD BOARD_AVR_MEGA2560
to
#define BOARD BOARD_RAMPS
it again fails for all environments.
This is the first error I get, with a lot of similar ones after
In file included from src\../LocalConfiguration.hpp:20:0, from src\../Configuration.hpp:50, from src\Declination.cpp:1: src\../Configuration_local.hpp:24:0: error: "BOARD" redefined [-Werror] #define BOARD BOARD_RAMPS
I noticed Constants.hpp does not have a #define BOARD_RAMPS line or anything similar.
Environment Status Duration
------------- -------- ------------
mega2560 SUCCESS 00:00:29.547
mksgenlv21 SUCCESS 00:00:29.410
mksgenlv2 SUCCESS 00:00:29.538
mksgenlv1 SUCCESS 00:00:29.738
esp32 FAILED 00:00:35.691
====================================================================== 1 failed, 4 succeeded in 00:02:33.924 ======================================================================The terminal process "C:\.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload'" terminated with exit code: 1.
Terminal will be reused by tasks, press any key to close it.
Help ****
// We live in the southern hemisphere
#define NORTHERN_HEMISPHERE 0
// We are using an ATMega 2560 card (or clone)
#define BOARD BOARD_AVR_MEGA2560
//////////////////////////////////////////
// RA Stepper configuration
// See the allowed stepper values. Change according to the steppers you are using
// Using NEMA 17, 1.8 ° / step for RA
#define RA_STEPPER_TYPE STEPPER_TYPE_NEMA17
#define RA_STEPPER_SPR 200
// Using the TMC2209-UART driver for RA stepper motor
#define RA_DRIVER_TYPE DRIVER_TYPE_TMC2209_UART
// Using the purchased 16-tooth gear for the RA belt
#define RA_PULLEY_TEETH 16
Using UART to read the StallGuard4 SG_RESULT register the motor load can be measured.
The motor RMS current can be dynamically adjusted on-the-fly to lower power draw, and ramp up as required.
This way the OAT saves on battery usage.
See Section 11 of the TMC2209 datasheet:
https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC2209_Datasheet_V103.pdf
I had some issues with the EEPROM store and wanted to try the dummy store to double.check. Unfortunately it didn't compile. Here's what I did to get it to run.
stellarmate@astroberry:~/astro/OpenAstroTracker-Firmware $ git diff src/EPROMStore.cpp
diff --git a/src/EPROMStore.cpp b/src/EPROMStore.cpp
index 37c5c22..52f6f49 100644
--- a/src/EPROMStore.cpp
+++ b/src/EPROMStore.cpp
@@ -1,9 +1,10 @@
#include "inc/Globals.hpp"
+#include "../Configuration.hpp"
+#if USE_DUMMY_EEPROM == false
PUSH_NO_WARNINGS
#include <EEPROM.h>
POP_NO_WARNINGS
-
-#include "../Configuration.hpp"
+#endif
#include "Utility.hpp"
#include "EPROMStore.hpp"
@@ -17,13 +18,15 @@ const float SteppingStorageNormalized = 25600.0;
#if USE_DUMMY_EEPROM == true
-static uint8_t dummyEepromStorage[EEPROMStore::STORE_SIZE];
+static uint8_t *dummyEepromStorage;
// Initialize the EEPROM object for ESP boards, setting aside storage
void EEPROMStore::initialize()
{
- LOG(DEBUG_EEPROM, "[EEPROM]: Dummy: Startup with %d bytes", EEPROMStore::STORE_SIZE);
- memset(dummyEepromStorage, 0, sizeof(dummyEepromStorage));
+ size_t size = EEPROMStore::STORE_SIZE;
+ dummyEepromStorage = (uint8_t *)malloc(size);
+ LOG(DEBUG_EEPROM, "[EEPROM]: Dummy: Startup with %d bytes", size);
+ memset(dummyEepromStorage, 0, size);
displayContents(); // Will always be empty at restart
}
Issue 158 added the ability to set DEC lower and upper limits based on a parameter. However Mount::setDecLimitPositionAbs always sets the limits based on the constants DEC_LIMIT_UP and DEC_LIMIT_DOWN, ignoring the passed argument stepperPos:
_decUpperLimit = DEC_LIMIT_UP * _stepsPerDECDegree;
and:
_decLowerLimit = -(DEC_LIMIT_DOWN * _stepsPerDECDegree);
Should this be adjusted to allow for either the limit and/or the passed argument?
Several times now I homed the OAT during the day prior to putting it outside and I had it going off the rails in RA. The RA steps were fine when I set it up.
Checking the RA steps when this happens gives me 13344.0 instead of the 417 it should be. The result is that the OAT moves a huge amount but thinks it only moved a bit (factor 32).
I haven't been able to reliable reproduce this though, I only guess that it's related to the time the mount it up.
I already switched the board, but it's still the same.
I'm using Firmware 1.13.5.beta
>> Command: XGR
>> Sending: :XGR#
<<Waiting for result: :XGR#>> newText=>Meade=13344.0
<< Received: 1 13344.0
# XGR -> (1, '13344.0')
>> Result: (1, '13344.0')
>> Command: XSR417
>> Sending: :XSR417#
<<Waiting for result: :XSR417#>> newText=>Meade=
<< Received: 3
# XSR417 -> (3, '')
Using git bisect
and arduino-cli
I determined that the build was broken in commit 26c2a22
Hello all,
I have re-flashed the mksV2.1 board FW (1.11.5) because i swapped the Axes of the Digital level.
Yesterday system works fine.
After this wenn turn on OAT the Display und system works, Powerled is on.
Moving RA/Dec axis to home, that works fine.
Digital leveling works fine.
because Indoor GPS is not found, press 2x the right button to go on.
then after this the display shows RA DEc and 01h etc
A few sec later the system freeze , no Displaybutton respond, and the display shows no h.
On the MKS Board the blue led next to powerled and red led next to mosfet turn on
HE1 goes from 0V to 12V
I used the firmware configurator and flashed it several times
result is always the same.
OpenAstrotech Discord :
https://discord.com/channels/693401540744183859/1027676652718792714
Each Time i made a "clean all" bevor build and upload.
I tested several combinations of add-ons.
All Add-ons alone work without problems.
If there are two, there are no problems, no matter what combination.
Only if I use all three (gps, leveling, AutoPA) together
then the system break after skipping the "GPS-Sat search" (indoors) with the R Button when it reaches the "main menu".
It's really cumbersome to have to re-init these limits after an EEPROM wipe.
Suggested is XSDL123|456 for lower/upper, the same format as the getter uses.
If I compile with the cheaper motors with AutoPA then it will compile, if I try the same settings with Nema 17 instead then it will not compile if I have AutoPA included too but will compile with AutoPA undefined
For some reason, I have NEVER been able to compile using the NEW_STEPPER_LIB definition. Always get a pack of errors. Why won't this work?
My Configuration:
Here is my Configuration_local.hpp
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// This configuration file was generated by the OAT/OAM Configurator at https://config.openastrotech.com
// and is for firmware to be used on a OpenAstroTracker.
// Save this as Configuration_local.hpp in the folder where you placed the firmware code.
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Unique ConfigKey: TR:OAT,FWT:L,SL:N,HS:N,BD:M21,RST:N8,RDO:TU,RATP900:O90:A3000:V1800:S16:T256:,RTR:Y,RT:1,DS:N8,DDT:TU,DATP900:O90:A3000:V1800:S16:T256:,DT:1,DLIN90:D45:,STL:S,DY:NO,GP:N,LM:N,FC:Y,FS:BY,FD:TU,FAP150:O100:S1:H10:,FMSA600:V400:,APT:N,RAH:N
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Use the much higher performance stepper library.
//#define NEW_STEPPER_LIB
// We live in the Northern Hemisphere
#define NORTHERN_HEMISPHERE 1
// We are using the MKS GEN L V2.1 board
#if defined(BOARD) && BOARD != BOARD_AVR_MKS_GEN_L_V21
#error Selected PIO environment does not match this configuration
#else
#define BOARD BOARD_AVR_MKS_GEN_L_V21
#endif
////////////////////////////////
// RA Stepper configuration (OAT)
// See supported stepper values. Change according to the steppers you are using
// Using the NEMA 17, 1.8°/step stepper for RA
#define RA_STEPPER_TYPE STEPPER_TYPE_ENABLED
#define RA_STEPPER_SPR 200.0f
// Using the TMC2209-UART driver for RA stepper motor
#define RA_DRIVER_TYPE DRIVER_TYPE_TMC2209_UART
// Define some RA stepper motor settings
#define RA_MOTOR_CURRENT_RATING 900 // mA
#define RA_OPERATING_CURRENT_SETTING 90 // %
#define RA_STEPPER_ACCELERATION 3000
#define RA_STEPPER_SPEED 1800
#define RA_SLEW_MICROSTEPPING 16
#define RA_TRACKING_MICROSTEPPING 256
// Is it going the wrong way?
#define RA_INVERT_DIR 0
#ifdef NEW_STEPPER_LIB
#define RA_SLEWING_ACCELERATION_DEG 2.0 // deg/s/s
#define RA_SLEWING_SPEED_DEG 2.0 // deg/s
#endif
// Track immediately after boot
#define TRACK_ON_BOOT 0
// Define limits for RA...
#define RA_LIMIT_LEFT 5.5f
#define RA_LIMIT_RIGHT 6.5f
#define RA_TRACKING_LIMIT 6.75f // can't quite get to 7h...
// Using the 16 tooth gear (recommended) for RA belt
#define RA_PULLEY_TEETH 16
////////////////////////////////
// DEC Stepper configuration
// See supported stepper values. Change according to the steppers you are using
// Using the NEMA 17, 1.8°/step stepper for DEC
#define DEC_STEPPER_TYPE STEPPER_TYPE_ENABLED
#define DEC_STEPPER_SPR 200.0f
// Using the TMC2209-UART driver for DEC stepper
#define DEC_DRIVER_TYPE DRIVER_TYPE_TMC2209_UART
// Define some DEC stepper motor settings
#define DEC_MOTOR_CURRENT_RATING 800 // mA
#define DEC_OPERATING_CURRENT_SETTING 90 // %
#define DEC_STEPPER_ACCELERATION 3000
#define DEC_STEPPER_SPEED 1800
#define DEC_SLEW_MICROSTEPPING 16
#define DEC_GUIDE_MICROSTEPPING 256
// Is it going the wrong way?
#define DEC_INVERT_DIR 0
#ifdef NEW_STEPPER_LIB
#define DEC_SLEWING_ACCELERATION_DEG 2.0 // degs/s/s
#define DEC_SLEWING_SPEED_DEG 2.0 // deg/s
#endif
// Using the 16 tooth gear (recommended) for DEC belt
#define DEC_PULLEY_TEETH 16
// Define DEC limits
#define DEC_LIMIT_UP 90 // degrees from Home
#define DEC_LIMIT_DOWN 55 // degrees from Home
// TMC2209 Stealth Mode (spreadCycle) - When set to 0, tracking is more precise, but noisy (high-pitched hissing sound). When set to 1, they are silent.
#define RA_UART_STEALTH_MODE 1
#define DEC_UART_STEALTH_MODE 1
////////////////////////////////
// Display configuration
// Define the type of display we are using. Currently: No display
#define DISPLAY_TYPE DISPLAY_TYPE_LCD_KEYPAD
////////////////////////////////
// GPS Addon configuration
// Define whether we have the GPS addon or not. Currently: No GPS
#define USE_GPS 1
////////////////////////////////
// Digital Level Addon configuration
// Define whether we have the Digital Level or not. Currently: No Digital Level
#define USE_GYRO_LEVEL 1
#define GYRO_AXIS_SWAP 0
// MKS uses software I2C library. Define the SCL and SDA pins you wired (recommended are 11 and 21)
#define USE_GYRO_WITH_SOFTWAREI2C 1
#define GYRO_SOFTWARE_SCL_PIN 11
#define GYRO_SOFTWARE_SDA_PIN 21 efine USE_GYRO_LEVEL 1
////////////////////////////////
// Focuser configuration
// Define whether to support a focusing stepper motor on E1 or not. Currently: Focuser stepper
// Using the Modded 28BYJ-48 (Bipolar) stepper for FOC
#define FOCUS_STEPPER_TYPE STEPPER_TYPE_ENABLED
#define FOCUS_STEPPER_SPR 2048.0f
// Using the TMC2209-UART driver for focuser stepper
#define FOCUS_DRIVER_TYPE DRIVER_TYPE_TMC2209_UART
// Define Focus stepper motor power settings
#define FOCUS_MOTOR_CURRENT_RATING 150 // mA
#define FOCUS_OPERATING_CURRENT_SETTING 100 // %
#define FOCUS_MICROSTEPPING 1 // steps
#define FOCUSER_MOTOR_HOLD_SETTING 10 // %
#define FOCUS_UART_STEALTH_MODE 1 // silent?
#define FOCUSER_ALWAYS_ON 1
// Define some focuser stepper motor settings
#define FOCUS_STEPPER_ACCELERATION 600
#define FOCUS_STEPPER_SPEED 400
////////////////////////////////
// AutoPA Addon configuration
// Define whether we have the AutoPA add on or not. Currently: No AutoPA
// No AutoPA settings
////////////////////////////////
// Auto Homing addons
#define USE_HALL_SENSOR_RA_AUTOHOME 1
#define RA_HOMING_SENSOR_SEARCH_DEGREES 30
#define RA_HOMING_SENSOR_ACTIVE_STATE HIGH
#define USE_HALL_SENSOR_DEC_AUTOHOME 1
#define DEC_HOMING_SENSOR_SEARCH_DEGREES 50
#define DEC_HOMING_SENSOR_ACTIVE_STATE HIGH
///////////////////////
// Debug settings
// DEBUG_NONE
// DEBUG_WIFI
// DEBUG_MOUNT
// DEBUG_FOCUS
//|DEBUG_EEPROM|DEBUG_GYRO|DEBUG_GPS|DEBUG_COORD_CALC| DEBUG_GPS
// DEBUG_MEADE|DEBUG_SERIAL|DEBUG_INFO|DEBUG_MOUNT_VERBOSE|DEBUG_GENERAL|DEBUG_MEADE|DEBUG_VERBOSE|DEBUG_STEPPERS|DEBUG_ANY
//#define DEBUG_LEVEL (DEBUG_NONE)
//#define DEBUG_LEVEL (DEBUG_MEADE|DEBUG_ANY)
//#define DEBUG_LEVEL (DEBUG_NONE)
#define DEBUG_LEVEL (DEBUG_INFO)
// UART CONNECTION TEST - USE only TX or TXRX at the same time
//#define UART_CONNECTION_TEST_TX 1 // this one contains a 5 degree self-test in both motors
//#define UART_CONNECTION_TEST_TXRX 1
// define debug commands to Serial1
#define DEBUG_SEPARATE_SERIAL 1
#define DEBUG_SERIAL_PORT Serial2
#define DEBUG_SERIAL_BAUDRATE 115200
Here is my modified pins_MKS_GEN_L_V21.h
#pragma once
// DRIVER_TYPE_TMC2209_UART requires 4 digital pins in Arduino pin numbering
#ifndef RA_STEP_PIN
#define RA_STEP_PIN 54 // STEP
#endif
#ifndef RA_DIR_PIN
#define RA_DIR_PIN 55 // DIR
#endif
#ifndef RA_EN_PIN
#define RA_EN_PIN 38 // Enable
#endif
#ifndef RA_DIAG_PIN
#define RA_DIAG_PIN 3 // only needed for autohome function
#endif
#ifndef RA_MS0_PIN
#define RA_MS0_PIN 51
#endif
#ifndef RA_MS1_PIN
#define RA_MS1_PIN 52
#endif
#ifndef RA_MS2_PIN
#define RA_MS2_PIN 63
#endif
// DRIVER_TYPE_TMC2209_UART requires 2 additional digital pins for SoftwareSerial, can be shared across all drivers
#ifndef RA_SERIAL_PORT_TX
#define RA_SERIAL_PORT_TX 40 // SoftwareSerial TX port
#endif
#ifndef RA_SERIAL_PORT_RX
#define RA_SERIAL_PORT_RX 63 // SoftwareSerial RX port
#endif
#ifndef RA_DRIVER_ADDRESS
#define RA_DRIVER_ADDRESS 0b00
#endif
// DRIVER_TYPE_TMC2209_UART requires 4 digital pins in Arduino pin numbering
#ifndef DEC_STEP_PIN
#define DEC_STEP_PIN 60 // STEP
#endif
#ifndef DEC_DIR_PIN
#define DEC_DIR_PIN 61 // DIR
#endif
#ifndef DEC_EN_PIN
#define DEC_EN_PIN 56 // Enable
#endif
#ifndef DEC_DIAG_PIN
#define DEC_DIAG_PIN 14 // only needed for autohome function
//#define DEC_DIAG_PIN -1
#endif
#ifndef DEC_MS0_PIN
#define DEC_MS0_PIN 51
#endif
#ifndef DEC_MS1_PIN
#define DEC_MS1_PIN 52
#endif
#ifndef DEC_MS2_PIN
#define DEC_MS2_PIN 64
#endif
// DRIVER_TYPE_TMC2209_UART requires 2 additional digital pins for SoftwareSerial, can be shared across all drivers
#ifndef DEC_SERIAL_PORT_TX
#define DEC_SERIAL_PORT_TX 59 // SoftwareSerial TX port
#endif
#ifndef DEC_SERIAL_PORT_RX
#define DEC_SERIAL_PORT_RX 64 // SoftwareSerial RX port
#endif
#ifndef DEC_DRIVER_ADDRESS
#define DEC_DRIVER_ADDRESS 0b00
#endif
#define SW_SERIAL_UART 1
#ifndef UART_CONNECTION_TEST_TXRX
#define UART_CONNECTION_TEST_TXRX 1
#endif
// DRIVER_TYPE_TMC2209_UART requires 4 digital pins in Arduino pin numbering
#ifndef AZ_STEP_PIN
#define AZ_STEP_PIN 46 // STEP
#endif
#ifndef AZ_DIR_PIN
#define AZ_DIR_PIN 48 // DIR
#endif
#ifndef AZ_EN_PIN
#define AZ_EN_PIN 62 // Enable
#endif
#ifndef AZ_DIAG_PIN
#define AZ_DIAG_PIN 18 // only needed for autohome function
#endif
// DRIVER_TYPE_TMC2209_UART requires 2 additional digital pins for SoftwareSerial, can be shared across all drivers
#ifndef AZ_SERIAL_PORT_TX
#define AZ_SERIAL_PORT_TX 42 // SoftwareSerial TX port
#endif
#ifndef AZ_SERIAL_PORT_RX
#define AZ_SERIAL_PORT_RX 65 // SoftwareSerial RX port
#endif
#ifndef AZ_DRIVER_ADDRESS
#define AZ_DRIVER_ADDRESS 0b00
#endif
// DRIVER_TYPE_TMC2209_UART requires 4 digital pins in Arduino pin numbering
#ifndef ALT_STEP_PIN
#define ALT_STEP_PIN 26 // STEP
#endif
#ifndef ALT_DIR_PIN
#define ALT_DIR_PIN 28 // DIR
#endif
#ifndef ALT_EN_PIN
#define ALT_EN_PIN 24 // Enable
#endif
#ifndef ALT_DIAG_PIN
#define ALT_DIAG_PIN 2 // only needed for autohome function
#endif
// DRIVER_TYPE_TMC2209_UART requires 2 additional digital pins for SoftwareSerial, can be shared across all drivers
#ifndef ALT_SERIAL_PORT_TX
#define ALT_SERIAL_PORT_TX 44 // SoftwareSerial TX port
#endif
#ifndef ALT_SERIAL_PORT_RX
#define ALT_SERIAL_PORT_RX 66 // SoftwareSerial RX port
#endif
#ifndef ALT_DRIVER_ADDRESS
#define ALT_DRIVER_ADDRESS 0b00
#endif
// DRIVER_TYPE_TMC2209_UART requires 4 digital pins in Arduino pin numbering. This is the E1 port.
#ifndef FOCUS_STEP_PIN
#define FOCUS_STEP_PIN 36 // STEP
#endif
#ifndef FOCUS_DIR_PIN
#define FOCUS_DIR_PIN 34 // DIR
#endif
#ifndef FOCUS_EN_PIN
#define FOCUS_EN_PIN 30 // Enable
#endif
#ifndef FOCUS_DIAG_PIN
#define FOCUS_DIAG_PIN 15 // only needed for autohome function
//#define FOCUS_DIAG_PIN -1
#endif
// DRIVER_TYPE_TMC2209_UART requires 2 additional digital pins for SoftwareSerial, can be shared across all drivers
#ifndef FOCUS_SERIAL_PORT_TX
#define FOCUS_SERIAL_PORT_TX 20 // SoftwareSerial TX port
#endif
#ifndef FOCUS_SERIAL_PORT_RX
#define FOCUS_SERIAL_PORT_RX 12 // SoftwareSerial RX port
#endif
#ifndef FOCUS_DRIVER_ADDRESS
#define FOCUS_DRIVER_ADDRESS 0b00
#endif
// RA Homing pin for Hall sensor
#ifndef RA_HOMING_SENSOR_PIN
#define RA_HOMING_SENSOR_PIN 53
#endif
// DEC Homing pin for Hall sensor
#ifndef DEC_HOMING_SENSOR_PIN
#define DEC_HOMING_SENSOR_PIN 52
#endif
// RA End Switch East pin
#ifndef RA_ENDSWITCH_EAST_SENSOR_PIN
#define RA_ENDSWITCH_EAST_SENSOR_PIN 19
#endif
// RA End Switch West pin
#ifndef RA_ENDSWITCH_WEST_SENSOR_PIN
#define RA_ENDSWITCH_WEST_SENSOR_PIN 18
#endif
// DEC End Switch Up pin
#ifndef DEC_ENDSWITCH_UP_SENSOR_PIN
#define DEC_ENDSWITCH_UP_SENSOR_PIN 3
#endif
// DEC End Switch Down pin
#ifndef DEC_ENDSWITCH_DOWN_SENSOR_PIN
#define DEC_ENDSWITCH_DOWN_SENSOR_PIN 2
#endif
//GPS pin configuration
#ifndef GPS_SERIAL_PORT
#define GPS_SERIAL_PORT Serial1
#endif
// DISPLAY_TYPE_LCD_KEYPAD requires 6 digital & 1 analog output in Arduino pin numbering
#ifndef LCD_PIN4
#define LCD_PIN4 37
#endif
#ifndef LCD_PIN5
#define LCD_PIN5 35
#endif
#ifndef LCD_PIN6
#define LCD_PIN6 23
#endif
#ifndef LCD_PIN7
#define LCD_PIN7 25
#endif
#ifndef LCD_PIN8
#define LCD_PIN8 27
#endif
#ifndef LCD_PIN9
#define LCD_PIN9 29
#endif
// DISPLAY_TYPE_LCD_KEYPAD requires 1 analog input in Arduino pin numbering
#ifndef LCD_KEY_SENSE_PIN
#define LCD_KEY_SENSE_PIN 58
#endif
//Pin to turn on dew heater MOSFET
#ifndef DEW_HEATER_1_PIN
#define DEW_HEATER_1_PIN 10
#endif
#ifndef DEW_HEATER_2_PIN
#define DEW_HEATER_2_PIN 7
#endif
//Serial port for external debugging
#if DEBUG_SEPARATE_SERIAL == 1
#ifndef DEBUG_SERIAL_PORT
#define DEBUG_SERIAL_PORT Serial2 //D16 (LCD_RS) - TXD2 and D17 (LCD_EN) - RXD2
// #define DEBUG_SERIAL_PORT Serial3 //D14/15
#endif
//#else
// #ifndef DEBUG_SERIAL_PORT
// #define DEBUG_SERIAL_PORT Serial
// #endif
#endif
Beyond that, the only other mod is to adjust the values for the up/down/left/right/enter of the LCD keypad.
Hijacked Serial2 for debug output and moved LCD pins to new pins. All good.
Currently, when power is applied to the mount it starts Tracking, which in many cases that would work the best. But if the unit is unattended and Parked , and a power glitch were to occur, the Oat would reset and start to track without guidance.
the statement would be like #define AUTOTRACKING ON POWER ON True or False of course the default would be True, to continue on how it is already setup, but the False would give the operator an option for tracking on power up.
When I set the speed/accel of the new stepper lib too high (I used 16.0 for both), MHRR3 doesn't find the magnet anymore and subsequently goes off the rails on the other side (which is actually a second issue as it shouldn't do so).
Issuing :RM# before the homing makes it kinda work again, but it doesn't move to 0 afterwards. Apparently the RA moves are "weird". When I give MXr100, it moves 100 steps. When I give MXr200, it just doesn't stop until I issue Q.
I've noticed inconsitent behavior betwen PlatformIO and Arduino IDE
When compiling via PlatformIO dates appear to wrap at 09:06:07 instead of 23:59:59.
This appears to be a 16 bit signed integer overflow error, possibly related to the usage of abs(totalSeconds) in DayTime.cpp
I don't know why I live in Brazil. =(
trying to compile with Arduino IDE 1.8.19 on Linux (Manjaro).
Get following compile error:
OpenAstroTech/OpenAstroTracker-Firmware/src/Utility.cpp:212:7: error: redefinition of 'float fabsf(float)'
212 | float fabsf(float x)
| ^~~~~
In file included from OpenAstroTech/OpenAstroTracker-Firmware/src/Utility.cpp:1:
/usr/avr/include/math.h:163:21: note: 'float fabsf(float)' previously defined here
163 | static inline float fabsf (float __x)
| ^~~~~
exit status 1
Error compiling for board Arduino Mega or Mega 2560.
I open the .ino in arduino and follow the directions. When i hit ctrl u it gives me this error. I'm not sure what I am doing wrong.
C:\Users\Chris\AppData\Local\Temp\cckK8d9i.ltrans0.ltrans.o: In function main': C:\Users\Chris\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.5\cores\arduino/main.cpp:43: undefined reference to
setup'
C:\Users\Chris\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.5\cores\arduino/main.cpp:46: undefined reference to `loop'
collect2.exe: error: ld returned 1 exit status
exit status 1
Compilation error: exit status 1
Hello all,
I know the focuser is a new addition and not yet fully functional, but I just want to raise a couple of things I noticed.
Thanks for the amazing equipment you guys put together.
In order to greatly improve maintainability and expandability of Firmware code, a hardware abstraction layer (HAL) should be implemented in context of a big refactoring. The new architecture will then form the base of firmware version 2.x.x
Multiple components have to be extracted out of the current code (mainly from Mount.cpp and init files) and placed into well designed and encapsulated units. These units should follow single-responsibility principle (e.g. a stepper driver should only be responsible for the actual driver hardware and not care about higher level hardware or software like the board it is attached to or the interrupt routine used for step triggering).
The strict encapsulation will allow proper automated unit testing later and increase stability of the whole firmware after code or configuration changes. It will also provide an easy way for further hardware support implementations.
Hi, is there any guide how to create a config by yourself, or even a finished config for using a L293 Motor Shield? I have big problems figuring out where to change stuff needed to get it working
we should add a version value to each generated local config, e.g:
#define LOCAL_CONFIG_VERSION 1
the firmware code could then have following definition & check:
#define MIN_LOCAL_CONFIG_VERSION 1
#if MIN_LOCAL_CONFIG_VERSION > LOCAL_CONFIG_VERSION
#error You have to update your local config to be able to use this version of firmware
#endif
This would allow us making changes to the config api (e.g. renaming or restructuring the config definitions) which would not lead to compile errors otherwise.
The user would also have an easier to understand error message instead of some generic "XYZ not defined"
If we introduce some breaking changes, we simply bump the min required config version in the firmware ... then adapt the config server and bump the version there as well.
calculateRAandDECSteppers appears to not calculate the correct direction to turn the RA axis when attempting to park after a long session of tracking (6+ hrs)
Exact duration of tracking required to cause this has not been narrowed down yet, but it is repeatable.
Edit: Confirmed this occurs when attempting to park after 12 hrs of tracking. I'll try to narrow down the window it occurs.
Instead of this, it uses _targetRA and _targetDEC
An "Unknown" board is not handled properly by Mount::getMountHardwareInfo(): ESP32 and m2560p boards have a trailing comma whereas the Unknown board type does not. This results in the following hardware line being sent by the firmware:
[00:00:07.560] [06]: Mount: Hardware is UnknownNEMA|20|400,NEMA|20|400,NO_GPS,NO_AZ_ALT,NO_GYRO,NO_LCD,NO_FOC,
causing OATControl to crash, as the missing comma relocates the line segments parsed here.
Hi,
it seems to me that with changes made from v 1.12.5 (d5daf2e) to 1.12.6beta (38586ce) my esp32 build crashes with a
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x400dde4a PS : 0x00060e30 A0 : 0x800d9308 A1 : 0x3ffb2140
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000844 A5 : 0x3ffb2110
A6 : 0x00000025 A7 : 0x3ffc2900 A8 : 0x800dea0c A9 : 0x3ffb2130
A10 : 0x3ffb217c A11 : 0x0000002b A12 : 0x0beb37e9 A13 : 0x3ffc2900
A14 : 0x00000025 A15 : 0x3ffb9303 SAR : 0x0000001a EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000020 LBEG : 0x40086004 LEND : 0x4008600f LCOUNT : 0x00000000
Backtrace: 0x400dde47:0x3ffb2140 0x400d9305:0x3ffb2170 0x400daeaf:0x3ffb21b0 0x400db372:0x3ffb21f0 0x400d2012:0x3ffb2220 0x400e030a:0x3ffb2290
#0 0x400dde47:0x3ffb2140 in AccelStepper::stop() at .pio/libdeps/esp32/AccelStepper/src/AccelStepper.cpp:666
#1 0x400d9305:0x3ffb2170 in Mount::stopSlewing(int) at src/Mount.cpp:2329 (discriminator 2)
#2 0x400daeaf:0x3ffb21b0 in Mount::configureHemisphere(bool, bool) at src/Mount.cpp:227 (discriminator 2)
#3 0x400db372:0x3ffb21f0 in Mount::configureRAStepper(unsigned char, unsigned char, unsigned int, unsigned int) at src/Mount.cpp:269 (discriminator 2)
#4 0x400d2012:0x3ffb2220 in setup() at src/b_setup.hpp:312 (discriminator 3)
#5 0x400e030a:0x3ffb2290 in loopTask(void*) at .platformio/packages/framework-arduinoespressif32/cores/esp32/main.cpp:42
My guess is that with the changes made to the stepper driver things got broken.
Thanks!
changing *_STEPPER_SPEED brings no response. I find defines speed and see that they are set through microsteps... *_STEPPER_SPEED used ONLY for UART testing... Why?
Just a FYI, unable to compile the dec-auto-home branch (git pull date: 08-10-22).
Board: MKS_GENL_V2.1
OS: Ubuntu 22.04.1 LTS
root@odroid:/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware# git branch -a | head -2
*dec-auto-home
remotes/origin/Alt-Az-local-config
root@odroid:/home/OAT_GitHub/dec-auto-home# arduino-cli compile --fqbn arduino:avr:mega ./OpenAstroTracker-Firmware
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp: In member function 'bool Mount::isAxisRunning(StepperAxis)':
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:1665:20: error: '_stepperALT' was not declared in this scope
return _stepperALT->isRunning();
^~~~~~~~~~~
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:1665:20: note: suggested alternative: '_stepperRA'
return _stepperALT->isRunning();
^~~~~~~~~~~
_stepperRA
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:1669:20: error: '_stepperAZ' was not declared in this scope
return _stepperAZ->isRunning();
^~~~~~~~~~
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:1669:20: note: suggested alternative: '_stepperRA'
return _stepperAZ->isRunning();
^~~~~~~~~~
_stepperRA
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:1673:20: error: '_stepperFocus' was not declared in this scope
return _stepperFocus->isRunning();
^~~~~~~~~~~~~
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:1673:20: note: suggested alternative: '_stepperRA'
return _stepperFocus->isRunning();
^~~~~~~~~~~~~
_stepperRA
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp: In member function 'void Mount::stopSlewing(StepperAxis)':
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2285:9: error: '_stepperAZ' was not declared in this scope
_stepperAZ->stop();
^~~~~~~~~~
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2285:9: note: suggested alternative: '_stepperRA'
_stepperAZ->stop();
^~~~~~~~~~
_stepperRA
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2291:9: error: '_stepperALT' was not declared in this scope
_stepperALT->stop();
^~~~~~~~~~~
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2291:9: note: suggested alternative: '_stepperRA'
_stepperALT->stop();
^~~~~~~~~~~
_stepperRA
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp: In member function 'long int Mount::getCurrentStepperPosition(StepperAxis)':
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2363:16: error: '_stepperALT' was not declared in this scope
return _stepperALT->currentPosition();
^~~~~~~~~~~
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2363:16: note: suggested alternative: '_stepperRA'
return _stepperALT->currentPosition();
^~~~~~~~~~~
_stepperRA
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2369:16: error: '_stepperAZ' was not declared in this scope
return _stepperAZ->currentPosition();
^~~~~~~~~~
/home/OAT_GitHub/dec-auto-home/OpenAstroTracker-Firmware/src/Mount.cpp:2369:16: note: suggested alternative: '_stepperRA'
return _stepperAZ->currentPosition();
^~~~~~~~~~
_stepperRA
Used library Version Path
AccelStepper 1.61 /root/Arduino/libraries/AccelStepper
TMCStepper 0.7.3 /root/Arduino/libraries/TMCStepper
SPI 1.0 /root/.arduino15/packages/arduino/hardware/avr/1.8.5/libraries/SPI
SoftwareSerial 1.0 /root/.arduino15/packages/arduino/hardware/avr/1.8.5/libraries/SoftwareSerial
LiquidCrystal 1.0.7 /root/Arduino/libraries/LiquidCrystal
EEPROM 2.0 /root/.arduino15/packages/arduino/hardware/avr/1.8.5/libraries/EEPROM
Used platform Version Path
arduino:avr 1.8.5 /root/.arduino15/packages/arduino/hardware/avr/1.8.5
Error during build: exit status 1
New build. Running Mega2560, LCD+kaypad. Nema17 w/ A4988 drivers on RA and DEC. Running 1.8.53. Updated to 1.8.64.
Prior to update, RA tracked no problem. After update, will not track. Can skew RA and DEC no issues. Just does not track. Track stepper counter increases.
Repost here from Discord.
Steps to reproduce (not 100% guaranteed):
What happens:
State before second slew: Tracking,--T---,0,28278,1470,154009,+000000,
OATControl sends :XGC12.000*0.000#
and receives 17267|-28278
DEC crashes into RA ring (also occurs over ASCOM)
What should happen:
DEC should not move at all, -28278 should be positive.
I haven't dug into the code enough to understand stepper directions, how coordinates are encoded and so on. I ended up rewiring to avoid DEC invert, and the problem did not occur (limited testing). Will update when I have more time.
Rather than changing SpreadCycle/StealthChop to create an audible noise, the GCONF.shaft UART registry can be used to toggle the motor direction.
A simple menu item can trigger a forward/backward motion routine that controls the step direction via UART.
That way you can visually test the UART Tx channel without needing to re-upload the firmware.
Sync getting inverted in dec, SOUTHERN HEMISPHERE
Latest dev firmware.
To replicate:
IM not sure what this translates into error looking at the sky, but linearly on the OAT, my sensors seems to have some hysteresis depending on the direction being homed.
If I home in one direction, and then home in the opposite direction, my home positioning will be different by about a 1/8 - 1/4 inch.
Im wondering if its possible to do a double home....find sensor and move past, then move back the other way and move past, and fine the middle of the two directions.
I believe currently it just find the start, looks for the end, and then moved to the middle of that. Problem is, that position changes depending on what direction you begin the homing sequence.
Perhaps its the extremely cheap hall sensors I have.
Maybe it can find the sensor, and then register the position when it passes it, and then go back the other way and register the position where it passes in the other direction.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.