├── utils ├── mag_calibration │ ├── .gitignore │ ├── example_dataset.png │ ├── plot_mag.sh │ ├── plot_mag.gnuplot │ └── README.md ├── mower_buttons │ ├── press_s1.sh │ ├── press_s2.sh │ ├── press_home.sh │ └── press_start.sh └── scripts │ ├── redirect_serial.sh │ ├── upload_firmware.sh │ └── start_openocd.sh ├── img ├── mainboard.jpg ├── open_mower_app_1.jpg ├── open_mower_app_2.jpg ├── open_mower_header.jpg ├── clion_cmake_settings.png ├── open_mower_mainboard.jpg └── dfplayer-clone_cut-pin.png ├── Design └── STL │ ├── openmower_logo_part_text.stl │ └── openmower_logo_part_mower_complete.stl ├── Hardware ├── OpenMowerMainboard │ ├── RP-Pico Libraries │ │ ├── MCU_RaspberryPi_and_Boards.dcm │ │ ├── MCU_RaspberryPi_and_Boards.pretty │ │ │ └── Crystal_SMD_HC49-US.kicad_mod │ │ ├── LICENSE │ │ └── MCU_RaspberryPi_and_Boards.lib │ ├── MAX2040 │ │ ├── MAX2040.dcm │ │ ├── MAX2040.lib │ │ ├── MAX2040.mod │ │ └── MAX2040.kicad_mod │ ├── TXS0104EPWR │ │ ├── TXS0104EPWR.dcm │ │ ├── TXS0104EPWR.lib │ │ ├── TXS0104EPWR.mod │ │ └── SOP65P640X120-14N.kicad_mod │ ├── LSM6DSOTR │ │ ├── LSM6DSOTR.dcm │ │ ├── LSM6DSOTR.lib │ │ ├── LSM6DSOTR.mod │ │ └── LGA-14_2.5X3X0.86_.kicad_mod │ ├── TSC101CILT │ │ ├── TSC101CILT.dcm │ │ ├── TSC101CILT.lib │ │ ├── TSC101CILT.mod │ │ └── SOT95P280X145-5N.kicad_mod │ ├── 74ALVC164245DGG │ │ ├── 74ALVC164245DGG_11.dcm │ │ └── 74ALVC164245DGG_11.lib │ ├── .gitignore │ ├── fp-lib-table │ ├── MyModules.pretty │ │ ├── .gitignore │ │ ├── LM2596S_MODULE.kicad_mod │ │ ├── Fuseholder5x20_horiz_open_inline_Type-I.kicad_mod │ │ ├── WT901.kicad_mod │ │ └── LGA-14_2.5X3X0.86_.kicad_mod │ ├── sym-lib-table │ ├── lcsc.pretty │ │ ├── F1206.kicad_mod │ │ ├── SW-TH_DA-01BP.kicad_mod │ │ └── SW-SMD_MK-11C04-G013.kicad_mod │ ├── RPi_Hat.lib │ ├── MyModules.lib │ ├── bom.ini │ ├── xESC2.kicad_sym │ ├── OpenMowerMainboard.kibot.yaml │ └── WTV020.pretty │ │ └── WTV020.kicad_mod ├── GPSGroundPlane │ └── GPSGroundPlane-v_0_9_u1.zip ├── DockStation │ ├── fp-lib-table │ ├── sym-lib-table │ ├── .gitignore │ ├── ene9ba_library.lib │ ├── mower_PowerDeviceCarrier.kibot.yaml │ ├── ene9ba_footprint.pretty │ │ ├── Fuseholder5x20_horiz_open_inline_Type-I.kicad_mod │ │ └── DC-DC-XL4016.kicad_mod │ └── ene9ba_library.kicad_sym └── .gitignore ├── Firmware ├── LowLevel │ ├── soundfiles │ │ ├── 49 │ │ │ ├── 020_leiser.mp3 │ │ │ ├── 021_lauter.mp3 │ │ │ ├── 023_Notaus aufgehoben.mp3 │ │ │ ├── 024_Not-Aus durch ROS.mp3 │ │ │ ├── 001_Hallo, ich bin Steve.mp3 │ │ │ ├── 007_Starte den Mähvorgang.mp3 │ │ │ ├── 008_Stop-Taste gedrueckt.mp3 │ │ │ ├── 013_Au-weia, schon wieder.mp3 │ │ │ ├── 005_Warte auf RTK-GPS Signal.mp3 │ │ │ ├── 009_Not-Aus durch Rad Hebesensor.mp3 │ │ │ ├── 022_auf deutsche sprache umgestellt.mp3 │ │ │ ├── 025_Not-Aus durch Kollisionssensor.mp3 │ │ │ ├── 002_open mower erfolgreich gestartet.mp3 │ │ │ ├── 004_Starte Aufzeichnung des Lageplans.mp3 │ │ │ ├── 006_Berechne Abmessungen des Lageplans.mp3 │ │ │ ├── 003_Initialisiere Roboter Betriebssystem.mp3 │ │ │ ├── 011_open-mower hat das Rasenmähen beendet.mp3 │ │ │ ├── 017_Das Roboter Betriebssystem wurde gestoppt.mp3 │ │ │ ├── 018_Der Raspberry Pai wurde herunter gefahren.mp3 │ │ │ ├── 010_Regen festgestellt, fahre zurück zur Basis.mp3 │ │ │ ├── 012_Vorsicht, autonomer Maehroboter im Einsatz.mp3 │ │ │ ├── 019_Die IMU Initialisierung ist fehlgeschlagen.mp3 │ │ │ ├── 016_Start des Roboter Betriebssystems erfolgreich.mp3 │ │ │ └── GoogleTTS_Strings.txt │ │ ├── 01 │ │ │ ├── 020_down.mp3 │ │ │ ├── 021_up.mp3 │ │ │ ├── 008_stop button.mp3 │ │ │ ├── 017_ROS stopped.mp3 │ │ │ ├── 013_ups, I did it again.mp3 │ │ │ ├── 023_Emergency cleared.mp3 │ │ │ ├── 001_Hi, I am Steve, your.mp3 │ │ │ ├── 002_open mower start up .mp3 │ │ │ ├── 003_Initializing robot o.mp3 │ │ │ ├── 004_Starting map area re.mp3 │ │ │ ├── 005_waiting for rtk gps .mp3 │ │ │ ├── 006_calculating map dime.mp3 │ │ │ ├── 007_initiate mowing sequ.mp3 │ │ │ ├── 009_emergency wheel lift.mp3 │ │ │ ├── 010_rain detected, headi.mp3 │ │ │ ├── 011_open mower has compl.mp3 │ │ │ ├── 012_stay back, autononou.mp3 │ │ │ ├── 014_Hallo, ich bin Tobi,.mp3 │ │ │ ├── 015_Hi, I am Tobi, your .mp3 │ │ │ ├── 016_ROS startup successful.mp3 │ │ │ ├── 019_IMU initialization failed.mp3 │ │ │ ├── 024_Emergency triggered by ROS.mp3 │ │ │ ├── 018_RPI shut down and powered off.mp3 │ │ │ ├── 022_Switched to english language.mp3 │ │ │ ├── 025_Emergency triggered by collision sensor.mp3 │ │ │ └── GoogleTTS_Strings.txt │ │ ├── mp3 │ │ │ ├── 0014_Alarm01.mp3 │ │ │ ├── 0015_Alarm02.mp3 │ │ │ ├── 0205_Burp-A2.mp3 │ │ │ ├── 0008_r2d2-sfx.mp3 │ │ │ ├── 0020_gps-poor.mp3 │ │ │ ├── 0022_gps-good.mp3 │ │ │ ├── 0203_wet-fart.mp3 │ │ │ ├── 0012_Pink-Panther.mp3 │ │ │ ├── 0200_Minions Fart.mp3 │ │ │ ├── 0202_Cow-Mooing-C.mp3 │ │ │ ├── 0303_Darth-Vader.mp3 │ │ │ ├── 0004_computer-heart.mp3 │ │ │ ├── 0021_gps-acceptable.mp3 │ │ │ ├── 0002_success_02-68338.mp3 │ │ │ ├── 0007_montage-machine.mp3 │ │ │ ├── 0009_Minion-Fire-Alarm.mp3 │ │ │ ├── 0013_Highway-to-Hell.mp3 │ │ │ ├── 0201_Sheep-Lamb-Bah-B.mp3 │ │ │ ├── 0204_vegan-fart-voice.mp3 │ │ │ ├── 0301_ComingHome_Remix.mp3 │ │ │ ├── 0302_SweetHomeAlabama.mp3 │ │ │ ├── 0100_SingingInTheRain_Remix.mp3 │ │ │ ├── 0300_MamaImComingHome_Demo.mp3 │ │ │ ├── 0003_scifi_ruined_environment.mp3 │ │ │ ├── 0005_evil-robot-or-spaceship.mp3 │ │ │ ├── 0101_ItsRainingAgain_Supertramp.mp3 │ │ │ ├── 0102_OnlyHappyWhenItRains_Cover.mp3 │ │ │ ├── 0001_intergalactic-comm-scifi-8238.mp3 │ │ │ └── Legal.md │ │ └── 0001_success_02-68338.mp3 │ ├── .editorconfig │ ├── lib │ │ ├── FastCRC │ │ │ ├── .piopm │ │ │ ├── library.properties │ │ │ ├── library.json │ │ │ ├── LICENCE.md │ │ │ ├── keywords.txt │ │ │ ├── README.md │ │ │ └── FastCRC_cpu.h │ │ ├── README │ │ ├── JY901_SERIAL │ │ │ ├── keywords.txt │ │ │ ├── JY901.cpp │ │ │ └── JY901.h │ │ └── JY901_I2C │ │ │ ├── JY901.cpp │ │ │ └── JY901.h │ ├── .gitignore │ ├── src │ │ ├── imu.h │ │ ├── ui_board.cpp │ │ ├── imu │ │ │ ├── MPU9250 │ │ │ │ └── imu.cpp │ │ │ ├── WT901_I2C │ │ │ │ └── imu.cpp │ │ │ ├── WT901_SERIAL │ │ │ │ └── imu.cpp │ │ │ └── LSM6DSO │ │ │ │ └── imu.cpp │ │ ├── pins.h │ │ └── ui_board.h │ ├── test │ │ └── README │ ├── include │ │ ├── README │ │ └── debug.h │ └── platformio.ini ├── TestMPU9250 │ ├── .gitignore │ ├── test │ │ └── README │ ├── lib │ │ └── README │ ├── platformio.ini │ ├── include │ │ └── README │ └── src │ │ └── main.cpp └── SerialRedirect │ ├── bin │ └── SerialRedirect.ino.rpipico.uf2 │ └── SerialRedirect.ino ├── .github └── FUNDING.yml ├── Changelog.md └── configs └── RaspberryPiConfig └── config.txt /utils/mag_calibration/.gitignore: -------------------------------------------------------------------------------- 1 | fit.log 2 | -------------------------------------------------------------------------------- /img/mainboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/img/mainboard.jpg -------------------------------------------------------------------------------- /img/open_mower_app_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/img/open_mower_app_1.jpg -------------------------------------------------------------------------------- /img/open_mower_app_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/img/open_mower_app_2.jpg -------------------------------------------------------------------------------- /img/open_mower_header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/img/open_mower_header.jpg -------------------------------------------------------------------------------- /utils/mower_buttons/press_s1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rosservice call /mower_service/high_level_control "command: 3" 3 | -------------------------------------------------------------------------------- /utils/mower_buttons/press_s2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rosservice call /mower_service/high_level_control "command: 4" 3 | -------------------------------------------------------------------------------- /img/clion_cmake_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/img/clion_cmake_settings.png -------------------------------------------------------------------------------- /img/open_mower_mainboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/img/open_mower_mainboard.jpg -------------------------------------------------------------------------------- /utils/mower_buttons/press_home.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rosservice call /mower_service/high_level_control "command: 2" 3 | -------------------------------------------------------------------------------- /utils/mower_buttons/press_start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rosservice call /mower_service/high_level_control "command: 1" 3 | -------------------------------------------------------------------------------- /img/dfplayer-clone_cut-pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/img/dfplayer-clone_cut-pin.png -------------------------------------------------------------------------------- /Design/STL/openmower_logo_part_text.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Design/STL/openmower_logo_part_text.stl -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /utils/mag_calibration/example_dataset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/utils/mag_calibration/example_dataset.png -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/020_down.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/020_down.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/021_up.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/021_up.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/020_leiser.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/020_leiser.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/021_lauter.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/021_lauter.mp3 -------------------------------------------------------------------------------- /Design/STL/openmower_logo_part_mower_complete.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Design/STL/openmower_logo_part_mower_complete.stl -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0014_Alarm01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0014_Alarm01.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0015_Alarm02.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0015_Alarm02.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0205_Burp-A2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0205_Burp-A2.mp3 -------------------------------------------------------------------------------- /Firmware/TestMPU9250/.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | .vscode/ 7 | -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/008_stop button.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/008_stop button.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/017_ROS stopped.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/017_ROS stopped.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0008_r2d2-sfx.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0008_r2d2-sfx.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0020_gps-poor.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0020_gps-poor.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0022_gps-good.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0022_gps-good.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0203_wet-fart.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0203_wet-fart.mp3 -------------------------------------------------------------------------------- /Hardware/GPSGroundPlane/GPSGroundPlane-v_0_9_u1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Hardware/GPSGroundPlane/GPSGroundPlane-v_0_9_u1.zip -------------------------------------------------------------------------------- /utils/mag_calibration/plot_mag.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rostopic echo -b $1 -p /mower/imu | sed --expression 's/,/ /g' > /tmp/mag.csv 3 | gnuplot -p plot_mag.gnuplot 4 | -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/0001_success_02-68338.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/0001_success_02-68338.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0012_Pink-Panther.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0012_Pink-Panther.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0200_Minions Fart.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0200_Minions Fart.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0202_Cow-Mooing-C.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0202_Cow-Mooing-C.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0303_Darth-Vader.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0303_Darth-Vader.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0004_computer-heart.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0004_computer-heart.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0021_gps-acceptable.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0021_gps-acceptable.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/013_ups, I did it again.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/013_ups, I did it again.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/023_Emergency cleared.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/023_Emergency cleared.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/023_Notaus aufgehoben.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/023_Notaus aufgehoben.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/024_Not-Aus durch ROS.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/024_Not-Aus durch ROS.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0002_success_02-68338.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0002_success_02-68338.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0007_montage-machine.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0007_montage-machine.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0009_Minion-Fire-Alarm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0009_Minion-Fire-Alarm.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0013_Highway-to-Hell.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0013_Highway-to-Hell.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0201_Sheep-Lamb-Bah-B.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0201_Sheep-Lamb-Bah-B.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0204_vegan-fart-voice.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0204_vegan-fart-voice.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0301_ComingHome_Remix.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0301_ComingHome_Remix.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0302_SweetHomeAlabama.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0302_SweetHomeAlabama.mp3 -------------------------------------------------------------------------------- /Firmware/SerialRedirect/bin/SerialRedirect.ino.rpipico.uf2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/SerialRedirect/bin/SerialRedirect.ino.rpipico.uf2 -------------------------------------------------------------------------------- /Hardware/DockStation/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name "ene9ba_footprint")(type "KiCad")(uri "${KIPRJMOD}/ene9ba_footprint.pretty")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /Hardware/DockStation/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name "ene9ba_library")(type "KiCad")(uri "${KIPRJMOD}/ene9ba_library.kicad_sym")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /Firmware/LowLevel/.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | indent_style = space 4 | indent_size = 4 5 | tab_width = 4 6 | end_of_line = lf 7 | insert_final_newline = true 8 | 9 | -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/001_Hi, I am Steve, your.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/001_Hi, I am Steve, your.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/002_open mower start up .mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/002_open mower start up .mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/003_Initializing robot o.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/003_Initializing robot o.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/004_Starting map area re.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/004_Starting map area re.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/005_waiting for rtk gps .mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/005_waiting for rtk gps .mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/006_calculating map dime.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/006_calculating map dime.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/007_initiate mowing sequ.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/007_initiate mowing sequ.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/009_emergency wheel lift.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/009_emergency wheel lift.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/010_rain detected, headi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/010_rain detected, headi.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/011_open mower has compl.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/011_open mower has compl.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/012_stay back, autononou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/012_stay back, autononou.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/014_Hallo, ich bin Tobi,.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/014_Hallo, ich bin Tobi,.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/015_Hi, I am Tobi, your .mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/015_Hi, I am Tobi, your .mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/001_Hallo, ich bin Steve.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/001_Hallo, ich bin Steve.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/007_Starte den Mähvorgang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/007_Starte den Mähvorgang.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/008_Stop-Taste gedrueckt.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/008_Stop-Taste gedrueckt.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/013_Au-weia, schon wieder.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/013_Au-weia, schon wieder.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/016_ROS startup successful.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/016_ROS startup successful.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/005_Warte auf RTK-GPS Signal.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/005_Warte auf RTK-GPS Signal.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0100_SingingInTheRain_Remix.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0100_SingingInTheRain_Remix.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0300_MamaImComingHome_Demo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0300_MamaImComingHome_Demo.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/019_IMU initialization failed.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/019_IMU initialization failed.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/024_Emergency triggered by ROS.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/024_Emergency triggered by ROS.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0003_scifi_ruined_environment.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0003_scifi_ruined_environment.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0005_evil-robot-or-spaceship.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0005_evil-robot-or-spaceship.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/FastCRC/.piopm: -------------------------------------------------------------------------------- 1 | {"type": "library", "name": "FastCRC", "version": "1.41.0", "spec": {"owner": "frankboesing", "id": 6497, "name": "FastCRC", "requirements": null, "url": null}} -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/018_RPI shut down and powered off.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/018_RPI shut down and powered off.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/022_Switched to english language.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/022_Switched to english language.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/009_Not-Aus durch Rad Hebesensor.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/009_Not-Aus durch Rad Hebesensor.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0101_ItsRainingAgain_Supertramp.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0101_ItsRainingAgain_Supertramp.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0102_OnlyHappyWhenItRains_Cover.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0102_OnlyHappyWhenItRains_Cover.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/022_auf deutsche sprache umgestellt.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/022_auf deutsche sprache umgestellt.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/025_Not-Aus durch Kollisionssensor.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/025_Not-Aus durch Kollisionssensor.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/0001_intergalactic-comm-scifi-8238.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/mp3/0001_intergalactic-comm-scifi-8238.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/002_open mower erfolgreich gestartet.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/002_open mower erfolgreich gestartet.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/004_Starte Aufzeichnung des Lageplans.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/004_Starte Aufzeichnung des Lageplans.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/006_Berechne Abmessungen des Lageplans.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/006_Berechne Abmessungen des Lageplans.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/003_Initialisiere Roboter Betriebssystem.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/003_Initialisiere Roboter Betriebssystem.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/025_Emergency triggered by collision sensor.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/01/025_Emergency triggered by collision sensor.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/011_open-mower hat das Rasenmähen beendet.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/011_open-mower hat das Rasenmähen beendet.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/017_Das Roboter Betriebssystem wurde gestoppt.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/017_Das Roboter Betriebssystem wurde gestoppt.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/018_Der Raspberry Pai wurde herunter gefahren.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/018_Der Raspberry Pai wurde herunter gefahren.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/010_Regen festgestellt, fahre zurück zur Basis.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/010_Regen festgestellt, fahre zurück zur Basis.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/012_Vorsicht, autonomer Maehroboter im Einsatz.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/012_Vorsicht, autonomer Maehroboter im Einsatz.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/019_Die IMU Initialisierung ist fehlgeschlagen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/019_Die IMU Initialisierung ist fehlgeschlagen.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/016_Start des Roboter Betriebssystems erfolgreich.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ClemensElflein/OpenMower/HEAD/Firmware/LowLevel/soundfiles/49/016_Start des Roboter Betriebssystems erfolgreich.mp3 -------------------------------------------------------------------------------- /Firmware/LowLevel/.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | .vscode/ 7 | 8 | .idea 9 | 10 | cmake-build* 11 | CMakeLists.txt 12 | CMakeListsPrivate.txt 13 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MAX2040/MAX2040.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP MAX20405AFOF_VY+T 4 | D 36V 4A/5A/6A Sync Low Iq Buck Converter in P90 5 | K 6 | F http://www.maximintegrated.com/MAX20405 7 | $ENDCMP 8 | # 9 | #End Doc Library 10 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TXS0104EPWR/TXS0104EPWR.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP TXS0104EPWR 4 | D TXS0104EPWR, Voltage Level Translator, Open Drain 1.65 3.6 V, 2.3 5.5 V 14-Pin TSSOP 5 | K 6 | F http://www.ti.com/lit/ds/symlink/txs0104e.pdf 7 | $ENDCMP 8 | # 9 | #End Doc Library 10 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/LSM6DSOTR/LSM6DSOTR.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP LSM6DSOTR 4 | D IMUs - Inertial Measurement Units iNEMO inertial module: 3D accelerometer and 3D gyroscope 5 | K 6 | F https://www.st.com/resource/en/datasheet/lsm6dso.pdf 7 | $ENDCMP 8 | # 9 | #End Doc Library 10 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/FastCRC/library.properties: -------------------------------------------------------------------------------- 1 | name=FastCRC 2 | version=1.41 3 | author=Frank Bösing 4 | maintainer=Frank Boesing 5 | sentence=Fast CRC routines 6 | paragraph= 7 | category=Data Processing 8 | url=https://github.com/FrankBoesing/FastCRC 9 | architectures=* 10 | dot_a_linkage=true -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TSC101CILT/TSC101CILT.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP TSC101CILT 4 | D TSC101CILT, Current Sensing Amplifier Single 5-Pin SOT-23 5 | K 6 | F http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00153725.pdf 7 | $ENDCMP 8 | # 9 | #End Doc Library 10 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/74ALVC164245DGG/74ALVC164245DGG_11.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP 74ALVC164245DGG,11 4 | D 74ALVC164245 - 16-bit dual supply translating transceiver; 3-state@en-us 5 | K 6 | F https://assets.nexperia.com/documents/data-sheet/74ALVC164245.pdf 7 | $ENDCMP 8 | # 9 | #End Doc Library 10 | -------------------------------------------------------------------------------- /utils/scripts/redirect_serial.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | trap 'kill %1; kill %2' SIGINT 3 | /usr/bin/socat -b128 -d -d TCP-LISTEN:65102,fork,reuseaddr FILE:/dev/ttyAMA2,b115200,raw & 4 | /usr/bin/socat -b128 -d -d TCP-LISTEN:65103,fork,reuseaddr FILE:/dev/ttyAMA3,b115200,raw & 5 | /usr/bin/socat -b128 -d -d TCP-LISTEN:65104,fork,reuseaddr FILE:/dev/ttyAMA4,b115200,raw 6 | -------------------------------------------------------------------------------- /utils/scripts/upload_firmware.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This script uploads new firmware to the Pico. 4 | # You need to provide the .elf file, not the .uf2 5 | 6 | echo "10" > /sys/class/gpio/export 7 | echo "out" > /sys/class/gpio/gpio10/direction 8 | echo "1" > /sys/class/gpio/gpio10/value 9 | openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg -c "program $1 verify reset exit" 10 | 11 | -------------------------------------------------------------------------------- /utils/scripts/start_openocd.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This script starts OpenOCD on the pi and allows external connections. 4 | # This way you can use VS code to remotely debug the Pico code. 5 | 6 | echo "10" > /sys/class/gpio/export 7 | echo "out" > /sys/class/gpio/gpio10/direction 8 | echo "1" > /sys/class/gpio/gpio10/value 9 | openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg -c "bindto 0.0.0.0" 10 | 11 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/imu.h: -------------------------------------------------------------------------------- 1 | #ifndef _IMU_H 2 | #define _IMU_H 3 | 4 | bool init_imu(); 5 | 6 | bool imu_read(float *acceleration_mss,float *gyro_rads,float *mag_uT); 7 | 8 | // call once per loop, used to process serial or do sensor fusion or do nothing. 9 | void imu_loop(); 10 | 11 | #if defined(WT901) || defined(WT901_INSTEAD_OF_SOUND) 12 | bool imu_comms_error(); // get IMU communication error flag (and reset it) 13 | #endif 14 | 15 | #endif -------------------------------------------------------------------------------- /Hardware/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.sch-bak 10 | *~ 11 | _autosave-* 12 | *.tmp 13 | *-save.pro 14 | *-save.kicad_pcb 15 | fp-info-cache 16 | 17 | # Netlist files (exported from Eeschema) 18 | *.net 19 | 20 | # Autorouter files (exported from Pcbnew) 21 | *.dsn 22 | *.ses 23 | 24 | # Exported BOM files 25 | *.xml 26 | *.csv 27 | -------------------------------------------------------------------------------- /Firmware/LowLevel/test/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for PlatformIO Unit Testing and project tests. 3 | 4 | Unit Testing is a software testing method by which individual units of 5 | source code, sets of one or more MCU program modules together with associated 6 | control data, usage procedures, and operating procedures, are tested to 7 | determine whether they are fit for use. Unit testing finds problems early 8 | in the development cycle. 9 | 10 | More information about PlatformIO Unit Testing: 11 | - https://docs.platformio.org/page/plus/unit-testing.html 12 | -------------------------------------------------------------------------------- /Firmware/TestMPU9250/test/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for PlatformIO Unit Testing and project tests. 3 | 4 | Unit Testing is a software testing method by which individual units of 5 | source code, sets of one or more MCU program modules together with associated 6 | control data, usage procedures, and operating procedures, are tested to 7 | determine whether they are fit for use. Unit testing finds problems early 8 | in the development cycle. 9 | 10 | More information about PlatformIO Unit Testing: 11 | - https://docs.platformio.org/page/plus/unit-testing.html 12 | -------------------------------------------------------------------------------- /utils/mag_calibration/plot_mag.gnuplot: -------------------------------------------------------------------------------- 1 | f(x,y) = (x-bx)*(x-bx) + (y-by)*(y-by) - r 2 | fit f(x, y) '/tmp/mag.csv' u 9:10:(0) via bx,by,r 3 | 4 | set xr [-50:50] 5 | set yr [-50:50] 6 | 7 | set contour 8 | set view map 9 | unset surface 10 | set cntrparam levels discrete 0 11 | set isosamples 1000,1000 12 | 13 | set table '/tmp/contour.dat' 14 | splot f(x, y) 15 | 16 | unset table 17 | unset contour 18 | 19 | #stats '/tmp/mag.csv' using 9:10 20 | 21 | set grid 22 | set size square 23 | 24 | 25 | plot \ 26 | '/tmp/mag.csv' using 9:10 with points, \ 27 | '/tmp/contour.dat' u 1:2 w l lw 2 lc rgb 'red' 28 | 29 | 30 | -------------------------------------------------------------------------------- /Hardware/DockStation/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: https://www.kicad.org/ 2 | # Format documentation: https://kicad.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.kicad_sch-bak 10 | *-backups 11 | *.kicad_prl 12 | *.sch-bak 13 | *~ 14 | _autosave-* 15 | *.tmp 16 | *-save.pro 17 | *-save.kicad_pcb 18 | fp-info-cache 19 | 20 | *-backups/ 21 | 22 | # Netlist files (exported from Eeschema) 23 | *.net 24 | 25 | # Autorouter files (exported from Pcbnew) 26 | *.dsn 27 | *.ses 28 | 29 | # Exported BOM files 30 | *.xml 31 | *.csv 32 | 33 | replicate_layout.log 34 | 35 | release 36 | release_navigator 37 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/FastCRC/library.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "FastCRC", 3 | "keywords": "CRC7, CRC8, CRC16, CRC32", 4 | "description": "Fast CRC routines for Arduino and PC (Teensy 3.x: CRC in hardware)", 5 | "exclude": [ 6 | "examples", 7 | "examples_PC" 8 | ], 9 | "repository": 10 | { 11 | "type": "git", 12 | "url": "https://github.com/FrankBoesing/FastCRC" 13 | }, 14 | "authors": 15 | [ 16 | { 17 | "name": "Frank Bösing", 18 | "email": "f.boesing@gmx.de", 19 | "url": "https://github.com/FrankBoesing/FastCRC", 20 | "maintainer": true 21 | } 22 | ], 23 | "version": "1.41", 24 | "frameworks": "arduino", 25 | "platforms": "*" 26 | } 27 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: ClemensElflein 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: https://www.kicad.org/ 2 | # Format documentation: https://kicad.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.kicad_sch-bak 10 | *-backups 11 | *.kicad_prl 12 | *.sch-bak 13 | *.kicad_pro-bak 14 | *~ 15 | _autosave-* 16 | *.tmp 17 | *.lck 18 | *-save.pro 19 | *-save.kicad_pcb 20 | fp-info-cache 21 | 22 | # Netlist files (exported from Eeschema) 23 | *.net 24 | 25 | # Autorouter files (exported from Pcbnew) 26 | *.dsn 27 | *.ses 28 | 29 | # Exported BOM files 30 | *.xml 31 | *.csv 32 | 33 | replicate_layout.log 34 | 35 | MyModules3d/ 36 | 37 | release 38 | release_navigator 39 | jlcpcb 40 | Gerber 41 | OpenMowerMainboard-drc.txt 42 | OpenMowerMainboard-erc.txt 43 | kibot_errors.filter 44 | 45 | .kidiff 46 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/ui_board.cpp: -------------------------------------------------------------------------------- 1 | #include "ui_board.h" 2 | 3 | void setLed(struct msg_set_leds &msg, int led, uint8_t state) { 4 | // mask the current led state 5 | uint64_t mask = ~(((uint64_t)0b111) << (led*3)); 6 | msg.leds &= mask; 7 | msg.leds |= ((uint64_t)(state&0b111)) << (led*3); 8 | } 9 | 10 | void setBars7(struct msg_set_leds &msg, double value) { 11 | int on_leds = round(value * 7.0); 12 | for(int i = 0; i < 7; i++) { 13 | setLed(msg, LED11-i, i < on_leds ? LED_on : LED_off); 14 | } 15 | } 16 | 17 | void setBars4(struct msg_set_leds &msg, double value) { 18 | if(value < 0) { 19 | for(int i = 0; i < 4; i++) { 20 | setLed(msg, i+LED15, LED_blink_fast); 21 | } 22 | } else { 23 | int on_leds = round(value * 4.0); 24 | for(int i = 0; i < 4; i++) { 25 | setLed(msg, LED18-i, i < on_leds ? LED_on : LED_off); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /Firmware/SerialRedirect/SerialRedirect.ino: -------------------------------------------------------------------------------- 1 | /** 2 | * Use this Arduino Sketch to turn on your Raspberry Pi and redirect the console via USB. 3 | * 4 | */ 5 | void setup() { 6 | Serial.begin(115200); 7 | Serial1.begin(115200); 8 | 9 | pinMode(21, OUTPUT); 10 | // Disable Raspi 11 | digitalWrite(21, LOW); 12 | 13 | // Wait for Serial to be available 14 | while(!Serial); 15 | delay(1000); 16 | 17 | // Drain serial input 18 | while(Serial.available()) 19 | Serial.read(); 20 | 21 | do { 22 | Serial.println("Send anything to start Raspi"); 23 | delay(1000); 24 | } while(!Serial.available()); 25 | 26 | // Drain serial input again 27 | while(Serial.available()) 28 | Serial.read(); 29 | 30 | // Enable Raspi 31 | digitalWrite(21, HIGH); 32 | } 33 | 34 | void loop() { 35 | // redirect serial interface 36 | while(Serial.available()) 37 | Serial1.write(Serial.read()); 38 | while(Serial1.available()) 39 | Serial.write(Serial1.read()); 40 | } 41 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (version 7) 3 | (lib (name "Arduino")(type "KiCad")(uri "${KIPRJMOD}/Arduino.pretty")(options "")(descr "")) 4 | (lib (name "MyModules")(type "KiCad")(uri "${KIPRJMOD}/MyModules.pretty")(options "")(descr "")) 5 | (lib (name "xESC2")(type "KiCad")(uri "${KIPRJMOD}/xESC2.pretty")(options "")(descr "")) 6 | (lib (name "WTV020")(type "KiCad")(uri "${KIPRJMOD}/WTV020.pretty")(options "")(descr "")) 7 | (lib (name "MCU_RaspberryPi_and_Boards")(type "KiCad")(uri "${KIPRJMOD}/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.pretty")(options "")(descr "")) 8 | (lib (name "74ALVC164245DGG")(type "KiCad")(uri "${KIPRJMOD}/74ALVC164245DGG")(options "")(descr "")) 9 | (lib (name "TSC101CILT")(type "KiCad")(uri "${KIPRJMOD}/TSC101CILT")(options "")(descr "")) 10 | (lib (name "PicoW")(type "KiCad")(uri "${KIPRJMOD}/RP-PicoW Libraries/Module.pretty")(options "")(descr "")) 11 | (lib (name "lcsc")(type "KiCad")(uri "${KIPRJMOD}/lcsc.pretty")(options "")(descr "")) 12 | (lib (name "MAX2040")(type "KiCad")(uri "${KIPRJMOD}/MAX2040")(options "")(descr "")) 13 | ) 14 | -------------------------------------------------------------------------------- /Hardware/DockStation/ene9ba_library.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # Conn_01x04 5 | # 6 | DEF Conn_01x04 J 0 40 Y N 1 F N 7 | F0 "J" 0 200 50 H V C CNN 8 | F1 "Conn_01x04" 0 -300 50 H V C CNN 9 | F2 "" 0 0 50 H I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | $FPLIST 12 | Connector*:*_1x??_* 13 | $ENDFPLIST 14 | DRAW 15 | S -50 -195 0 -205 1 1 6 N 16 | S -50 -95 0 -105 1 1 6 N 17 | S -50 5 0 -5 1 1 6 N 18 | S -50 105 0 95 1 1 6 N 19 | S -50 150 50 -250 1 1 10 f 20 | X Pin_1 1 -200 100 150 R 50 50 1 1 P 21 | X Pin_2 2 -200 0 150 R 50 50 1 1 P 22 | X Pin_3 3 -200 -100 150 R 50 50 1 1 P 23 | X Pin_4 4 -200 -200 150 R 50 50 1 1 P 24 | ENDDRAW 25 | ENDDEF 26 | # 27 | # DC-DC-Wandler 28 | # 29 | DEF DC-DC-Wandler A 0 40 Y Y 1 F N 30 | F0 "A" 50 100 50 H V C CNN 31 | F1 "DC-DC-Wandler" 400 400 50 H V C CNN 32 | F2 "" 0 0 50 H I C CNN 33 | F3 "" 0 0 50 H I C CNN 34 | DRAW 35 | S 0 500 750 50 0 1 0 N 36 | X Vin+ 1 -100 300 100 R 50 50 1 1 W 37 | X Vin- 2 -100 200 100 R 50 50 1 1 W 38 | X Vout+ 3 850 300 100 L 50 50 1 1 w 39 | X Vout- 4 850 200 100 L 50 50 1 1 w 40 | ENDDRAW 41 | ENDDEF 42 | # 43 | #End Library 44 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MyModules.pretty/.gitignore: -------------------------------------------------------------------------------- 1 | # Available at GrabCAD: https://grabcad.com/library/mpu-9250-1 2 | MPU-9250.stp 3 | 4 | # Available at GrabCAD: https://grabcad.com/library/raspberry-pi-4-model-b-1 5 | Raspberry Pi 4 Model B.STEP 6 | 7 | # Available at GrabCAD: https://grabcad.com/library/raspberry-pi-pico-r3-1 8 | Raspberry Pi Pico-R3.STEP 9 | 10 | # Available at GrabCAD: https://grabcad.com/library/dfplayer-mini-3 11 | DFPlayer Mini Assem v1.step 12 | 13 | # Available at GrabCAD: https://grabcad.com/library/fuse-5x20-with-clips-1 14 | Fuse Holder.STEP 15 | 16 | # Available at GrabCAD: https://grabcad.com/library/ic-packages-tssop-1 17 | TSSOP-48.stp 18 | 19 | # Available at Molex 20 | # https://www.molex.com/molex/products/part-detail/pcb_headers/0039281023 21 | # https://www.molex.com/molex/products/part-detail/pcb_headers/0039281083 22 | # https://www.molex.com/molex/products/part-detail/pcb_headers/0039281223 23 | 039281023.stp 24 | 039281083.stp 25 | 039281223.stp 26 | 27 | 28 | # Available at GrabCAD: https://grabcad.com/library/inductor-wurth-elektronik-74437324100-1 29 | WE_Inductor_4020.STEP 30 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TSC101CILT/TSC101CILT.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | #SamacSys ECAD Model TSC101CILT 4 | #/154176/101608/2.49/5/3/Integrated Circuit 5 | DEF TSC101CILT IC 0 30 Y Y 1 F N 6 | F0 "IC" 850 300 50 H V L CNN 7 | F1 "TSC101CILT" 850 200 50 H V L CNN 8 | F2 "SOT95P280X145-5N" 850 100 50 H I L CNN 9 | F3 "http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00153725.pdf" 850 0 50 H I L CNN 10 | F4 "TSC101CILT, Current Sensing Amplifier Single 5-Pin SOT-23" 850 -100 50 H I L CNN "Description" 11 | F5 "1.45" 850 -200 50 H I L CNN "Height" 12 | F6 "" 850 -300 50 H I L CNN "Mouser2 Part Number" 13 | F7 "" 850 -400 50 H I L CNN "Mouser2 Price/Stock" 14 | F8 "STMicroelectronics" 850 -500 50 H I L CNN "Manufacturer_Name" 15 | F9 "TSC101CILT" 850 -600 50 H I L CNN "Manufacturer_Part_Number" 16 | DRAW 17 | X OUT 1 0 0 200 R 50 50 0 0 O 18 | X GND 2 0 -100 200 R 50 50 0 0 W 19 | X VP 3 0 -200 200 R 50 50 0 0 P 20 | X VM 4 1000 0 200 L 50 50 0 0 P 21 | X VCC 5 1000 -100 200 L 50 50 0 0 W 22 | P 5 0 1 6 200 100 800 100 800 -300 200 -300 200 100 N 23 | ENDDRAW 24 | ENDDEF 25 | # 26 | #End Library 27 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/FastCRC/LICENCE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Frank 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/imu/MPU9250/imu.cpp: -------------------------------------------------------------------------------- 1 | #include "imu.h" 2 | #include "pins.h" 3 | #include 4 | 5 | MPU9250 IMU(SPI, PIN_IMU_CS); 6 | 7 | bool init_imu() 8 | { 9 | int status = IMU.begin(); 10 | if (status < 0) 11 | return false; 12 | 13 | // setting DLPF bandwidth to 20 Hz 14 | IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ); 15 | 16 | return true; 17 | } 18 | 19 | bool imu_read(float *acceleration_mss, float *gyro_rads, float *mag_uT) 20 | { 21 | IMU.readSensor(); 22 | 23 | // TODO: test this 24 | // Left down: Y = -g 25 | acceleration_mss[1] = -IMU.getAccelX_mss(); 26 | // Nose down: X = -g 27 | acceleration_mss[0] = IMU.getAccelY_mss(); 28 | // Flat: Z = +g 29 | acceleration_mss[2] = IMU.getAccelZ_mss(); 30 | 31 | // MPU-9250 Datasheet shows gyro and acceleromter axes are aligned 32 | gyro_rads[1] = -IMU.getGyroX_rads(); 33 | gyro_rads[0] = IMU.getGyroY_rads(); 34 | gyro_rads[2] = -IMU.getGyroZ_rads(); 35 | 36 | // Mag is NED coordinates 37 | mag_uT[0] = IMU.getMagX_uT(); 38 | mag_uT[1] = IMU.getMagY_uT(); 39 | mag_uT[2] = IMU.getMagZ_uT(); 40 | 41 | return true; 42 | } 43 | 44 | void imu_loop() { 45 | 46 | } 47 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /Firmware/TestMPU9250/lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/imu/WT901_I2C/imu.cpp: -------------------------------------------------------------------------------- 1 | #include "imu.h" 2 | #include "pins.h" 3 | #include "Wire.h" 4 | #include 5 | 6 | CJY901 IMU = CJY901(&WT901_WIRE); 7 | 8 | bool init_imu() 9 | { 10 | WT901_WIRE.setSDA(PIN_WT901_SDA); 11 | WT901_WIRE.setSCL(PIN_WT901_SCL); 12 | 13 | 14 | IMU.StartIIC(); 15 | 16 | return true; 17 | } 18 | 19 | bool imu_read(float *acceleration_mss, float *gyro_rads, float *mag_uT) 20 | { 21 | IMU.GetTime(); 22 | IMU.GetAcc(); 23 | IMU.GetMag(); 24 | IMU.GetGyro(); 25 | 26 | // WT901 axes seem to be corrected? 27 | acceleration_mss[0] = (float)IMU.stcAcc.a[0] / 32768.0f * 16.0f * 9.81f; 28 | acceleration_mss[1] = (float)IMU.stcAcc.a[1] / 32768.0f * 16.0f * 9.81f; 29 | acceleration_mss[2] = (float)IMU.stcAcc.a[2] / 32768.0f * 16.0f * 9.81f; 30 | 31 | gyro_rads[0] = (float)IMU.stcGyro.w[0]/32768.0f*2000.0f * PI / 180.0f; 32 | gyro_rads[1] = (float)IMU.stcGyro.w[1]/32768.0f*2000.0f * PI / 180.0f; 33 | gyro_rads[2] = (float)IMU.stcGyro.w[2]/32768.0f*2000.0f * PI / 180.0f; 34 | 35 | mag_uT[0] = IMU.stcMag.h[0] / 1000.0f; 36 | mag_uT[1] = IMU.stcMag.h[1] / 1000.0f; 37 | mag_uT[2] = IMU.stcMag.h[2] / 1000.0f; 38 | 39 | return true; 40 | } 41 | 42 | void imu_loop() 43 | { 44 | 45 | } -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/mp3/Legal.md: -------------------------------------------------------------------------------- 1 | Questionable sound origins 2 | 3 | | Title | License | Link | 4 | | ----- | ------- | ----------- | 5 | | 0012_Pink-Panther.mp3 | Free Ringtone | https://klingeltonekostenlos.de/pink-panther-1/ | 6 | | 0013_Highway-to-Hell.mp3 | Free / Covered by Philbert Audio | https://soundcloud.com/simonpvo/acdc-highway-to-hell | 7 | | 0100_Singin' In The Rain - Gene Kelly.mp3 | Free / The Bangerz Remix | https://soundcloud.com/exit33/singing-in-the-rain-the-bangerz-remix | 8 | | 0101_ItsRainingAgain_Supertramp.mp3 | Freely available @ Internet Archive.org | https://archive.org/details/supertramp-music/Supertramp+-+It's+Raining+Again.mp3 | 9 | | 0102_OnlyHappyWhenItRains_Cover.mp3 | Covered by Giulio Preuch | https://soundcloud.com/giulio-peruch/garbage-only-happy-when-it-rains-cover | 10 | | 0206_Darth-Vader.mp3 | Free Ringtone | https://klingeltonekostenlos.de/darth-vader/ | 11 | | 0300_MamaImComingHome_Demo.mp3 | Public Available Demo | Shortened from https://open.spotify.com/intl-de/track/1yQiYwG2N8WiWHlhj3CX3T Demo | 12 | | 0301_ComingHome_Remix.mp3 | Free / Remix | https://www.reverbnation.com/n3xg3nmusik/song/9300198-diddy-dirty-money-coming-home-zouk | 13 | | 0302_SweetHomeAlabama.mp3 | Freely available @ Internet Archive.org | https://archive.org/details/lynyrd.-skynyrd.2/Lynyrd+Skynyrd+2/Lynyrd+Skynyrd+2/01+Sweet+Home+Alabama.wav | 14 | -------------------------------------------------------------------------------- /Firmware/TestMPU9250/platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | 12 | [env:pico] 13 | platform = https://github.com/maxgerhardt/platform-raspberrypi.git 14 | board = pico 15 | framework = arduino 16 | board_build.core = earlephilhower 17 | 18 | lib_deps = 19 | Wire 20 | SPI 21 | bolderflight/Bolder Flight Systems MPU9250@^1.0.2 22 | 23 | 24 | ; 133MHz 25 | board_build.f_cpu = 133000000L 26 | 27 | ; note that download link for toolchain is specific for OS. see https://github.com/earlephilhower/pico-quick-toolchain/releases. 28 | platform_packages = 29 | maxgerhardt/framework-arduinopico@https://github.com/earlephilhower/arduino-pico.git 30 | maxgerhardt/toolchain-pico@https://github.com/earlephilhower/pico-quick-toolchain/releases/download/1.3.3-a/x86_64-linux-gnu.arm-none-eabi-ed6d983.220212.tar.gz 31 | ; maxgerhardt/toolchain-pico@https://github.com/earlephilhower/pico-quick-toolchain/releases/download/1.3.1-a/x86_64-w64-mingw32.arm-none-eabi-7855b0c.210706.zip 32 | 33 | ; needed so that tinyusb is not added to dependency list (we don't want to use it.) 34 | lib_ldf_mode = off 35 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/imu/WT901_SERIAL/imu.cpp: -------------------------------------------------------------------------------- 1 | #include "imu.h" 2 | #include "pins.h" 3 | #include 4 | 5 | #ifdef WT901_INSTEAD_OF_SOUND 6 | CJY901 IMU(&Serial2); 7 | #elif WT901 8 | SerialPIO imuSerial(PIN_WT901_TX, PIN_WT901_RX, 250); // set hardware pin 9 | CJY901 IMU(&imuSerial); 10 | #endif 11 | 12 | bool init_imu() 13 | { 14 | #ifdef WT901_INSTEAD_OF_SOUND 15 | Serial2.setRX(PIN_WT901_RX); // set hardware pin 16 | Serial2.setTX(PIN_WT901_TX); 17 | #endif 18 | 19 | IMU.begin(); 20 | 21 | return true; 22 | } 23 | 24 | bool imu_read(float *acceleration_mss, float *gyro_rads, float *mag_uT) 25 | { 26 | // WT901 axes seem to be corrected? 27 | acceleration_mss[0] = (float)IMU.stcAcc.a[0] / 32768.0f * 16.0f * 9.81f; 28 | acceleration_mss[1] = (float)IMU.stcAcc.a[1] / 32768.0f * 16.0f * 9.81f; 29 | acceleration_mss[2] = (float)IMU.stcAcc.a[2] / 32768.0f * 16.0f * 9.81f; 30 | 31 | gyro_rads[0] = (float)IMU.stcGyro.w[0]/32768.0f*2000.0f * PI / 180.0f; 32 | gyro_rads[1] = (float)IMU.stcGyro.w[1]/32768.0f*2000.0f * PI / 180.0f; 33 | gyro_rads[2] = (float)IMU.stcGyro.w[2]/32768.0f*2000.0f * PI / 180.0f; 34 | 35 | mag_uT[0] = IMU.stcMag.h[0] / 1000.0f; 36 | mag_uT[1] = IMU.stcMag.h[1] / 1000.0f; 37 | mag_uT[2] = IMU.stcMag.h[2] / 1000.0f; 38 | 39 | return true; 40 | } 41 | 42 | void imu_loop() 43 | { 44 | IMU.update(); 45 | } 46 | 47 | bool imu_comms_error() 48 | { 49 | return IMU.commsError(); 50 | } -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name "arduino")(type "Legacy")(uri "${KIPRJMOD}/arduino.lib")(options "")(descr "")) 3 | (lib (name "MyModules")(type "KiCad")(uri "${KIPRJMOD}/MyModules.kicad_sym")(options "")(descr "")) 4 | (lib (name "MCU_RaspberryPi_and_Boards")(type "Legacy")(uri "${KIPRJMOD}/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.lib")(options "")(descr "")) 5 | (lib (name "OpenMowerMainboardLib")(type "KiCad")(uri "${KIPRJMOD}/OpenMowerMainboardLib.kicad_sym")(options "")(descr "")) 6 | (lib (name "xESC2")(type "KiCad")(uri "${KIPRJMOD}/xESC2.kicad_sym")(options "")(descr "")) 7 | (lib (name "TXS0104EPWR")(type "Legacy")(uri "${KIPRJMOD}/TXS0104EPWR/TXS0104EPWR.lib")(options "")(descr "")) 8 | (lib (name "74ALVC164245DGG_11")(type "Legacy")(uri "${KIPRJMOD}/74ALVC164245DGG/74ALVC164245DGG_11.lib")(options "")(descr "")) 9 | (lib (name "TSC101CILT")(type "Legacy")(uri "${KIPRJMOD}/TSC101CILT/TSC101CILT.lib")(options "")(descr "")) 10 | (lib (name "MAX2040")(type "Legacy")(uri "${KIPRJMOD}/MAX2040/MAX2040.lib")(options "")(descr "")) 11 | (lib (name "PicoW")(type "KiCad")(uri "${KIPRJMOD}/RP-PicoW Libraries/MCU_Module.kicad_sym")(options "")(descr "")) 12 | (lib (name "lcsc")(type "KiCad")(uri "${KIPRJMOD}/lcsc.kicad_sym")(options "")(descr "Import using 'easyeda2kicad --full --lcsc_id=Cxxxxx --output ./lcsc'")) 13 | (lib (name "LSM6DSOTR")(type "Legacy")(uri "${KIPRJMOD}/LSM6DSOTR/LSM6DSOTR.lib")(options "")(descr "")) 14 | ) 15 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/FastCRC/keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For FastCRC 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | FastCRC7 KEYWORD1 10 | FastCRC8 KEYWORD1 11 | FastCRC14 KEYWORD1 12 | FastCRC16 KEYWORD1 13 | FastCRC32 KEYWORD1 14 | CRC7 KEYWORD1 15 | CRC8 KEYWORD1 16 | CRC14 KEYWORD1 17 | CRC16 KEYWORD1 18 | CRC32 KEYWORD1 19 | 20 | ####################################### 21 | # Methods and Functions (KEYWORD2) 22 | ####################################### 23 | crc7 KEYWORD2 24 | crc7_upd KEYWORD2 25 | ccitt KEYWORD2 26 | ccitt_upd KEYWORD2 27 | kermit KEYWORD2 28 | kermit_upd KEYWORD2 29 | mcrf4xx KEYWORD2 30 | mcrf4xx_upd KEYWORD2 31 | modbus KEYWORD2 32 | modbus_upd KEYWORD2 33 | xmodem KEYWORD2 34 | xmodem_upd KEYWORD2 35 | x25 KEYWORD2 36 | x25_upd KEYWORD2 37 | update KEYWORD2 38 | update_upd KEYWORD2 39 | generic KEYWORD2 40 | crc32 KEYWORD2 41 | crc32_upd KEYWORD2 42 | cksum KEYWORD2 43 | cksum_upd KEYWORD2 44 | darc KEYWORD2 45 | darc_upd KEYWORD2 46 | gsm KEYWORD2 47 | gsm_upd KEYWORD2 48 | eloran KEYWORD2 49 | eloran_upd KEYWORD2 50 | 51 | ####################################### 52 | # Constants (LITERAL1) 53 | ####################################### 54 | 55 | CRC_FLAG_NOREFLECT LITERAL1 56 | CRC_FLAG_REFLECT LITERAL1 57 | CRC_FLAG_XOR LITERAL1 58 | CRC_FLAG_NOREFLECT_8 LITERAL1 59 | CRC_FLAG_REFLECT_SWAP LITERAL1 60 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/lcsc.pretty/F1206.kicad_mod: -------------------------------------------------------------------------------- 1 | (module easyeda2kicad:F1206 (layer F.Cu) (tedit 5DC5F6A4) 2 | (attr smd) 3 | (fp_text reference REF** (at 0 -4.0) (layer F.SilkS) 4 | (effects (font (size 1 1) (thickness 0.15))) 5 | ) 6 | (fp_text value F1206 (at 0 4.0) (layer F.Fab) 7 | (effects (font (size 1 1) (thickness 0.15))) 8 | ) 9 | (fp_text user %R (at 0 0) (layer F.Fab) 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | ) 12 | (fp_line (start -0.93 -1.09) (end -2.12 -1.09) (layer F.SilkS) (width 0.15)) 13 | (fp_line (start 0.93 -1.09) (end 2.12 -1.09) (layer F.SilkS) (width 0.15)) 14 | (fp_line (start -2.27 -0.94) (end -2.27 0.94) (layer F.SilkS) (width 0.15)) 15 | (fp_line (start 2.27 -0.94) (end 2.27 0.94) (layer F.SilkS) (width 0.15)) 16 | (fp_line (start -2.12 1.09) (end -0.93 1.09) (layer F.SilkS) (width 0.15)) 17 | (fp_line (start 2.12 1.09) (end 0.93 1.09) (layer F.SilkS) (width 0.15)) 18 | (pad 1 smd rect (at -1.45 0.00 0.00) (size 1.19 1.73) (layers F.Cu F.Paste F.Mask)) 19 | (pad 2 smd rect (at 1.45 0.00 0.00) (size 1.19 1.73) (layers F.Cu F.Paste F.Mask)) 20 | (fp_circle (center -1.60 0.80) (end -1.57 0.80) (layer F.Fab) (width 0.06)) 21 | (fp_arc (start 0.73 -0.42) (end 0.00 -0.84) (angle -60.00) (layer F.SilkS) (width 0.08)) 22 | (fp_arc (start -0.73 0.42) (end 0.00 0.84) (angle -60.00) (layer F.SilkS) (width 0.08)) 23 | (model "/lcsc.3dshapes/F1206_L3.2-W1.7-H0.6.wrl" 24 | (offset (xyz 0.000 -0.000 -0.000)) 25 | (scale (xyz 1 1 1)) 26 | (rotate (xyz 0 0 0)) 27 | ) 28 | ) -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TSC101CILT/TSC101CILT.mod: -------------------------------------------------------------------------------- 1 | PCBNEW-LibModule-V1 2022-01-28 11:40:46 2 | # encoding utf-8 3 | Units mm 4 | $INDEX 5 | SOT95P280X145-5N 6 | $EndINDEX 7 | $MODULE SOT95P280X145-5N 8 | Po 0 0 0 15 61f3d63e 00000000 ~~ 9 | Li SOT95P280X145-5N 10 | Cd SOT23-5 11 | Kw Integrated Circuit 12 | Sc 0 13 | At SMD 14 | AR 15 | Op 0 0 0 16 | T0 0 0 1.27 1.27 0 0.254 N V 21 N "IC**" 17 | T1 0 0 1.27 1.27 0 0.254 N I 21 N "SOT95P280X145-5N" 18 | DS -2.125 -1.75 2.125 -1.75 0.05 24 19 | DS 2.125 -1.75 2.125 1.75 0.05 24 20 | DS 2.125 1.75 -2.125 1.75 0.05 24 21 | DS -2.125 1.75 -2.125 -1.75 0.05 24 22 | DS -0.812 -1.45 0.812 -1.45 0.1 24 23 | DS 0.812 -1.45 0.812 1.45 0.1 24 24 | DS 0.812 1.45 -0.812 1.45 0.1 24 25 | DS -0.812 1.45 -0.812 -1.45 0.1 24 26 | DS -0.812 -0.5 0.138 -1.45 0.1 24 27 | DS -0.375 -1.45 0.375 -1.45 0.2 21 28 | DS 0.375 -1.45 0.375 1.45 0.2 21 29 | DS 0.375 1.45 -0.375 1.45 0.2 21 30 | DS -0.375 1.45 -0.375 -1.45 0.2 21 31 | DS -1.875 -1.5 -0.725 -1.5 0.2 21 32 | $PAD 33 | Po -1.3 -0.95 34 | Sh "1" R 0.6 1.15 0 0 900 35 | At SMD N 00888000 36 | Ne 0 "" 37 | $EndPAD 38 | $PAD 39 | Po -1.3 0 40 | Sh "2" R 0.6 1.15 0 0 900 41 | At SMD N 00888000 42 | Ne 0 "" 43 | $EndPAD 44 | $PAD 45 | Po -1.3 0.95 46 | Sh "3" R 0.6 1.15 0 0 900 47 | At SMD N 00888000 48 | Ne 0 "" 49 | $EndPAD 50 | $PAD 51 | Po 1.3 0.95 52 | Sh "4" R 0.6 1.15 0 0 900 53 | At SMD N 00888000 54 | Ne 0 "" 55 | $EndPAD 56 | $PAD 57 | Po 1.3 -0.95 58 | Sh "5" R 0.6 1.15 0 0 900 59 | At SMD N 00888000 60 | Ne 0 "" 61 | $EndPAD 62 | $EndMODULE SOT95P280X145-5N 63 | $EndLIBRARY 64 | -------------------------------------------------------------------------------- /Firmware/LowLevel/include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /Firmware/TestMPU9250/include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TXS0104EPWR/TXS0104EPWR.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | #SamacSys ECAD Model TXS0104EPWR 4 | #/182924/101608/2.49/14/3/Integrated Circuit 5 | DEF TXS0104EPWR IC 0 30 Y Y 1 F N 6 | F0 "IC" 950 300 50 H V L CNN 7 | F1 "TXS0104EPWR" 950 200 50 H V L CNN 8 | F2 "SOP65P640X120-14N" 950 100 50 H I L CNN 9 | F3 "http://www.ti.com/lit/ds/symlink/txs0104e.pdf" 950 0 50 H I L CNN 10 | F4 "TXS0104EPWR, Voltage Level Translator, Open Drain 1.65 3.6 V, 2.3 5.5 V 14-Pin TSSOP" 950 -100 50 H I L CNN "Description" 11 | F5 "1.2" 950 -200 50 H I L CNN "Height" 12 | F6 "595-TXS0104EPWR" 950 -300 50 H I L CNN "Mouser Part Number" 13 | F7 "https://www.mouser.co.uk/ProductDetail/Texas-Instruments/TXS0104EPWR?qs=7kv20MEVUlglsv2MH6ZndA%3D%3D" 950 -400 50 H I L CNN "Mouser Price/Stock" 14 | F8 "Texas Instruments" 950 -500 50 H I L CNN "Manufacturer_Name" 15 | F9 "TXS0104EPWR" 950 -600 50 H I L CNN "Manufacturer_Part_Number" 16 | DRAW 17 | X VCCA 1 0 0 200 R 50 50 0 0 P 18 | X A1 2 0 -100 200 R 50 50 0 0 P 19 | X A2 3 0 -200 200 R 50 50 0 0 P 20 | X A3 4 0 -300 200 R 50 50 0 0 P 21 | X A4 5 0 -400 200 R 50 50 0 0 P 22 | X NC_1 6 0 -500 200 R 50 50 0 0 P 23 | X GND 7 0 -600 200 R 50 50 0 0 P 24 | X VCCB 14 1100 0 200 L 50 50 0 0 P 25 | X B1 13 1100 -100 200 L 50 50 0 0 P 26 | X B2 12 1100 -200 200 L 50 50 0 0 P 27 | X B3 11 1100 -300 200 L 50 50 0 0 P 28 | X B4 10 1100 -400 200 L 50 50 0 0 P 29 | X NC_2 9 1100 -500 200 L 50 50 0 0 P 30 | X OE 8 1100 -600 200 L 50 50 0 0 P 31 | P 5 0 1 6 200 100 900 100 900 -700 200 -700 200 100 N 32 | ENDDRAW 33 | ENDDEF 34 | # 35 | #End Library 36 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/LSM6DSOTR/LSM6DSOTR.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | #SamacSys ECAD Model LSM6DSOTR 4 | #/1490857/101608/2.49/14/4/Accelerometer 5 | DEF LSM6DSOTR AC 0 30 Y Y 1 F N 6 | F0 "AC" 1250 600 50 H V L CNN 7 | F1 "LSM6DSOTR" 1250 500 50 H V L CNN 8 | F2 "LGA-14(2.5X3X0.86)" 1250 400 50 H I L CNN 9 | F3 "https://www.st.com/resource/en/datasheet/lsm6dso.pdf" 1250 300 50 H I L CNN 10 | F4 "IMUs - Inertial Measurement Units iNEMO inertial module: 3D accelerometer and 3D gyroscope" 1250 200 50 H I L CNN "Description" 11 | F5 "" 1250 100 50 H I L CNN "Height" 12 | F6 "511-LSM6DSOTR" 1250 0 50 H I L CNN "Mouser Part Number" 13 | F7 "https://www.mouser.co.uk/ProductDetail/STMicroelectronics/LSM6DSOTR?qs=lc2O%252BfHJPVbD197C5c7oNw%3D%3D" 1250 -100 50 H I L CNN "Mouser Price/Stock" 14 | F8 "STMicroelectronics" 1250 -200 50 H I L CNN "Manufacturer_Name" 15 | F9 "LSM6DSOTR" 1250 -300 50 H I L CNN "Manufacturer_Part_Number" 16 | DRAW 17 | X SDO/SA0 1 0 0 200 R 50 50 0 0 P 18 | X SDX 2 0 -100 200 R 50 50 0 0 P 19 | X SCX 3 0 -200 200 R 50 50 0 0 P 20 | X INT1 4 0 -300 200 R 50 50 0 0 P 21 | X VDDIO 5 600 -1000 200 U 50 50 0 0 P 22 | X GND_1 6 700 -1000 200 U 50 50 0 0 P 23 | X GND_2 7 800 -1000 200 U 50 50 0 0 P 24 | X VDD 8 1400 -300 200 L 50 50 0 0 P 25 | X INT2 9 1400 -200 200 L 50 50 0 0 P 26 | X OCS_AUX 10 1400 -100 200 L 50 50 0 0 P 27 | X SDO_AUX 11 1400 0 200 L 50 50 0 0 P 28 | X CS 12 800 600 200 D 50 50 0 0 P 29 | X SCL 13 700 600 200 D 50 50 0 0 P 30 | X SDA 14 600 600 200 D 50 50 0 0 P 31 | P 5 0 1 6 200 400 1200 400 1200 -800 200 -800 200 400 N 32 | ENDDRAW 33 | ENDDEF 34 | # 35 | #End Library 36 | -------------------------------------------------------------------------------- /Firmware/TestMPU9250/src/main.cpp: -------------------------------------------------------------------------------- 1 | /** 2 | * This software is used to check MPU9250 modules if they are fake or real. 3 | * If real, LED will stay lit, if fake, the LED will blink. 4 | * Pins: 5 | * VCC=5V 6 | * GND=GND 7 | * SCL=GP18 8 | * SDA=GP19 9 | * AD0=GP16 10 | * NCS=GP17 11 | */ 12 | 13 | #include "Arduino.h" 14 | #include 15 | 16 | MPU9250 IMU(SPI, 17); 17 | 18 | void setup() 19 | { 20 | pinMode(LED_BUILTIN, OUTPUT); 21 | digitalWrite(LED_BUILTIN, HIGH); 22 | 23 | Serial.begin(115200); 24 | } 25 | 26 | bool on = false; 27 | 28 | void loop() 29 | { 30 | 31 | int status = IMU.begin(); 32 | if (status < 0) 33 | { 34 | on = !on; 35 | Serial.println("Fake"); 36 | } 37 | else 38 | { 39 | on = true; 40 | digitalWrite(LED_BUILTIN, on); 41 | 42 | Serial.println("Real"); 43 | for(int i = 0; i < 100; i++) { 44 | IMU.readSensor(); 45 | // display the data 46 | Serial.print(IMU.getAccelX_mss(),6); 47 | Serial.print("\t"); 48 | Serial.print(IMU.getAccelY_mss(),6); 49 | Serial.print("\t"); 50 | Serial.print(IMU.getAccelZ_mss(),6); 51 | Serial.print("\t"); 52 | Serial.print(IMU.getGyroX_rads(),6); 53 | Serial.print("\t"); 54 | Serial.print(IMU.getGyroY_rads(),6); 55 | Serial.print("\t"); 56 | Serial.print(IMU.getGyroZ_rads(),6); 57 | Serial.print("\t"); 58 | Serial.print(IMU.getMagX_uT(),6); 59 | Serial.print("\t"); 60 | Serial.print(IMU.getMagY_uT(),6); 61 | Serial.print("\t"); 62 | Serial.print(IMU.getMagZ_uT(),6); 63 | Serial.print("\t"); 64 | Serial.println(IMU.getTemperature_C(),6); 65 | delay(100); 66 | } 67 | } 68 | digitalWrite(LED_BUILTIN, on); 69 | delay(100); 70 | } -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/49/GoogleTTS_Strings.txt: -------------------------------------------------------------------------------- 1 | -- file leading nr -- ------ string to convert ------------ 2 | 3 | 001 Hallo, ich bin Steve, dein intelligenter Rasemäher, Rasenpflege ist mein Beruf 4 | 002 "open mower" erfolgreich gestartet 5 | 003 Initialisiere Roboter Betriebssystem 6 | 004 Starte Aufzeichnung des Lageplans 7 | 005 Warte auf RTK-GPS Signal 8 | 006 Berechne Abmessungen des Lageplans 9 | 007 Starte den Mähvorgang 10 | 008 Stop-Taste gedrückt 11 | 009 Not-Aus durch Rad Hebesensor 12 | 010 Regen festgestellt, fahre zurück zur Basis 13 | 011 "open mower" hat das Rasenmähen beendet und fährt zurück zu Ladestation 14 | 012 Vorsicht! Autonomer Mähroboter im Einsatz 15 | 013 Au-weia, schon wieder 16 | 016 Start des Roboter Betriebssystems erfolgreich 17 | 017 Das Roboter Betriebssystem wurde gestoppt 18 | 018 Der Raspberry Pai wurde heruntergefahren, Du kannst Deinen open mower nun ausschalten 19 | 019 Die ei-em-ju-Initialisierung ist fehlgeschlagen 20 | 020 leiser 21 | 021 lauter 22 | 022 auf deutsche sprache umgestellt 23 | 023 Notaus aufgehoben 24 | 024 Not-Aus durch Roboter Betriebssystem 25 | 025 Not-Aus durch Kollisionssensor 26 | 27 | 28 | New german adverts sampled via Google TTS with settings: 29 | Language: Deutsch (Deutschland), Neural2, de-DE-Neural2-B 30 | Small home speaker, Speed = 1.00, Pitch 0 31 | 32 | Amplified to a max of -5db 33 | Saved as mono mp3 with medium quality 34 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MAX2040/MAX2040.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | #SamacSys ECAD Model MAX20405AFOF_VY+T 4 | #/15328792/101608/2.49/20/2/Integrated Circuit 5 | DEF MAX20405AFOF_VY+T IC 0 30 Y Y 1 F N 6 | F0 "IC" 1350 300 50 H V L CNN 7 | F1 "MAX20405AFOF_VY+T" 1350 200 50 H V L CNN 8 | F2 "MAX20405AFOFVYT" 1350 100 50 H I L CNN 9 | F3 "http://www.maximintegrated.com/MAX20405" 1350 0 50 H I L CNN 10 | F4 "36V 4A/5A/6A Sync Low Iq Buck Converter in P90" 1350 -100 50 H I L CNN "Description" 11 | F5 "0.8" 1350 -200 50 H I L CNN "Height" 12 | F6 "" 1350 -300 50 H I L CNN "Mouser2 Part Number" 13 | F7 "" 1350 -400 50 H I L CNN "Mouser2 Price/Stock" 14 | F8 "Maxim Integrated" 1350 -500 50 H I L CNN "Manufacturer_Name" 15 | F9 "MAX20405AFOF/VY+T" 1350 -600 50 H I L CNN "Manufacturer_Part_Number" 16 | DRAW 17 | X EN 1 0 0 200 R 50 50 0 0 P 18 | X BST 2 0 -100 200 R 50 50 0 0 P 19 | X SUP_1 3 0 -200 200 R 50 50 0 0 P 20 | X PGND_1 4 0 -300 200 R 50 50 0 0 P 21 | X PGND_2 5 0 -400 200 R 50 50 0 0 P 22 | X LX_1 6 0 -500 200 R 50 50 0 0 P 23 | X PGND_3 7 0 -600 200 R 50 50 0 0 P 24 | X PGND_4 8 0 -700 200 R 50 50 0 0 P 25 | X SUP_2 9 0 -800 200 R 50 50 0 0 P 26 | X GND 10 0 -900 200 R 50 50 0 0 P 27 | X BIAS 11 1500 0 200 L 50 50 0 0 P 28 | X FB_1 12 1500 -100 200 L 50 50 0 0 P 29 | X OUT 13 1500 -200 200 L 50 50 0 0 P 30 | X VEA 14 1500 -300 200 L 50 50 0 0 P 31 | X PGOOD 15 1500 -400 200 L 50 50 0 0 P 32 | X SYNC 16 1500 -500 200 L 50 50 0 0 P 33 | X SYNCOUT_1 17 1500 -600 200 L 50 50 0 0 P 34 | X SYNCOUT_2 18 1500 -700 200 L 50 50 0 0 P 35 | X LX_2 19 1500 -800 200 L 50 50 0 0 P 36 | X FB_2 20 1500 -900 200 L 50 50 0 0 P 37 | P 5 0 1 6 200 100 1300 100 1300 -1000 200 -1000 200 100 N 38 | ENDDRAW 39 | ENDDEF 40 | # 41 | #End Library 42 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/lcsc.pretty/SW-TH_DA-01BP.kicad_mod: -------------------------------------------------------------------------------- 1 | (module easyeda2kicad:SW-TH_DA-01BP (layer F.Cu) (tedit 5DC5F6A4) 2 | (attr smd) 3 | (fp_text reference REF** (at 0 -4.0) (layer F.SilkS) 4 | (effects (font (size 1 1) (thickness 0.15))) 5 | ) 6 | (fp_text value SW-TH_DA-01BP (at 0 4.0) (layer F.Fab) 7 | (effects (font (size 1 1) (thickness 0.15))) 8 | ) 9 | (fp_text user %R (at 0 0) (layer F.Fab) 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | ) 12 | (fp_line (start -1.27 -2.12) (end -7.47 -2.12) (layer F.SilkS) (width 0.25)) 13 | (fp_line (start -7.47 -2.12) (end -7.47 2.12) (layer F.SilkS) (width 0.25)) 14 | (fp_line (start -7.57 -0.62) (end -8.47 -0.62) (layer F.SilkS) (width 0.25)) 15 | (fp_line (start -8.47 -0.62) (end -8.47 0.28) (layer F.SilkS) (width 0.25)) 16 | (fp_line (start -8.47 0.28) (end -7.57 0.28) (layer F.SilkS) (width 0.25)) 17 | (fp_line (start -1.27 2.12) (end -7.47 2.12) (layer F.SilkS) (width 0.25)) 18 | (fp_line (start -1.27 -2.12) (end -1.27 -1.08) (layer F.SilkS) (width 0.25)) 19 | (fp_line (start -1.27 1.08) (end -1.27 2.12) (layer F.SilkS) (width 0.25)) 20 | (pad 1 thru_hole circle (at -1.27 0.00 0.00) (size 1.70 1.70) (layers *.Cu *.Paste *.Mask)(drill 1.1000231999999999)) 21 | (pad 2 thru_hole circle (at 1.27 -0.00 0.00) (size 1.70 1.70) (layers *.Cu *.Paste *.Mask)(drill 1.1000231999999999)) 22 | (fp_circle (center -1.27 0.00) (end -1.05 0.00) (layer F.Fab) (width 0.45)) 23 | (fp_circle (center 1.27 -0.00) (end 1.49 -0.00) (layer F.Fab) (width 0.45)) 24 | (fp_circle (center -8.60 2.25) (end -8.57 2.25) (layer F.Fab) (width 0.06)) 25 | (model "/lcsc.3dshapes/SW-TH_DA-01BP_L3.6-W10.0-H9.9-P2.54.wrl" 26 | (offset (xyz -3.650 -0.000 3.000)) 27 | (scale (xyz 1 1 1)) 28 | (rotate (xyz 0 0 90)) 29 | ) 30 | ) -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/FastCRC/README.md: -------------------------------------------------------------------------------- 1 | FastCRC 2 | ======= 3 | 4 | Fast CRC Arduino library 5 | Up to 30 times faster than crc16.h (_avr_libc) 6 | 7 | - uses the on-chip hardware for Teensy 3.0 / 3.1 / 3.2 / 3.5 / 3.6 8 | - uses fast table-algorithms for other chips 9 | 10 | List of supported CRC calculations: 11 | - 12 | 7 BIT: 13 | 14 | CRC7 15 | (poly=0x09 init=0x00 refin=false refout=false xorout=0x00 check=0x75) 16 | MultiMediaCard interface 17 | 18 | 19 | 8 BIT: 20 | 21 | SMBUS 22 | (poly=0x07 init=0x00 refin=false refout=false xorout=0x00 check=0xf4) 23 | 24 | MAXIM 25 | (poly=0x31 init=0x00 refin=true refout=true xorout=0x00 check=0xa1) 26 | 27 | 28 | 16 BIT: 29 | 30 | KERMIT (Alias CRC-16/CCITT, CRC-16/CCITT-TRUE, CRC-CCITT) 31 | (poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 32 | Attention: sometimes you'll find byteswapped presentation of result in other implementations) 33 | 34 | CCITT-FALSE 35 | (poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000 check=0x29b1) 36 | 37 | MCRF4XX 38 | (poly=0x1021 init=0xffff refin=true refout=true xorout=0x0000 check=0x6f91) 39 | 40 | MODBUS 41 | (poly=0x8005 init=0xffff refin=true refout=true xorout=0x0000 check=0x4b37) 42 | 43 | XMODEM (Alias ZMODEM, CRC-16/ACORN) 44 | (poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0000 check=0x31c3) 45 | 46 | X25 (Alias CRC-16/IBM-SDLC, CRC-16/ISO-HDLC, CRC-B) 47 | (poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e) 48 | 49 | 50 | 32 BIT: 51 | 52 | CRC32, CRC-32/ADCCP, PKZIP, ETHERNET, 802.3 53 | (poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926) 54 | 55 | CKSUM, CRC-32/POSIX 56 | (poly=0x04c11db7 init=0x00000000 refin=false refout=false xorout=0xffffffff check=0x765e7680) 57 | -------------------------------------------------------------------------------- /Firmware/LowLevel/soundfiles/01/GoogleTTS_Strings.txt: -------------------------------------------------------------------------------- 1 | -- file leading nr -- ------ string to convert ------------ 2 | 3 | 001 Hi, I am Steve, your open mower green care is my profession 4 | 002 open mower start up successful 5 | 003 Initializing robot operating system 6 | 004 Starting map area recording 7 | 005 waiting for rtk gps signal 8 | 006 calculating map dimensions 9 | 007 initiate mowing sequence 10 | 008 stop button triggered 11 | 009 emergency wheel lift sensor triggered 12 | 010 rain detected, heading back to base 13 | 011 open mower has completed mowing the lawn, heading back to charging station 14 | 012 stay back, autononous robot mower in use 15 | 013 ups, I did it again 16 | 014 Hallo, ich bin Tobi, dein intelligenter Rasemäher, Rasenpflege ist mein Beruf 17 | 015 Hello, I am Tobi, your smart mower, green care ist my profession 18 | 016 Robot operating system start up successful 19 | 20 | 017 Robot operating system stopped 21 | 018 Raspberry Pi shut down and powered off. It's save to power off your open mower now 22 | 019 IMU initialization failed 23 | 020 down 24 | 021 up 25 | 022 Switched to English Language 26 | 023 Emergency cleared 27 | 024 Emergency triggered by Robot operating system 28 | 025 Emergency triggered by collision sensor 29 | 30 | 31 | New adverts >= 0017 sampled via Google TTS with settings: 32 | Language: English (US), Neural2, en-US-Neural2-D 33 | Small home speaker, Speed = 1.00, Pitch 0 34 | 35 | Amplified to a max of -5db 36 | Saved as mono mp3 with medium quality 37 | -------------------------------------------------------------------------------- /Changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | 4 | 5 | ## [current dev progress] 6 | 7 | #### Hardware 8 | 9 | - Added solder jumper so that we don't need to solder some ICs if we don't need ultrasonic and sound 10 | - Moved some solder jumpers to the bottom of the board to keep them accessible even with IMU mounted. 11 | 12 | #### Software 13 | 14 | ##### Breaking Changes 15 | 16 | - Moved most of the configuration to an external file 17 | - Removed start and pause mowing from rosparams. This was just a hack to trigger it using rqt_reconfigure. 18 | - Removed area_recorder and corresponding configs 19 | - Added SensorFusion with imu_filter_madgwick, you need to set your mag biases in the global settings file now 20 | 21 | ##### Features 22 | 23 | - Added UI Board integration to LowLevel Firmware 24 | - Added service to start and pause mowing as well as start area recording mode 25 | - Added area recording behavior to main logic, so that we don't need an additional launch file for it 26 | - Added a mower_logic/current_state topic which has the identifier of the current high level state. 27 | - mower_comms now listens for UI button messages and calls the high level control service accordingly. 28 | - Added support for LAT/LNG coordinates instead of relative coordinates. Set **OM_USE_RELATIVE_POSITION** to **false** for this and provide an origin for your local coordinate space using **OM_DATUM_LAT** and **OM_DATUM_LONG** in your local config file. 29 | - Added the mag_calibration node to help magnetometer calibration without manually recording and copying files. 30 | 31 | ##### Small Fixes 32 | 33 | - Changed planner logic, so that it starts with innermost outlines 34 | 35 | - We can now configure arbitrarily many outlines 36 | - Motor temperatures can be configured 37 | - Added safety offset parameter to the outline (i.e. shrink area without rerecording the areas) 38 | - Added vesc_msgs to mower_msgs to resolve a dependency issue 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/imu/LSM6DSO/imu.cpp: -------------------------------------------------------------------------------- 1 | #include "imu.h" 2 | #include "pins.h" 3 | #include 4 | 5 | #if defined(HW_0_10_X) || defined(HW_0_11_X) || defined(HW_0_12_X) 6 | // Needs software SPI because pins were messed up in 0.10-0.12 7 | #include 8 | SoftwareSPI spiBus(PIN_IMU_SCK, PIN_IMU_MISO, PIN_IMU_MOSI); 9 | #else 10 | #include 11 | #define spiBus SPI 12 | #endif 13 | 14 | LSM6DSOSensor IMU(&spiBus, PIN_IMU_CS, 1000000); 15 | int32_t accelerometer[3]; 16 | int32_t gyroscope[3]; 17 | 18 | bool init_imu() { 19 | #if defined(HW_0_10_X) || defined(HW_0_11_X) || defined(HW_0_12_X) 20 | spiBus.begin(); 21 | #else 22 | spiBus.setCS(PIN_IMU_CS); 23 | spiBus.setTX(PIN_IMU_TX); 24 | spiBus.setRX(PIN_IMU_RX); 25 | spiBus.setSCK(PIN_IMU_SCK); 26 | spiBus.begin(); 27 | #endif 28 | 29 | int status = IMU.begin(); 30 | 31 | uint8_t WHOAMI = 0; 32 | IMU.ReadID(&WHOAMI); 33 | if(WHOAMI != 0b01101100) 34 | return false; 35 | 36 | if (status != 0) 37 | return false; 38 | 39 | if (IMU.Enable_G() != 0) 40 | return false; 41 | 42 | if (IMU.Enable_X() != 0) 43 | return false; 44 | return true; 45 | } 46 | 47 | bool imu_read(float *acceleration_mss, float *gyro_rads, float *mag_uT) { 48 | bool success = true; 49 | success &= IMU.Get_X_Axes(accelerometer) == 0; 50 | success &= IMU.Get_G_Axes(gyroscope) == 0; 51 | 52 | // Left down: Y = -g 53 | acceleration_mss[1] = accelerometer[0] * 9.81 / 1000.0; 54 | // Nose down: X = -g 55 | acceleration_mss[0] = -accelerometer[1] * 9.81 / 1000.0; 56 | // Flat: Z = +g 57 | acceleration_mss[2] = accelerometer[2] * 9.81 / 1000.0; 58 | 59 | // Datasheet shows gyro and acceleromter axes are aligned 60 | gyro_rads[1] = -gyroscope[0] * (PI / 180.0) / 1000.0; 61 | gyro_rads[0] = gyroscope[1] * (PI / 180.0) / 1000.0; 62 | gyro_rads[2] = gyroscope[2] * (PI / 180.0) / 1000.0; 63 | 64 | mag_uT[0] = 0; 65 | mag_uT[1] = 0; 66 | mag_uT[2] = 0; 67 | 68 | return success; 69 | } 70 | 71 | void imu_loop() {} 72 | -------------------------------------------------------------------------------- /Hardware/DockStation/mower_PowerDeviceCarrier.kibot.yaml: -------------------------------------------------------------------------------- 1 | kibot: 2 | version: 1 3 | 4 | outputs: 5 | - name: 'write_gerber_drill' 6 | comment: 'This is the information for the drilling machine in gerber format.' 7 | type: 'gerb_drill' 8 | dir: 'release/gerber_dock' 9 | 10 | - name: 'write_gerber' 11 | comment: 'This is the main fabrication format for the PCB.' 12 | type: 'gerber' 13 | dir: 'release/gerber_dock' 14 | layers: 'selected' 15 | 16 | - name: 'gerber' 17 | comment: 'Generates a compressed file containing gerber files.' 18 | type: 'compress' 19 | dir: 'release' 20 | options: 21 | files: 22 | # [string=''] Destination directory inside the archive, empty means the same of the file 23 | - dest: '.' 24 | source: 'release/gerber_dock/*' 25 | 26 | - name: 'position' 27 | comment: 'Generates the file with position information for the PCB components, used by the pick and place machine.' 28 | type: 'position' 29 | dir: 'release' 30 | 31 | - name: 'pcbdraw_svg' 32 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 33 | type: 'pcbdraw' 34 | dir: 'release' 35 | options: 36 | format: 'svg' 37 | 38 | - name: 'pcbdraw_png' 39 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 40 | type: 'pcbdraw' 41 | dir: 'release' 42 | options: 43 | format: 'png' 44 | 45 | - name: 'pcbdraw_svg_bottom' 46 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 47 | type: 'pcbdraw' 48 | dir: 'release' 49 | options: 50 | bottom: true 51 | format: 'svg' 52 | 53 | - name: 'pcbdraw_png_bottom' 54 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 55 | type: 'pcbdraw' 56 | dir: 'release' 57 | options: 58 | bottom: true 59 | format: 'png' 60 | 61 | - name: 'render_3d' 62 | comment: "Exports the image generated by KiCad's 3D viewer." 63 | type: 'render_3d' 64 | dir: 'release' 65 | options: 66 | rotate_x: 1 67 | rotate_y: 1 68 | ray_tracing: true 69 | wait_render: -600 70 | zoom: 2 71 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/RPi_Hat.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # RPi_GPIO 5 | # 6 | DEF RPi_GPIO J 0 40 Y Y 1 F N 7 | F0 "J" 750 250 60 H V C CNN 8 | F1 "RPi_GPIO" 750 150 60 H V C CNN 9 | F2 "" 0 0 60 H V C CNN 10 | F3 "" 0 0 60 H V C CNN 11 | DRAW 12 | S 0 100 1500 -2000 0 1 0 N 13 | X 3.3V 1 -200 0 200 R 50 50 1 1 W 14 | X BCM15_RXD 10 1700 -400 200 L 50 50 1 1 B 15 | X BCM17 11 -200 -500 200 R 50 50 1 1 B 16 | X BCM18_PCM_C 12 1700 -500 200 L 50 50 1 1 B 17 | X BCM27 13 -200 -600 200 R 50 50 1 1 B 18 | X GND 14 1700 -600 200 L 50 50 1 1 W 19 | X BCM22 15 -200 -700 200 R 50 50 1 1 B 20 | X BCM23 16 1700 -700 200 L 50 50 1 1 B 21 | X 3.3V 17 -200 -800 200 R 50 50 1 1 W 22 | X BCM24 18 1700 -800 200 L 50 50 1 1 B 23 | X BCM10_MOSI 19 -200 -900 200 R 50 50 1 1 B 24 | X 5V 2 1700 0 200 L 50 50 1 1 W 25 | X GND 20 1700 -900 200 L 50 50 1 1 W 26 | X BCM9_MISO 21 -200 -1000 200 R 50 50 1 1 B 27 | X BCM25 22 1700 -1000 200 L 50 50 1 1 B 28 | X BCM11_SCLK 23 -200 -1100 200 R 50 50 1 1 B 29 | X BCM8_CE0 24 1700 -1100 200 L 50 50 1 1 B 30 | X GND 25 -200 -1200 200 R 50 50 1 1 W 31 | X BCM7_CE1 26 1700 -1200 200 L 50 50 1 1 B 32 | X BCM0_ID_SD 27 -200 -1300 200 R 50 50 1 1 B 33 | X BCM1_ID_SC 28 1700 -1300 200 L 50 50 1 1 B 34 | X BCM5 29 -200 -1400 200 R 50 50 1 1 B 35 | X BCM2_SDA 3 -200 -100 200 R 50 50 1 1 B 36 | X GND 30 1700 -1400 200 L 50 50 1 1 W 37 | X BCM6 31 -200 -1500 200 R 50 50 1 1 B 38 | X BCM12_PWM0 32 1700 -1500 200 L 50 50 1 1 B 39 | X BCM13_PWM1 33 -200 -1600 200 R 50 50 1 1 B 40 | X GND 34 1700 -1600 200 L 50 50 1 1 W 41 | X BCM19_MISO_PCM_FS 35 -200 -1700 200 R 50 50 1 1 B 42 | X BCM16 36 1700 -1700 200 L 50 50 1 1 B 43 | X BCM26 37 -200 -1800 200 R 50 50 1 1 B 44 | X BCM20_MOSI_PCM_DI 38 1700 -1800 200 L 50 50 1 1 B 45 | X GND 39 -200 -1900 200 R 50 50 1 1 W 46 | X 5V 4 1700 -100 200 L 50 50 1 1 W 47 | X BCM21_SCLK_PCM_DO 40 1700 -1900 200 L 50 50 1 1 B 48 | X BCM3_SCL 5 -200 -200 200 R 50 50 1 1 B 49 | X GND 6 1700 -200 200 L 50 50 1 1 W 50 | X BCM4_GPCLK0 7 -200 -300 200 R 50 50 1 1 B 51 | X BCM14_TXD 8 1700 -300 200 L 50 50 1 1 B 52 | X GND 9 -200 -400 200 R 50 50 1 1 W 53 | ENDDRAW 54 | ENDDEF 55 | # 56 | #End Library 57 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TSC101CILT/SOT95P280X145-5N.kicad_mod: -------------------------------------------------------------------------------- 1 | (module "SOT95P280X145-5N" (layer F.Cu) 2 | (descr "SOT23-5") 3 | (tags "Integrated Circuit") 4 | (attr smd) 5 | (fp_text reference IC** (at 0 0) (layer F.SilkS) 6 | (effects (font (size 1.27 1.27) (thickness 0.254))) 7 | ) 8 | (fp_text user %R (at 0 0) (layer F.Fab) 9 | (effects (font (size 1.27 1.27) (thickness 0.254))) 10 | ) 11 | (fp_text value "SOT95P280X145-5N" (at 0 0) (layer F.SilkS) hide 12 | (effects (font (size 1.27 1.27) (thickness 0.254))) 13 | ) 14 | (fp_line (start -2.125 -1.75) (end 2.125 -1.75) (layer F.CrtYd) (width 0.05)) 15 | (fp_line (start 2.125 -1.75) (end 2.125 1.75) (layer F.CrtYd) (width 0.05)) 16 | (fp_line (start 2.125 1.75) (end -2.125 1.75) (layer F.CrtYd) (width 0.05)) 17 | (fp_line (start -2.125 1.75) (end -2.125 -1.75) (layer F.CrtYd) (width 0.05)) 18 | (fp_line (start -0.812 -1.45) (end 0.812 -1.45) (layer F.Fab) (width 0.1)) 19 | (fp_line (start 0.812 -1.45) (end 0.812 1.45) (layer F.Fab) (width 0.1)) 20 | (fp_line (start 0.812 1.45) (end -0.812 1.45) (layer F.Fab) (width 0.1)) 21 | (fp_line (start -0.812 1.45) (end -0.812 -1.45) (layer F.Fab) (width 0.1)) 22 | (fp_line (start -0.812 -0.5) (end 0.138 -1.45) (layer F.Fab) (width 0.1)) 23 | (fp_line (start -0.375 -1.45) (end 0.375 -1.45) (layer F.SilkS) (width 0.2)) 24 | (fp_line (start 0.375 -1.45) (end 0.375 1.45) (layer F.SilkS) (width 0.2)) 25 | (fp_line (start 0.375 1.45) (end -0.375 1.45) (layer F.SilkS) (width 0.2)) 26 | (fp_line (start -0.375 1.45) (end -0.375 -1.45) (layer F.SilkS) (width 0.2)) 27 | (fp_line (start -1.875 -1.5) (end -0.725 -1.5) (layer F.SilkS) (width 0.2)) 28 | (pad 1 smd rect (at -1.3 -0.95 90) (size 0.6 1.15) (layers F.Cu F.Paste F.Mask)) 29 | (pad 2 smd rect (at -1.3 0 90) (size 0.6 1.15) (layers F.Cu F.Paste F.Mask)) 30 | (pad 3 smd rect (at -1.3 0.95 90) (size 0.6 1.15) (layers F.Cu F.Paste F.Mask)) 31 | (pad 4 smd rect (at 1.3 0.95 90) (size 0.6 1.15) (layers F.Cu F.Paste F.Mask)) 32 | (pad 5 smd rect (at 1.3 -0.95 90) (size 0.6 1.15) (layers F.Cu F.Paste F.Mask)) 33 | (model TSC101CILT.stp 34 | (at (xyz 0 0 0)) 35 | (scale (xyz 1 1 1)) 36 | (rotate (xyz 0 0 0)) 37 | ) 38 | ) 39 | -------------------------------------------------------------------------------- /Firmware/LowLevel/include/debug.h: -------------------------------------------------------------------------------- 1 | // Created by Apehaenger on 02/02/23. 2 | // 3 | // This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. 4 | // 5 | // Feel free to use the design in your private/educational projects, but don't try to sell the design or products based on it without getting my consent first. 6 | // 7 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 8 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 9 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 10 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 11 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 12 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 13 | // SOFTWARE. 14 | // 15 | // 16 | #ifndef _DEBUG_H_ 17 | #define _DEBUG_H_ 18 | 19 | // Define to stream debugging messages via USB 20 | //#define USB_DEBUG 21 | 22 | #ifdef USB_DEBUG 23 | 24 | #define DEBUG_SERIAL Serial 25 | // #define DfMiniMp3Debug DEBUG_SERIAL // Also output DFPlayer IN/OUT cmd data 26 | 27 | // Some bloody simple debug macros which superfluous '#ifdef USB_DEBUG' ... 28 | #define DEBUG_BEGIN(b) \ 29 | DEBUG_SERIAL.begin(b); \ 30 | while (!DEBUG_SERIAL); 31 | #define DEBUG_PRINTLN(str) DEBUG_SERIAL.println(str) 32 | #define DEBUG_PRINTF(fmt, ...) \ 33 | do { \ 34 | DEBUG_SERIAL.printf(fmt, ##__VA_ARGS__); \ 35 | } while (0) 36 | #define PRINTF_BINARY_PATTERN_INT8 "%c%c%c%c%c%c%c%c" 37 | #define PRINTF_BYTE_TO_BINARY_INT8(i) \ 38 | (((i) & 0x80ll) ? '1' : '0'), (((i) & 0x40ll) ? '1' : '0'), (((i) & 0x20ll) ? '1' : '0'), (((i) & 0x10ll) ? '1' : '0'), \ 39 | (((i) & 0x08ll) ? '1' : '0'), (((i) & 0x04ll) ? '1' : '0'), (((i) & 0x02ll) ? '1' : '0'), (((i) & 0x01ll) ? '1' : '0') 40 | 41 | #else 42 | 43 | #define DEBUG_BEGIN(b) 44 | #define DEBUG_PRINTLN(str) 45 | #define DEBUG_PRINTF(fmt, ...) 46 | #define PRINTF_BINARY_PATTERN_INT8 47 | #define PRINTF_BYTE_TO_BINARY_INT8(i) 48 | #endif 49 | 50 | #endif // _DEBUG_H_ 51 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.pretty/Crystal_SMD_HC49-US.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Crystal_SMD_HC49-US (layer F.Cu) (tedit 5F0C7995) 2 | (descr "SMD Crystal HC-49-SD http://cdn-reichelt.de/documents/datenblatt/B400/xxx-HC49-SMD.pdf, 11.4x4.7mm^2 package") 3 | (tags "SMD SMT crystal") 4 | (attr smd) 5 | (fp_text reference Y1 (at 0 -3.55) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value ABLS-12.000MHZ-B4-T (at 0 3.55) (layer F.Fab) 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_line (start -6.7 1.3) (end -6.7 2.55) (layer F.SilkS) (width 0.12)) 12 | (fp_text user %R (at 0 0) (layer F.Fab) 13 | (effects (font (size 1 1) (thickness 0.15))) 14 | ) 15 | (fp_line (start -5.7 -2.35) (end -5.7 2.35) (layer F.Fab) (width 0.1)) 16 | (fp_line (start -5.7 2.35) (end 5.7 2.35) (layer F.Fab) (width 0.1)) 17 | (fp_line (start 5.7 2.35) (end 5.7 -2.35) (layer F.Fab) (width 0.1)) 18 | (fp_line (start 5.7 -2.35) (end -5.7 -2.35) (layer F.Fab) (width 0.1)) 19 | (fp_line (start -3.015 -2.115) (end 3.015 -2.115) (layer F.Fab) (width 0.1)) 20 | (fp_line (start -3.015 2.115) (end 3.015 2.115) (layer F.Fab) (width 0.1)) 21 | (fp_line (start 5.9 -2.55) (end -6.7 -2.55) (layer F.SilkS) (width 0.12)) 22 | (fp_line (start -6.7 -2.55) (end -6.7 -1.3) (layer F.SilkS) (width 0.12)) 23 | (fp_line (start -6.7 2.55) (end 5.9 2.55) (layer F.SilkS) (width 0.12)) 24 | (fp_line (start -6.8 -2.6) (end -6.8 2.6) (layer F.CrtYd) (width 0.05)) 25 | (fp_line (start -6.8 2.6) (end 6.8 2.6) (layer F.CrtYd) (width 0.05)) 26 | (fp_line (start 6.8 2.6) (end 6.8 -2.6) (layer F.CrtYd) (width 0.05)) 27 | (fp_line (start 6.8 -2.6) (end -6.8 -2.6) (layer F.CrtYd) (width 0.05)) 28 | (fp_arc (start -3.015 0) (end -3.015 -2.115) (angle -180) (layer F.Fab) (width 0.1)) 29 | (fp_arc (start 3.015 0) (end 3.015 -2.115) (angle 180) (layer F.Fab) (width 0.1)) 30 | (pad 1 smd rect (at -4.5 0) (size 5.6 2.1) (layers F.Cu F.Paste F.Mask)) 31 | (pad 2 smd rect (at 4.5 0) (size 5.6 2.1) (layers F.Cu F.Paste F.Mask)) 32 | (model ${KICAD6_3DMODEL_DIR}/Crystal.3dshapes/Crystal_SMD_HC49-SD.wrl 33 | (at (xyz 0 0 0)) 34 | (scale (xyz 1 1 1)) 35 | (rotate (xyz 0 0 0)) 36 | ) 37 | ) 38 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/LSM6DSOTR/LSM6DSOTR.mod: -------------------------------------------------------------------------------- 1 | PCBNEW-LibModule-V1 2023-01-25 08:46:16 2 | # encoding utf-8 3 | Units mm 4 | $INDEX 5 | LGA-14(2.5X3X0.86) 6 | $EndINDEX 7 | $MODULE LGA-14(2.5X3X0.86) 8 | Po 0 0 0 15 63d0ec58 00000000 ~~ 9 | Li LGA-14(2.5X3X0.86) 10 | Cd LGA-14(2.5x3x0.86) 11 | Kw Accelerometer 12 | Sc 0 13 | At SMD 14 | AR 15 | Op 0 0 0 16 | T0 -0.29 -0.006 1.27 1.27 0 0.254 N V 21 N "AC**" 17 | T1 -0.29 -0.006 1.27 1.27 0 0.254 N I 21 N "LGA-14(2.5X3X0.86)" 18 | DS -1.5 -1.25 1.5 -1.25 0.2 24 19 | DS 1.5 -1.25 1.5 1.25 0.2 24 20 | DS 1.5 1.25 -1.5 1.25 0.2 24 21 | DS -1.5 1.25 -1.5 -1.25 0.2 24 22 | DC -1.905 -0.98 -1.932 -0.98 0.254 21 23 | $PAD 24 | Po -1.1625 -0.75 25 | Sh "1" R 0.25 0.475 0 0 900 26 | At SMD N 00888000 27 | Ne 0 "" 28 | $EndPAD 29 | $PAD 30 | Po -1.1625 -0.25 31 | Sh "2" R 0.25 0.475 0 0 900 32 | At SMD N 00888000 33 | Ne 0 "" 34 | $EndPAD 35 | $PAD 36 | Po -1.1625 0.25 37 | Sh "3" R 0.25 0.475 0 0 900 38 | At SMD N 00888000 39 | Ne 0 "" 40 | $EndPAD 41 | $PAD 42 | Po -1.1625 0.75 43 | Sh "4" R 0.25 0.475 0 0 900 44 | At SMD N 00888000 45 | Ne 0 "" 46 | $EndPAD 47 | $PAD 48 | Po -0.5 0.9125 49 | Sh "5" R 0.25 0.475 0 0 0 50 | At SMD N 00888000 51 | Ne 0 "" 52 | $EndPAD 53 | $PAD 54 | Po 0 0.9125 55 | Sh "6" R 0.25 0.475 0 0 0 56 | At SMD N 00888000 57 | Ne 0 "" 58 | $EndPAD 59 | $PAD 60 | Po 0.5 0.9125 61 | Sh "7" R 0.25 0.475 0 0 0 62 | At SMD N 00888000 63 | Ne 0 "" 64 | $EndPAD 65 | $PAD 66 | Po 1.1625 0.75 67 | Sh "8" R 0.25 0.475 0 0 900 68 | At SMD N 00888000 69 | Ne 0 "" 70 | $EndPAD 71 | $PAD 72 | Po 1.1625 0.25 73 | Sh "9" R 0.25 0.475 0 0 900 74 | At SMD N 00888000 75 | Ne 0 "" 76 | $EndPAD 77 | $PAD 78 | Po 1.1625 -0.25 79 | Sh "10" R 0.25 0.475 0 0 900 80 | At SMD N 00888000 81 | Ne 0 "" 82 | $EndPAD 83 | $PAD 84 | Po 1.1625 -0.75 85 | Sh "11" R 0.25 0.475 0 0 900 86 | At SMD N 00888000 87 | Ne 0 "" 88 | $EndPAD 89 | $PAD 90 | Po 0.5 -0.9125 91 | Sh "12" R 0.25 0.475 0 0 0 92 | At SMD N 00888000 93 | Ne 0 "" 94 | $EndPAD 95 | $PAD 96 | Po 0 -0.9125 97 | Sh "13" R 0.25 0.475 0 0 0 98 | At SMD N 00888000 99 | Ne 0 "" 100 | $EndPAD 101 | $PAD 102 | Po -0.5 -0.9125 103 | Sh "14" R 0.25 0.475 0 0 0 104 | At SMD N 00888000 105 | Ne 0 "" 106 | $EndPAD 107 | $EndMODULE LGA-14(2.5X3X0.86) 108 | $EndLIBRARY 109 | -------------------------------------------------------------------------------- /configs/RaspberryPiConfig/config.txt: -------------------------------------------------------------------------------- 1 | # Please DO NOT modify this file; if you need to modify the boot config, the 2 | # "usercfg.txt" file is the place to include user changes. Please refer to 3 | # the README file for a description of the various configuration files on 4 | # the boot partition. 5 | 6 | # The unusual ordering below is deliberate; older firmwares (in particular the 7 | # version initially shipped with bionic) don't understand the conditional 8 | # [sections] below and simply ignore them. The Pi4 doesn't boot at all with 9 | # firmwares this old so it's safe to place at the top. Of the Pi2 and Pi3, the 10 | # Pi3 uboot happens to work happily on the Pi2, so it needs to go at the bottom 11 | # to support old firmwares. 12 | 13 | [pi4] 14 | kernel=uboot_rpi_4.bin 15 | 16 | [pi2] 17 | kernel=uboot_rpi_2.bin 18 | 19 | [pi3] 20 | kernel=uboot_rpi_3.bin 21 | 22 | [pi0] 23 | kernel=uboot_rpi_3.bin 24 | 25 | [all] 26 | device_tree_address=0x03000000 27 | 28 | [pi4] 29 | max_framebuffers=2 30 | arm_boost=1 31 | 32 | [all] 33 | # Enable the audio output, I2C and SPI interfaces on the GPIO header. As these 34 | # parameters related to the base device-tree they must appear *before* any 35 | # other dtoverlay= specification 36 | dtparam=audio=on 37 | dtparam=i2c_arm=on 38 | dtparam=spi=on 39 | 40 | # Comment out the following line if the edges of the desktop appear outside 41 | # the edges of your display 42 | disable_overscan=1 43 | 44 | # If you have issues with audio, you may try uncommenting the following line 45 | # which forces the HDMI output into HDMI mode instead of DVI (which doesn't 46 | # support audio output) 47 | #hdmi_drive=2 48 | 49 | # Config settings specific to arm64 50 | arm_64bit=1 51 | dtoverlay=dwc2 52 | 53 | [cm4] 54 | # Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into 55 | # such a board) 56 | dtoverlay=dwc2,dr_mode=host 57 | 58 | [all] 59 | 60 | # The following settings are "defaults" expected to be overridden by the 61 | # included configuration. The only reason they are included is, again, to 62 | # support old firmwares which don't understand the "include" command. 63 | 64 | enable_uart=1 65 | cmdline=cmdline.txt 66 | 67 | include syscfg.txt 68 | include usercfg.txt 69 | 70 | dtoverlay=disable-bt 71 | dtoverlay=uart2 72 | dtoverlay=uart3 73 | dtoverlay=uart4 74 | dtoverlay=uart5 75 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/LSM6DSOTR/LGA-14_2.5X3X0.86_.kicad_mod: -------------------------------------------------------------------------------- 1 | (module "LGA-14(2.5X3X0.86)" (layer F.Cu) 2 | (descr "LGA-14(2.5x3x0.86)") 3 | (tags "Accelerometer") 4 | (attr smd) 5 | (fp_text reference AC** (at -0.29 -0.006) (layer F.SilkS) 6 | (effects (font (size 1.27 1.27) (thickness 0.254))) 7 | ) 8 | (fp_text user %R (at -0.29 -0.006) (layer F.Fab) 9 | (effects (font (size 1.27 1.27) (thickness 0.254))) 10 | ) 11 | (fp_text value "LGA-14(2.5X3X0.86)" (at -0.29 -0.006) (layer F.SilkS) hide 12 | (effects (font (size 1.27 1.27) (thickness 0.254))) 13 | ) 14 | (fp_line (start -1.5 -1.25) (end 1.5 -1.25) (layer F.Fab) (width 0.2)) 15 | (fp_line (start 1.5 -1.25) (end 1.5 1.25) (layer F.Fab) (width 0.2)) 16 | (fp_line (start 1.5 1.25) (end -1.5 1.25) (layer F.Fab) (width 0.2)) 17 | (fp_line (start -1.5 1.25) (end -1.5 -1.25) (layer F.Fab) (width 0.2)) 18 | (fp_circle (center -1.905 -0.98) (end -1.905 -0.953) (layer F.SilkS) (width 0.2)) 19 | (pad 1 smd rect (at -1.1625 -0.75 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 20 | (pad 2 smd rect (at -1.1625 -0.25 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 21 | (pad 3 smd rect (at -1.1625 0.25 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 22 | (pad 4 smd rect (at -1.1625 0.75 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 23 | (pad 5 smd rect (at -0.5 0.9125 0) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 24 | (pad 6 smd rect (at 0 0.9125 0) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 25 | (pad 7 smd rect (at 0.5 0.9125 0) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 26 | (pad 8 smd rect (at 1.1625 0.75 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 27 | (pad 9 smd rect (at 1.1625 0.25 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 28 | (pad 10 smd rect (at 1.1625 -0.25 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 29 | (pad 11 smd rect (at 1.1625 -0.75 90) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 30 | (pad 12 smd rect (at 0.5 -0.9125 0) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 31 | (pad 13 smd rect (at 0 -0.9125 0) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 32 | (pad 14 smd rect (at -0.5 -0.9125 0) (size 0.25 0.475) (layers F.Cu F.Paste F.Mask)) 33 | (model LSM6DSOTR.stp 34 | (at (xyz 0 0 0.033858268279729)) 35 | (scale (xyz 1 1 1)) 36 | (rotate (xyz 90 0 0)) 37 | ) 38 | ) 39 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/FastCRC/FastCRC_cpu.h: -------------------------------------------------------------------------------- 1 | /* FastCRC library code is placed under the MIT license 2 | * Copyright (c) 2014,2015,2016 Frank Bösing 3 | * 4 | * Permission is hereby granted, free of charge, to any person obtaining 5 | * a copy of this software and associated documentation files (the 6 | * "Software"), to deal in the Software without restriction, including 7 | * without limitation the rights to use, copy, modify, merge, publish, 8 | * distribute, sublicense, and/or sell copies of the Software, and to 9 | * permit persons to whom the Software is furnished to do so, subject to 10 | * the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be 13 | * included in all copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | */ 24 | 25 | 26 | // CPU-specific implementations of helper functions 27 | 28 | #if !defined(KINETISK) 29 | #if !defined(FastCRC_cpu) 30 | #define FastCRC_cpu 31 | 32 | //Reverse byte order (16 bit) 33 | #if defined(__thumb__) 34 | static inline __attribute__((always_inline)) 35 | uint32_t REV16( uint32_t value) //ARM-THUMB 36 | { 37 | asm ("rev16 %0, %1" : "=r" (value) : "r" (value) ); 38 | return(value); 39 | } 40 | #else 41 | static inline __attribute__((always_inline)) 42 | uint32_t REV16( uint32_t value) //generic 43 | { 44 | return (value >> 8) | ((value & 0xff) << 8); 45 | } 46 | #endif 47 | 48 | 49 | 50 | 51 | 52 | //Reverse byte order (32 bit) 53 | #if defined(__thumb__) 54 | static inline __attribute__((always_inline)) 55 | uint32_t REV32( uint32_t value) //ARM-THUMB 56 | { 57 | asm ("rev %0, %1" : "=r" (value) : "r" (value) ); 58 | return(value); 59 | } 60 | #else 61 | static inline __attribute__((always_inline)) 62 | uint32_t REV32( uint32_t value) //generic 63 | { 64 | value = (value >> 16) | ((value & 0xffff) << 16); 65 | return ((value >> 8) & 0xff00ff) | ((value & 0xff00ff) << 8); 66 | } 67 | #endif 68 | 69 | 70 | #endif 71 | #endif 72 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MyModules.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # ArduinoProMini 5 | # 6 | DEF ArduinoProMini XA 0 40 Y Y 1 F N 7 | F0 "XA" 100 0 60 V V C CNN 8 | F1 "ArduinoProMini" -100 0 60 V V C CNN 9 | F2 "" 1800 3750 60 H I C CNN 10 | F3 "" 1800 3750 60 H I C CNN 11 | ALIAS Arduino_Mini_05_Socket 12 | $FPLIST 13 | Arduino_Mini_Socket 14 | $ENDFPLIST 15 | DRAW 16 | T 900 -400 150 60 0 0 0 Analogue Normal 0 C C 17 | T 900 500 -900 60 0 0 0 Misc. Normal 0 C C 18 | T 900 -500 -650 60 0 0 0 Power Normal 0 C C 19 | T 900 -500 850 60 0 0 0 Serial Normal 0 C C 20 | T 900 500 450 60 0 1 0 GPIO Normal 0 C C 21 | S -1000 1100 1000 -1050 0 0 0 f 22 | P 2 0 0 0 -600 850 -550 850 N 23 | P 2 0 0 0 650 -900 550 -900 N 24 | P 3 0 0 0 -800 -900 -500 -900 -500 -800 N 25 | P 3 0 0 0 -500 -500 -500 -400 -800 -400 N 26 | P 3 0 0 0 -400 -100 -400 -200 -850 -200 N 27 | P 3 0 0 0 -400 400 -400 500 -850 500 N 28 | P 4 0 0 0 -650 900 -600 900 -600 800 -650 800 N 29 | P 3 0 1 0 600 -100 500 -100 500 300 N 30 | P 3 0 1 0 650 1000 500 1000 500 600 N 31 | P 4 0 1 0 700 -850 650 -850 650 -950 700 -950 N 32 | X 5V 5V1 -1300 -700 300 R 50 50 1 1 W 33 | X A0 A0 -1300 -200 300 R 50 50 1 1 B 34 | X A1 A1 -1300 -100 300 R 50 50 1 1 B 35 | X A2 A2 -1300 0 300 R 50 50 1 1 B 36 | X A3 A3 -1300 100 300 R 50 50 1 1 B 37 | X D0_RX0 D0 -1300 900 300 R 50 50 1 1 B 38 | X D1_TX0 D1 -1300 800 300 R 50 50 1 1 B 39 | X D10_CS D10 1300 200 300 L 50 50 1 1 B 40 | X D11_MOSI D11 1300 100 300 L 50 50 1 1 B 41 | X D12_MISO D12 1300 0 300 L 50 50 1 1 B 42 | X D13_SCK D13 1300 -100 300 L 50 50 1 1 B C 43 | X D2_INT0 D2 1300 1000 300 L 50 50 1 1 B 44 | X D3_INT1 D3 1300 900 300 L 50 50 1 1 B 45 | X D4 D4 1300 800 300 L 50 50 1 1 B 46 | X D5 D5 1300 700 300 L 50 50 1 1 B 47 | X D6 D6 1300 600 300 L 50 50 1 1 B 48 | X D7 D7 1300 500 300 L 50 50 1 1 B 49 | X D8 D8 1300 400 300 L 50 50 1 1 B 50 | X D9 D9 1300 300 300 L 50 50 1 1 B 51 | X GND GND2 -1300 -500 300 R 50 50 1 1 W 52 | X RESET L0 1300 -850 300 L 50 50 1 1 C L 53 | X GND L1 -1300 -400 300 R 50 50 1 1 W 54 | X RESET RST2 1300 -950 300 L 50 50 1 1 C L 55 | X VIN VIN -1300 -900 300 R 50 50 1 1 W 56 | ENDDRAW 57 | ENDDEF 58 | # 59 | # LM2596S_MODULE 60 | # 61 | DEF LM2596S_MODULE U 0 40 Y Y 1 F N 62 | F0 "U" 0 0 50 H V C CNN 63 | F1 "LM2596S_MODULE" 0 0 50 H V C CNN 64 | F2 "" 0 0 50 H I C CNN 65 | F3 "" 0 0 50 H I C CNN 66 | DRAW 67 | S 500 100 -450 400 0 1 0 N 68 | X IN- 1 600 200 100 L 50 50 1 1 W 69 | X IN+ 2 600 300 100 L 50 50 1 1 W 70 | X OUT+ 3 -550 300 100 R 50 50 1 1 w 71 | X OUT- 4 -550 200 100 R 50 50 1 1 w 72 | ENDDRAW 73 | ENDDEF 74 | # 75 | #End Library 76 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TXS0104EPWR/TXS0104EPWR.mod: -------------------------------------------------------------------------------- 1 | PCBNEW-LibModule-V1 2022-01-20 17:11:17 2 | # encoding utf-8 3 | Units mm 4 | $INDEX 5 | SOP65P640X120-14N 6 | $EndINDEX 7 | $MODULE SOP65P640X120-14N 8 | Po 0 0 0 15 61e997b5 00000000 ~~ 9 | Li SOP65P640X120-14N 10 | Cd PW (R-PDSO-G14) 11 | Kw Integrated Circuit 12 | Sc 0 13 | At SMD 14 | AR 15 | Op 0 0 0 16 | T0 0 0 1.27 1.27 0 0.254 N V 21 N "IC**" 17 | T1 0 0 1.27 1.27 0 0.254 N I 21 N "SOP65P640X120-14N" 18 | DS -3.925 -2.8 3.925 -2.8 0.05 24 19 | DS 3.925 -2.8 3.925 2.8 0.05 24 20 | DS 3.925 2.8 -3.925 2.8 0.05 24 21 | DS -3.925 2.8 -3.925 -2.8 0.05 24 22 | DS -2.2 -2.5 2.2 -2.5 0.1 24 23 | DS 2.2 -2.5 2.2 2.5 0.1 24 24 | DS 2.2 2.5 -2.2 2.5 0.1 24 25 | DS -2.2 2.5 -2.2 -2.5 0.1 24 26 | DS -2.2 -1.85 -1.55 -2.5 0.1 24 27 | DS -1.85 -2.5 1.85 -2.5 0.2 21 28 | DS 1.85 -2.5 1.85 2.5 0.2 21 29 | DS 1.85 2.5 -1.85 2.5 0.2 21 30 | DS -1.85 2.5 -1.85 -2.5 0.2 21 31 | DS -3.675 -2.525 -2.2 -2.525 0.2 21 32 | $PAD 33 | Po -2.938 -1.95 34 | Sh "1" R 0.45 1.475 0 0 900 35 | At SMD N 00888000 36 | Ne 0 "" 37 | $EndPAD 38 | $PAD 39 | Po -2.938 -1.3 40 | Sh "2" R 0.45 1.475 0 0 900 41 | At SMD N 00888000 42 | Ne 0 "" 43 | $EndPAD 44 | $PAD 45 | Po -2.938 -0.65 46 | Sh "3" R 0.45 1.475 0 0 900 47 | At SMD N 00888000 48 | Ne 0 "" 49 | $EndPAD 50 | $PAD 51 | Po -2.938 0 52 | Sh "4" R 0.45 1.475 0 0 900 53 | At SMD N 00888000 54 | Ne 0 "" 55 | $EndPAD 56 | $PAD 57 | Po -2.938 0.65 58 | Sh "5" R 0.45 1.475 0 0 900 59 | At SMD N 00888000 60 | Ne 0 "" 61 | $EndPAD 62 | $PAD 63 | Po -2.938 1.3 64 | Sh "6" R 0.45 1.475 0 0 900 65 | At SMD N 00888000 66 | Ne 0 "" 67 | $EndPAD 68 | $PAD 69 | Po -2.938 1.95 70 | Sh "7" R 0.45 1.475 0 0 900 71 | At SMD N 00888000 72 | Ne 0 "" 73 | $EndPAD 74 | $PAD 75 | Po 2.938 1.95 76 | Sh "8" R 0.45 1.475 0 0 900 77 | At SMD N 00888000 78 | Ne 0 "" 79 | $EndPAD 80 | $PAD 81 | Po 2.938 1.3 82 | Sh "9" R 0.45 1.475 0 0 900 83 | At SMD N 00888000 84 | Ne 0 "" 85 | $EndPAD 86 | $PAD 87 | Po 2.938 0.65 88 | Sh "10" R 0.45 1.475 0 0 900 89 | At SMD N 00888000 90 | Ne 0 "" 91 | $EndPAD 92 | $PAD 93 | Po 2.938 0 94 | Sh "11" R 0.45 1.475 0 0 900 95 | At SMD N 00888000 96 | Ne 0 "" 97 | $EndPAD 98 | $PAD 99 | Po 2.938 -0.65 100 | Sh "12" R 0.45 1.475 0 0 900 101 | At SMD N 00888000 102 | Ne 0 "" 103 | $EndPAD 104 | $PAD 105 | Po 2.938 -1.3 106 | Sh "13" R 0.45 1.475 0 0 900 107 | At SMD N 00888000 108 | Ne 0 "" 109 | $EndPAD 110 | $PAD 111 | Po 2.938 -1.95 112 | Sh "14" R 0.45 1.475 0 0 900 113 | At SMD N 00888000 114 | Ne 0 "" 115 | $EndPAD 116 | $EndMODULE SOP65P640X120-14N 117 | $EndLIBRARY 118 | -------------------------------------------------------------------------------- /utils/mag_calibration/README.md: -------------------------------------------------------------------------------- 1 | # Magnetometer Calibration 2 | 3 | In an ideal word, when we rotate our robot around the Z axis, our magnetometer values would create a circle around the origin. Unfortunately, in the real world, due to magnetic fields in the robot and sensor bias, this is **not the case**. The magnetometer will most likely be an ellipse or a circle with some offset from the origin. 4 | 5 | **This calibration will remove this offset, but won't remove any elliptical form!** 6 | 7 | 8 | 9 | 10 | 11 | ## How I'm currently doing this 12 | 13 | Currently, I am doing it in the following way: 14 | 15 | 1. Put the robot in your lawn (turned on, fully assembled) 16 | 2. Start a teleop + recording session. Rotate the robot slowly in one spot for several rotations. 17 | 3. Run the plot_mag.sh script: `./plot_mag.sh /path/to/your.bag` 18 | 4. Check in the interactive plot, if your values are circular and if the fitted circle (red circle) is a good fit. 19 | 5. If everything seems fine, your bias values will be printed in the console (see example below). 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ## Example 28 | 29 | ![example_dataset](./example_dataset.png) 30 | 31 | 32 | 33 | This is the output of my calibration run today. 34 | 35 | Note that: 36 | 37 | 1. The outliers have been rejected 38 | 2. The plot is pretty much a circle, moved to the upper right hand side 39 | 40 | 41 | 42 | The console output was the following: 43 | 44 | ```bash 45 | [...] 46 | 47 | After 3 iterations the fit converged. 48 | final sum of squares of residuals : 8.48886e+07 49 | rel. change during last iteration : -4.36383e-06 50 | 51 | degrees of freedom (FIT_NDF) : 16540 52 | rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 71.6402 53 | variance of residuals (reduced chisquare) = WSSR/ndf : 5132.32 54 | 55 | Final set of parameters Asymptotic Standard Error 56 | ======================= ========================== 57 | bx = 11.4452 +/- 0.0209 (0.1826%) 58 | by = 12.2336 +/- 0.02425 (0.1982%) 59 | r = 370.698 +/- 0.5595 (0.1509%) 60 | 61 | correlation matrix of the fit parameters: 62 | bx by r 63 | bx 1.000 64 | by -0.402 1.000 65 | r 0.092 -0.020 1.000 66 | ``` 67 | 68 | 69 | 70 | **--> Our bias parameters (bx, by) are 11.4452 and 12.2336** 71 | 72 | 73 | 74 | ## Better Calibration 75 | 76 | This assumes that the result will be a circle with an offset. In reality, the result could be an ellipse. Also it would be nice to automate this process. 77 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/JY901_SERIAL/keywords.txt: -------------------------------------------------------------------------------- 1 | JY901 KEYWORD1 2 | CopeSerialData KEYWORD2 3 | StartIIC KEYWORD2 4 | CopeSerialData KEYWORD2 5 | ReadWord KEYWORD2 6 | WriteWord KEYWORD2 7 | ReadData KEYWORD2 8 | GetTime KEYWORD2 9 | GetAcc KEYWORD2 10 | GetGyro KEYWORD2 11 | GetAngle KEYWORD2 12 | GetMag KEYWORD2 13 | GetPress KEYWORD2 14 | GetDStatus KEYWORD2 15 | GetLonLat KEYWORD2 16 | GetGPSV KEYWORD2 17 | stcTime LITERAL1 18 | ucYear LITERAL1 19 | ucMonth LITERAL1 20 | ucDay LITERAL1 21 | ucHour LITERAL1 22 | ucMinute LITERAL1 23 | ucSecond LITERAL1 24 | usMiliSecond LITERAL1 25 | 26 | stcAcc LITERAL1 27 | a LITERAL1 28 | T LITERAL1 29 | 30 | stcGyro LITERAL1 31 | w LITERAL1 32 | 33 | stcAngle LITERAL1 34 | Angle LITERAL1 35 | 36 | stcMag LITERAL1 37 | h LITERAL1 38 | 39 | stcDStatus LITERAL1 40 | sDStatus LITERAL1 41 | 42 | stcPress LITERAL1 43 | lPressure LITERAL1 44 | lAltitude LITERAL1 45 | 46 | stcLonLat LITERAL1 47 | lLon LITERAL1 48 | lLat LITERAL1 49 | 50 | stcGPSV LITERAL1 51 | sGPSHeight LITERAL1 52 | sGPSYaw LITERAL1 53 | lGPSVelocity LITERAL1 54 | 55 | SAVE LITERAL1 56 | CALSW LITERAL1 57 | RSW LITERAL1 58 | RRATE LITERAL1 59 | BAUD LITERAL1 60 | AXOFFSET LITERAL1 61 | AYOFFSET LITERAL1 62 | AZOFFSET LITERAL1 63 | GXOFFSET LITERAL1 64 | GYOFFSET LITERAL1 65 | GZOFFSET LITERAL1 66 | HXOFFSET LITERAL1 67 | HYOFFSET LITERAL1 68 | HZOFFSET LITERAL1 69 | D0MODE LITERAL1 70 | D1MODE LITERAL1 71 | D2MODE LITERAL1 72 | D3MODE LITERAL1 73 | D0PWMH LITERAL1 74 | D1PWMH LITERAL1 75 | D2PWMH LITERAL1 76 | D3PWMH LITERAL1 77 | D0PWMT LITERAL1 78 | D1PWMT LITERAL1 79 | D2PWMT LITERAL1 80 | D3PWMT LITERAL1 81 | IICADDR LITERAL1 82 | LEDOFF LITERAL1 83 | GPSBAUD LITERAL1 84 | 85 | YYMM LITERAL1 86 | DDHH LITERAL1 87 | MMSS LITERAL1 88 | MS LITERAL1 89 | AX LITERAL1 90 | AY LITERAL1 91 | AZ LITERAL1 92 | GX LITERAL1 93 | GY LITERAL1 94 | GZ LITERAL1 95 | HX LITERAL1 96 | HY LITERAL1 97 | HZ LITERAL1 98 | Roll LITERAL1 99 | Pitch LITERAL1 100 | Yaw LITERAL1 101 | TEMP LITERAL1 102 | D0Status LITERAL1 103 | D1Status LITERAL1 104 | D2Status LITERAL1 105 | D3Status LITERAL1 106 | PressureL LITERAL1 107 | PressureH LITERAL1 108 | HeightL LITERAL1 109 | HeightH LITERAL1 110 | LonL LITERAL1 111 | LonH LITERAL1 112 | LatL LITERAL1 113 | LatH LITERAL1 114 | GPSHeight LITERAL1 115 | GPSYAW LITERAL1 116 | GPSVL LITERAL1 117 | GPSVH LITERAL1 118 | 119 | DIO_MODE_AIN LITERAL1 120 | DIO_MODE_DIN LITERAL1 121 | DIO_MODE_DOH LITERAL1 122 | DIO_MODE_DOL LITERAL1 123 | DIO_MODE_DOPWM LITERAL1 124 | DIO_MODE_GPS LITERAL1 125 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MyModules.pretty/LM2596S_MODULE.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "LM2596S_MODULE" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 624DC8DD) 4 | (attr through_hole) 5 | (fp_text reference "REF**" (at 20.9 -4.6) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 0d251e07-71ac-4ae3-a0f7-94ec4accabe1) 8 | ) 9 | (fp_text value "LM2596S_MODULE" (at 20.7 -2.4) (layer "F.Fab") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 0c6fec6c-34dd-47ec-a6bd-46a2bbbf10aa) 12 | ) 13 | (fp_text user "OUT -" (at 43 2) (layer "F.SilkS") 14 | (effects (font (size 1 1) (thickness 0.15))) 15 | (tstamp c500672c-ac70-4637-bf13-297c9e0922e8) 16 | ) 17 | (fp_text user "OUT +" (at 43 -23) (layer "F.SilkS") 18 | (effects (font (size 1 1) (thickness 0.15))) 19 | (tstamp c7e5d860-c237-41a7-8b59-18f12766170a) 20 | ) 21 | (fp_text user "IN -" (at 1 2) (layer "F.SilkS") 22 | (effects (font (size 1 1) (thickness 0.15))) 23 | (tstamp ccac5b5e-4b18-4a79-a8ce-1b5ceb4334d9) 24 | ) 25 | (fp_text user "IN+" (at 1 -23) (layer "F.SilkS") 26 | (effects (font (size 1 1) (thickness 0.15))) 27 | (tstamp ff1aff7d-0795-4702-945c-9516f4d1a7a9) 28 | ) 29 | (pad "1" thru_hole rect (at 1.4 -1.4) (size 3.048 3.048) (drill 1.5) (layers *.Cu *.Mask) (tstamp 2fdb9d50-be10-4637-8b92-410c098ddccb)) 30 | (pad "2" thru_hole rect (at 1.4 -19.8) (size 3.048 3.048) (drill 1.5) (layers *.Cu *.Mask) (tstamp 7f514ac8-a803-4257-b075-40189106dd67)) 31 | (pad "3" thru_hole rect (at 41.8 -19.8) (size 3.048 3.048) (drill 1.5) (layers *.Cu *.Mask) (tstamp f35fe5ca-f3f4-4c3e-a802-c0fdd39fc2a8)) 32 | (pad "4" thru_hole rect (at 41.8 -1.4) (size 3.048 3.048) (drill 1.5) (layers *.Cu *.Mask) (tstamp 384874da-0e76-4c32-8847-1771499c5cc2)) 33 | (model "${KIPRJMOD}/MyModules3d/LM2596/LM2596.step" 34 | (offset (xyz 25.75 -26 -21)) 35 | (scale (xyz 1 1 1)) 36 | (rotate (xyz 0 0 0)) 37 | ) 38 | (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x01_P2.54mm_Vertical.step" 39 | (offset (xyz 1 1.5 0)) 40 | (scale (xyz 1 1 1)) 41 | (rotate (xyz 0 0 0)) 42 | ) 43 | (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x01_P2.54mm_Vertical.step" 44 | (offset (xyz 1 20 0)) 45 | (scale (xyz 1 1 1)) 46 | (rotate (xyz 0 0 0)) 47 | ) 48 | (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x01_P2.54mm_Vertical.step" 49 | (offset (xyz 42 1.5 0)) 50 | (scale (xyz 1 1 1)) 51 | (rotate (xyz 0 0 0)) 52 | ) 53 | (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x01_P2.54mm_Vertical.step" 54 | (offset (xyz 42 20 0)) 55 | (scale (xyz 1 1 1)) 56 | (rotate (xyz 0 0 0)) 57 | ) 58 | ) 59 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/74ALVC164245DGG/74ALVC164245DGG_11.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | #SamacSys ECAD Model 74ALVC164245DGG,11 4 | #/1173229/101608/2.49/48/2/Integrated Circuit 5 | DEF 74ALVC164245DGG,11 IC 0 30 Y Y 1 F N 6 | F0 "IC" 1350 300 50 H V L CNN 7 | F1 "74ALVC164245DGG,11" 1350 200 50 H V L CNN 8 | F2 "SOP50P810X120-48N" 1350 100 50 H I L CNN 9 | F3 "https://assets.nexperia.com/documents/data-sheet/74ALVC164245.pdf" 1350 0 50 H I L CNN 10 | F4 "74ALVC164245 - 16-bit dual supply translating transceiver; 3-state@en-us" 1350 -100 50 H I L CNN "Description" 11 | F5 "1.2" 1350 -200 50 H I L CNN "Height" 12 | F6 "" 1350 -300 50 H I L CNN "Mouser2 Part Number" 13 | F7 "" 1350 -400 50 H I L CNN "Mouser2 Price/Stock" 14 | F8 "Nexperia" 1350 -500 50 H I L CNN "Manufacturer_Name" 15 | F9 "74ALVC164245DGG,11" 1350 -600 50 H I L CNN "Manufacturer_Part_Number" 16 | DRAW 17 | X 1DIR 1 0 0 200 R 50 50 0 0 P 18 | X 1B0 2 0 -100 200 R 50 50 0 0 P 19 | X 1B1 3 0 -200 200 R 50 50 0 0 P 20 | X GND_1 4 0 -300 200 R 50 50 0 0 P 21 | X 1B2 5 0 -400 200 R 50 50 0 0 P 22 | X 1B3 6 0 -500 200 R 50 50 0 0 P 23 | X VCC(B)_1 7 0 -600 200 R 50 50 0 0 P 24 | X 1B4 8 0 -700 200 R 50 50 0 0 P 25 | X 1B5 9 0 -800 200 R 50 50 0 0 P 26 | X GND_2 10 0 -900 200 R 50 50 0 0 P 27 | X 1B6 11 0 -1000 200 R 50 50 0 0 P 28 | X 1B7 12 0 -1100 200 R 50 50 0 0 P 29 | X 2B0 13 0 -1200 200 R 50 50 0 0 P 30 | X 2B1 14 0 -1300 200 R 50 50 0 0 P 31 | X GND_3 15 0 -1400 200 R 50 50 0 0 P 32 | X 2B2 16 0 -1500 200 R 50 50 0 0 P 33 | X 2B3 17 0 -1600 200 R 50 50 0 0 P 34 | X VCC(B)_2 18 0 -1700 200 R 50 50 0 0 P 35 | X 2B4 19 0 -1800 200 R 50 50 0 0 P 36 | X 2B5 20 0 -1900 200 R 50 50 0 0 P 37 | X GND_4 21 0 -2000 200 R 50 50 0 0 P 38 | X 2B6 22 0 -2100 200 R 50 50 0 0 P 39 | X 2B7 23 0 -2200 200 R 50 50 0 0 P 40 | X 2DIR 24 0 -2300 200 R 50 50 0 0 P 41 | X ~1OE 48 1500 0 200 L 50 50 0 0 P 42 | X 1A0 47 1500 -100 200 L 50 50 0 0 P 43 | X 1A1 46 1500 -200 200 L 50 50 0 0 P 44 | X GND_8 45 1500 -300 200 L 50 50 0 0 P 45 | X 1A2 44 1500 -400 200 L 50 50 0 0 P 46 | X 1A3 43 1500 -500 200 L 50 50 0 0 P 47 | X VCC(A)_2 42 1500 -600 200 L 50 50 0 0 P 48 | X 1A4 41 1500 -700 200 L 50 50 0 0 P 49 | X 1A5 40 1500 -800 200 L 50 50 0 0 P 50 | X GND_7 39 1500 -900 200 L 50 50 0 0 P 51 | X 1A6 38 1500 -1000 200 L 50 50 0 0 P 52 | X 1A7 37 1500 -1100 200 L 50 50 0 0 P 53 | X 2A0 36 1500 -1200 200 L 50 50 0 0 P 54 | X 2A1 35 1500 -1300 200 L 50 50 0 0 P 55 | X GND_6 34 1500 -1400 200 L 50 50 0 0 P 56 | X 2A2 33 1500 -1500 200 L 50 50 0 0 P 57 | X 2A3 32 1500 -1600 200 L 50 50 0 0 P 58 | X VCC(A)_1 31 1500 -1700 200 L 50 50 0 0 P 59 | X 2A4 30 1500 -1800 200 L 50 50 0 0 P 60 | X 2A5 29 1500 -1900 200 L 50 50 0 0 P 61 | X GND_5 28 1500 -2000 200 L 50 50 0 0 P 62 | X 2A6 27 1500 -2100 200 L 50 50 0 0 P 63 | X 2A7 26 1500 -2200 200 L 50 50 0 0 P 64 | X ~2OE 25 1500 -2300 200 L 50 50 0 0 P 65 | P 5 0 1 6 200 100 1300 100 1300 -2400 200 -2400 200 100 N 66 | ENDDRAW 67 | ENDDEF 68 | # 69 | #End Library 70 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/TXS0104EPWR/SOP65P640X120-14N.kicad_mod: -------------------------------------------------------------------------------- 1 | (module "SOP65P640X120-14N" (layer F.Cu) 2 | (descr "PW (R-PDSO-G14)") 3 | (tags "Integrated Circuit") 4 | (attr smd) 5 | (fp_text reference IC** (at 0 0) (layer F.SilkS) 6 | (effects (font (size 1.27 1.27) (thickness 0.254))) 7 | ) 8 | (fp_text user %R (at 0 0) (layer F.Fab) 9 | (effects (font (size 1.27 1.27) (thickness 0.254))) 10 | ) 11 | (fp_text value "SOP65P640X120-14N" (at 0 0) (layer F.SilkS) hide 12 | (effects (font (size 1.27 1.27) (thickness 0.254))) 13 | ) 14 | (fp_line (start -3.925 -2.8) (end 3.925 -2.8) (layer F.CrtYd) (width 0.05)) 15 | (fp_line (start 3.925 -2.8) (end 3.925 2.8) (layer F.CrtYd) (width 0.05)) 16 | (fp_line (start 3.925 2.8) (end -3.925 2.8) (layer F.CrtYd) (width 0.05)) 17 | (fp_line (start -3.925 2.8) (end -3.925 -2.8) (layer F.CrtYd) (width 0.05)) 18 | (fp_line (start -2.2 -2.5) (end 2.2 -2.5) (layer F.Fab) (width 0.1)) 19 | (fp_line (start 2.2 -2.5) (end 2.2 2.5) (layer F.Fab) (width 0.1)) 20 | (fp_line (start 2.2 2.5) (end -2.2 2.5) (layer F.Fab) (width 0.1)) 21 | (fp_line (start -2.2 2.5) (end -2.2 -2.5) (layer F.Fab) (width 0.1)) 22 | (fp_line (start -2.2 -1.85) (end -1.55 -2.5) (layer F.Fab) (width 0.1)) 23 | (fp_line (start -1.85 -2.5) (end 1.85 -2.5) (layer F.SilkS) (width 0.2)) 24 | (fp_line (start 1.85 -2.5) (end 1.85 2.5) (layer F.SilkS) (width 0.2)) 25 | (fp_line (start 1.85 2.5) (end -1.85 2.5) (layer F.SilkS) (width 0.2)) 26 | (fp_line (start -1.85 2.5) (end -1.85 -2.5) (layer F.SilkS) (width 0.2)) 27 | (fp_line (start -3.675 -2.525) (end -2.2 -2.525) (layer F.SilkS) (width 0.2)) 28 | (pad 1 smd rect (at -2.938 -1.95 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 29 | (pad 2 smd rect (at -2.938 -1.3 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 30 | (pad 3 smd rect (at -2.938 -0.65 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 31 | (pad 4 smd rect (at -2.938 0 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 32 | (pad 5 smd rect (at -2.938 0.65 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 33 | (pad 6 smd rect (at -2.938 1.3 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 34 | (pad 7 smd rect (at -2.938 1.95 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 35 | (pad 8 smd rect (at 2.938 1.95 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 36 | (pad 9 smd rect (at 2.938 1.3 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 37 | (pad 10 smd rect (at 2.938 0.65 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 38 | (pad 11 smd rect (at 2.938 0 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 39 | (pad 12 smd rect (at 2.938 -0.65 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 40 | (pad 13 smd rect (at 2.938 -1.3 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 41 | (pad 14 smd rect (at 2.938 -1.95 90) (size 0.45 1.475) (layers F.Cu F.Paste F.Mask)) 42 | (model TXS0104EPWR.stp 43 | (at (xyz 0 0 0)) 44 | (scale (xyz 1 1 1)) 45 | (rotate (xyz 0 0 0)) 46 | ) 47 | ) 48 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/JY901_SERIAL/JY901.cpp: -------------------------------------------------------------------------------- 1 | #include "JY901.h" 2 | #include "string.h" 3 | 4 | #ifdef WT901_INSTEAD_OF_SOUND 5 | CJY901 ::CJY901(HardwareSerial *serial) 6 | #elif WT901 7 | CJY901 ::CJY901(SerialPIO *serial) 8 | #endif 9 | { 10 | this->serial = serial; 11 | } 12 | 13 | void CJY901::begin(unsigned long baudrate) { 14 | serial->begin(baudrate); 15 | delay(1000); 16 | uint8_t unlock[] = {0xFF,0xF0,0xF0,0xF0,0xF0}; // undocumented but required magic unlock sequence 17 | serial->write(unlock, 5); 18 | serial->flush(); 19 | delay(10); 20 | writeRegister(RSW, 0b0000000000010110); // Return data content 21 | delay(10); 22 | writeRegister(RRATE, 0x08); // Return rate 0x06 = 10Hz (default), 0x08 = 50Hz, 0x09 = 100Hz 23 | delay(10); 24 | writeRegister(0x0b, 0x00); // X axis Magnetic bias 25 | delay(10); 26 | writeRegister(0x0c, 0x00); // Y axis Magnetic bias 27 | delay(10); 28 | writeRegister(0x0d, 0x00); // Z axis Magnetic bias 29 | delay(10); 30 | 31 | ucRxCnt = 0; 32 | } 33 | 34 | void CJY901 ::update() 35 | { 36 | while (serial->available()) 37 | { 38 | 39 | ucRxBuffer[ucRxCnt++] = serial->read(); 40 | if (ucRxBuffer[0] != 0x55) 41 | { 42 | ucRxCnt = 0; 43 | commsError_ = true; 44 | continue; 45 | } 46 | if (ucRxCnt < 11) 47 | { 48 | continue; 49 | } 50 | else 51 | { 52 | switch (ucRxBuffer[1]) 53 | { 54 | case 0x50: 55 | memcpy(&stcTime, &ucRxBuffer[2], 8); 56 | break; 57 | case 0x51: 58 | memcpy(&stcAcc, &ucRxBuffer[2], 8); 59 | break; 60 | case 0x52: 61 | memcpy(&stcGyro, &ucRxBuffer[2], 8); 62 | break; 63 | case 0x53: 64 | memcpy(&stcAngle, &ucRxBuffer[2], 8); 65 | break; 66 | case 0x54: 67 | memcpy(&stcMag, &ucRxBuffer[2], 8); 68 | break; 69 | case 0x55: 70 | memcpy(&stcDStatus, &ucRxBuffer[2], 8); 71 | break; 72 | case 0x56: 73 | memcpy(&stcPress, &ucRxBuffer[2], 8); 74 | break; 75 | case 0x57: 76 | memcpy(&stcLonLat, &ucRxBuffer[2], 8); 77 | break; 78 | case 0x58: 79 | memcpy(&stcGPSV, &ucRxBuffer[2], 8); 80 | break; 81 | } 82 | ucRxCnt = 0; 83 | } 84 | } 85 | } 86 | 87 | void CJY901::writeRegister(uint8_t address, uint16_t data) { 88 | uint8_t unlock[] = {0xFF,0xAA,0x69,0x88,0xB5}; 89 | serial->write(unlock, 5); 90 | serial->flush(); 91 | delay(100); 92 | 93 | uint8_t buffer[6]; 94 | buffer[0] = 0xFF; 95 | buffer[1] = 0xAA; 96 | buffer[2] = address; 97 | buffer[3] = data & 0xFF; 98 | buffer[4] = (data >> 8) & 0xFF; 99 | 100 | serial->write(buffer, 5); 101 | serial->flush(); 102 | 103 | serial->write(unlock, 5); 104 | serial->flush(); 105 | delay(100); 106 | 107 | uint8_t save[] = {0xFF,0xAA,0x00,0x00,0x00}; 108 | serial->write(save, 5); 109 | serial->flush(); 110 | delay(100); 111 | 112 | } 113 | 114 | bool CJY901::commsError() { 115 | bool hold = commsError_; 116 | #ifdef WT901 117 | hold |= serial->overflow(); 118 | #endif 119 | commsError_ = false; 120 | return hold; 121 | } -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/RP-Pico Libraries/LICENSE: -------------------------------------------------------------------------------- 1 | ### TPCWare KiCad Library License 2 | 3 | The TPCWare KiCad Library is licensed under the [Creative Commons CC-BY-SA 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/legalcode), with the following exception: 4 | 5 | --------- 6 | 7 | _To the extent that the creation of electronic designs that use 'Licensed Material' can be considered to be 'Adapted Material', then the copyright holder waives article 3 of the license with respect to these designs and any generated files which use data provided as part of the 'Licensed Material'._ 8 | 9 | --------- 10 | 11 | 12 | **What does this mean?** 13 | 14 | TPCWare KiCad Library is licensed in such a way to ensure free use of library data for commercial, closed, and non-commercial projects without restriction. TPCWare Corporation does not wish to exert any control over designs produced using the library data, or force users to reveal proprietary information contained in their designs. Neither do we wish to force users to attribute the TPCWare KiCad Library _within their design_. 15 | 16 | Use of the library data in a project does not (by itself) require that the design or any files generated from the design are licensed under the CC-BY-SA 4.0 License. You are free to use the library data in your own projects without the obligation to share your project files under this or any other license agreement. 17 | 18 | However, if you wish to redistribute the TPCWare KiCad Library, or parts thereof (including in modified form) as a collection then the exception above does not apply. Redistributed library collections must be shared under the same license agreement. Under these circumstances, the libraries must also retain attribution information, including the license documents which are distributed with the library files. 19 | 20 | ---------------------- 21 | 22 | 23 | **Disclaimer of Warranties and Limitation of Liability.** 24 | 25 | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. 26 | b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. 27 | c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MAX2040/MAX2040.mod: -------------------------------------------------------------------------------- 1 | PCBNEW-LibModule-V1 2022-03-31 22:54:56 2 | # encoding utf-8 3 | Units mm 4 | $INDEX 5 | MAX20405AFOFVYT 6 | $EndINDEX 7 | $MODULE MAX20405AFOFVYT 8 | Po 0 0 0 15 62462330 00000000 ~~ 9 | Li MAX20405AFOFVYT 10 | Cd F173A3FY+6_2021 11 | Kw Integrated Circuit 12 | Sc 0 13 | At SMD 14 | AR 15 | Op 0 0 0 16 | T0 0.000 0 1.27 1.27 0 0.254 N V 21 N "IC**" 17 | T1 0.000 0 1.27 1.27 0 0.254 N I 21 N "MAX20405AFOFVYT" 18 | DS -1.75 -1.875 1.75 -1.875 0.1 24 19 | DS 1.75 -1.875 1.75 1.875 0.1 24 20 | DS 1.75 1.875 -1.75 1.875 0.1 24 21 | DS -1.75 1.875 -1.75 -1.875 0.1 24 22 | DS -3.05 -3.175 3.05 -3.175 0.1 24 23 | DS 3.05 -3.175 3.05 3.175 0.1 24 24 | DS 3.05 3.175 -3.05 3.175 0.1 24 25 | DS -3.05 3.175 -3.05 -3.175 0.1 24 26 | DS -2.6 -0.95 -2.6 -0.95 0.1 21 27 | DS -2.5 -0.95 -2.5 -0.95 0.1 21 28 | DA -2.55 -0.95 -2.600 -0.95 -1800 0.1 21 29 | DA -2.55 -0.95 -2.500 -0.95 -1800 0.1 21 30 | $PAD 31 | Po -1.612 -0.95 32 | Sh "1" R 0.300 0.875 0 0 900 33 | At SMD N 00888000 34 | Ne 0 "" 35 | $EndPAD 36 | $PAD 37 | Po -1.612 -0.45 38 | Sh "2" R 0.300 0.875 0 0 900 39 | At SMD N 00888000 40 | Ne 0 "" 41 | $EndPAD 42 | $PAD 43 | Po -1.287 0.05 44 | Sh "3" R 0.250 1.525 0 0 900 45 | At SMD N 00888000 46 | Ne 0 "" 47 | $EndPAD 48 | $PAD 49 | Po -1.287 1.1 50 | Sh "4" R 0.950 1.525 0 0 900 51 | At SMD N 00888000 52 | Ne 0 "" 53 | $EndPAD 54 | $PAD 55 | Po -1.325 1.875 56 | Sh "5" R 0.450 0.600 0 0 0 57 | At SMD N 00888000 58 | Ne 0 "" 59 | $EndPAD 60 | $PAD 61 | Po 0.000 1.35 62 | Sh "6" R 0.300 1.650 0 0 0 63 | At SMD N 00888000 64 | Ne 0 "" 65 | $EndPAD 66 | $PAD 67 | Po 1.325 1.875 68 | Sh "7" R 0.450 0.600 0 0 0 69 | At SMD N 00888000 70 | Ne 0 "" 71 | $EndPAD 72 | $PAD 73 | Po 1.287 1.1 74 | Sh "8" R 0.950 1.525 0 0 900 75 | At SMD N 00888000 76 | Ne 0 "" 77 | $EndPAD 78 | $PAD 79 | Po 1.287 0.05 80 | Sh "9" R 0.250 1.525 0 0 900 81 | At SMD N 00888000 82 | Ne 0 "" 83 | $EndPAD 84 | $PAD 85 | Po 1.612 -0.45 86 | Sh "10" R 0.300 0.875 0 0 900 87 | At SMD N 00888000 88 | Ne 0 "" 89 | $EndPAD 90 | $PAD 91 | Po 1.612 -0.95 92 | Sh "11" R 0.300 0.875 0 0 900 93 | At SMD N 00888000 94 | Ne 0 "" 95 | $EndPAD 96 | $PAD 97 | Po 1.325 -1.737 98 | Sh "12" R 0.450 0.875 0 0 0 99 | At SMD N 00888000 100 | Ne 0 "" 101 | $EndPAD 102 | $PAD 103 | Po 0.750 -1.737 104 | Sh "13" R 0.300 0.875 0 0 0 105 | At SMD N 00888000 106 | Ne 0 "" 107 | $EndPAD 108 | $PAD 109 | Po 0.250 -1.737 110 | Sh "14" R 0.300 0.875 0 0 0 111 | At SMD N 00888000 112 | Ne 0 "" 113 | $EndPAD 114 | $PAD 115 | Po -0.250 -1.737 116 | Sh "15" R 0.300 0.875 0 0 0 117 | At SMD N 00888000 118 | Ne 0 "" 119 | $EndPAD 120 | $PAD 121 | Po -0.750 -1.737 122 | Sh "16" R 0.300 0.875 0 0 0 123 | At SMD N 00888000 124 | Ne 0 "" 125 | $EndPAD 126 | $PAD 127 | Po -1.325 -1.737 128 | Sh "17" R 0.450 0.875 0 0 0 129 | At SMD N 00888000 130 | Ne 0 "" 131 | $EndPAD 132 | $PAD 133 | Po -1.800 -1.475 134 | Sh "18" R 0.350 0.500 0 0 900 135 | At SMD N 00888000 136 | Ne 0 "" 137 | $EndPAD 138 | $PAD 139 | Po 0.000 0.4 140 | Sh "19" R 0.250 0.600 0 0 900 141 | At SMD N 00888000 142 | Ne 0 "" 143 | $EndPAD 144 | $PAD 145 | Po 1.800 -1.475 146 | Sh "20" R 0.350 0.500 0 0 900 147 | At SMD N 00888000 148 | Ne 0 "" 149 | $EndPAD 150 | $EndMODULE MAX20405AFOFVYT 151 | $EndLIBRARY 152 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/pins.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef HW_0_9_X 4 | #define PIN_ANALOG_BATTERY_VOLTAGE 27 5 | #define PIN_ANALOG_CHARGE_VOLTAGE 26 6 | #define PIN_ANALOG_CHARGE_CURRENT 28 7 | 8 | #define PIN_ENABLE_CHARGE 22 9 | 10 | #define PIN_ESC_SHUTDOWN 20 11 | #define PIN_RASPI_POWER 21 12 | 13 | #define PIN_EMERGENCY_1 7 14 | #define PIN_EMERGENCY_2 6 15 | #define PIN_EMERGENCY_3 3 16 | #define PIN_EMERGENCY_4 2 17 | 18 | #define PIN_MUX_IN 11 19 | #define PIN_MUX_OUT 12 20 | #define PIN_MUX_ADDRESS_0 13 21 | #define PIN_MUX_ADDRESS_1 14 22 | #define PIN_MUX_ADDRESS_2 15 23 | 24 | #define PIN_NEOPIXEL 10 25 | 26 | #define PIN_UI_TX 4 27 | #define PIN_UI_RX 5 28 | 29 | #ifdef ENABLE_SOUND_MODULE 30 | #define PIN_SOUND_TX 8 31 | #define PIN_SOUND_RX 9 32 | #endif 33 | 34 | // IMU Variants 35 | #ifdef WT901_INSTEAD_OF_SOUND // WT901 via HardwareSerial 36 | #ifdef ENABLE_SOUND_MODULE 37 | #error you can not enable sound and have wt901 on sound port at the same time. 38 | #endif 39 | #define PIN_WT901_TX 8 40 | #define PIN_WT901_RX 9 41 | #elif WT901 // WT901 on MPU9250 Slot via SerialPIO. 42 | #define PIN_WT901_TX 17 43 | #define PIN_WT901_RX 16 44 | #else 45 | #define PIN_IMU_CS 17 // MPU9250 46 | #define PIN_IMU_RX 16 // LSM6DSx 47 | #define PIN_IMU_TX 19 // LSM6DSx 48 | #define PIN_IMU_SCK 18 // LSM6DSx 49 | #endif 50 | 51 | #elif HW_0_10_X || HW_0_11_X || HW_0_12_X 52 | #define WT901_WIRE Wire 53 | 54 | #define PIN_WT901_SDA 8 55 | #define PIN_WT901_SCL 9 56 | 57 | #define PIN_IMU_CS 9 58 | #define PIN_IMU_MOSI 7 59 | #define PIN_IMU_MISO 8 60 | #define PIN_IMU_SCK 6 61 | 62 | #define PIN_ANALOG_BATTERY_VOLTAGE 27 63 | #define PIN_ANALOG_CHARGE_VOLTAGE 26 64 | #define PIN_ANALOG_CHARGE_CURRENT 28 65 | 66 | #define PIN_ENABLE_CHARGE 22 67 | 68 | #define PIN_ESC_SHUTDOWN 20 69 | #define PIN_RASPI_POWER 21 70 | 71 | #define PIN_EMERGENCY_1 18 72 | #define PIN_EMERGENCY_2 19 73 | #define PIN_EMERGENCY_3 3 74 | #define PIN_EMERGENCY_4 2 75 | 76 | #define PIN_MUX_IN 11 77 | #define PIN_MUX_OUT 12 78 | #define PIN_MUX_ADDRESS_0 13 79 | #define PIN_MUX_ADDRESS_1 14 80 | #define PIN_MUX_ADDRESS_2 15 81 | 82 | #define PIN_NEOPIXEL 10 83 | 84 | #define PIN_UI_TX 4 85 | #define PIN_UI_RX 5 86 | 87 | #ifdef ENABLE_SOUND_MODULE 88 | #define PIN_SOUND_TX 16 89 | #define PIN_SOUND_RX 17 90 | #endif 91 | 92 | #elif HW_0_13_X 93 | #define PIN_IMU_SCK 6 94 | #define PIN_IMU_TX 7 95 | #define PIN_IMU_RX 4 96 | #define PIN_IMU_CS 5 97 | 98 | #define PIN_ANALOG_BATTERY_VOLTAGE 27 99 | #define PIN_ANALOG_CHARGE_VOLTAGE 26 100 | #define PIN_ANALOG_CHARGE_CURRENT 28 101 | 102 | #define PIN_ENABLE_CHARGE 22 103 | 104 | #define PIN_ESC_SHUTDOWN 20 105 | #define PIN_RASPI_POWER 21 106 | 107 | #define PIN_EMERGENCY_1 18 108 | #define PIN_EMERGENCY_2 19 109 | #define PIN_EMERGENCY_3 3 110 | #define PIN_EMERGENCY_4 2 111 | 112 | #define PIN_MUX_IN 11 113 | #define PIN_MUX_OUT 12 114 | #define PIN_MUX_ADDRESS_0 13 115 | #define PIN_MUX_ADDRESS_1 14 116 | #define PIN_MUX_ADDRESS_2 15 117 | 118 | #define PIN_NEOPIXEL 10 119 | 120 | #define PIN_UI_TX 8 121 | #define PIN_UI_RX 9 122 | 123 | #ifdef ENABLE_SOUND_MODULE 124 | #define PIN_SOUND_TX 16 125 | #define PIN_SOUND_RX 17 126 | #endif 127 | 128 | #else 129 | #error No hardware version defined 130 | #endif 131 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MAX2040/MAX2040.kicad_mod: -------------------------------------------------------------------------------- 1 | (module "MAX20405AFOFVYT" (layer F.Cu) 2 | (descr "F173A3FY+6_2021") 3 | (tags "Integrated Circuit") 4 | (attr smd) 5 | (fp_text reference IC** (at 0.000 0) (layer F.SilkS) 6 | (effects (font (size 1.27 1.27) (thickness 0.254))) 7 | ) 8 | (fp_text user %R (at 0.000 0) (layer F.Fab) 9 | (effects (font (size 1.27 1.27) (thickness 0.254))) 10 | ) 11 | (fp_text value "MAX20405AFOFVYT" (at 0.000 0) (layer F.SilkS) hide 12 | (effects (font (size 1.27 1.27) (thickness 0.254))) 13 | ) 14 | (fp_line (start -1.75 -1.875) (end 1.75 -1.875) (layer F.Fab) (width 0.1)) 15 | (fp_line (start 1.75 -1.875) (end 1.75 1.875) (layer F.Fab) (width 0.1)) 16 | (fp_line (start 1.75 1.875) (end -1.75 1.875) (layer F.Fab) (width 0.1)) 17 | (fp_line (start -1.75 1.875) (end -1.75 -1.875) (layer F.Fab) (width 0.1)) 18 | (fp_line (start -3.05 -3.175) (end 3.05 -3.175) (layer F.CrtYd) (width 0.1)) 19 | (fp_line (start 3.05 -3.175) (end 3.05 3.175) (layer F.CrtYd) (width 0.1)) 20 | (fp_line (start 3.05 3.175) (end -3.05 3.175) (layer F.CrtYd) (width 0.1)) 21 | (fp_line (start -3.05 3.175) (end -3.05 -3.175) (layer F.CrtYd) (width 0.1)) 22 | (fp_line (start -2.6 -0.95) (end -2.6 -0.95) (layer F.SilkS) (width 0.1)) 23 | (fp_line (start -2.5 -0.95) (end -2.5 -0.95) (layer F.SilkS) (width 0.1)) 24 | (fp_arc (start -2.55 -0.95) (end -2.600 -0.95) (angle -180) (layer F.SilkS) (width 0.1)) 25 | (fp_arc (start -2.55 -0.95) (end -2.500 -0.95) (angle -180) (layer F.SilkS) (width 0.1)) 26 | (pad 1 smd rect (at -1.612 -0.95 90) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 27 | (pad 2 smd rect (at -1.612 -0.45 90) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 28 | (pad 3 smd rect (at -1.287 0.05 90) (size 0.250 1.525) (layers F.Cu F.Paste F.Mask)) 29 | (pad 4 smd rect (at -1.287 1.1 90) (size 0.950 1.525) (layers F.Cu F.Paste F.Mask)) 30 | (pad 5 smd rect (at -1.325 1.875 0) (size 0.450 0.600) (layers F.Cu F.Paste F.Mask)) 31 | (pad 6 smd rect (at 0.000 1.35 0) (size 0.300 1.650) (layers F.Cu F.Paste F.Mask)) 32 | (pad 7 smd rect (at 1.325 1.875 0) (size 0.450 0.600) (layers F.Cu F.Paste F.Mask)) 33 | (pad 8 smd rect (at 1.287 1.1 90) (size 0.950 1.525) (layers F.Cu F.Paste F.Mask)) 34 | (pad 9 smd rect (at 1.287 0.05 90) (size 0.250 1.525) (layers F.Cu F.Paste F.Mask)) 35 | (pad 10 smd rect (at 1.612 -0.45 90) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 36 | (pad 11 smd rect (at 1.612 -0.95 90) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 37 | (pad 12 smd rect (at 1.325 -1.737 0) (size 0.450 0.875) (layers F.Cu F.Paste F.Mask)) 38 | (pad 13 smd rect (at 0.750 -1.737 0) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 39 | (pad 14 smd rect (at 0.250 -1.737 0) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 40 | (pad 15 smd rect (at -0.250 -1.737 0) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 41 | (pad 16 smd rect (at -0.750 -1.737 0) (size 0.300 0.875) (layers F.Cu F.Paste F.Mask)) 42 | (pad 17 smd rect (at -1.325 -1.737 0) (size 0.450 0.875) (layers F.Cu F.Paste F.Mask)) 43 | (pad 18 smd rect (at -1.800 -1.475 90) (size 0.350 0.500) (layers F.Cu F.Paste F.Mask)) 44 | (pad 19 smd rect (at 0.000 0.4 90) (size 0.250 0.600) (layers F.Cu F.Paste F.Mask)) 45 | (pad 20 smd rect (at 1.800 -1.475 90) (size 0.350 0.500) (layers F.Cu F.Paste F.Mask)) 46 | (model MAX20405AFOF_VY+T.stp 47 | (at (xyz 0 0 0)) 48 | (scale (xyz 1 1 1)) 49 | (rotate (xyz 0 0 0)) 50 | ) 51 | ) 52 | -------------------------------------------------------------------------------- /Hardware/DockStation/ene9ba_footprint.pretty/Fuseholder5x20_horiz_open_inline_Type-I.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Fuseholder5x20_horiz_open_inline_Type-I 2 | (layer F.Cu) 3 | (tedit 5880C3AD) 4 | (descr "Fuseholder, 5x20, open, horizontal, Type-I, Inline,") 5 | (tags "Fuseholder 5x20 open horizontal Type-I Inline Sicherungshalter offen ") 6 | (fp_text reference REF** (at 10.00 -5.08) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15)))) 7 | (fp_text value Fuseholder5x20_horiz_open_inline_Type-I (at 11.27 5.08) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15)))) 8 | (fp_line (start 5.00 0) (end 15.00 0) (layer F.Fab) (width 0.10)) 9 | (fp_line (start -2.00 -2.50) (end 22.00 -2.50) (layer F.Fab) (width 0.10)) 10 | (fp_line (start 22.00 -2.50) (end 22.00 2.50) (layer F.Fab) (width 0.10)) 11 | (fp_line (start 22.00 2.50) (end -2.00 2.50) (layer F.Fab) (width 0.10)) 12 | (fp_line (start -2.00 2.50) (end -2.00 -2.50) (layer F.Fab) (width 0.10)) 13 | (fp_line (start 13.35 -3.40) (end 13.35 3.40) (layer F.Fab) (width 0.10)) 14 | (fp_line (start 13.35 3.40) (end 22.90 3.40) (layer F.Fab) (width 0.10)) 15 | (fp_line (start 22.90 3.40) (end 22.90 -3.40) (layer F.Fab) (width 0.10)) 16 | (fp_line (start 22.90 -3.40) (end 13.35 -3.40) (layer F.Fab) (width 0.10)) 17 | (fp_line (start -2.95 -3.40) (end 6.65 -3.40) (layer F.Fab) (width 0.10)) 18 | (fp_line (start 6.65 -3.40) (end 6.65 3.40) (layer F.Fab) (width 0.10)) 19 | (fp_line (start 6.65 3.40) (end -2.90 3.40) (layer F.Fab) (width 0.10)) 20 | (fp_line (start -2.90 3.40) (end -2.90 -3.40) (layer F.Fab) (width 0.10)) 21 | (fp_line (start 13.25 0) (end 6.75 0) (layer F.SilkS) (width 0.12)) 22 | (fp_line (start 13.25 -3.50) (end 13.25 3.50) (layer F.SilkS) (width 0.12)) 23 | (fp_line (start 22.00 3.50) (end 13.25 3.50) (layer F.SilkS) (width 0.12)) 24 | (fp_line (start 22.00 -3.50) (end 13.25 -3.50) (layer F.SilkS) (width 0.12)) 25 | (fp_line (start -0.75 2.50) (end -2.00 2.50) (layer F.SilkS) (width 0.12)) 26 | (fp_line (start -0.50 -2.50) (end -2.00 -2.50) (layer F.SilkS) (width 0.12)) 27 | (fp_line (start 11.50 2.50) (end -0.75 2.50) (layer F.SilkS) (width 0.12)) 28 | (fp_line (start 11.25 -2.50) (end -0.50 -2.50) (layer F.SilkS) (width 0.12)) 29 | (fp_line (start 22.00 2.50) (end 11.50 2.50) (layer F.SilkS) (width 0.12)) 30 | (fp_line (start 22.00 -2.50) (end 11.25 -2.50) (layer F.SilkS) (width 0.12)) 31 | (fp_line (start 22.00 -2.50) (end 22.00 2.50) (layer F.SilkS) (width 0.12)) 32 | (fp_line (start 23.00 -3.50) (end 22.00 -3.50) (layer F.SilkS) (width 0.12)) 33 | (fp_line (start 23.00 -3.50) (end 23.00 3.50) (layer F.SilkS) (width 0.12)) 34 | (fp_line (start 23.00 3.50) (end 22.00 3.50) (layer F.SilkS) (width 0.12)) 35 | (fp_line (start -2.00 -2.50) (end -2.00 2.50) (layer F.SilkS) (width 0.12)) 36 | (fp_line (start 6.75 -3.50) (end -3.00 -3.50) (layer F.SilkS) (width 0.12)) 37 | (fp_line (start -3.00 -3.50) (end -3.00 3.50) (layer F.SilkS) (width 0.12)) 38 | (fp_line (start 6.75 3.50) (end -3.00 3.50) (layer F.SilkS) (width 0.12)) 39 | (fp_line (start 6.75 -3.50) (end 6.75 3.50) (layer F.SilkS) (width 0.12)) 40 | (fp_line (start -3.20 -3.65) (end 23.15 -3.65) (layer F.CrtYd) (width 0.05)) 41 | (fp_line (start -3.20 -3.65) (end -3.20 3.65) (layer F.CrtYd) (width 0.05)) 42 | (fp_line (start 23.15 3.65) (end 23.15 -3.65) (layer F.CrtYd) (width 0.05)) 43 | (fp_line (start 23.15 3.65) (end -3.20 3.65) (layer F.CrtYd) (width 0.05)) 44 | (pad 2 thru_hole circle (at 15.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask)) 45 | (pad 2 thru_hole circle (at 20.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask)) 46 | (pad 1 thru_hole circle (at 5.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask)) 47 | (pad 1 thru_hole circle (at 0.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask))) 48 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MyModules.pretty/Fuseholder5x20_horiz_open_inline_Type-I.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Fuseholder5x20_horiz_open_inline_Type-I 2 | (layer F.Cu) 3 | (tedit 5880C3AD) 4 | (descr "Fuseholder, 5x20, open, horizontal, Type-I, Inline,") 5 | (tags "Fuseholder 5x20 open horizontal Type-I Inline Sicherungshalter offen ") 6 | (fp_text reference REF** (at 10.00 -5.08) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15)))) 7 | (fp_text value Fuseholder5x20_horiz_open_inline_Type-I (at 11.27 5.08) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15)))) 8 | (fp_line (start 5.00 0) (end 15.00 0) (layer F.Fab) (width 0.10)) 9 | (fp_line (start -2.00 -2.50) (end 22.00 -2.50) (layer F.Fab) (width 0.10)) 10 | (fp_line (start 22.00 -2.50) (end 22.00 2.50) (layer F.Fab) (width 0.10)) 11 | (fp_line (start 22.00 2.50) (end -2.00 2.50) (layer F.Fab) (width 0.10)) 12 | (fp_line (start -2.00 2.50) (end -2.00 -2.50) (layer F.Fab) (width 0.10)) 13 | (fp_line (start 13.35 -3.40) (end 13.35 3.40) (layer F.Fab) (width 0.10)) 14 | (fp_line (start 13.35 3.40) (end 22.90 3.40) (layer F.Fab) (width 0.10)) 15 | (fp_line (start 22.90 3.40) (end 22.90 -3.40) (layer F.Fab) (width 0.10)) 16 | (fp_line (start 22.90 -3.40) (end 13.35 -3.40) (layer F.Fab) (width 0.10)) 17 | (fp_line (start -2.95 -3.40) (end 6.65 -3.40) (layer F.Fab) (width 0.10)) 18 | (fp_line (start 6.65 -3.40) (end 6.65 3.40) (layer F.Fab) (width 0.10)) 19 | (fp_line (start 6.65 3.40) (end -2.90 3.40) (layer F.Fab) (width 0.10)) 20 | (fp_line (start -2.90 3.40) (end -2.90 -3.40) (layer F.Fab) (width 0.10)) 21 | (fp_line (start 13.25 0) (end 6.75 0) (layer F.SilkS) (width 0.12)) 22 | (fp_line (start 13.25 -3.50) (end 13.25 3.50) (layer F.SilkS) (width 0.12)) 23 | (fp_line (start 22.00 3.50) (end 13.25 3.50) (layer F.SilkS) (width 0.12)) 24 | (fp_line (start 22.00 -3.50) (end 13.25 -3.50) (layer F.SilkS) (width 0.12)) 25 | (fp_line (start -0.75 2.50) (end -2.00 2.50) (layer F.SilkS) (width 0.12)) 26 | (fp_line (start -0.50 -2.50) (end -2.00 -2.50) (layer F.SilkS) (width 0.12)) 27 | (fp_line (start 11.50 2.50) (end -0.75 2.50) (layer F.SilkS) (width 0.12)) 28 | (fp_line (start 11.25 -2.50) (end -0.50 -2.50) (layer F.SilkS) (width 0.12)) 29 | (fp_line (start 22.00 2.50) (end 11.50 2.50) (layer F.SilkS) (width 0.12)) 30 | (fp_line (start 22.00 -2.50) (end 11.25 -2.50) (layer F.SilkS) (width 0.12)) 31 | (fp_line (start 22.00 -2.50) (end 22.00 2.50) (layer F.SilkS) (width 0.12)) 32 | (fp_line (start 23.00 -3.50) (end 22.00 -3.50) (layer F.SilkS) (width 0.12)) 33 | (fp_line (start 23.00 -3.50) (end 23.00 3.50) (layer F.SilkS) (width 0.12)) 34 | (fp_line (start 23.00 3.50) (end 22.00 3.50) (layer F.SilkS) (width 0.12)) 35 | (fp_line (start -2.00 -2.50) (end -2.00 2.50) (layer F.SilkS) (width 0.12)) 36 | (fp_line (start 6.75 -3.50) (end -3.00 -3.50) (layer F.SilkS) (width 0.12)) 37 | (fp_line (start -3.00 -3.50) (end -3.00 3.50) (layer F.SilkS) (width 0.12)) 38 | (fp_line (start 6.75 3.50) (end -3.00 3.50) (layer F.SilkS) (width 0.12)) 39 | (fp_line (start 6.75 -3.50) (end 6.75 3.50) (layer F.SilkS) (width 0.12)) 40 | (fp_line (start -3.20 -3.65) (end 23.15 -3.65) (layer F.CrtYd) (width 0.05)) 41 | (fp_line (start -3.20 -3.65) (end -3.20 3.65) (layer F.CrtYd) (width 0.05)) 42 | (fp_line (start 23.15 3.65) (end 23.15 -3.65) (layer F.CrtYd) (width 0.05)) 43 | (fp_line (start 23.15 3.65) (end -3.20 3.65) (layer F.CrtYd) (width 0.05)) 44 | (pad 2 thru_hole circle (at 15.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask)) 45 | (pad 2 thru_hole circle (at 20.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask)) 46 | (pad 1 thru_hole circle (at 5.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask)) 47 | (pad 1 thru_hole circle (at 0.00 0) (size 2.35 2.35) (drill 1.35) (layers *.Cu *.Mask))) 48 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/JY901_I2C/JY901.cpp: -------------------------------------------------------------------------------- 1 | #include "JY901.h" 2 | #include "string.h" 3 | 4 | CJY901 ::CJY901 (HardwareI2C *wire) 5 | { 6 | ucDevAddr =0x50; 7 | this->wire = wire; 8 | } 9 | void CJY901::StartIIC() 10 | { 11 | ucDevAddr = 0x50; 12 | wire->begin(); 13 | } 14 | void CJY901::StartIIC(unsigned char ucAddr) 15 | { 16 | ucDevAddr = ucAddr; 17 | wire->begin(); 18 | } 19 | void CJY901 ::CopeSerialData(unsigned char ucData) 20 | { 21 | static unsigned char ucRxBuffer[250]; 22 | static unsigned char ucRxCnt = 0; 23 | 24 | ucRxBuffer[ucRxCnt++]=ucData; 25 | if (ucRxBuffer[0]!=0x55) 26 | { 27 | ucRxCnt=0; 28 | return; 29 | } 30 | if (ucRxCnt<11) {return;} 31 | else 32 | { 33 | switch(ucRxBuffer[1]) 34 | { 35 | case 0x50: memcpy(&stcTime,&ucRxBuffer[2],8);break; 36 | case 0x51: memcpy(&stcAcc,&ucRxBuffer[2],8);break; 37 | case 0x52: memcpy(&stcGyro,&ucRxBuffer[2],8);break; 38 | case 0x53: memcpy(&stcAngle,&ucRxBuffer[2],8);break; 39 | case 0x54: memcpy(&stcMag,&ucRxBuffer[2],8);break; 40 | case 0x55: memcpy(&stcDStatus,&ucRxBuffer[2],8);break; 41 | case 0x56: memcpy(&stcPress,&ucRxBuffer[2],8);break; 42 | case 0x57: memcpy(&stcLonLat,&ucRxBuffer[2],8);break; 43 | case 0x58: memcpy(&stcGPSV,&ucRxBuffer[2],8);break; 44 | case 0x59: memcpy(&stcQuater,&ucRxBuffer[2],8);break; 45 | case 0x5a: memcpy(&stcSN,&ucRxBuffer[2],8);break; 46 | } 47 | ucRxCnt=0; 48 | } 49 | } 50 | void CJY901::readRegisters(unsigned char deviceAddr,unsigned char addressToRead, unsigned char bytesToRead, char * dest) 51 | { 52 | wire->beginTransmission(deviceAddr); 53 | wire->write(addressToRead); 54 | wire->endTransmission(false); //endTransmission but keep the connection active 55 | 56 | wire->requestFrom(deviceAddr, bytesToRead); //Ask for bytes, once done, bus is released by default 57 | 58 | while(wire->available() < bytesToRead); //Hang out until we get the # of bytes we expect 59 | 60 | for(int x = 0 ; x < bytesToRead ; x++) 61 | dest[x] = wire->read(); 62 | } 63 | void CJY901::writeRegister(unsigned char deviceAddr,unsigned char addressToWrite,unsigned char bytesToRead, char *dataToWrite) 64 | { 65 | wire->beginTransmission(deviceAddr); 66 | wire->write(addressToWrite); 67 | for(int i = 0 ; i < bytesToRead ; i++) 68 | wire->write(dataToWrite[i]); 69 | wire->endTransmission(); //Stop transmitting 70 | } 71 | 72 | short CJY901::ReadWord(unsigned char ucAddr) 73 | { 74 | short sResult; 75 | readRegisters(ucDevAddr, ucAddr, 2, (char *)&sResult); 76 | return sResult; 77 | } 78 | void CJY901::WriteWord(unsigned char ucAddr,short sData) 79 | { 80 | writeRegister(ucDevAddr, ucAddr, 2, (char *)&sData); 81 | } 82 | void CJY901::ReadData(unsigned char ucAddr,unsigned char ucLength,char chrData[]) 83 | { 84 | readRegisters(ucDevAddr, ucAddr, ucLength, chrData); 85 | } 86 | 87 | void CJY901::GetTime() 88 | { 89 | readRegisters(ucDevAddr, 0x30, 8, (char*)&stcTime); 90 | } 91 | void CJY901::GetAcc() 92 | { 93 | readRegisters(ucDevAddr, AX, 6, (char *)&stcAcc); 94 | } 95 | void CJY901::GetGyro() 96 | { 97 | readRegisters(ucDevAddr, GX, 6, (char *)&stcGyro); 98 | } 99 | 100 | void CJY901::GetAngle() 101 | { 102 | readRegisters(ucDevAddr, Roll, 6, (char *)&stcAngle); 103 | } 104 | void CJY901::GetMag() 105 | { 106 | readRegisters(ucDevAddr, HX, 6, (char *)&stcMag); 107 | } 108 | void CJY901::GetPress() 109 | { 110 | readRegisters(ucDevAddr, PressureL, 8, (char *)&stcPress); 111 | } 112 | void CJY901::GetDStatus() 113 | { 114 | readRegisters(ucDevAddr, D0Status, 8, (char *)&stcDStatus); 115 | } 116 | void CJY901::GetLonLat() 117 | { 118 | readRegisters(ucDevAddr, LonL, 8, (char *)&stcLonLat); 119 | } 120 | void CJY901::GetGPSV() 121 | { 122 | readRegisters(ucDevAddr, GPSHeight, 8, (char *)&stcGPSV); 123 | } 124 | -------------------------------------------------------------------------------- /Hardware/DockStation/ene9ba_library.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "Conn_01x04" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) 3 | (property "Reference" "J" (id 0) (at 0 5.08 0) 4 | (effects (font (size 1.27 1.27))) 5 | ) 6 | (property "Value" "Conn_01x04" (id 1) (at 0 -7.62 0) 7 | (effects (font (size 1.27 1.27))) 8 | ) 9 | (property "Footprint" "" (id 2) (at 0 0 0) 10 | (effects (font (size 1.27 1.27)) hide) 11 | ) 12 | (property "Datasheet" "" (id 3) (at 0 0 0) 13 | (effects (font (size 1.27 1.27)) hide) 14 | ) 15 | (property "ki_fp_filters" "Connector*:*_1x??_*" (id 4) (at 0 0 0) 16 | (effects (font (size 1.27 1.27)) hide) 17 | ) 18 | (symbol "Conn_01x04_1_1" 19 | (rectangle (start -1.27 -4.953) (end 0 -5.207) 20 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 21 | (fill (type none)) 22 | ) 23 | (rectangle (start -1.27 -2.413) (end 0 -2.667) 24 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 25 | (fill (type none)) 26 | ) 27 | (rectangle (start -1.27 0.127) (end 0 -0.127) 28 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 29 | (fill (type none)) 30 | ) 31 | (rectangle (start -1.27 2.667) (end 0 2.413) 32 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 33 | (fill (type none)) 34 | ) 35 | (rectangle (start -1.27 3.81) (end 1.27 -6.35) 36 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 37 | (fill (type background)) 38 | ) 39 | (pin passive line (at -5.08 2.54 0) (length 3.81) 40 | (name "Pin_1" (effects (font (size 1.27 1.27)))) 41 | (number "1" (effects (font (size 1.27 1.27)))) 42 | ) 43 | (pin passive line (at -5.08 0 0) (length 3.81) 44 | (name "Pin_2" (effects (font (size 1.27 1.27)))) 45 | (number "2" (effects (font (size 1.27 1.27)))) 46 | ) 47 | (pin passive line (at -5.08 -2.54 0) (length 3.81) 48 | (name "Pin_3" (effects (font (size 1.27 1.27)))) 49 | (number "3" (effects (font (size 1.27 1.27)))) 50 | ) 51 | (pin passive line (at -5.08 -5.08 0) (length 3.81) 52 | (name "Pin_4" (effects (font (size 1.27 1.27)))) 53 | (number "4" (effects (font (size 1.27 1.27)))) 54 | ) 55 | ) 56 | ) 57 | (symbol "DC-DC-Wandler" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) 58 | (property "Reference" "A" (id 0) (at 1.27 2.54 0) 59 | (effects (font (size 1.27 1.27))) 60 | ) 61 | (property "Value" "DC-DC-Wandler" (id 1) (at 10.16 10.16 0) 62 | (effects (font (size 1.27 1.27))) 63 | ) 64 | (property "Footprint" "" (id 2) (at 0 0 0) 65 | (effects (font (size 1.27 1.27)) hide) 66 | ) 67 | (property "Datasheet" "" (id 3) (at 0 0 0) 68 | (effects (font (size 1.27 1.27)) hide) 69 | ) 70 | (symbol "DC-DC-Wandler_0_1" 71 | (rectangle (start 0 12.7) (end 19.05 1.27) 72 | (stroke (width 0) (type default) (color 0 0 0 0)) 73 | (fill (type none)) 74 | ) 75 | ) 76 | (symbol "DC-DC-Wandler_1_1" 77 | (pin power_in line (at -2.54 7.62 0) (length 2.54) 78 | (name "Vin+" (effects (font (size 1.27 1.27)))) 79 | (number "1" (effects (font (size 1.27 1.27)))) 80 | ) 81 | (pin power_in line (at -2.54 5.08 0) (length 2.54) 82 | (name "Vin-" (effects (font (size 1.27 1.27)))) 83 | (number "2" (effects (font (size 1.27 1.27)))) 84 | ) 85 | (pin power_out line (at 21.59 7.62 180) (length 2.54) 86 | (name "Vout+" (effects (font (size 1.27 1.27)))) 87 | (number "3" (effects (font (size 1.27 1.27)))) 88 | ) 89 | (pin power_out line (at 21.59 5.08 180) (length 2.54) 90 | (name "Vout-" (effects (font (size 1.27 1.27)))) 91 | (number "4" (effects (font (size 1.27 1.27)))) 92 | ) 93 | ) 94 | ) 95 | ) 96 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/lcsc.pretty/SW-SMD_MK-11C04-G013.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "SW-SMD_MK-11C04-G013" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 5DC5F6A4) 4 | (attr smd) 5 | (fp_text reference "REF**" (at 0 -4.63) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 4aa4b410-7150-4d4d-9c69-efdcfcbffc59) 8 | ) 9 | (fp_text value "SW-SMD_MK-11C04-G013" (at 0 4.63) (layer "F.Fab") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 74f3c426-6abf-43e2-90e6-49a07a3fb79b) 12 | ) 13 | (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab") 14 | (effects (font (size 1 1) (thickness 0.15))) 15 | (tstamp bef9338c-8b7a-425d-bd7b-b73528289fc5) 16 | ) 17 | (fp_line (start 2.75 1.21) (end 2.75 1.88) (layer "F.SilkS") (width 0.25) (tstamp 3d1f4eb0-7bbc-4d4d-8640-0e5376085002)) 18 | (fp_line (start -2.75 0.05) (end -2.75 -0.62) (layer "F.SilkS") (width 0.25) (tstamp 465bc34c-b5b6-43f7-97a0-ae3ed5213cbd)) 19 | (fp_line (start -2.75 1.88) (end 2.75 1.88) (layer "F.SilkS") (width 0.25) (tstamp 4d6974fa-0445-4b4e-b201-0ac56980e855)) 20 | (fp_line (start 0.05 1.88) (end 0.05 3.18) (layer "F.SilkS") (width 0.25) (tstamp 4ee8fae1-2742-4f75-b1a1-9c540fac723b)) 21 | (fp_line (start -2.75 -0.62) (end -1.53 -0.62) (layer "F.SilkS") (width 0.25) (tstamp 648db625-b33d-4f23-af7c-23b4ef1a4125)) 22 | (fp_line (start -2.75 1.88) (end -2.75 1.21) (layer "F.SilkS") (width 0.25) (tstamp 68bafa37-f9a2-4c88-b166-229b2aa35ce0)) 23 | (fp_line (start -1.05 1.88) (end -1.5 1.88) (layer "F.SilkS") (width 0.25) (tstamp 6a655664-9014-4e5c-86fc-8b8213bc6c6a)) 24 | (fp_line (start 1.5 1.38) (end 1.5 1.88) (layer "F.SilkS") (width 0.25) (tstamp 90c94235-56a4-4652-a8e6-1ad33357b1fc)) 25 | (fp_line (start 0.05 3.18) (end 1.25 3.18) (layer "F.SilkS") (width 0.25) (tstamp b16a6a84-08d3-415f-bf0a-8e45cbd7cb01)) 26 | (fp_line (start -1.5 1.88) (end -1.5 1.38) (layer "F.SilkS") (width 0.25) (tstamp b83a021a-8911-4d8e-a76b-a375b18eeea0)) 27 | (fp_line (start 1.25 3.18) (end 1.25 1.88) (layer "F.SilkS") (width 0.25) (tstamp ca71d04b-5101-46c7-bf60-47c664d45ea0)) 28 | (fp_line (start 1.53 -0.62) (end 2.75 -0.62) (layer "F.SilkS") (width 0.25) (tstamp d6edaa8c-37a9-4be2-861d-e251991c879f)) 29 | (fp_line (start 2.75 -0.62) (end 2.75 0.05) (layer "F.SilkS") (width 0.25) (tstamp e0252227-deeb-4adc-b553-970782aa148f)) 30 | (fp_line (start -1.5 1.38) (end 1.5 1.38) (layer "F.SilkS") (width 0.25) (tstamp e6d247d1-fb76-4d63-b7d7-2ae338593e83)) 31 | (fp_poly (pts 32 | (xy 3.556 2.286) 33 | (xy 1.778 2.286) 34 | (xy 1.778 3.556) 35 | (xy -1.778 3.556) 36 | (xy -1.778 2.286) 37 | (xy -3.556 2.286) 38 | (xy -3.556 -1.016) 39 | (xy 3.556 -1.016) 40 | ) (layer "F.CrtYd") (width 0.05) (fill none) (tstamp 8e7d2be3-cdc6-4a2f-af2d-28fff3c78c31)) 41 | (fp_circle (center -3.25 -0.76) (end -3.22 -0.76) (layer "F.Fab") (width 0.06) (fill none) (tstamp e141ce56-68a9-45d3-9522-d6f978ec92f3)) 42 | (pad "" thru_hole circle (at -1.5 0.56) (size 1.2 1.2) (drill 0.9) (layers *.Cu *.Mask) (tstamp c483fed5-1849-4111-bfeb-25edd88a5f37)) 43 | (pad "" thru_hole circle (at 1.5 0.56) (size 1.2 1.2) (drill 0.9) (layers *.Cu *.Mask) (tstamp f47283b5-4719-4e17-b5b1-34a0fd6ceef2)) 44 | (pad "1" smd rect (at -1 -0.63 90) (size 0.7 0.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 08e88ae8-2226-498b-b3d1-ec63bd3337de)) 45 | (pad "2" smd rect (at 1 -0.63 90) (size 0.7 0.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp e19ebb5c-3bac-413e-8a6c-6dadcb65f601)) 46 | (pad "4" smd rect (at 3 0.63 180) (size 0.9 0.7) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp c671325b-6cde-441a-95e7-0bee83729966)) 47 | (pad "5" smd rect (at -3 0.63 180) (size 0.9 0.7) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 354133ae-6203-440b-9739-9f76ab1f8e61)) 48 | (pad "C" smd rect (at 0 -0.63 90) (size 0.7 0.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp da5ed49b-617c-4d5a-9565-e969dedc13f6)) 49 | (model "/lcsc.3dshapes/SW-SMD_MK-11C04-G013.wrl" 50 | (offset (xyz 0 -1.16 0.5)) 51 | (scale (xyz 1 1 1)) 52 | (rotate (xyz 0 0 0)) 53 | ) 54 | ) 55 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MyModules.pretty/WT901.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "WT901" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 0) 4 | (property "Sheetfile" "imu.kicad_sch") 5 | (property "Sheetname" "IMU") 6 | (autoplace_cost90 10) 7 | (autoplace_cost180 10) 8 | (attr smd) 9 | (fp_text reference "J51" (at 0 4.064 180) (layer "F.SilkS") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 42287e2f-cd28-48db-8040-8a3c60c3e22f) 12 | ) 13 | (fp_text value "WT901" (at 0 0) (layer "F.Fab") 14 | (effects (font (size 1 1) (thickness 0.15))) 15 | (tstamp 67841901-d5d6-47a2-bf1a-2666ee09d1aa) 16 | ) 17 | (fp_line (start -7.45 -2.5) (end -7.09 -2.5) (layer "F.SilkS") (width 0.12) (tstamp 00efc7e4-8a0a-488d-9df6-7ab780935590)) 18 | (fp_line (start -7.09 2.499999) (end -7.45 2.499999) (layer "F.SilkS") (width 0.12) (tstamp 48f0eb67-09a3-4696-91e6-d3b761f0a34e)) 19 | (fp_line (start -7.09 -2.5) (end -7.09 2.499999) (layer "F.SilkS") (width 0.12) (tstamp 5ceaa511-36ab-4318-af05-e22f6240af91)) 20 | (fp_line (start -7.45 -7.5) (end -7.45 -2.5) (layer "F.SilkS") (width 0.12) (tstamp 9074f5d7-aaff-4c1a-a3ea-d3ee4e2103f4)) 21 | (fp_line (start -7.45 2.499999) (end -7.45 7.5) (layer "F.SilkS") (width 0.12) (tstamp 9f385574-248d-49bb-8866-d358753413de)) 22 | (fp_line (start 7.45 7.5) (end 7.45 -7.5) (layer "F.SilkS") (width 0.12) (tstamp da04f3f0-c5d1-4887-922b-4ea4a662d726)) 23 | (fp_circle (center 2.58358 -4.064) (end 3.58358 -4.064) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 3d3ae200-2616-4b23-9626-77292802ae6f)) 24 | (fp_line (start -7.2 -7.25) (end 7.2 -7.25) (layer "F.CrtYd") (width 0.05) (tstamp 0e1e6983-14c4-4660-a956-29cd0371ac3f)) 25 | (fp_line (start -7.2 7.25) (end -7.2 -7.25) (layer "F.CrtYd") (width 0.05) (tstamp 7722fa4b-1262-492d-9e15-d7b07d5ebde0)) 26 | (fp_line (start 7.2 -7.25) (end 7.2 7.25) (layer "F.CrtYd") (width 0.05) (tstamp b19a6244-322c-4737-9aa7-821b5c426fc2)) 27 | (fp_line (start 7.2 7.25) (end -7.2 7.25) (layer "F.CrtYd") (width 0.05) (tstamp ca68cead-91db-4d29-aa24-b3b5bd0eaab2)) 28 | (fp_line (start 7.45 -7.5) (end -7.45 -7.5) (layer "F.Fab") (width 0.12) (tstamp 786e59c4-4ae6-4c88-9f13-bad70d5a1c98)) 29 | (fp_line (start -7.45 7.5) (end 7.45 7.5) (layer "F.Fab") (width 0.12) (tstamp ae159030-0423-4a69-97b5-5edcede41312)) 30 | (pad "a1" connect oval (at -6.35 6) (size 1.6 3.2) (drill (offset 0 0.8)) (layers "F.Cu" "F.Mask") (tstamp a502cd57-bd3e-4366-9ada-61598eb59137)) 31 | (pad "a2" connect oval (at -3.81 6) (size 1.6 3.2) (drill (offset 0 0.8)) (layers "F.Cu" "F.Mask") (tstamp 22bb17ce-2921-4916-a9c6-0854019c8ede)) 32 | (pad "a3" connect oval (at -1.27 6) (size 1.6 3.2) (drill (offset 0 0.8)) (layers "F.Cu" "F.Mask") (tstamp 6b410de5-898f-4eab-923a-3bceab206172)) 33 | (pad "a4" connect oval (at 1.27 6) (size 1.6 3.2) (drill (offset 0 0.8)) (layers "F.Cu" "F.Mask") (tstamp 757ce66e-3068-45f1-8d0d-862b9134c2a6)) 34 | (pad "a5" connect oval (at 3.81 6) (size 1.6 3.2) (drill (offset 0 0.8)) (layers "F.Cu" "F.Mask") (tstamp ced500e8-7eb9-459d-b3c5-2c5724afe055)) 35 | (pad "a6" connect oval (at 6.35 6) (size 1.6 3.2) (drill (offset 0 0.8)) (layers "F.Cu" "F.Mask") (tstamp a489be82-9da0-4d48-b9c9-d0ab64ffe1e9)) 36 | (pad "b1" connect oval (at -6.35 -6) (size 1.6 3.2) (drill (offset 0 -0.8)) (layers "F.Cu" "F.Mask") (tstamp b7917eef-742d-4826-a0c8-1903631be269)) 37 | (pad "b2" connect oval (at -3.81 -6) (size 1.6 3.2) (drill (offset 0 -0.8)) (layers "F.Cu" "F.Mask") (tstamp 8cbb86f1-a348-4391-9f33-902341e0b6db)) 38 | (pad "b3" connect oval (at -1.27 -6) (size 1.6 3.2) (drill (offset 0 -0.8)) (layers "F.Cu" "F.Mask") (tstamp 38866133-f31b-4db2-b7c4-22b69fe34807)) 39 | (pad "b4" connect oval (at 1.27 -6) (size 1.6 3.2) (drill (offset 0 -0.8)) (layers "F.Cu" "F.Mask") (tstamp 9cc99731-3bb1-474f-9855-89aad5c596fb)) 40 | (pad "b5" connect oval (at 3.81 -6) (size 1.6 3.2) (drill (offset 0 -0.8)) (layers "F.Cu" "F.Mask") (tstamp 78f2ac9f-55b7-4523-a313-06c650d23b00)) 41 | (pad "b6" connect oval (at 6.35 -6) (size 1.6 3.2) (drill (offset 0 -0.8)) (layers "F.Cu" "F.Mask") (tstamp 3d131b53-9398-409c-a184-fe4cbaf51d7f)) 42 | ) 43 | -------------------------------------------------------------------------------- /Hardware/DockStation/ene9ba_footprint.pretty/DC-DC-XL4016.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "DC-DC-XL4016" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 61346C3B) 4 | (attr through_hole) 5 | (fp_text reference "REF**" (at 46.84 3.48) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 3db0ff67-c52a-42c9-b393-378f9d4a6a78) 8 | ) 9 | (fp_text value "DC-DC-XL4016" (at 7.22 3.32) (layer "F.Fab") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 310da5a3-58cd-4688-bb8c-a3b4c64ac27e) 12 | ) 13 | (fp_line (start 22.86 -8.89) (end 25.4 -8.89) (layer "F.SilkS") (width 0.5) (tstamp 155539ac-86fa-4dc5-815b-6d350103b4aa)) 14 | (fp_line (start 19.05 -8.89) (end 21.59 -8.89) (layer "F.SilkS") (width 0.5) (tstamp 15e40e7d-f910-47f1-8279-0d52f0aec0da)) 15 | (fp_line (start 26.67 -8.89) (end 29.21 -8.89) (layer "F.SilkS") (width 0.5) (tstamp 161cd2ca-0509-47d2-9fd4-b1829f026ba0)) 16 | (fp_line (start 13.97 -21.59) (end 25.4 -21.59) (layer "F.SilkS") (width 0.5) (tstamp 4686d847-635a-4668-88e1-e07e8ec4eece)) 17 | (fp_line (start 12.7 -7.62) (end 31.75 -7.62) (layer "F.SilkS") (width 0.12) (tstamp 4d945994-fcfd-4210-be6f-127b7afb1780)) 18 | (fp_line (start 31.75 -24.13) (end 13.97 -24.13) (layer "F.SilkS") (width 0.12) (tstamp 5041e22b-31dc-46be-9770-7a5bf462036d)) 19 | (fp_line (start -3.0734 4.191) (end -3.0734 -32.5628) (layer "F.SilkS") (width 0.12) (tstamp 6ada657f-8aed-4357-817d-481b1f7221ed)) 20 | (fp_line (start 61.3918 -32.5628) (end 61.3918 4.191) (layer "F.SilkS") (width 0.12) (tstamp 6ceb852c-cbcd-443a-bec2-189e7346e032)) 21 | (fp_line (start -3.0734 -32.5628) (end 61.3156 -32.5628) (layer "F.SilkS") (width 0.12) (tstamp 8cf8f7ca-ef42-40e5-9ddf-bcadb2838263)) 22 | (fp_line (start 12.7 -7.62) (end 31.75 -24.13) (layer "F.SilkS") (width 0.12) (tstamp 912a6f65-1786-40a5-b4f1-aafc15b21a67)) 23 | (fp_line (start 21.59 -19.05) (end 24.13 -19.05) (layer "F.SilkS") (width 0.5) (tstamp 92df496b-da64-4f7c-aa93-42e3d1a2c3bb)) 24 | (fp_line (start 19.05 -11.43) (end 30.48 -11.43) (layer "F.SilkS") (width 0.5) (tstamp 9b11e9b6-0805-4bed-86c5-6aa740f5d061)) 25 | (fp_line (start 17.78 -19.05) (end 20.32 -19.05) (layer "F.SilkS") (width 0.5) (tstamp ba72339e-7162-4285-bf42-fdff4a0277a5)) 26 | (fp_line (start 31.75 -7.62) (end 31.75 -24.13) (layer "F.SilkS") (width 0.12) (tstamp bad24d8c-719f-4ecb-a15a-1e9ccb1326cd)) 27 | (fp_line (start 13.97 -19.05) (end 16.51 -19.05) (layer "F.SilkS") (width 0.5) (tstamp c99a4323-1e86-49ef-a73d-eced8d14a1f5)) 28 | (fp_line (start 13.97 -24.13) (end 12.7 -24.13) (layer "F.SilkS") (width 0.12) (tstamp dc1a0bfc-c31f-4453-b454-b0160058b72b)) 29 | (fp_line (start 61.3918 4.191) (end -3.0734 4.191) (layer "F.SilkS") (width 0.12) (tstamp e54f3f82-8bff-4ba2-9ddd-8161ea5054be)) 30 | (fp_line (start 12.7 -24.13) (end 12.7 -7.62) (layer "F.SilkS") (width 0.12) (tstamp fdd7503f-cbfa-47f2-8d76-edefa39658a3)) 31 | (pad "" thru_hole circle (at -0.03 -0.88) (size 4 4) (drill 2.8) (layers *.Cu *.Mask) (tstamp 5eee8026-877f-4349-b857-7f466849d699)) 32 | (pad "" thru_hole circle (at -0.02 -27.43) (size 4 4) (drill 2.8) (layers *.Cu *.Mask) (tstamp 635414a4-6c8d-436e-8497-927e4b91eb30)) 33 | (pad "" thru_hole circle (at 58.33 -27.4) (size 4 4) (drill 2.8) (layers *.Cu *.Mask) (tstamp b7695966-5277-45ab-9494-67528c5c18ec)) 34 | (pad "" thru_hole circle (at 58.33 -0.8) (size 4 4) (drill 2.8) (layers *.Cu *.Mask) (tstamp faacf747-c151-4cea-91a3-45c5fd218242)) 35 | (pad "1" thru_hole circle (at 0.99 -21.67) (size 2.5 2.5) (drill 0.762) (layers *.Cu *.Mask) (tstamp 525bfff6-bb5b-44ca-96bd-17f781d7db3b)) 36 | (pad "2" thru_hole circle (at 0.99 -16.59) (size 2.5 2.5) (drill 0.762) (layers *.Cu *.Mask) (tstamp 66d2e853-17f4-4bdf-a31d-97e160190af3)) 37 | (pad "3" thru_hole circle (at 0.99 -6.43) (size 2.5 2.5) (drill 0.762) (layers *.Cu *.Mask) (tstamp dd058cd0-5e03-4a39-b4ec-ed9925af7aee)) 38 | (pad "4" thru_hole circle (at 0.99 -11.51) (size 2.5 2.5) (drill 0.762) (layers *.Cu *.Mask) (tstamp 61060bff-301d-4187-b3d9-1f885a3c5274)) 39 | (model "${KIPRJMOD}/MODULO_XL4016.step" 40 | (offset (xyz 22.15 78.42 5.5)) 41 | (scale (xyz 1 1 1)) 42 | (rotate (xyz -90 0 0)) 43 | ) 44 | ) 45 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/JY901_SERIAL/JY901.h: -------------------------------------------------------------------------------- 1 | #ifndef WT901_h 2 | #define WT901_h 3 | 4 | #include "Arduino.h" 5 | 6 | #define SAVE 0x00 7 | #define CALSW 0x01 8 | #define RSW 0x02 9 | #define RRATE 0x03 10 | #define BAUD 0x04 11 | #define AXOFFSET 0x05 12 | #define AYOFFSET 0x06 13 | #define AZOFFSET 0x07 14 | #define GXOFFSET 0x08 15 | #define GYOFFSET 0x09 16 | #define GZOFFSET 0x0a 17 | #define HXOFFSET 0x0b 18 | #define HYOFFSET 0x0c 19 | #define HZOFFSET 0x0d 20 | #define D0MODE 0x0e 21 | #define D1MODE 0x0f 22 | #define D2MODE 0x10 23 | #define D3MODE 0x11 24 | #define D0PWMH 0x12 25 | #define D1PWMH 0x13 26 | #define D2PWMH 0x14 27 | #define D3PWMH 0x15 28 | #define D0PWMT 0x16 29 | #define D1PWMT 0x17 30 | #define D2PWMT 0x18 31 | #define D3PWMT 0x19 32 | #define IICADDR 0x1a 33 | #define LEDOFF 0x1b 34 | #define GPSBAUD 0x1c 35 | 36 | #define YYMM 0x30 37 | #define DDHH 0x31 38 | #define MMSS 0x32 39 | #define MS 0x33 40 | #define AX 0x34 41 | #define AY 0x35 42 | #define AZ 0x36 43 | #define GX 0x37 44 | #define GY 0x38 45 | #define GZ 0x39 46 | #define HX 0x3a 47 | #define HY 0x3b 48 | #define HZ 0x3c 49 | #define Roll 0x3d 50 | #define Pitch 0x3e 51 | #define Yaw 0x3f 52 | #define TEMP 0x40 53 | #define D0Status 0x41 54 | #define D1Status 0x42 55 | #define D2Status 0x43 56 | #define D3Status 0x44 57 | #define PressureL 0x45 58 | #define PressureH 0x46 59 | #define HeightL 0x47 60 | #define HeightH 0x48 61 | #define LonL 0x49 62 | #define LonH 0x4a 63 | #define LatL 0x4b 64 | #define LatH 0x4c 65 | #define GPSHeight 0x4d 66 | #define GPSYAW 0x4e 67 | #define GPSVL 0x4f 68 | #define GPSVH 0x50 69 | 70 | #define DIO_MODE_AIN 0 71 | #define DIO_MODE_DIN 1 72 | #define DIO_MODE_DOH 2 73 | #define DIO_MODE_DOL 3 74 | #define DIO_MODE_DOPWM 4 75 | #define DIO_MODE_GPS 5 76 | 77 | struct STime 78 | { 79 | unsigned char ucYear; 80 | unsigned char ucMonth; 81 | unsigned char ucDay; 82 | unsigned char ucHour; 83 | unsigned char ucMinute; 84 | unsigned char ucSecond; 85 | unsigned short usMiliSecond; 86 | }; 87 | struct SAcc 88 | { 89 | short a[3]; 90 | short T; 91 | }; 92 | struct SGyro 93 | { 94 | short w[3]; 95 | short T; 96 | }; 97 | struct SAngle 98 | { 99 | short Angle[3]; 100 | short T; 101 | }; 102 | struct SMag 103 | { 104 | short h[3]; 105 | short T; 106 | }; 107 | 108 | struct SDStatus 109 | { 110 | short sDStatus[4]; 111 | }; 112 | 113 | struct SPress 114 | { 115 | long lPressure; 116 | long lAltitude; 117 | }; 118 | 119 | struct SLonLat 120 | { 121 | long lLon; 122 | long lLat; 123 | }; 124 | 125 | struct SGPSV 126 | { 127 | short sGPSHeight; 128 | short sGPSYaw; 129 | long lGPSVelocity; 130 | }; 131 | class CJY901 132 | { 133 | public: 134 | struct STime stcTime; 135 | struct SAcc stcAcc; 136 | struct SGyro stcGyro; 137 | struct SAngle stcAngle; 138 | struct SMag stcMag; 139 | struct SDStatus stcDStatus; 140 | struct SPress stcPress; 141 | struct SLonLat stcLonLat; 142 | struct SGPSV stcGPSV; 143 | 144 | #ifdef WT901_INSTEAD_OF_SOUND 145 | CJY901 (HardwareSerial *serial); 146 | void begin(unsigned long baudrate = 9600UL); 147 | #elif WT901 148 | CJY901 (SerialPIO *serial); 149 | void begin(unsigned long baudrate = 9700UL); // YES, 9700 baud! See SerialPIO timing issue https://github.com/earlephilhower/arduino-pico/issues/1276 150 | #endif 151 | 152 | // Call as often as possible to fetch data from serial 153 | void update(); 154 | bool commsError(); // Get (and reset) communication error flag 155 | 156 | 157 | private: 158 | #ifdef WT901_INSTEAD_OF_SOUND 159 | HardwareSerial *serial; 160 | #elif WT901 161 | SerialPIO *serial; 162 | #endif 163 | unsigned char ucRxBuffer[250]; 164 | unsigned char ucRxCnt = 0; 165 | bool commsError_ = false; // Any kind of communication error 166 | 167 | void writeRegister(uint8_t address, uint16_t data); 168 | }; 169 | 170 | #endif -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/MyModules.pretty/LGA-14_2.5X3X0.86_.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "LGA-14_2.5X3X0.86_" (version 20221018) (generator pcbnew) 2 | (layer "F.Cu") 3 | (descr "LGA-14(2.5x3x0.86)") 4 | (tags "Accelerometer") 5 | (attr smd) 6 | (fp_text reference "AC**" (at -0.29 2.54) (layer "F.SilkS") 7 | (effects (font (size 1.27 1.27) (thickness 0.254))) 8 | (tstamp 5f68305a-6687-4dd9-a0d7-4970873aa0fa) 9 | ) 10 | (fp_text value "LGA-14(2.5X3X0.86)" (at -0.29 -0.006) (layer "F.SilkS") hide 11 | (effects (font (size 1.27 1.27) (thickness 0.254))) 12 | (tstamp 8d63bc15-7f3e-4f8a-9d11-865e74a18c46) 13 | ) 14 | (fp_text user "${REFERENCE}" (at -0.29 2.54) (layer "F.Fab") 15 | (effects (font (size 1.27 1.27) (thickness 0.254))) 16 | (tstamp a0f452ec-cdda-4432-9914-c806ddfed933) 17 | ) 18 | (fp_line (start -1.5 -1.25) (end 1.5 -1.25) 19 | (stroke (width 0.2) (type solid)) (layer "F.SilkS") (tstamp b425d91a-556f-4a8b-8582-a726ba8e1853)) 20 | (fp_line (start -1.5 1.25) (end -1.5 -1.25) 21 | (stroke (width 0.2) (type solid)) (layer "F.SilkS") (tstamp d10e698c-accc-4176-b6e1-9efa56bffd5c)) 22 | (fp_line (start 1.5 -1.25) (end 1.5 1.25) 23 | (stroke (width 0.2) (type solid)) (layer "F.SilkS") (tstamp a704727b-86cd-4321-aad2-c92a1110f2a3)) 24 | (fp_line (start 1.5 1.25) (end -1.5 1.25) 25 | (stroke (width 0.2) (type solid)) (layer "F.SilkS") (tstamp 9dd0797a-0865-46cb-a0dc-1f6ce4b093e4)) 26 | (fp_circle (center -1.905 -0.98) (end -1.905 -0.953) 27 | (stroke (width 0.2) (type solid)) (fill none) (layer "F.SilkS") (tstamp 390ad22c-e94e-40ac-9d80-86a27f2731e5)) 28 | (fp_line (start -1.5 -1.25) (end 1.5 -1.25) 29 | (stroke (width 0.2) (type solid)) (layer "F.Fab") (tstamp 004c7f1d-20ed-4a9b-b2c1-f3322f025e18)) 30 | (fp_line (start -1.5 1.25) (end -1.5 -1.25) 31 | (stroke (width 0.2) (type solid)) (layer "F.Fab") (tstamp b68aff6d-1bf5-4d06-9d6a-ad006cc6e148)) 32 | (fp_line (start 1.5 -1.25) (end 1.5 1.25) 33 | (stroke (width 0.2) (type solid)) (layer "F.Fab") (tstamp deec2afd-f5b3-4670-a036-1b2504facce1)) 34 | (fp_line (start 1.5 1.25) (end -1.5 1.25) 35 | (stroke (width 0.2) (type solid)) (layer "F.Fab") (tstamp 44e6e07a-bcea-49c3-83c8-6861cf19877f)) 36 | (pad "1" smd rect (at -1.1625 -0.75 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 74e4843e-9482-4ad9-9d4f-dd13fe19d432)) 37 | (pad "2" smd rect (at -1.1625 -0.25 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp b6f40d11-d575-4422-a956-6296cd77509a)) 38 | (pad "3" smd rect (at -1.1625 0.25 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 3d620da4-788f-4885-bb5f-a4d37cebf915)) 39 | (pad "4" smd rect (at -1.1625 0.75 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 99deae1e-3158-423e-8d5b-b5b971841cd7)) 40 | (pad "5" smd rect (at -0.5 0.9125) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 0cb61b66-b93d-4f6f-871e-45ebc255ecbf)) 41 | (pad "6" smd rect (at 0 0.9125) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 5d442b24-57d8-4268-b0bc-a59287ebc33b)) 42 | (pad "7" smd rect (at 0.5 0.9125) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 6413bf0a-4cee-4687-aac6-7e3c72f6c629)) 43 | (pad "8" smd rect (at 1.1625 0.75 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 9328e6de-5e61-4e65-9015-b72d78585f50)) 44 | (pad "9" smd rect (at 1.1625 0.25 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 643a4cac-63a0-4801-b117-3f4ca9ca3458)) 45 | (pad "10" smd rect (at 1.1625 -0.25 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp afc4d72f-5061-45a1-893c-46f38caf51c7)) 46 | (pad "11" smd rect (at 1.1625 -0.75 90) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 936e8ce8-0221-42b2-bb9f-dde2cafd8df1)) 47 | (pad "12" smd rect (at 0.5 -0.9125) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 9ee09b4b-33b6-4a4c-98a4-00a4c2fce1ff)) 48 | (pad "13" smd rect (at 0 -0.9125) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp eed11f92-6bb7-4e88-81b4-b4831cc059d7)) 49 | (pad "14" smd rect (at -0.5 -0.9125) (size 0.25 0.475) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 36cbe4cc-1448-419b-ab2f-e85e80e083ea)) 50 | (model "LSM6DSOTR.stp" 51 | (offset (xyz 0 0 0.8600000014)) 52 | (scale (xyz 1 1 1)) 53 | (rotate (xyz 90 0 0)) 54 | ) 55 | ) 56 | -------------------------------------------------------------------------------- /Firmware/LowLevel/lib/JY901_I2C/JY901.h: -------------------------------------------------------------------------------- 1 | #ifndef JY901_h 2 | #define JY901_h 3 | #include 4 | 5 | #define SAVE 0x00 6 | #define CALSW 0x01 7 | #define RSW 0x02 8 | #define RRATE 0x03 9 | #define BAUD 0x04 10 | #define AXOFFSET 0x05 11 | #define AYOFFSET 0x06 12 | #define AZOFFSET 0x07 13 | #define GXOFFSET 0x08 14 | #define GYOFFSET 0x09 15 | #define GZOFFSET 0x0a 16 | #define HXOFFSET 0x0b 17 | #define HYOFFSET 0x0c 18 | #define HZOFFSET 0x0d 19 | #define D0MODE 0x0e 20 | #define D1MODE 0x0f 21 | #define D2MODE 0x10 22 | #define D3MODE 0x11 23 | #define D0PWMH 0x12 24 | #define D1PWMH 0x13 25 | #define D2PWMH 0x14 26 | #define D3PWMH 0x15 27 | #define D0PWMT 0x16 28 | #define D1PWMT 0x17 29 | #define D2PWMT 0x18 30 | #define D3PWMT 0x19 31 | #define IICADDR 0x1a 32 | #define LEDOFF 0x1b 33 | #define GPSBAUD 0x1c 34 | 35 | #define YYMM 0x30 36 | #define DDHH 0x31 37 | #define MMSS 0x32 38 | #define MS 0x33 39 | #define AX 0x34 40 | #define AY 0x35 41 | #define AZ 0x36 42 | #define GX 0x37 43 | #define GY 0x38 44 | #define GZ 0x39 45 | #define HX 0x3a 46 | #define HY 0x3b 47 | #define HZ 0x3c 48 | #define Roll 0x3d 49 | #define Pitch 0x3e 50 | #define Yaw 0x3f 51 | #define TEMP 0x40 52 | #define D0Status 0x41 53 | #define D1Status 0x42 54 | #define D2Status 0x43 55 | #define D3Status 0x44 56 | #define PressureL 0x45 57 | #define PressureH 0x46 58 | #define HeightL 0x47 59 | #define HeightH 0x48 60 | #define LonL 0x49 61 | #define LonH 0x4a 62 | #define LatL 0x4b 63 | #define LatH 0x4c 64 | #define GPSHeight 0x4d 65 | #define GPSYAW 0x4e 66 | #define GPSVL 0x4f 67 | #define GPSVH 0x50 68 | 69 | #define DIO_MODE_AIN 0 70 | #define DIO_MODE_DIN 1 71 | #define DIO_MODE_DOH 2 72 | #define DIO_MODE_DOL 3 73 | #define DIO_MODE_DOPWM 4 74 | #define DIO_MODE_GPS 5 75 | 76 | struct STime 77 | { 78 | unsigned char ucYear; 79 | unsigned char ucMonth; 80 | unsigned char ucDay; 81 | unsigned char ucHour; 82 | unsigned char ucMinute; 83 | unsigned char ucSecond; 84 | unsigned short usMiliSecond; 85 | }; 86 | struct SAcc 87 | { 88 | short a[3]; 89 | short T; 90 | }; 91 | struct SGyro 92 | { 93 | short w[3]; 94 | short T; 95 | }; 96 | struct SAngle 97 | { 98 | short Angle[3]; 99 | short T; 100 | }; 101 | struct SMag 102 | { 103 | short h[3]; 104 | short T; 105 | }; 106 | 107 | struct SDStatus 108 | { 109 | short sDStatus[4]; 110 | }; 111 | 112 | struct SPress 113 | { 114 | long lPressure; 115 | long lAltitude; 116 | }; 117 | 118 | struct SLonLat 119 | { 120 | long lLon; 121 | long lLat; 122 | }; 123 | 124 | struct SGPSV 125 | { 126 | short sGPSHeight; 127 | short sGPSYaw; 128 | long lGPSVelocity; 129 | }; 130 | struct SQuater 131 | { 132 | short q0; 133 | short q1; 134 | short q2; 135 | short q3; 136 | }; 137 | struct SSN 138 | { 139 | short sSVNum; 140 | short sPDOP; 141 | short sHDOP; 142 | short sVDOP; 143 | }; 144 | class CJY901 145 | { 146 | public: 147 | struct STime stcTime; 148 | struct SAcc stcAcc; 149 | struct SGyro stcGyro; 150 | struct SAngle stcAngle; 151 | struct SMag stcMag; 152 | struct SDStatus stcDStatus; 153 | struct SPress stcPress; 154 | struct SLonLat stcLonLat; 155 | struct SGPSV stcGPSV; 156 | struct SQuater stcQuater; 157 | struct SSN stcSN; 158 | 159 | CJY901 (HardwareI2C *wire); 160 | void StartIIC(); 161 | void StartIIC(unsigned char ucAddr); 162 | void CopeSerialData(unsigned char ucData); 163 | short ReadWord(unsigned char ucAddr); 164 | void WriteWord(unsigned char ucAddr,short sData); 165 | void ReadData(unsigned char ucAddr,unsigned char ucLength,char chrData[]); 166 | void GetTime(); 167 | void GetAcc(); 168 | void GetGyro(); 169 | void GetAngle(); 170 | void GetMag(); 171 | void GetPress(); 172 | void GetDStatus(); 173 | void GetLonLat(); 174 | void GetGPSV(); 175 | 176 | private: 177 | HardwareI2C *wire; 178 | unsigned char ucDevAddr; 179 | void readRegisters(unsigned char deviceAddr,unsigned char addressToRead, unsigned char bytesToRead, char * dest); 180 | void writeRegister(unsigned char deviceAddr,unsigned char addressToWrite,unsigned char bytesToRead, char *dataToWrite); 181 | }; 182 | extern CJY901 JY901; 183 | #include 184 | #endif -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/bom.ini: -------------------------------------------------------------------------------- 1 | [BOM_OPTIONS] 2 | ; General BoM options here 3 | ; If 'ignore_dnf' option is set to 1, rows that are not to be fitted on the PCB will not be written to the BoM file 4 | ignore_dnf = 1 5 | ; If 'html_generate_dnf' option is set to 1, also generate a list of components not fitted on the PCB (HTML only) 6 | html_generate_dnf = 1 7 | ; If 'use_alt' option is set to 1, grouped references will be printed in the alternate compressed style eg: R1-R7,R18 8 | use_alt = 0 9 | ; If 'number_rows' option is set to 1, each row in the BoM will be prepended with an incrementing row number 10 | number_rows = 1 11 | ; If 'group_connectors' option is set to 1, connectors with the same footprints will be grouped together, independent of the name of the connector 12 | group_connectors = 1 13 | ; If 'test_regex' option is set to 1, each component group will be tested against a number of regular-expressions (specified, per column, below). If any matches are found, the row is ignored in the output file 14 | test_regex = 1 15 | ; If 'merge_blank_fields' option is set to 1, component groups with blank fields will be merged into the most compatible group, where possible 16 | merge_blank_fields = 1 17 | ; Specify output file name format, %O is the defined output name, %v is the version, %V is the variant name which will be ammended according to 'variant_file_name_format'. 18 | output_file_name = %O_bom_%v%V 19 | ; Specify the variant file name format, this is a unique field as the variant is not always used/specified. When it is unused you will want to strip all of this. 20 | variant_file_name_format = _(%V) 21 | ; Field name used to determine if a particular part is to be fitted 22 | fit_field = Config 23 | ; Complex variant processing (disabled by default) 24 | complex_variant = False 25 | ; Character used to separate reference designators in output 26 | ref_separator = ' ' 27 | ; Make a backup of the bom before generating the new one, using the following template 28 | make_backup = %O.tmp 29 | ; Default number of boards to produce if none given on CLI with -n 30 | number_boards = 1 31 | ; Default PCB variant if none given on CLI with -r 32 | board_variant = ['default'] 33 | ; Whether to hide headers from output file 34 | hide_headers = False 35 | ; Whether to hide PCB info from output file 36 | hide_pcb_info = True 37 | ; Interpret as a Digikey P/N and link the following field 38 | digikey_link = False 39 | 40 | [IGNORE_COLUMNS] 41 | ; Any column heading that appears here will be excluded from the Generated BoM 42 | ; Titles are case-insensitive 43 | part lib 44 | footprint lib 45 | sheetpath 46 | 47 | [COLUMN_ORDER] 48 | ; Columns will apear in the order they are listed here 49 | ; Titles are case-insensitive 50 | Description 51 | Part 52 | Part Lib 53 | References 54 | Value 55 | Footprint 56 | Footprint Lib 57 | Sheetpath 58 | Quantity Per PCB 59 | Build Quantity 60 | Datasheet 61 | 62 | [GROUP_FIELDS] 63 | ; List of fields used for sorting individual components into groups 64 | ; Components which match (comparing *all* fields) will be grouped together 65 | ; Field names are case-insensitive 66 | Part 67 | Part Lib 68 | Value 69 | Footprint 70 | Footprint Lib 71 | 72 | [COMPONENT_ALIASES] 73 | ; A series of values which are considered to be equivalent for the part name 74 | ; Each line represents a list of equivalent component name values separated by a tab character 75 | ; e.g. 'c c_small cap' will ensure the equivalent capacitor symbols can be grouped together 76 | ; Aliases are case-insensitive 77 | c c_small cap capacitor 78 | r r_small res resistor 79 | sw switch 80 | l l_small inductor 81 | zener zenersmall 82 | d diode d_small 83 | 84 | [JOIN] 85 | ; A list of rules to join the content of fields 86 | ; Each line is a rule, the first name is the field that will receive the data 87 | ; from the other fields 88 | ; Use tab (ASCII 9) as separator 89 | ; Field names are case sensitive 90 | 91 | [REGEX_INCLUDE] 92 | ; A series of regular expressions used to include parts in the BoM 93 | ; If there are any regex defined here, only components that match against ANY of them will be included in the BOM 94 | ; Column names are case-insensitive 95 | ; Format is: "[ColumName] [Regex]" (separated by a tab) 96 | 97 | [COLUMN_RENAME] 98 | ; A list of columns to be renamed 99 | ; Format is: "[ColumName] [NewName]" (separated by a tab) 100 | 101 | [REGEX_EXCLUDE] 102 | ; A series of regular expressions used to exclude parts from the BoM 103 | ; If a component matches ANY of these, it will be excluded from the BoM 104 | ; Column names are case-insensitive 105 | ; Format is: "[ColumName] [Regex]" (separated by a tab 106 | References ^TP[0-9]* 107 | References ^FID 108 | Part mount.*hole 109 | Part solder.*bridge 110 | Part test.*point 111 | Footprint test.*point 112 | Footprint mount.*hole 113 | Footprint fiducial 114 | 115 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # Pico 5 | # 6 | DEF Pico U 0 20 Y Y 1 F N 7 | F0 "U" -550 1100 50 H V C CNN 8 | F1 "Pico" 0 750 50 H V C CNN 9 | F2 "RPi_Pico:RPi_Pico_SMD_TH" 0 0 50 V I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | DRAW 12 | T 0 0 850 50 0 0 0 "Raspberry Pi Pico" Normal 0 C C 13 | S -600 1050 600 -1050 0 1 0 f 14 | X GPIO0 1 -700 950 100 R 50 50 1 1 B 15 | X GPIO7 10 -700 50 100 R 50 50 1 1 B 16 | X GPIO8 11 -700 -50 100 R 50 50 1 1 B 17 | X GPIO9 12 -700 -150 100 R 50 50 1 1 B 18 | X GND 13 -700 -250 100 R 50 50 1 1 W 19 | X GPIO10 14 -700 -350 100 R 50 50 1 1 B 20 | X GPIO11 15 -700 -450 100 R 50 50 1 1 B 21 | X GPIO12 16 -700 -550 100 R 50 50 1 1 B 22 | X GPIO13 17 -700 -650 100 R 50 50 1 1 B 23 | X GND 18 -700 -750 100 R 50 50 1 1 W 24 | X GPIO14 19 -700 -850 100 R 50 50 1 1 B 25 | X GPIO1 2 -700 850 100 R 50 50 1 1 B 26 | X GPIO15 20 -700 -950 100 R 50 50 1 1 B 27 | X GPIO16 21 700 -950 100 L 50 50 1 1 B 28 | X GPIO17 22 700 -850 100 L 50 50 1 1 B 29 | X GND 23 700 -750 100 L 50 50 1 1 W 30 | X GPIO18 24 700 -650 100 L 50 50 1 1 B 31 | X GPIO19 25 700 -550 100 L 50 50 1 1 B 32 | X GPIO20 26 700 -450 100 L 50 50 1 1 B 33 | X GPIO21 27 700 -350 100 L 50 50 1 1 B 34 | X GND 28 700 -250 100 L 50 50 1 1 W 35 | X GPIO22 29 700 -150 100 L 50 50 1 1 B 36 | X GND 3 -700 750 100 R 50 50 1 1 W 37 | X RUN 30 700 -50 100 L 50 50 1 1 I 38 | X GPIO26_ADC0 31 700 50 100 L 50 50 1 1 B 39 | X GPIO27_ADC1 32 700 150 100 L 50 50 1 1 B 40 | X AGND 33 700 250 100 L 50 50 1 1 W 41 | X GPIO28_ADC2 34 700 350 100 L 50 50 1 1 B 42 | X ADC_VREF 35 700 450 100 L 50 50 1 1 W 43 | X 3V3 36 700 550 100 L 50 50 1 1 W 44 | X 3V3_EN 37 700 650 100 L 50 50 1 1 I 45 | X GND 38 700 750 100 L 50 50 1 1 B 46 | X VSYS 39 700 850 100 L 50 50 1 1 W 47 | X GPIO2 4 -700 650 100 R 50 50 1 1 B 48 | X VBUS 40 700 950 100 L 50 50 1 1 W 49 | X SWCLK 41 -100 -1150 100 U 50 50 1 1 I 50 | X GND 42 0 -1150 100 U 50 50 1 1 W 51 | X SWDIO 43 100 -1150 100 U 50 50 1 1 B 52 | X GPIO3 5 -700 550 100 R 50 50 1 1 B 53 | X GPIO4 6 -700 450 100 R 50 50 1 1 B 54 | X GPIO5 7 -700 350 100 R 50 50 1 1 B 55 | X GND 8 -700 250 100 R 50 50 1 1 W 56 | X GPIO6 9 -700 150 100 R 50 50 1 1 B 57 | ENDDRAW 58 | ENDDEF 59 | # 60 | # RP2040 61 | # 62 | DEF RP2040 U 0 40 Y Y 1 F N 63 | F0 "U" -1150 1950 50 H V C CNN 64 | F1 "RP2040" 950 -1950 50 H V C CNN 65 | F2 "RP2040_minimal:RP2040-QFN-56" -750 0 50 H I C CNN 66 | F3 "" -750 0 50 H I C CNN 67 | DRAW 68 | T 0 0 200 100 0 0 0 "Raspberry Pi" Normal 0 C C 69 | T 0 0 0 100 0 0 0 RP2040 Normal 0 C C 70 | S 1150 1900 -1150 -1900 0 1 10 f 71 | X IOVDD 1 350 2000 100 D 50 50 1 1 W 72 | X IOVDD 10 250 2000 100 D 50 50 1 1 W 73 | X GPIO8 11 1250 500 100 L 50 50 1 1 B 74 | X GPIO9 12 1250 400 100 L 50 50 1 1 B 75 | X GPIO10 13 1250 300 100 L 50 50 1 1 B 76 | X GPIO11 14 1250 200 100 L 50 50 1 1 B 77 | X GPIO12 15 1250 100 100 L 50 50 1 1 B 78 | X GPIO13 16 1250 0 100 L 50 50 1 1 B 79 | X GPIO14 17 1250 -100 100 L 50 50 1 1 B 80 | X GPIO15 18 1250 -200 100 L 50 50 1 1 B 81 | X TESTEN 19 -500 -2000 100 U 50 50 1 1 P 82 | X GPIO0 2 1250 1300 100 L 50 50 1 1 B 83 | X XIN 20 -1250 -100 100 R 50 50 1 1 I 84 | X XOUT 21 -1250 -300 100 R 50 50 1 1 P 85 | X IOVDD 22 150 2000 100 D 50 50 1 1 W 86 | X DVDD 23 -700 2000 100 D 50 50 1 1 W 87 | X SWCLK 24 -1250 -1250 100 R 50 50 1 1 O 88 | X SWD 25 -1250 -1350 100 R 50 50 1 1 B 89 | X RUN 26 -1250 -800 100 R 50 50 1 1 I 90 | X GPIO16 27 1250 -300 100 L 50 50 1 1 B 91 | X GPIO17 28 1250 -400 100 L 50 50 1 1 B 92 | X GPIO18 29 1250 -500 100 L 50 50 1 1 B 93 | X GPIO1 3 1250 1200 100 L 50 50 1 1 B 94 | X GPIO19 30 1250 -600 100 L 50 50 1 1 B 95 | X GPIO20 31 1250 -700 100 L 50 50 1 1 B 96 | X GPIO21 32 1250 -800 100 L 50 50 1 1 B 97 | X IOVDD 33 50 2000 100 D 50 50 1 1 W 98 | X GPIO22 34 1250 -900 100 L 50 50 1 1 B 99 | X GPIO23 35 1250 -1000 100 L 50 50 1 1 B 100 | X GPIO24 36 1250 -1100 100 L 50 50 1 1 B 101 | X GPIO25 37 1250 -1200 100 L 50 50 1 1 B 102 | X GPIO26_ADC0 38 1250 -1400 100 L 50 50 1 1 B 103 | X GPIO27_ADC1 39 1250 -1500 100 L 50 50 1 1 B 104 | X GPIO2 4 1250 1100 100 L 50 50 1 1 B 105 | X GPIO28_ADC2 40 1250 -1600 100 L 50 50 1 1 B 106 | X GPIO29_ADC3 41 1250 -1700 100 L 50 50 1 1 B 107 | X IOVDD 42 -50 2000 100 D 50 50 1 1 W 108 | X ADC_AVDD 43 650 2000 100 D 50 50 1 1 W 109 | X VREG_IN 44 -350 2000 100 D 50 50 1 1 W 110 | X VREG_VOUT 45 -500 2000 100 D 50 50 1 1 w 111 | X USB_DM 46 1250 1600 100 L 50 50 1 1 B 112 | X USB_DP 47 1250 1700 100 L 50 50 1 1 B 113 | X USB_VDD 48 500 2000 100 D 50 50 1 1 W 114 | X IOVDD 49 -150 2000 100 D 50 50 1 1 W 115 | X GPIO3 5 1250 1000 100 L 50 50 1 1 B 116 | X DVDD 50 -800 2000 100 D 50 50 1 1 W 117 | X QSPI_SD3 51 -1250 800 100 R 50 50 1 1 B 118 | X QSPI_SCLK 52 -1250 650 100 R 50 50 1 1 O 119 | X QSPI_SD0 53 -1250 1100 100 R 50 50 1 1 B 120 | X QSPI_SD2 54 -1250 900 100 R 50 50 1 1 B 121 | X QSPI_SD1 55 -1250 1000 100 R 50 50 1 1 B 122 | X QSPI_SS 56 -1250 1250 100 R 50 50 1 1 B 123 | X GND 57 0 -2000 100 U 50 50 1 1 W 124 | X GPIO4 6 1250 900 100 L 50 50 1 1 B 125 | X GPIO5 7 1250 800 100 L 50 50 1 1 B 126 | X GPIO6 8 1250 700 100 L 50 50 1 1 B 127 | X GPIO7 9 1250 600 100 L 50 50 1 1 B 128 | ENDDRAW 129 | ENDDEF 130 | # 131 | #End Library 132 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/xESC2.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "xESC2" (in_bom yes) (on_board yes) 3 | (property "Reference" "U" (id 0) (at -2.54 -22.86 0) 4 | (effects (font (size 1.27 1.27))) 5 | ) 6 | (property "Value" "xESC2" (id 1) (at -2.54 -25.4 0) 7 | (effects (font (size 1.27 1.27))) 8 | ) 9 | (property "Footprint" "" (id 2) (at 0 0 0) 10 | (effects (font (size 1.27 1.27)) hide) 11 | ) 12 | (property "Datasheet" "" (id 3) (at 0 0 0) 13 | (effects (font (size 1.27 1.27)) hide) 14 | ) 15 | (symbol "xESC2_0_0" 16 | (text "Comms" (at -17.78 10.16 0) 17 | (effects (font (size 1.27 1.27))) 18 | ) 19 | (text "Motor Sensors" (at 8.89 31.75 0) 20 | (effects (font (size 1.27 1.27))) 21 | ) 22 | (text "Phases" (at 12.7 46.99 0) 23 | (effects (font (size 1.27 1.27))) 24 | ) 25 | (text "Power In" (at -16.51 46.99 0) 26 | (effects (font (size 1.27 1.27))) 27 | ) 28 | (text "Programming" (at -13.97 29.21 0) 29 | (effects (font (size 1.27 1.27))) 30 | ) 31 | ) 32 | (symbol "xESC2_0_1" 33 | (rectangle (start -21.59 49.53) (end 16.51 -20.32) 34 | (stroke (width 0) (type default) (color 0 0 0 0)) 35 | (fill (type none)) 36 | ) 37 | ) 38 | (symbol "xESC2_1_1" 39 | (pin input line (at -24.13 -10.16 0) (length 2.54) 40 | (name "CAN_L" (effects (font (size 1.27 1.27)))) 41 | (number "1" (effects (font (size 1.27 1.27)))) 42 | ) 43 | (pin input line (at -24.13 15.24 0) (length 2.54) 44 | (name "RESET" (effects (font (size 1.27 1.27)))) 45 | (number "10" (effects (font (size 1.27 1.27)))) 46 | ) 47 | (pin input line (at -24.13 7.62 0) (length 2.54) 48 | (name "MISO" (effects (font (size 1.27 1.27)))) 49 | (number "11" (effects (font (size 1.27 1.27)))) 50 | ) 51 | (pin input line (at -24.13 3.81 0) (length 2.54) 52 | (name "MOSI/TX" (effects (font (size 1.27 1.27)))) 53 | (number "12" (effects (font (size 1.27 1.27)))) 54 | ) 55 | (pin input line (at -24.13 0 0) (length 2.54) 56 | (name "SCK" (effects (font (size 1.27 1.27)))) 57 | (number "13" (effects (font (size 1.27 1.27)))) 58 | ) 59 | (pin input line (at -24.13 -3.81 0) (length 2.54) 60 | (name "NCS/RX" (effects (font (size 1.27 1.27)))) 61 | (number "14" (effects (font (size 1.27 1.27)))) 62 | ) 63 | (pin input line (at -24.13 -13.97 0) (length 2.54) 64 | (name "CAN_H" (effects (font (size 1.27 1.27)))) 65 | (number "2" (effects (font (size 1.27 1.27)))) 66 | ) 67 | (pin input line (at 19.05 29.21 180) (length 2.54) 68 | (name "TEMPERATURE" (effects (font (size 1.27 1.27)))) 69 | (number "3" (effects (font (size 1.27 1.27)))) 70 | ) 71 | (pin input line (at 19.05 25.4 180) (length 2.54) 72 | (name "HALL_U" (effects (font (size 1.27 1.27)))) 73 | (number "4" (effects (font (size 1.27 1.27)))) 74 | ) 75 | (pin input line (at 19.05 21.59 180) (length 2.54) 76 | (name "HALL_V" (effects (font (size 1.27 1.27)))) 77 | (number "5" (effects (font (size 1.27 1.27)))) 78 | ) 79 | (pin input line (at -24.13 39.37 0) (length 2.54) 80 | (name "5V" (effects (font (size 1.27 1.27)))) 81 | (number "5V" (effects (font (size 1.27 1.27)))) 82 | ) 83 | (pin input line (at 19.05 17.78 180) (length 2.54) 84 | (name "HALL_W" (effects (font (size 1.27 1.27)))) 85 | (number "6" (effects (font (size 1.27 1.27)))) 86 | ) 87 | (pin input line (at -24.13 26.67 0) (length 2.54) 88 | (name "3V3_IN" (effects (font (size 1.27 1.27)))) 89 | (number "7" (effects (font (size 1.27 1.27)))) 90 | ) 91 | (pin input line (at -24.13 22.86 0) (length 2.54) 92 | (name "SWDCLK" (effects (font (size 1.27 1.27)))) 93 | (number "8" (effects (font (size 1.27 1.27)))) 94 | ) 95 | (pin input line (at -24.13 19.05 0) (length 2.54) 96 | (name "SWDIO" (effects (font (size 1.27 1.27)))) 97 | (number "9" (effects (font (size 1.27 1.27)))) 98 | ) 99 | (pin input line (at -24.13 35.56 0) (length 2.54) 100 | (name "GND" (effects (font (size 1.27 1.27)))) 101 | (number "GND" (effects (font (size 1.27 1.27)))) 102 | ) 103 | (pin output line (at 19.05 44.45 180) (length 2.54) 104 | (name "U" (effects (font (size 1.27 1.27)))) 105 | (number "U" (effects (font (size 1.27 1.27)))) 106 | ) 107 | (pin output line (at 19.05 40.64 180) (length 2.54) 108 | (name "V" (effects (font (size 1.27 1.27)))) 109 | (number "V" (effects (font (size 1.27 1.27)))) 110 | ) 111 | (pin input line (at -24.13 43.18 0) (length 2.54) 112 | (name "VIN" (effects (font (size 1.27 1.27)))) 113 | (number "VM" (effects (font (size 1.27 1.27)))) 114 | ) 115 | (pin output line (at 19.05 36.83 180) (length 2.54) 116 | (name "W" (effects (font (size 1.27 1.27)))) 117 | (number "W" (effects (font (size 1.27 1.27)))) 118 | ) 119 | ) 120 | ) 121 | ) 122 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/OpenMowerMainboard.kibot.yaml: -------------------------------------------------------------------------------- 1 | kibot: 2 | version: 1 3 | 4 | preflight: 5 | drc: true 6 | erc: true 7 | 8 | filters: 9 | - filter: SIP32509DT has 2 VOUTs 10 | error: 'pin_to_pin' 11 | regex: 'Symbol U3' 12 | 13 | - filter: Kicad 7.0.8 complains about solder jumpers connecting filled areas 14 | error: 'clearance' 15 | regex: 'Zone \[GND\]' 16 | 17 | - filter: New SMD/THT warning system. Ignoring that for non-used SW1 18 | error: 'footprint_type_mismatch' 19 | regex: 'Footprint SW1' 20 | 21 | set_text_variables: 22 | - name: 'git_version' 23 | # Replace n.m.i with n.m."x" 24 | command: > 25 | git describe --tags | sed -E 's/^(v[0-9]+\.[0-9]+)\.([0-9]+)/\1.x/' 26 | update_xml: true 27 | 28 | filters: 29 | - name: anything_in_Config 30 | type: 'generic' 31 | comment: 'Remove components with something in config' 32 | keys: [ "do not place", "DNP", 'bench_test' ] 33 | exclude_config: true 34 | exclude_value: true 35 | 36 | outputs: 37 | - name: 'diff_pcb' 38 | type: 'diff' 39 | comment: 'Generates a PDF with the differences between two PCBs.' 40 | dir: 'release' 41 | options: 42 | old: origin/main 43 | pcb: true 44 | only_different: true 45 | 46 | - name: 'diff_sch' 47 | type: 'diff' 48 | comment: 'Generates a PDF with the differences between two schematics.' 49 | dir: 'release' 50 | options: 51 | old: origin/main 52 | pcb: false 53 | only_different: true 54 | 55 | - name: 'kiri' 56 | comment: 'Generates an interactive web page to browse the schematic and/or PCB differences between git commits.' 57 | type: 'kiri' 58 | dir: 'release' 59 | options: 60 | dnf_filter: [ anything_in_Config, _mechanical ] 61 | max_commits: 16 62 | 63 | - name: 'bom' 64 | comment: 'Used to generate the BoM in CSV, HTML, TSV, TXT, XML or XLSX format using the internal BoM.' 65 | type: 'kibom' # reads bom.ini in contrast with 'bom' 66 | dir: 'release' 67 | options: 68 | format: CSV 69 | 70 | - name: 'write_gerber_drill' 71 | comment: 'This is the information for the drilling machine in gerber format.' 72 | type: 'gerb_drill' 73 | dir: 'release/gerber' 74 | 75 | - name: 'write_gerber' 76 | comment: 'This is the main fabrication format for the PCB.' 77 | type: 'gerber' 78 | dir: 'release/gerber' 79 | layers: 'selected' 80 | 81 | - name: 'gerber' 82 | comment: 'Generates a compressed file containing gerber files.' 83 | type: 'compress' 84 | dir: 'release' 85 | options: 86 | files: 87 | # [string=''] Destination directory inside the archive, empty means the same of the file 88 | - dest: '.' 89 | source: 'release/gerber/*' 90 | 91 | - name: 'position' 92 | comment: 'Generates the file with position information for the PCB components, used by the pick and place machine.' 93 | type: 'position' 94 | dir: 'release' 95 | options: 96 | dnf_filter: [ anything_in_Config, _mechanical ] 97 | format: CSV 98 | 99 | - name: 'ibom' 100 | comment: 'Generates an interactive web page useful to identify the position of the components in the PCB.' 101 | type: 'ibom' 102 | dir: 'release' 103 | options: 104 | # TMP use dnp_field due to bug 105 | # dnf_filter: [anything_in_Config, _mechanical] 106 | dnp_field: Config 107 | extra_fields: Stock_PN 108 | highlight_pin1: true 109 | 110 | - name: 'pdf_sch_print' 111 | comment: 'Exports the PCB to the most common exchange format. Suitable for printing.' 112 | type: 'pdf_sch_print' 113 | dir: 'release' 114 | options: 115 | dnf_filter: anything_in_Config 116 | 117 | - name: 'pcbdraw_svg' 118 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 119 | type: 'pcbdraw' 120 | dir: 'release' 121 | options: 122 | format: 'svg' 123 | dnf_filter: anything_in_Config 124 | 125 | - name: 'pcbdraw_png' 126 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 127 | type: 'pcbdraw' 128 | dir: 'release' 129 | options: 130 | format: 'png' 131 | dnf_filter: anything_in_Config 132 | 133 | - name: 'pcbdraw_svg_bottom' 134 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 135 | type: 'pcbdraw' 136 | dir: 'release' 137 | options: 138 | bottom: true 139 | format: 'svg' 140 | dnf_filter: anything_in_Config 141 | 142 | - name: 'pcbdraw_png_bottom' 143 | comment: 'Exports the PCB as a 2D model (SVG, PNG or JPG).' 144 | type: 'pcbdraw' 145 | dir: 'release' 146 | options: 147 | bottom: true 148 | format: 'png' 149 | dnf_filter: anything_in_Config 150 | 151 | - name: 'render_3d' 152 | comment: "Exports the image generated by KiCad's 3D viewer." 153 | type: 'render_3d' 154 | dir: 'release' 155 | options: 156 | rotate_x: 1 157 | rotate_y: 1 158 | ray_tracing: true 159 | wait_render: -600 160 | zoom: 2 161 | 162 | - name: 'navigate_results' 163 | comment: 'Generates a web page to navigate the generated outputs' 164 | type: 'navigate_results' 165 | dir: 'release_navigator' 166 | options: 167 | link_from_root: "release_navigator/index.html" 168 | -------------------------------------------------------------------------------- /Firmware/LowLevel/src/ui_board.h: -------------------------------------------------------------------------------- 1 | // Created by Elmar Elflein on 3/07/22. 2 | // Copyright (c) 2022 Elmar Elflein. All rights reserved. 3 | // 4 | // This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. 5 | // 6 | // Feel free to use the design in your private/educational projects, but don't try to sell the design or products based on it without getting my consent first. 7 | // 8 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 9 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 10 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 11 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 12 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 13 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 14 | // SOFTWARE. 15 | // 16 | // 17 | #ifndef _UI_DATATYPES_H_ 18 | #define _UI_DATATYPES_H_ 19 | 20 | #include 21 | #include 22 | // Protocol Header Info 23 | enum TYPE 24 | { 25 | Get_Version = 0xB0, 26 | Set_Buzzer = 0xB1, 27 | Set_LEDs = 0xB2, 28 | Get_Button = 0xB3, 29 | Get_Emergency = 0xB4, // Stock-CoverUI 30 | Get_Rain = 0xB5, // Stock-CoverUI 31 | Get_Subscribe = 0xB6 32 | }; 33 | 34 | // Function definiton for the 18 LEDS 35 | enum LED_id 36 | { 37 | LED_CHARGING = 0, 38 | LED_BATTERY_LOW = 1, 39 | LED_POOR_GPS = 2, 40 | LED_MOWER_LIFTED = 3, 41 | LED5 = 4, 42 | LED6 = 5, 43 | LED7 = 6, 44 | LED8 = 7, 45 | LED9 = 8, 46 | LED10 = 9, 47 | LED11 = 10, 48 | LED_LOCK = 11, 49 | LED_S2 = 12, 50 | LED_S1 = 13, 51 | LED15 = 14, 52 | LED16 = 15, 53 | LED17 = 16, 54 | LED18 = 17 55 | }; 56 | 57 | enum LED_state { 58 | LED_off = 0b000, 59 | LED_blink_slow = 0b101, 60 | LED_blink_fast = 0b110, 61 | LED_on = 0b111 62 | }; 63 | 64 | // Stock-CoverUI (same bitmask as in ll_status.emergency_bitmask of datatypes.h) 65 | enum Emergency_state 66 | { 67 | Emergency_latch = 0b00001, 68 | Emergency_stop1 = 0b00010, 69 | Emergency_stop2 = 0b00100, 70 | Emergency_lift1 = 0b01000, 71 | Emergency_lift2 = 0b10000 72 | }; 73 | 74 | enum Topic_state 75 | { 76 | Topic_set_leds = 1 << 0, 77 | Topic_set_ll_status = 1 << 1, 78 | Topic_set_hl_state = 1 << 2, 79 | }; 80 | 81 | #pragma pack(push, 1) 82 | struct msg_get_version 83 | { 84 | uint8_t type; // command type 85 | uint8_t reserved; // padding 86 | uint16_t version; 87 | uint16_t crc; // CRC 16 88 | } __attribute__((packed)); 89 | #pragma pack(pop) 90 | 91 | 92 | #pragma pack(push, 1) 93 | struct msg_set_buzzer 94 | { 95 | uint8_t type; // command type 96 | uint8_t repeat; // Repeat X times 97 | uint8_t on_time; // Signal on time 98 | uint8_t off_time; // Signal off time 99 | uint16_t crc; // CRC 16 100 | } __attribute__((packed)); 101 | #pragma pack(pop) 102 | 103 | 104 | /** 105 | * @brief Use this to update the LED matrix 106 | * Each LED gets three bits with the following meaning: 107 | * 0b000 = Off 108 | * 0b001 = reserved for future use 109 | * 0b010 = reserved for future use 110 | * 0b011 = reserved for future use 111 | * 0b100 = reserved for future use 112 | * 0b101 = On slow blink 113 | * 0b110 = On fast blink 114 | * 0b111 = On 115 | */ 116 | #pragma pack(push, 1) 117 | struct msg_set_leds 118 | { 119 | uint8_t type; // command type 120 | uint8_t reserved; // padding 121 | uint64_t leds; 122 | uint16_t crc; // CRC 16 123 | } __attribute__((packed)); 124 | #pragma pack(pop) 125 | 126 | #pragma pack(push, 1) 127 | struct msg_event_button 128 | { 129 | uint8_t type; // command type 130 | uint16_t button_id; 131 | uint8_t press_duration; 132 | uint16_t crc; // CRC 16 133 | } __attribute__((packed)); 134 | #pragma pack(pop) 135 | 136 | // Stock-CoverUI 137 | #pragma pack(push, 1) 138 | struct msg_event_rain 139 | { 140 | uint8_t type; // Command type 141 | uint8_t reserved; // Padding 142 | uint32_t value; 143 | uint32_t threshold; // If value < threshold then it rains. Why a threshold? Cause there might be a future option to make it configurable on Stock-CoverUI 144 | uint16_t crc; // CRC 16 145 | } __attribute__((packed)); 146 | #pragma pack(pop) 147 | 148 | // Stock-CoverUI 149 | #pragma pack(push, 1) 150 | struct msg_event_emergency 151 | { 152 | uint8_t type; // Command type 153 | uint8_t state; // Same as in ll_status.emergency_bitmask of datatypes.h 154 | uint16_t crc; // CRC 16 155 | } __attribute__((packed)); 156 | #pragma pack(pop) 157 | 158 | // Cover UI might subscribe in what data it's interested to receive 159 | 160 | #pragma pack(push, 1) 161 | struct msg_event_subscribe 162 | { 163 | uint8_t type; // Command type 164 | uint8_t topic_bitmask; // Bitmask of data subscription(s), see Topic_state 165 | uint16_t interval; // Interval (ms) how often to send topic(s) 166 | uint16_t crc; // CRC 16 167 | } __attribute__((packed)); 168 | #pragma pack(pop) 169 | 170 | void setLed(struct msg_set_leds &msg, int led, uint8_t state); 171 | 172 | void setBars7(struct msg_set_leds &msg, double value); 173 | 174 | void setBars4(struct msg_set_leds &msg, double value); 175 | 176 | 177 | #endif // _BttnCtl_HEADER_FILE_ 178 | -------------------------------------------------------------------------------- /Firmware/LowLevel/platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [common] 12 | ; common sources here 13 | default_src_filter = +<*> 14 | - 15 | 16 | [env] 17 | platform = https://github.com/maxgerhardt/platform-raspberrypi.git 18 | board = pico 19 | framework = arduino 20 | 21 | board_build.core = earlephilhower 22 | board_build.filesystem_size = 64k 23 | 24 | lib_deps = 25 | Wire 26 | SPI 27 | FastCRC 28 | LittleFS 29 | bakercp/PacketSerial@^1.4.0 30 | powerbroker2/FireTimer@^1.0.5 31 | https://github.com/ClemensElflein/NeoPixelConnect.git 32 | etlcpp/Embedded Template Library @ ^20.39.4 33 | 34 | debug_tool = custom 35 | debug_init_break = 36 | debug_load_mode = always 37 | debug_port = tcp:openmower.local:3333 38 | 39 | ; 133MHz 40 | board_build.f_cpu = 133000000L 41 | 42 | ; needed so that tinyusb is not added to dependency list (we don't want to use it.) 43 | lib_ldf_mode = off 44 | debug_build_flags = -O0 -g -ggdb 45 | 46 | build_src_filter = +<*> -<.git/> -<.svn/> - 47 | 48 | [sound] 49 | lib_deps = makuna/DFPlayer Mini Mp3 by Makuna@^1.2.3 50 | 51 | [env:0_13_X] 52 | lib_ignore = JY901_SERIAL,JY901_I2C 53 | lib_deps = ${env.lib_deps} 54 | ${sound.lib_deps} 55 | stm32duino/STM32duino LSM6DSO@^2.0.3 56 | build_src_filter = ${env.build_src_filter} + 57 | build_flags = ${env.build_flags} -DHW_0_13_X -DENABLE_SOUND_MODULE 58 | 59 | [env:0_12_X] 60 | lib_ignore = JY901_SERIAL,JY901_I2C 61 | lib_deps = ${env.lib_deps} 62 | ${sound.lib_deps} 63 | stm32duino/STM32duino LSM6DSO@^2.0.3 64 | SoftwareSPI@^1.0 65 | build_src_filter = ${env.build_src_filter} + 66 | build_flags = ${env.build_flags} -DHW_0_12_X -DENABLE_SOUND_MODULE 67 | 68 | 69 | [env:0_11_X_MPU9250] 70 | lib_ignore = JY901_SERIAL,JY901_I2C 71 | lib_deps = ${env.lib_deps} 72 | ${sound.lib_deps} 73 | bolderflight/Bolder Flight Systems MPU9250@^1.0.2 74 | build_src_filter = ${env.build_src_filter} + 75 | build_flags = ${env.build_flags} -DHW_0_11_X -DENABLE_SOUND_MODULE 76 | 77 | [env:0_11_X_WT901] 78 | build_src_filter = ${env.build_src_filter} + 79 | lib_ignore = JY901_SERIAL 80 | lib_deps = ${env.lib_deps} 81 | ${sound.lib_deps} 82 | JY901_I2C 83 | build_flags = ${env.build_flags} -DWT901_I2C -DHW_0_11_X -DENABLE_SOUND_MODULE 84 | 85 | [env:0_11_X_LSM6DSO] 86 | build_src_filter = ${env.build_src_filter} + 87 | lib_ignore = JY901_SERIAL,JY901_I2C 88 | lib_deps = ${env.lib_deps} 89 | ${sound.lib_deps} 90 | stm32duino/STM32duino LSM6DSO@^2.0.3 91 | SoftwareSPI@^1.0 92 | build_flags = ${env.build_flags} -DHW_0_11_X -DENABLE_SOUND_MODULE 93 | 94 | 95 | [env:0_10_X_MPU9250] 96 | lib_ignore = JY901_SERIAL,JY901_I2C 97 | lib_deps = ${env.lib_deps} 98 | ${sound.lib_deps} 99 | bolderflight/Bolder Flight Systems MPU9250@^1.0.2 100 | build_src_filter = ${env.build_src_filter} + 101 | build_flags = ${env.build_flags} -DHW_0_10_X -DENABLE_SOUND_MODULE 102 | 103 | [env:0_10_X_WT901] 104 | build_src_filter = ${env.build_src_filter} + 105 | lib_ignore = JY901_SERIAL 106 | lib_deps = ${env.lib_deps} 107 | ${sound.lib_deps} 108 | JY901_I2C 109 | build_flags = ${env.build_flags} -DWT901_I2C -DHW_0_10_X -DENABLE_SOUND_MODULE 110 | 111 | [env:0_10_X_LSM6DSO] 112 | build_src_filter = ${env.build_src_filter} + 113 | lib_ignore = JY901_SERIAL,JY901_I2C 114 | lib_deps = ${env.lib_deps} 115 | ${sound.lib_deps} 116 | stm32duino/STM32duino LSM6DSO@^2.0.3 117 | SoftwareSPI@^1.0 118 | build_flags = ${env.build_flags} -DHW_0_10_X -DENABLE_SOUND_MODULE 119 | 120 | 121 | [env:0_9_X_MPU9250] 122 | lib_ignore = JY901_SERIAL,JY901_I2C 123 | lib_deps = ${env.lib_deps} 124 | ${sound.lib_deps} 125 | bolderflight/Bolder Flight Systems MPU9250@^1.0.2 126 | build_src_filter = ${env.build_src_filter} + 127 | build_flags = ${env.build_flags} -DHW_0_9_X -DENABLE_SOUND_MODULE 128 | 129 | [env:0_9_X_WT901_INSTEAD_OF_SOUND] 130 | lib_ignore = JY901_I2C 131 | build_src_filter = ${env.build_src_filter} + - 132 | lib_deps = ${env.lib_deps} 133 | JY901_SERIAL 134 | build_flags = ${env.build_flags} -DWT901_INSTEAD_OF_SOUND -DHW_0_9_X 135 | 136 | [env:0_9_X_WT901] 137 | lib_ignore = JY901_I2C 138 | build_src_filter = ${env.build_src_filter} + 139 | lib_deps = ${env.lib_deps} 140 | ${sound.lib_deps} 141 | JY901_SERIAL 142 | build_flags = ${env.build_flags} -DWT901 -DHW_0_9_X -DENABLE_SOUND_MODULE 143 | 144 | [env:0_9_X_LSM6DSO] 145 | lib_ignore = JY901_SERIAL,JY901_I2C 146 | build_src_filter = ${env.build_src_filter} + 147 | lib_deps = ${env.lib_deps} 148 | ${sound.lib_deps} 149 | stm32duino/STM32duino LSM6DSO@^2.0.3 150 | build_flags = ${env.build_flags} -DHW_0_9_X -DENABLE_SOUND_MODULE 151 | -------------------------------------------------------------------------------- /Hardware/OpenMowerMainboard/WTV020.pretty/WTV020.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "WTV020" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 61EAEEAD) 4 | (attr through_hole) 5 | (fp_text reference "REF**" (at -2.54 -8.12 unlocked) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 07fdfdcc-4872-4067-8a18-6d2f0971ae29) 8 | ) 9 | (fp_text value "WTV020" (at -2.54 -6.62 unlocked) (layer "F.Fab") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 8711a956-252e-4d30-9d0c-4dbca206fb1d) 12 | ) 13 | (fp_line (start -12.23 -9.57) (end 5.67 -9.57) (layer "F.SilkS") (width 0.12) (tstamp 7c8625f4-8ffd-4dc1-aca9-926311a56b72)) 14 | (fp_line (start -12.23 -27.41) (end -12.23 -9.57) (layer "F.SilkS") (width 0.12) (tstamp 904873c2-0fb7-4448-83be-7c7b2182a62a)) 15 | (fp_line (start 5.67 -30.01) (end 5.67 -9.57) (layer "F.SilkS") (width 0.12) (tstamp 923a53ff-4688-40b5-bda6-12d916dc33a7)) 16 | (fp_line (start -12.23 -28.68) (end -12.23 -30.01) (layer "F.SilkS") (width 0.12) (tstamp 9d28fdc0-74a7-4d4f-a72b-a3c76de00716)) 17 | (fp_line (start -12.23 -27.41) (end -9.63 -27.41) (layer "F.SilkS") (width 0.12) (tstamp cdb4f591-b6d9-4cd2-8b1c-7152ad23bf66)) 18 | (fp_line (start -9.63 -30.01) (end 5.67 -30.01) (layer "F.SilkS") (width 0.12) (tstamp df4fa527-001d-4469-ab18-723fab62f3a6)) 19 | (fp_line (start -9.63 -27.41) (end -9.63 -30.01) (layer "F.SilkS") (width 0.12) (tstamp e81baf3a-e4d1-46c5-8de2-c1f850a6b1d6)) 20 | (fp_line (start -12.23 -30.01) (end -10.9 -30.01) (layer "F.SilkS") (width 0.12) (tstamp f4175a5b-11d1-4839-b9aa-629df12a2b15)) 21 | (fp_line (start -12.7 -9.13) (end 6.15 -9.13) (layer "F.CrtYd") (width 0.05) (tstamp 1d2a3208-affe-402e-ace7-5f8607f3101f)) 22 | (fp_line (start -12.7 -30.48) (end -12.7 -9.13) (layer "F.CrtYd") (width 0.05) (tstamp 1e8bd9a2-c40c-487c-a25b-61309389c54e)) 23 | (fp_line (start 6.15 -30.48) (end -12.7 -30.48) (layer "F.CrtYd") (width 0.05) (tstamp c4a2d2b5-2da9-43b1-a184-6486edffa8fd)) 24 | (fp_line (start 6.15 -9.13) (end 6.15 -30.48) (layer "F.CrtYd") (width 0.05) (tstamp d2529171-92fc-4895-8aba-ac4e112a2c6d)) 25 | (fp_line (start -7.09 -9.63) (end -12.17 -9.63) (layer "F.Fab") (width 0.1) (tstamp 19507d94-0f5b-483f-b801-b32484ebc487)) 26 | (fp_line (start 5.61 -29.95) (end 5.61 -9.63) (layer "F.Fab") (width 0.1) (tstamp 1c9e0928-6d40-4dca-95b0-a140625db070)) 27 | (fp_line (start -12.17 -9.63) (end -12.17 -28.68) (layer "F.Fab") (width 0.1) (tstamp 83f46f97-02b3-47e4-9f9a-b5a1fb5307da)) 28 | (fp_line (start -12.17 -28.68) (end -10.9 -29.95) (layer "F.Fab") (width 0.1) (tstamp 94201a97-7e54-478d-84be-ab7c2187112c)) 29 | (fp_line (start -10.9 -29.95) (end 5.61 -29.95) (layer "F.Fab") (width 0.1) (tstamp c4de7fa7-b283-4149-a790-a90d4fff96d1)) 30 | (pad "1" thru_hole rect (at -10.9 -28.68) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp e4330972-5378-49fc-856f-d5ac9194e9d7)) 31 | (pad "2" thru_hole oval (at 4.34 -28.68) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp 01d4768a-c5f0-4542-bd92-26cb35851f40)) 32 | (pad "3" thru_hole oval (at -10.9 -26.14) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp 104d3acb-965d-4350-8d70-79593633ab60)) 33 | (pad "4" thru_hole oval (at 4.34 -26.14) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp a777d3fa-defd-459e-bcc0-be967b297b8e)) 34 | (pad "5" thru_hole oval (at -10.9 -23.6) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp 15e52e97-d70c-4540-8bea-f5125c728e34)) 35 | (pad "6" thru_hole oval (at 4.34 -23.6) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp 25cf2556-391b-4f85-a364-f982d099384d)) 36 | (pad "7" thru_hole oval (at -10.9 -21.06) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp 3efc1268-dbc7-4bf3-9742-49add15a4cec)) 37 | (pad "8" thru_hole oval (at 4.34 -21.06) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp b49dd2bf-3e43-424a-9354-842b2185b33a)) 38 | (pad "9" thru_hole oval (at -10.9 -18.52) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp 80640bb4-9c39-4762-928c-94e881512e5e)) 39 | (pad "10" thru_hole oval (at 4.34 -18.52) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp 4397637a-0d4b-4467-a6bd-f8012e28c3d5)) 40 | (pad "11" thru_hole oval (at -10.9 -15.98) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp eca38f2e-6366-4625-b8be-97ae04cb8626)) 41 | (pad "12" thru_hole oval (at 4.34 -15.98) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp 26266969-2872-4d44-b207-95e13cc5d733)) 42 | (pad "13" thru_hole oval (at -10.9 -13.44) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp ca59c29c-a5ab-4580-97ff-44d4b3e7ad23)) 43 | (pad "14" thru_hole oval (at 4.34 -13.44) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp cb78c2d3-2960-4479-bca8-f5bf62a3824a)) 44 | (pad "15" thru_hole oval (at -10.9 -10.9) (size 3 1.7) (drill 1 (offset -0.5 0)) (layers *.Cu *.Mask) (tstamp 457fd312-68dc-49b9-8560-e98e8d8494be)) 45 | (pad "16" thru_hole oval (at 4.34 -10.9) (size 3 1.7) (drill 1 (offset 0.5 0)) (layers *.Cu *.Mask) (tstamp c2bebfe4-a61c-45b1-b96a-44047619dd45)) 46 | (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x08_P2.54mm_Vertical.step" 47 | (offset (xyz 4.35 28.67 0.5)) 48 | (scale (xyz 1 1 1)) 49 | (rotate (xyz 0 0 0)) 50 | ) 51 | (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x08_P2.54mm_Vertical.step" 52 | (offset (xyz -10.9 28.65 0)) 53 | (scale (xyz 1 1 1)) 54 | (rotate (xyz 0 0 0)) 55 | ) 56 | ) 57 | --------------------------------------------------------------------------------