From 6759696c6870778e7fbfb277285561826a89b317 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Wed, 15 May 2019 20:15:16 +0200 Subject: [PATCH 01/44] added .gitattributes added .gitignore --- .gitattributes | 63 +++++++++ .gitignore | 341 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 404 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..188e6c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,341 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ii]ntermediates/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb \ No newline at end of file From f646c965d54ed4f6f0377ef4087ab406b252366b Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Wed, 15 May 2019 20:19:23 +0200 Subject: [PATCH 02/44] corrected some comments --- src/Servo_Hardware_PWM.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index c491dec..bca0104 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -34,7 +34,7 @@ void Servo::attach(int pin) TCCR3A |= (1 << WGM31) | (1 << WGM30); TCCR3B |= (1 << WGM32) | (1 << WGM33); - //setting the the TOP value: + //setting the TOP value: OCR3A = MAX_TIMER_COUNT; //results in 50Hz at 2MHz Clock //setting the output to non inverted: @@ -62,7 +62,7 @@ void Servo::attach(int pin) TCCR3A |= (1 << WGM31) | (1 << WGM30); TCCR3B |= (1 << WGM32) | (1 << WGM33); - //setting the the TOP value: + //setting the TOP value: OCR3A = MAX_TIMER_COUNT; //results in 50Hz at 2MHz Clock //setting the output to non inverted: @@ -90,7 +90,7 @@ void Servo::attach(int pin) TCCR4A |= (1 << WGM41) | (1 << WGM40); TCCR4B |= (1 << WGM42) | (1 << WGM43); - //setting the the TOP value: + //setting the TOP value: OCR4A = MAX_TIMER_COUNT; //results in 50Hz at 2MHz Clock //setting the output to non inverted: @@ -118,7 +118,7 @@ void Servo::attach(int pin) TCCR4A |= (1 << WGM41) | (1 << WGM40); TCCR4B |= (1 << WGM42) | (1 << WGM43); - //setting the the TOP value: + //setting the TOP value: OCR4A = MAX_TIMER_COUNT; //results in 50Hz at 2MHz Clock //setting the output to non inverted: @@ -146,7 +146,7 @@ void Servo::attach(int pin) TCCR5A |= (1 << WGM51) | (1 << WGM50); TCCR5B |= (1 << WGM52) | (1 << WGM53); - //setting the the TOP value: + //setting the TOP value: OCR5A = MAX_TIMER_COUNT; //results in 50Hz at 2MHz Clock //setting the output to non inverted: @@ -174,7 +174,7 @@ void Servo::attach(int pin) TCCR5A |= (1 << WGM51) | (1 << WGM50); TCCR5B |= (1 << WGM52) | (1 << WGM53); - //setting the the TOP value: + //setting the TOP value: OCR5A = MAX_TIMER_COUNT; //results in 50Hz at 2MHz Clock //setting the output to non inverted: From f384362b4293a305c4b1ac87df4c79569a9698e1 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Wed, 15 May 2019 20:27:17 +0200 Subject: [PATCH 03/44] updated .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 188e6c9..61b81ca 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,11 @@ ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +# Custom ignore +*.vcxproj +*.vcxproj.filters +*.vsarduino.h + # User-specific files *.rsuser *.suo From 8d9c19c190503b02879021f9eac646dae1ac4bdf Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 13:52:29 +0200 Subject: [PATCH 04/44] added write(value)-method --- src/Servo_Hardware_PWM.cpp | 13 +++++++++++++ src/Servo_Hardware_PWM.h | 1 + 2 files changed, 14 insertions(+) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index bca0104..1d2cdb1 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -273,7 +273,20 @@ void Servo::detach() } } +void Servo::write(int value) +{ + if (value < 0) + { + value = 0; + } + else if (value > 180) + { + value = 180; + } + value = map(value, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); + this->writeMicroseconds(value); +} void Servo::writeMicroseconds(int value) { if ((this->servoIndex < MAX_SERVOS)) { diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 301c160..0c19c7d 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -68,6 +68,7 @@ class Servo Servo(); void attach(int pin); //attach the given pin void detach(); //detach the used pin + void write(int value); //write angle in degrees void writeMicroseconds(int value); //write pulse width in microseconds private: int servoIndex = 0; //number of attached Servos From 962366781f422eeb54c75a4d90b79f50fd4f7dff Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 16:54:43 +0200 Subject: [PATCH 05/44] added "write" to keywords.txt --- keywords.txt | 1 + src/Servo_Hardware_PWM.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/keywords.txt b/keywords.txt index d4ab8c3..19e4b9c 100644 --- a/keywords.txt +++ b/keywords.txt @@ -13,6 +13,7 @@ Servo KEYWORD1 Servo ####################################### attach KEYWORD2 detach KEYWORD2 +write KEYWORD2 writeMicroseconds KEYWORD2 ####################################### diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 1d2cdb1..757096e 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -287,6 +287,7 @@ void Servo::write(int value) this->writeMicroseconds(value); } + void Servo::writeMicroseconds(int value) { if ((this->servoIndex < MAX_SERVOS)) { From 0b13f1a39812f33a19fd15afb91d01b7706acddd Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 17:01:36 +0200 Subject: [PATCH 06/44] updated .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 61b81ca..761da0a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,15 @@ ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + # Custom ignore +__vm/ *.vcxproj *.vcxproj.filters *.vsarduino.h +*.vmps.xml +*.Debug.vmps.xml + # User-specific files *.rsuser From a2f31feacbd09aa2ef6bb42ce092fd6e97386087 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 17:14:14 +0200 Subject: [PATCH 07/44] updated the Servo_Sweep.ino-example --- examples/Servo_Sweep/Servo_Sweep.ino | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/examples/Servo_Sweep/Servo_Sweep.ino b/examples/Servo_Sweep/Servo_Sweep.ino index c0ba682..1b12465 100644 --- a/examples/Servo_Sweep/Servo_Sweep.ino +++ b/examples/Servo_Sweep/Servo_Sweep.ino @@ -13,6 +13,7 @@ Servo myServo5; Servo myServo6; unsigned int valueMicros = 0; //variable that contains the microseconds +int valueDegrees = 0; //variable that contains the degrees void setup() { myServo1.attach(2); //attaches the servo to pin 2 @@ -24,22 +25,25 @@ void setup() { } void loop() { - for (valueMicros = 500; valueMicros < 2500; valueMicros++){ //goes from 0° to 180° (500us to 2500us) + //option 1 - using microseconds and the writeMicroseconds-function: + for (valueMicros = 500; valueMicros < 2500; valueMicros++){ //goes from 500us to 2500us (0° to 180°) myServo1.writeMicroseconds(valueMicros); //writes the value of valueMicros to the servo myServo2.writeMicroseconds(valueMicros); myServo3.writeMicroseconds(valueMicros); myServo4.writeMicroseconds(valueMicros); myServo5.writeMicroseconds(valueMicros); myServo6.writeMicroseconds(valueMicros); - delay(10); + delay(1); } - for (valueMicros = 2500; valueMicros > 500; valueMicros--){ //goes from 180° to 0° (2500us to 500us) - myServo1.writeMicroseconds(valueMicros); - myServo2.writeMicroseconds(valueMicros); - myServo3.writeMicroseconds(valueMicros); - myServo4.writeMicroseconds(valueMicros); - myServo5.writeMicroseconds(valueMicros); - myServo6.writeMicroseconds(valueMicros); + + //option 2 - using degrees and the write-function: + for (valueDegrees = 180; valueDegrees > 0; valueDegrees--){ //goes from 180° to 0° (2500us to 500us) + myServo1.write(valueDegrees); //writes the value of valueDegrees to the servo + myServo2.write(valueDegrees); + myServo3.write(valueDegrees); + myServo4.write(valueDegrees); + myServo5.write(valueDegrees); + myServo6.write(valueDegrees); delay(10); } } From dfafcd2a9003fcbfc32f3423ed70b5e76344d288 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 17:31:48 +0200 Subject: [PATCH 08/44] changed all global variables in Servo_Hardware_PWM.cpp to static --- src/Servo_Hardware_PWM.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 757096e..cb0dcb3 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -7,8 +7,8 @@ For information about the library, license and author, see Servo_Hardware_PWM.h #include #include -int servoCount = 0; -bool pinActive[MAX_SERVOS] = {false}; +static int servoCount = 0; +static bool pinActive[MAX_SERVOS] = {false}; Servo::Servo() { From 7622e85d91b12b0b31c20d137d99ff8c7335d6b9 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 18:42:25 +0200 Subject: [PATCH 09/44] added detachAll-method updated writeMicroseconds-method --- src/Servo_Hardware_PWM.cpp | 87 +++++++++++++++++++++++++++++++++++--- src/Servo_Hardware_PWM.h | 1 + 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index cb0dcb3..8c01182 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -273,6 +273,81 @@ void Servo::detach() } } +void Servo::detachAll() { + if (pinActive[0] == true) + { + //resetting the control register A and B: + TCCR3A = 0x0; + TCCR3B = 0x0; + //resetting the TOP value: + OCR3A = 0x0; + + OCR3B = 0x0; //resetting the pulse width + DDRE ^= (1 << PE4); //bit 4 (pin 2) stop output + pinActive[0] = false; + } + if (pinActive[1] == true) + { + //resetting the control register A and B: + TCCR3A = 0x0; + TCCR3B = 0x0; + //resetting the TOP value: + OCR3A = 0x0; + + OCR3C = 0x0; //resetting the pulse width + DDRE ^= (1 << PE5); //bit 5 (pin 3) stop output + pinActive[1] = false; + } + if (pinActive[2] == true) + { + //resetting the control register A and B: + TCCR4A = 0x0; + TCCR4B = 0x0; + //resetting the TOP value: + OCR4A = 0x0; + + OCR4B = 0x0; //resetting the pulse width + DDRH ^= (1 << PH4); //bit 4 (pin 7) stop output + pinActive[2] = false; + } + if (pinActive[3] == true) + { + //resetting the control register A and B: + TCCR4A = 0x0; + TCCR4B = 0x0; + //resetting the TOP value: + OCR4A = 0x0; + + OCR4C = 0x0; //resetting the pulse width + DDRH ^= (1 << PH5); //bit 5 (pin 8) stop output + pinActive[3] = false; + } + if (pinActive[4] == true) + { + //resetting the control register A and B: + TCCR5A = 0x0; + TCCR5B = 0x0; + //resetting the TOP value: + OCR5A = 0x0; + + OCR5C = 0x0; //resetting the pulse width + DDRL ^= (1 << PL5); //bit 5 (pin 44) stop output + pinActive[4] = false; + } + if (pinActive[5] == true) + { + //resetting the control register A and B: + TCCR5A = 0x0; + TCCR5B = 0x0; + //resetting the TOP value: + OCR5A = 0x0; + + OCR5B = 0x0; //resetting the pulse width + DDRL ^= (1 << PL4); //bit 4 (pin 45) stop output + pinActive[5] = false; + } +} + void Servo::write(int value) { if (value < 0) @@ -297,27 +372,27 @@ void Servo::writeMicroseconds(int value) else if (value > MAX_PULSE_WIDTH) { value = MAX_PULSE_WIDTH; } - if (this->servoPin == 2) { + if (this->servoPin == 2 && pinActive[0] == true) { OCR3B = 0x0; OCR3B = value * 2; } - else if (this->servoPin == 3) { + else if (this->servoPin == 3 && pinActive[1] == true) { OCR3C = 0x0; OCR3C = value * 2; } - else if (this->servoPin == 7) { + else if (this->servoPin == 7 && pinActive[2] == true) { OCR4B = 0x0; OCR4B = value * 2; } - else if (this->servoPin == 8) { + else if (this->servoPin == 8 && pinActive[3] == true) { OCR4C = 0x0; OCR4C = value * 2; } - else if (this->servoPin == 44) { + else if (this->servoPin == 44 && pinActive[4] == true) { OCR5C = 0x0; OCR5C = value * 2; } - else if (this->servoPin == 45) { + else if (this->servoPin == 45 && pinActive[5] == true) { OCR5B = 0x0; OCR5B = value * 2; } diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 0c19c7d..98e0649 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -68,6 +68,7 @@ class Servo Servo(); void attach(int pin); //attach the given pin void detach(); //detach the used pin + void detachAll(); //automatically detaches all used pins void write(int value); //write angle in degrees void writeMicroseconds(int value); //write pulse width in microseconds private: From f4e1fadb74524f4621cf622d961b26d732252ca8 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 19:06:09 +0200 Subject: [PATCH 10/44] updated the keywords.txt-file --- keywords.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/keywords.txt b/keywords.txt index 19e4b9c..6b9d631 100644 --- a/keywords.txt +++ b/keywords.txt @@ -11,10 +11,11 @@ Servo KEYWORD1 Servo ####################################### # Methods and Functions (KEYWORD2) ####################################### -attach KEYWORD2 -detach KEYWORD2 -write KEYWORD2 -writeMicroseconds KEYWORD2 +attach KEYWORD2 +detach KEYWORD2 +detachAll KEYWORD2 +write KEYWORD2 +writeMicroseconds KEYWORD2 ####################################### # Constants (LITERAL1) From 1e0726d399bbd35d37aa199bdfd2bfc59aa20f05 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sun, 19 May 2019 22:12:30 +0200 Subject: [PATCH 11/44] updated some data types updated the constructor method updated the attach method updated the detach method updated the write method --- src/Servo_Hardware_PWM.cpp | 116 ++++++++++++++++++++----------------- src/Servo_Hardware_PWM.h | 9 ++- 2 files changed, 70 insertions(+), 55 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 8c01182..e4db292 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -7,21 +7,31 @@ For information about the library, license and author, see Servo_Hardware_PWM.h #include #include -static int servoCount = 0; -static bool pinActive[MAX_SERVOS] = {false}; +#define BOOL_FALSE 0 +#define BOOL_TRUE 255 + +static uint8_t servoCount = 0; +static uint8_t pinActive[MAX_SERVOS] = {BOOL_FALSE}; Servo::Servo() { + this->servoIndex = 0; + this->servoPin = 0; + if (servoCount < MAX_SERVOS) { this->servoIndex = servoCount++; //assign a servoIndex to this instance } + else + { + this->servoIndex = INVALID_SERVO_NUMBER; //too many servos + } } -void Servo::attach(int pin) +uint8_t Servo::attach(int pin) { if (this->servoIndex < MAX_SERVOS) { if (pin == 2) { - if(pinActive[1] == false){ + if(pinActive[1] == BOOL_FALSE){ //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -45,11 +55,11 @@ void Servo::attach(int pin) //OC3B, Port E, Bit 4; setting pin 2 as output: DDRE |= (1 << PE4); //bit 4 (pin 2) as output - pinActive[0] = true; + pinActive[0] = BOOL_TRUE; this->servoPin = 2; } else if (pin == 3) { - if(pinActive[0] == false){ + if(pinActive[0] == BOOL_FALSE){ //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -73,11 +83,11 @@ void Servo::attach(int pin) //OC3C, Port E, Bit 5; setting pin 3 as output: DDRE |= (1 << PE5); //bit 5 (pin 3) as output - pinActive[1] = true; + pinActive[1] = BOOL_TRUE; this->servoPin = 3; } else if (pin == 7) { - if(pinActive[3] == false){ + if(pinActive[3] == BOOL_FALSE){ //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -101,11 +111,11 @@ void Servo::attach(int pin) //OC4B, Port H, Bit 4; setting pin 7 as output: DDRH |= (1 << PH4); //bit 4 (pin 7) as output - pinActive[2] = true; + pinActive[2] = BOOL_TRUE; this->servoPin = 7; } else if (pin == 8) { - if(pinActive[2] == false){ + if(pinActive[2] == BOOL_FALSE){ //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -129,11 +139,11 @@ void Servo::attach(int pin) //OC4C, Port H, Bit 5; setting pin 8 as output: DDRH |= (1 << PH5); //bit 5 (pin 8) as output - pinActive[3] = true; + pinActive[3] = BOOL_TRUE; this->servoPin = 8; } else if (pin == 44) { - if(pinActive[5] == false){ + if(pinActive[5] == BOOL_FALSE){ //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; @@ -157,11 +167,11 @@ void Servo::attach(int pin) //OC5C, Port L, Bit 5; setting pin 44 as output: DDRL |= (1 << PL5); //bit 5 (pin 44) as output - pinActive[4] = true; + pinActive[4] = BOOL_TRUE; this->servoPin = 44; } else if (pin == 45) { - if(pinActive[4] == false){ + if(pinActive[4] == BOOL_FALSE){ //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; @@ -185,16 +195,18 @@ void Servo::attach(int pin) //OC5B, Port L, Bit 4; setting pin 45 as output: DDRL |= (1 << PL4); //bit 4 (pin 45) as output - pinActive[5] = true; + pinActive[5] = BOOL_TRUE; this->servoPin = 45; } } + + return this->servoIndex; } void Servo::detach() { - if (servoPin == 2) { - if(pinActive[1] == false){ + if (servoPin == 2 && pinActive[0] == BOOL_TRUE) { + if(pinActive[1] == BOOL_FALSE){ //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -203,11 +215,11 @@ void Servo::detach() } OCR3B = 0x0; //resetting the pulse width DDRE ^= (1 << PE4); //bit 4 (pin 2) stop output - pinActive[0] = false; + pinActive[0] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 3) { - if(pinActive[0] == false){ + else if (servoPin == 3 && pinActive[1] == BOOL_TRUE) { + if(pinActive[0] == BOOL_FALSE){ //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -216,11 +228,11 @@ void Servo::detach() } OCR3C = 0x0; //resetting the pulse width DDRE ^= (1 << PE5); //bit 5 (pin 3) stop output - pinActive[1] = false; + pinActive[1] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 7) { - if(pinActive[3] == false){ + else if (servoPin == 7 && pinActive[2] == BOOL_TRUE) { + if(pinActive[3] == BOOL_FALSE){ //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -229,11 +241,11 @@ void Servo::detach() } OCR4B = 0x0; //resetting the pulse width DDRH ^= (1 << PH4); //bit 4 (pin 7) stop output - pinActive[2] = false; + pinActive[2] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 8) { - if(pinActive[2] == false){ + else if (servoPin == 8 && pinActive[3] == BOOL_TRUE) { + if(pinActive[2] == BOOL_FALSE){ //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -242,11 +254,11 @@ void Servo::detach() } OCR4C = 0x0; //resetting the pulse width DDRH ^= (1 << PH5); //bit 5 (pin 8) stop output - pinActive[3] = false; + pinActive[3] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 44) { - if(pinActive[5] == false){ + else if (servoPin == 44 && pinActive[4] == BOOL_TRUE) { + if(pinActive[5] == BOOL_FALSE){ //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; @@ -255,11 +267,11 @@ void Servo::detach() } OCR5C = 0x0; //resetting the pulse width DDRL ^= (1 << PL5); //bit 5 (pin 44) stop output - pinActive[4] = false; + pinActive[4] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 45) { - if(pinActive[4] == false){ + else if (servoPin == 45 && pinActive[5] == BOOL_TRUE) { + if(pinActive[4] == BOOL_FALSE){ //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; @@ -268,13 +280,13 @@ void Servo::detach() } OCR5B = 0x0; //resetting the pulse width DDRL ^= (1 << PL4); //bit 4 (pin 45) stop output - pinActive[5] = false; + pinActive[5] = BOOL_FALSE; this->servoPin = 0; } } void Servo::detachAll() { - if (pinActive[0] == true) + if (pinActive[0] == BOOL_TRUE) { //resetting the control register A and B: TCCR3A = 0x0; @@ -284,9 +296,9 @@ void Servo::detachAll() { OCR3B = 0x0; //resetting the pulse width DDRE ^= (1 << PE4); //bit 4 (pin 2) stop output - pinActive[0] = false; + pinActive[0] = BOOL_FALSE; } - if (pinActive[1] == true) + if (pinActive[1] == BOOL_TRUE) { //resetting the control register A and B: TCCR3A = 0x0; @@ -296,9 +308,9 @@ void Servo::detachAll() { OCR3C = 0x0; //resetting the pulse width DDRE ^= (1 << PE5); //bit 5 (pin 3) stop output - pinActive[1] = false; + pinActive[1] = BOOL_FALSE; } - if (pinActive[2] == true) + if (pinActive[2] == BOOL_TRUE) { //resetting the control register A and B: TCCR4A = 0x0; @@ -308,9 +320,9 @@ void Servo::detachAll() { OCR4B = 0x0; //resetting the pulse width DDRH ^= (1 << PH4); //bit 4 (pin 7) stop output - pinActive[2] = false; + pinActive[2] = BOOL_FALSE; } - if (pinActive[3] == true) + if (pinActive[3] == BOOL_TRUE) { //resetting the control register A and B: TCCR4A = 0x0; @@ -320,9 +332,9 @@ void Servo::detachAll() { OCR4C = 0x0; //resetting the pulse width DDRH ^= (1 << PH5); //bit 5 (pin 8) stop output - pinActive[3] = false; + pinActive[3] = BOOL_FALSE; } - if (pinActive[4] == true) + if (pinActive[4] == BOOL_TRUE) { //resetting the control register A and B: TCCR5A = 0x0; @@ -332,9 +344,9 @@ void Servo::detachAll() { OCR5C = 0x0; //resetting the pulse width DDRL ^= (1 << PL5); //bit 5 (pin 44) stop output - pinActive[4] = false; + pinActive[4] = BOOL_FALSE; } - if (pinActive[5] == true) + if (pinActive[5] == BOOL_TRUE) { //resetting the control register A and B: TCCR5A = 0x0; @@ -344,7 +356,7 @@ void Servo::detachAll() { OCR5B = 0x0; //resetting the pulse width DDRL ^= (1 << PL4); //bit 4 (pin 45) stop output - pinActive[5] = false; + pinActive[5] = BOOL_FALSE; } } @@ -358,7 +370,7 @@ void Servo::write(int value) { value = 180; } - value = map(value, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); + value = (((MAX_PULSE_WIDTH - MIN_PULSE_WIDTH) * value) / 180) + MIN_PULSE_WIDTH; this->writeMicroseconds(value); } @@ -372,27 +384,27 @@ void Servo::writeMicroseconds(int value) else if (value > MAX_PULSE_WIDTH) { value = MAX_PULSE_WIDTH; } - if (this->servoPin == 2 && pinActive[0] == true) { + if (this->servoPin == 2 && pinActive[0] == BOOL_TRUE) { OCR3B = 0x0; OCR3B = value * 2; } - else if (this->servoPin == 3 && pinActive[1] == true) { + else if (this->servoPin == 3 && pinActive[1] == BOOL_TRUE) { OCR3C = 0x0; OCR3C = value * 2; } - else if (this->servoPin == 7 && pinActive[2] == true) { + else if (this->servoPin == 7 && pinActive[2] == BOOL_TRUE) { OCR4B = 0x0; OCR4B = value * 2; } - else if (this->servoPin == 8 && pinActive[3] == true) { + else if (this->servoPin == 8 && pinActive[3] == BOOL_TRUE) { OCR4C = 0x0; OCR4C = value * 2; } - else if (this->servoPin == 44 && pinActive[4] == true) { + else if (this->servoPin == 44 && pinActive[4] == BOOL_TRUE) { OCR5C = 0x0; OCR5C = value * 2; } - else if (this->servoPin == 45 && pinActive[5] == true) { + else if (this->servoPin == 45 && pinActive[5] == BOOL_TRUE) { OCR5B = 0x0; OCR5B = value * 2; } diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 98e0649..dbf84aa 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -49,6 +49,8 @@ #ifndef Servo_Hardware_PWM_h #define Servo_Hardware_PWM_h +#include + #if !defined(ARDUINO_ARCH_AVR) #error "This library only supports boards with an AVR processor." #endif @@ -61,19 +63,20 @@ #define MAX_TIMER_COUNT 40000 //the timer TOP value (for creating 50Hz) #define MAX_SERVOS 6 //6 Servos can be attached +#define INVALID_SERVO_NUMBER 255 //flag indicating an invalid servo index class Servo { public: Servo(); - void attach(int pin); //attach the given pin + uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos void detach(); //detach the used pin void detachAll(); //automatically detaches all used pins void write(int value); //write angle in degrees void writeMicroseconds(int value); //write pulse width in microseconds private: - int servoIndex = 0; //number of attached Servos - int servoPin = 0; //pin number of the attached Servo + uint8_t servoIndex; //number of attached Servos + uint8_t servoPin; //pin number of the attached Servo }; #endif From c2f4781f3a060e1a2133c5ae82f7c80c5db8dbb3 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Tue, 21 May 2019 07:39:05 +0200 Subject: [PATCH 12/44] added attach(pin, min, max) and dependencies --- src/Servo_Hardware_PWM.cpp | 20 ++++++++++++++------ src/Servo_Hardware_PWM.h | 17 ++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index e4db292..5c35461 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -27,8 +27,16 @@ Servo::Servo() } } -uint8_t Servo::attach(int pin) +uint8_t Servo::attach(int pin) { + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); +} + +uint8_t Servo::attach(int pin, int min, int max) +{ + this->min = min; + this->max = max; + if (this->servoIndex < MAX_SERVOS) { if (pin == 2) { if(pinActive[1] == BOOL_FALSE){ @@ -370,7 +378,7 @@ void Servo::write(int value) { value = 180; } - value = (((MAX_PULSE_WIDTH - MIN_PULSE_WIDTH) * value) / 180) + MIN_PULSE_WIDTH; + value = (((this->max - this->min) * value) / 180) + this->min; this->writeMicroseconds(value); } @@ -378,11 +386,11 @@ void Servo::write(int value) void Servo::writeMicroseconds(int value) { if ((this->servoIndex < MAX_SERVOS)) { - if (value < MIN_PULSE_WIDTH) { - value = MIN_PULSE_WIDTH; + if (value < this->min) { + value = this->min; } - else if (value > MAX_PULSE_WIDTH) { - value = MAX_PULSE_WIDTH; + else if (value > this->max) { + value = this->max; } if (this->servoPin == 2 && pinActive[0] == BOOL_TRUE) { OCR3B = 0x0; diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index dbf84aa..69bfc85 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -69,14 +69,17 @@ class Servo { public: Servo(); - uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos - void detach(); //detach the used pin - void detachAll(); //automatically detaches all used pins - void write(int value); //write angle in degrees - void writeMicroseconds(int value); //write pulse width in microseconds + uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos + uint8_t attach(int pin, int min, int max); //attach the given pin and set the upper and lower pulse width limits; returns servoIndex number or 255 if too many servos + void detach(); //detach the used pin + void detachAll(); //automatically detaches all used pins + void write(int value); //write angle in degrees + void writeMicroseconds(int value); //write pulse width in microseconds private: - uint8_t servoIndex; //number of attached Servos - uint8_t servoPin; //pin number of the attached Servo + uint8_t servoIndex; //number of attached Servos + uint8_t servoPin; //pin number of the attached Servo + uint8_t min; //lower pulse width limit + uint8_t max; //upper pulse width limit }; #endif From 80011eba393c5f575066ebbc57fe5dd8c9335f2f Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Tue, 21 May 2019 07:56:34 +0200 Subject: [PATCH 13/44] added attach(pin, min, max, default) and dependencies --- src/Servo_Hardware_PWM.cpp | 22 ++++++++++++++-------- src/Servo_Hardware_PWM.h | 22 ++++++++++++---------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 5c35461..220acf7 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -29,13 +29,19 @@ Servo::Servo() uint8_t Servo::attach(int pin) { - return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH, DEFAULT_PULSE_WIDTH); } -uint8_t Servo::attach(int pin, int min, int max) +uint8_t Servo::attach(int pin, int min, int max) +{ + return this->attach(pin, min, max, DEFAULT_PULSE_WIDTH); +} + +uint8_t Servo::attach(int pin, int min, int max, int default) { this->min = min; this->max = max; + this->default = default; if (this->servoIndex < MAX_SERVOS) { if (pin == 2) { @@ -58,7 +64,7 @@ uint8_t Servo::attach(int pin, int min, int max) //setting the output to non inverted: TCCR3A |= (1 << COM3B1); - OCR3B = DEFAULT_PULSE_WIDTH; //setting the pulse width + OCR3B = this->default; //setting the pulse width //OC3B, Port E, Bit 4; setting pin 2 as output: DDRE |= (1 << PE4); //bit 4 (pin 2) as output @@ -86,7 +92,7 @@ uint8_t Servo::attach(int pin, int min, int max) //setting the output to non inverted: TCCR3A |= (1 << COM3C1); - OCR3C = DEFAULT_PULSE_WIDTH; //setting the pulse width + OCR3C = this->default; //setting the pulse width //OC3C, Port E, Bit 5; setting pin 3 as output: DDRE |= (1 << PE5); //bit 5 (pin 3) as output @@ -114,7 +120,7 @@ uint8_t Servo::attach(int pin, int min, int max) //setting the output to non inverted: TCCR4A |= (1 << COM4B1); - OCR4B = DEFAULT_PULSE_WIDTH; //setting the pulse width + OCR4B = this->default; //setting the pulse width //OC4B, Port H, Bit 4; setting pin 7 as output: DDRH |= (1 << PH4); //bit 4 (pin 7) as output @@ -142,7 +148,7 @@ uint8_t Servo::attach(int pin, int min, int max) //setting the output to non inverted: TCCR4A |= (1 << COM4C1); - OCR4C = DEFAULT_PULSE_WIDTH; //setting the pulse width + OCR4C = this->default; //setting the pulse width //OC4C, Port H, Bit 5; setting pin 8 as output: DDRH |= (1 << PH5); //bit 5 (pin 8) as output @@ -170,7 +176,7 @@ uint8_t Servo::attach(int pin, int min, int max) //setting the output to non inverted: TCCR5A |= (1 << COM5C1); - OCR5C = DEFAULT_PULSE_WIDTH; //setting the pulse width + OCR5C = this->default; //setting the pulse width //OC5C, Port L, Bit 5; setting pin 44 as output: DDRL |= (1 << PL5); //bit 5 (pin 44) as output @@ -198,7 +204,7 @@ uint8_t Servo::attach(int pin, int min, int max) //setting the output to non inverted: TCCR5A |= (1 << COM5B1); - OCR5B = DEFAULT_PULSE_WIDTH; //setting the pulse width + OCR5B = this->default; //setting the pulse width //OC5B, Port L, Bit 4; setting pin 45 as output: DDRL |= (1 << PL4); //bit 4 (pin 45) as output diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 69bfc85..3704a6d 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -69,17 +69,19 @@ class Servo { public: Servo(); - uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos - uint8_t attach(int pin, int min, int max); //attach the given pin and set the upper and lower pulse width limits; returns servoIndex number or 255 if too many servos - void detach(); //detach the used pin - void detachAll(); //automatically detaches all used pins - void write(int value); //write angle in degrees - void writeMicroseconds(int value); //write pulse width in microseconds + uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos + uint8_t attach(int pin, int min, int max); //attach the given pin and set the upper and lower pulse width limits; returns servoIndex number or 255 if too many servos + uint8_t attach(int pin, int min, int max, int default); //attach the given pin, set the upper and lower pulse width limits and set the pulse width when servo is attached; returns servoIndex number or 255 if too many servos + void detach(); //detach the used pin + void detachAll(); //automatically detaches all used pins + void write(int value); //write angle in degrees + void writeMicroseconds(int value); //write pulse width in microseconds private: - uint8_t servoIndex; //number of attached Servos - uint8_t servoPin; //pin number of the attached Servo - uint8_t min; //lower pulse width limit - uint8_t max; //upper pulse width limit + uint8_t servoIndex; //number of attached Servos + uint8_t servoPin; //pin number of the attached Servo + uint8_t min; //lower pulse width limit + uint8_t max; //upper pulse width limit + uint8_t default; //pulse width when servo is attached }; #endif From 4e76d5c864d8b517dbc605b3d2f980c6dc69ecab Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Tue, 21 May 2019 09:01:51 +0200 Subject: [PATCH 14/44] renamed "default" to "defaultPos" --- src/Servo_Hardware_PWM.cpp | 16 ++++++++-------- src/Servo_Hardware_PWM.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 220acf7..771487d 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -37,11 +37,11 @@ uint8_t Servo::attach(int pin, int min, int max) return this->attach(pin, min, max, DEFAULT_PULSE_WIDTH); } -uint8_t Servo::attach(int pin, int min, int max, int default) +uint8_t Servo::attach(int pin, int min, int max, int defaultPos) { this->min = min; this->max = max; - this->default = default; + this->defaultPos = defaultPos; if (this->servoIndex < MAX_SERVOS) { if (pin == 2) { @@ -64,7 +64,7 @@ uint8_t Servo::attach(int pin, int min, int max, int default) //setting the output to non inverted: TCCR3A |= (1 << COM3B1); - OCR3B = this->default; //setting the pulse width + OCR3B = this->defaultPos; //setting the pulse width //OC3B, Port E, Bit 4; setting pin 2 as output: DDRE |= (1 << PE4); //bit 4 (pin 2) as output @@ -92,7 +92,7 @@ uint8_t Servo::attach(int pin, int min, int max, int default) //setting the output to non inverted: TCCR3A |= (1 << COM3C1); - OCR3C = this->default; //setting the pulse width + OCR3C = this->defaultPos; //setting the pulse width //OC3C, Port E, Bit 5; setting pin 3 as output: DDRE |= (1 << PE5); //bit 5 (pin 3) as output @@ -120,7 +120,7 @@ uint8_t Servo::attach(int pin, int min, int max, int default) //setting the output to non inverted: TCCR4A |= (1 << COM4B1); - OCR4B = this->default; //setting the pulse width + OCR4B = this->defaultPos; //setting the pulse width //OC4B, Port H, Bit 4; setting pin 7 as output: DDRH |= (1 << PH4); //bit 4 (pin 7) as output @@ -148,7 +148,7 @@ uint8_t Servo::attach(int pin, int min, int max, int default) //setting the output to non inverted: TCCR4A |= (1 << COM4C1); - OCR4C = this->default; //setting the pulse width + OCR4C = this->defaultPos; //setting the pulse width //OC4C, Port H, Bit 5; setting pin 8 as output: DDRH |= (1 << PH5); //bit 5 (pin 8) as output @@ -176,7 +176,7 @@ uint8_t Servo::attach(int pin, int min, int max, int default) //setting the output to non inverted: TCCR5A |= (1 << COM5C1); - OCR5C = this->default; //setting the pulse width + OCR5C = this->defaultPos; //setting the pulse width //OC5C, Port L, Bit 5; setting pin 44 as output: DDRL |= (1 << PL5); //bit 5 (pin 44) as output @@ -204,7 +204,7 @@ uint8_t Servo::attach(int pin, int min, int max, int default) //setting the output to non inverted: TCCR5A |= (1 << COM5B1); - OCR5B = this->default; //setting the pulse width + OCR5B = this->defaultPos; //setting the pulse width //OC5B, Port L, Bit 4; setting pin 45 as output: DDRL |= (1 << PL4); //bit 4 (pin 45) as output diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 3704a6d..b5bc036 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -71,7 +71,7 @@ class Servo Servo(); uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos uint8_t attach(int pin, int min, int max); //attach the given pin and set the upper and lower pulse width limits; returns servoIndex number or 255 if too many servos - uint8_t attach(int pin, int min, int max, int default); //attach the given pin, set the upper and lower pulse width limits and set the pulse width when servo is attached; returns servoIndex number or 255 if too many servos + uint8_t attach(int pin, int min, int max, int defaultPos); //attach the given pin, set the upper and lower pulse width limits and set the pulse width when servo is attached; returns servoIndex number or 255 if too many servos void detach(); //detach the used pin void detachAll(); //automatically detaches all used pins void write(int value); //write angle in degrees @@ -81,7 +81,7 @@ class Servo uint8_t servoPin; //pin number of the attached Servo uint8_t min; //lower pulse width limit uint8_t max; //upper pulse width limit - uint8_t default; //pulse width when servo is attached + uint8_t defaultPos; //pulse width when servo is attached }; #endif From ed5868348527a38b82d15dc54085fdc07f371829 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Tue, 21 May 2019 12:06:11 +0200 Subject: [PATCH 15/44] changed the data types of min, max and defaultPos --- src/Servo_Hardware_PWM.cpp | 4 ++-- src/Servo_Hardware_PWM.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 771487d..f02b6e2 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -27,12 +27,12 @@ Servo::Servo() } } -uint8_t Servo::attach(int pin) +uint8_t Servo::attach(int pin) { return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH, DEFAULT_PULSE_WIDTH); } -uint8_t Servo::attach(int pin, int min, int max) +uint8_t Servo::attach(int pin, int min, int max) { return this->attach(pin, min, max, DEFAULT_PULSE_WIDTH); } diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index b5bc036..f7d738f 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -79,9 +79,9 @@ class Servo private: uint8_t servoIndex; //number of attached Servos uint8_t servoPin; //pin number of the attached Servo - uint8_t min; //lower pulse width limit - uint8_t max; //upper pulse width limit - uint8_t defaultPos; //pulse width when servo is attached + uint16_t min; //lower pulse width limit + uint16_t max; //upper pulse width limit + uint16_t defaultPos; //pulse width when servo is attached }; #endif From a74638f2e770815d4e304b235923174f31dea8dd Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Wed, 22 May 2019 20:53:25 +0200 Subject: [PATCH 16/44] added read methods --- src/Servo_Hardware_PWM.cpp | 26 ++++++++++++++++++++------ src/Servo_Hardware_PWM.h | 26 +++++++++++++++----------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index f02b6e2..14d4f4b 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -398,30 +398,44 @@ void Servo::writeMicroseconds(int value) else if (value > this->max) { value = this->max; } + this->pulseWidth = value; + if (this->servoPin == 2 && pinActive[0] == BOOL_TRUE) { OCR3B = 0x0; - OCR3B = value * 2; + OCR3B = this->pulseWidth * 2; } else if (this->servoPin == 3 && pinActive[1] == BOOL_TRUE) { OCR3C = 0x0; - OCR3C = value * 2; + OCR3C = this->pulseWidth * 2; } else if (this->servoPin == 7 && pinActive[2] == BOOL_TRUE) { OCR4B = 0x0; - OCR4B = value * 2; + OCR4B = this->pulseWidth * 2; } else if (this->servoPin == 8 && pinActive[3] == BOOL_TRUE) { OCR4C = 0x0; - OCR4C = value * 2; + OCR4C = this->pulseWidth * 2; } else if (this->servoPin == 44 && pinActive[4] == BOOL_TRUE) { OCR5C = 0x0; - OCR5C = value * 2; + OCR5C = this->pulseWidth * 2; } else if (this->servoPin == 45 && pinActive[5] == BOOL_TRUE) { OCR5B = 0x0; - OCR5B = value * 2; + OCR5B = this->pulseWidth * 2; } } } + +int read() +{ + int angle; + angle = (((180 * (this->readMicroseconds() - this->min)) / (this->max - this->min)); + return angle; +} + +int readMicroseconds() +{ + return this->pulseWidth; +} #endif diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index f7d738f..16d8943 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -69,19 +69,23 @@ class Servo { public: Servo(); - uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos - uint8_t attach(int pin, int min, int max); //attach the given pin and set the upper and lower pulse width limits; returns servoIndex number or 255 if too many servos + uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos + uint8_t attach(int pin, int min, int max); //attach the given pin and set the upper and lower pulse width limits; returns servoIndex number or 255 if too many servos uint8_t attach(int pin, int min, int max, int defaultPos); //attach the given pin, set the upper and lower pulse width limits and set the pulse width when servo is attached; returns servoIndex number or 255 if too many servos - void detach(); //detach the used pin - void detachAll(); //automatically detaches all used pins - void write(int value); //write angle in degrees - void writeMicroseconds(int value); //write pulse width in microseconds + void detach(); //detach the used pin + void detachAll(); //automatically detaches all used pins + void write(int value); //write angle in degrees + void writeMicroseconds(int value); //write pulse width in microseconds + int read(); //returns the current write angle in degrees + int readMicroseconds(); //returns the current write angle in microseconds + private: - uint8_t servoIndex; //number of attached Servos - uint8_t servoPin; //pin number of the attached Servo - uint16_t min; //lower pulse width limit - uint16_t max; //upper pulse width limit - uint16_t defaultPos; //pulse width when servo is attached + uint8_t servoIndex; //number of attached Servos + uint8_t servoPin; //pin number of the attached Servo + uint16_t min; //lower pulse width limit + uint16_t max; //upper pulse width limit + uint16_t defaultPos; //pulse width when servo is attached + uint16_t pulseWidth; //set pulse width }; #endif From 85a1f0142e7899fb0978f92eff366785107dc2b9 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Thu, 23 May 2019 21:51:40 +0200 Subject: [PATCH 17/44] corrected the read methods --- src/Servo_Hardware_PWM.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 14d4f4b..c338d26 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -427,15 +427,19 @@ void Servo::writeMicroseconds(int value) } } -int read() -{ + +int Servo::read() { int angle; - angle = (((180 * (this->readMicroseconds() - this->min)) / (this->max - this->min)); + angle = ((180 * (this->readMicroseconds() - this->min)) / (this->max - this->min)); return angle; } -int readMicroseconds() -{ +int Servo::readMicroseconds() { + if (this->servoIndex == INVALID_SERVO_NUMBER) + { + this->pulseWidth = 0; + } + return this->pulseWidth; } #endif From e49cbdce1bafb8ccc994a6352eea4507c3726270 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Thu, 23 May 2019 21:52:43 +0200 Subject: [PATCH 18/44] added the read methods to keywords.txt --- keywords.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keywords.txt b/keywords.txt index 6b9d631..6132f2c 100644 --- a/keywords.txt +++ b/keywords.txt @@ -16,6 +16,8 @@ detach KEYWORD2 detachAll KEYWORD2 write KEYWORD2 writeMicroseconds KEYWORD2 +read KEYWORD2 +readMicroseconds KEYWORD2 ####################################### # Constants (LITERAL1) From a6fa637bda7fc345cec6732c769715b40a75d570 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Sat, 1 Jun 2019 21:12:39 +0200 Subject: [PATCH 19/44] corrected spacing in keywords.txt (1 tab only!) --- keywords.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/keywords.txt b/keywords.txt index 6132f2c..6493127 100644 --- a/keywords.txt +++ b/keywords.txt @@ -11,13 +11,13 @@ Servo KEYWORD1 Servo ####################################### # Methods and Functions (KEYWORD2) ####################################### -attach KEYWORD2 -detach KEYWORD2 -detachAll KEYWORD2 -write KEYWORD2 -writeMicroseconds KEYWORD2 -read KEYWORD2 -readMicroseconds KEYWORD2 +attach KEYWORD2 +detach KEYWORD2 +detachAll KEYWORD2 +write KEYWORD2 +writeMicroseconds KEYWORD2 +read KEYWORD2 +readMicroseconds KEYWORD2 ####################################### # Constants (LITERAL1) From a23f2cb43e8d29637eae4791f4c124e99deddd56 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Mon, 3 Jun 2019 21:20:16 +0200 Subject: [PATCH 20/44] corrected the read() method --- src/Servo_Hardware_PWM.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index c338d26..039ef40 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -429,9 +429,18 @@ void Servo::writeMicroseconds(int value) int Servo::read() { - int angle; - angle = ((180 * (this->readMicroseconds() - this->min)) / (this->max - this->min)); - return angle; + float angle; + + if ((this->readMicroseconds() - this->min) <= 0) + { + angle = 0.0; + } + else + { + angle = (180.0 / (this->max - this->min)) * (this->readMicroseconds() - this->min); + } + + return (int)angle; } int Servo::readMicroseconds() { From db1aba7ad4547436ba45994d108e2c83380aefef Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Mon, 3 Jun 2019 21:34:30 +0200 Subject: [PATCH 21/44] corrected the write() method --- src/Servo_Hardware_PWM.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 039ef40..74385ae 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -376,16 +376,24 @@ void Servo::detachAll() { void Servo::write(int value) { - if (value < 0) + float tempValue; + + if (value <= 0) + { + tempValue = 0.0; + } + else if (value >= 180) { - value = 0; + tempValue = 180.0; } - else if (value > 180) + else { - value = 180; + tempValue = (float)value; } - value = (((this->max - this->min) * value) / 180) + this->min; + tempValue = (((this->max - this->min) * tempValue) / 180.0) + this->min; + + value = (int)tempValue; this->writeMicroseconds(value); } @@ -427,7 +435,6 @@ void Servo::writeMicroseconds(int value) } } - int Servo::read() { float angle; From 3e0c3adc9ab56171726b22d4281a7c97bb0d8988 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Tue, 4 Jun 2019 20:50:13 +0200 Subject: [PATCH 22/44] declaring the attached() method --- src/Servo_Hardware_PWM.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 16d8943..3efc381 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -78,6 +78,7 @@ class Servo void writeMicroseconds(int value); //write pulse width in microseconds int read(); //returns the current write angle in degrees int readMicroseconds(); //returns the current write angle in microseconds + bool attached(); //returns true if this servo is attached, otherwise false private: uint8_t servoIndex; //number of attached Servos From 618b8cd98415addebd546e053e9b347edc5b318d Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Tue, 4 Jun 2019 20:51:26 +0200 Subject: [PATCH 23/44] added the "attached"-keyword to the keywords.txt file --- keywords.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/keywords.txt b/keywords.txt index 6493127..323ad38 100644 --- a/keywords.txt +++ b/keywords.txt @@ -18,6 +18,7 @@ write KEYWORD2 writeMicroseconds KEYWORD2 read KEYWORD2 readMicroseconds KEYWORD2 +attached KEYWORD2 ####################################### # Constants (LITERAL1) From 75eb528df0d25d32395aca44f08726385730d33b Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Wed, 5 Jun 2019 18:57:56 +0200 Subject: [PATCH 24/44] implemented the attached() method --- src/Servo_Hardware_PWM.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 74385ae..a6139e1 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -458,4 +458,8 @@ int Servo::readMicroseconds() { return this->pulseWidth; } + +bool Servo::attached() { + return pinActive[this->servoIndex] == BOOL_TRUE; +} #endif From baee8ad486dc0f933e724109fb9c9d5861310f7a Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Thu, 6 Jun 2019 21:35:52 +0200 Subject: [PATCH 25/44] changed the code formatting style --- src/Servo_Hardware_PWM.cpp | 148 ++++++++++++++++++++++--------------- src/Servo_Hardware_PWM.h | 7 +- 2 files changed, 91 insertions(+), 64 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index a6139e1..7a14379 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -13,12 +13,12 @@ For information about the library, license and author, see Servo_Hardware_PWM.h static uint8_t servoCount = 0; static uint8_t pinActive[MAX_SERVOS] = {BOOL_FALSE}; -Servo::Servo() -{ +Servo::Servo() { this->servoIndex = 0; this->servoPin = 0; - if (servoCount < MAX_SERVOS) { + if (servoCount < MAX_SERVOS) + { this->servoIndex = servoCount++; //assign a servoIndex to this instance } else @@ -27,25 +27,25 @@ Servo::Servo() } } -uint8_t Servo::attach(int pin) -{ +uint8_t Servo::attach(int pin) { return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH, DEFAULT_PULSE_WIDTH); } -uint8_t Servo::attach(int pin, int min, int max) -{ +uint8_t Servo::attach(int pin, int min, int max) { return this->attach(pin, min, max, DEFAULT_PULSE_WIDTH); } -uint8_t Servo::attach(int pin, int min, int max, int defaultPos) -{ +uint8_t Servo::attach(int pin, int min, int max, int defaultPos) { this->min = min; this->max = max; this->defaultPos = defaultPos; - if (this->servoIndex < MAX_SERVOS) { - if (pin == 2) { - if(pinActive[1] == BOOL_FALSE){ + if (this->servoIndex < MAX_SERVOS) + { + if (pin == 2) + { + if (pinActive[1] == BOOL_FALSE) + { //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -68,12 +68,14 @@ uint8_t Servo::attach(int pin, int min, int max, int defaultPos) //OC3B, Port E, Bit 4; setting pin 2 as output: DDRE |= (1 << PE4); //bit 4 (pin 2) as output - + pinActive[0] = BOOL_TRUE; this->servoPin = 2; } - else if (pin == 3) { - if(pinActive[0] == BOOL_FALSE){ + else if (pin == 3) + { + if (pinActive[0] == BOOL_FALSE) + { //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -96,12 +98,14 @@ uint8_t Servo::attach(int pin, int min, int max, int defaultPos) //OC3C, Port E, Bit 5; setting pin 3 as output: DDRE |= (1 << PE5); //bit 5 (pin 3) as output - + pinActive[1] = BOOL_TRUE; this->servoPin = 3; } - else if (pin == 7) { - if(pinActive[3] == BOOL_FALSE){ + else if (pin == 7) + { + if (pinActive[3] == BOOL_FALSE) + { //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -124,12 +128,14 @@ uint8_t Servo::attach(int pin, int min, int max, int defaultPos) //OC4B, Port H, Bit 4; setting pin 7 as output: DDRH |= (1 << PH4); //bit 4 (pin 7) as output - + pinActive[2] = BOOL_TRUE; this->servoPin = 7; } - else if (pin == 8) { - if(pinActive[2] == BOOL_FALSE){ + else if (pin == 8) + { + if (pinActive[2] == BOOL_FALSE) + { //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -152,17 +158,19 @@ uint8_t Servo::attach(int pin, int min, int max, int defaultPos) //OC4C, Port H, Bit 5; setting pin 8 as output: DDRH |= (1 << PH5); //bit 5 (pin 8) as output - + pinActive[3] = BOOL_TRUE; this->servoPin = 8; } - else if (pin == 44) { - if(pinActive[5] == BOOL_FALSE){ + else if (pin == 44) + { + if (pinActive[5] == BOOL_FALSE) + { //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; } - + //setting the prescaler to 8 (2MHz): TCCR5B |= (1 << CS51); @@ -180,12 +188,14 @@ uint8_t Servo::attach(int pin, int min, int max, int defaultPos) //OC5C, Port L, Bit 5; setting pin 44 as output: DDRL |= (1 << PL5); //bit 5 (pin 44) as output - + pinActive[4] = BOOL_TRUE; this->servoPin = 44; } - else if (pin == 45) { - if(pinActive[4] == BOOL_FALSE){ + else if (pin == 45) + { + if (pinActive[4] == BOOL_FALSE) + { //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; @@ -208,19 +218,20 @@ uint8_t Servo::attach(int pin, int min, int max, int defaultPos) //OC5B, Port L, Bit 4; setting pin 45 as output: DDRL |= (1 << PL4); //bit 4 (pin 45) as output - + pinActive[5] = BOOL_TRUE; this->servoPin = 45; } } - + return this->servoIndex; } -void Servo::detach() -{ - if (servoPin == 2 && pinActive[0] == BOOL_TRUE) { - if(pinActive[1] == BOOL_FALSE){ +void Servo::detach() { + if (servoPin == 2 && pinActive[0] == BOOL_TRUE) + { + if (pinActive[1] == BOOL_FALSE) + { //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -229,11 +240,13 @@ void Servo::detach() } OCR3B = 0x0; //resetting the pulse width DDRE ^= (1 << PE4); //bit 4 (pin 2) stop output - pinActive[0] = BOOL_FALSE; - this->servoPin = 0; + pinActive[0] = BOOL_FALSE; + this->servoPin = 0; } - else if (servoPin == 3 && pinActive[1] == BOOL_TRUE) { - if(pinActive[0] == BOOL_FALSE){ + else if (servoPin == 3 && pinActive[1] == BOOL_TRUE) + { + if (pinActive[0] == BOOL_FALSE) + { //resetting the control register A and B: TCCR3A = 0x0; TCCR3B = 0x0; @@ -245,8 +258,10 @@ void Servo::detach() pinActive[1] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 7 && pinActive[2] == BOOL_TRUE) { - if(pinActive[3] == BOOL_FALSE){ + else if (servoPin == 7 && pinActive[2] == BOOL_TRUE) + { + if (pinActive[3] == BOOL_FALSE) + { //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -257,9 +272,11 @@ void Servo::detach() DDRH ^= (1 << PH4); //bit 4 (pin 7) stop output pinActive[2] = BOOL_FALSE; this->servoPin = 0; - } - else if (servoPin == 8 && pinActive[3] == BOOL_TRUE) { - if(pinActive[2] == BOOL_FALSE){ + } + else if (servoPin == 8 && pinActive[3] == BOOL_TRUE) + { + if (pinActive[2] == BOOL_FALSE) + { //resetting the control register A and B: TCCR4A = 0x0; TCCR4B = 0x0; @@ -271,8 +288,10 @@ void Servo::detach() pinActive[3] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 44 && pinActive[4] == BOOL_TRUE) { - if(pinActive[5] == BOOL_FALSE){ + else if (servoPin == 44 && pinActive[4] == BOOL_TRUE) + { + if (pinActive[5] == BOOL_FALSE) + { //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; @@ -284,8 +303,10 @@ void Servo::detach() pinActive[4] = BOOL_FALSE; this->servoPin = 0; } - else if (servoPin == 45 && pinActive[5] == BOOL_TRUE) { - if(pinActive[4] == BOOL_FALSE){ + else if (servoPin == 45 && pinActive[5] == BOOL_TRUE) + { + if (pinActive[4] == BOOL_FALSE) + { //resetting the control register A and B: TCCR5A = 0x0; TCCR5B = 0x0; @@ -374,8 +395,7 @@ void Servo::detachAll() { } } -void Servo::write(int value) -{ +void Servo::write(int value) { float tempValue; if (value <= 0) @@ -397,38 +417,46 @@ void Servo::write(int value) this->writeMicroseconds(value); } -void Servo::writeMicroseconds(int value) -{ - if ((this->servoIndex < MAX_SERVOS)) { - if (value < this->min) { +void Servo::writeMicroseconds(int value) { + if ((this->servoIndex < MAX_SERVOS)) + { + if (value < this->min) + { value = this->min; } - else if (value > this->max) { + else if (value > this->max) + { value = this->max; } this->pulseWidth = value; - if (this->servoPin == 2 && pinActive[0] == BOOL_TRUE) { + if (this->servoPin == 2 && pinActive[0] == BOOL_TRUE) + { OCR3B = 0x0; OCR3B = this->pulseWidth * 2; } - else if (this->servoPin == 3 && pinActive[1] == BOOL_TRUE) { + else if (this->servoPin == 3 && pinActive[1] == BOOL_TRUE) + { OCR3C = 0x0; OCR3C = this->pulseWidth * 2; } - else if (this->servoPin == 7 && pinActive[2] == BOOL_TRUE) { + else if (this->servoPin == 7 && pinActive[2] == BOOL_TRUE) + { OCR4B = 0x0; OCR4B = this->pulseWidth * 2; } - else if (this->servoPin == 8 && pinActive[3] == BOOL_TRUE) { + else if (this->servoPin == 8 && pinActive[3] == BOOL_TRUE) + { OCR4C = 0x0; OCR4C = this->pulseWidth * 2; } - else if (this->servoPin == 44 && pinActive[4] == BOOL_TRUE) { + else if (this->servoPin == 44 && pinActive[4] == BOOL_TRUE) + { OCR5C = 0x0; OCR5C = this->pulseWidth * 2; } - else if (this->servoPin == 45 && pinActive[5] == BOOL_TRUE) { + else if (this->servoPin == 45 && pinActive[5] == BOOL_TRUE) + { OCR5B = 0x0; OCR5B = this->pulseWidth * 2; } diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 3efc381..450f753 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -27,14 +27,14 @@ SOFTWARE. ############################################################################### - + ######################################################### Only works on pin 2, 3, 7, 8, 44, and 45 on Arduino Mega! ######################################################### Tested on Arduino Mega 2560 R3. ######################################################### - + The methods are: Servo --- Class for manipulating servo motors connected to Arduino pins. (max. 6 elements) @@ -65,8 +65,7 @@ #define MAX_SERVOS 6 //6 Servos can be attached #define INVALID_SERVO_NUMBER 255 //flag indicating an invalid servo index -class Servo -{ +class Servo { public: Servo(); uint8_t attach(int pin); //attach the given pin; returns servoIndex number or 255 if too many servos From 0deba5b11ee8a96f476d3509468beec1f2e66b7f Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Mon, 10 Jun 2019 20:26:57 +0200 Subject: [PATCH 26/44] Update and rename README.adoc to README.md --- README.adoc => README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename README.adoc => README.md (96%) diff --git a/README.adoc b/README.md similarity index 96% rename from README.adoc rename to README.md index edabb1a..3a5f35b 100644 --- a/README.adoc +++ b/README.md @@ -1,4 +1,4 @@ -= Servo Hardware PWM Library for Arduino Mega = +# Servo Hardware PWM Library for Arduino Mega This library allows Arduino/Genuino Mega boards to control up to **6 servos** with the integrated **16-bit hardware PWM timer/counter**. This library uses the 16-bit hardware timer/counter (timer3, timer4 and timer5) to control the servos. @@ -10,7 +10,7 @@ In addition, I/O registers are addressed directly and not via the digitalWrite() Possible output pins are **pin 2, 3, 7, 8, 44,** and **45**. **Only Arduino/Genuino Mega boards are supported!** -== License == +## License MIT License From da44346c18df41371067318e42b2a98c689c5a4b Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Tue, 11 Jun 2019 20:35:57 +0200 Subject: [PATCH 27/44] Update README.md --- README.md | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 3a5f35b..ac248bd 100644 --- a/README.md +++ b/README.md @@ -10,26 +10,23 @@ In addition, I/O registers are addressed directly and not via the digitalWrite() Possible output pins are **pin 2, 3, 7, 8, 44,** and **45**. **Only Arduino/Genuino Mega boards are supported!** -## License +### Installation +This library can be installed through the Arduino IDE library manager like so: +![](installation.gif) -MIT License +### Note +The Servo-Library was build to be compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. -Copyright (c) 2019 Daniel Duller +### Built With +* [Visual Studio 2019](https://visualstudio.microsoft.com/) - IDE used for programming +* [Arduino IDE](https://www.arduino.cc/en/Main/Software) - IDE used for programming and testing -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +### Author +**Daniel Duller** - [dadul96](https://github.com/dadul96) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +### License +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +### Acknowledgments +* Inspired by - [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) +* Screen-GIF recorded with - [ShareX](https://getsharex.com/) From f36be3a0a3a9efe258121b1970f83abf83f5acd5 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Tue, 11 Jun 2019 20:36:50 +0200 Subject: [PATCH 28/44] Add files via upload --- installation.gif | Bin 0 -> 171262 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 installation.gif diff --git a/installation.gif b/installation.gif new file mode 100644 index 0000000000000000000000000000000000000000..4537ce28fab94027b6942452a1127db9a28ec963 GIT binary patch literal 171262 zcmeFZWmH?;`t}R|!;uokv(7FKX&LqKC=U}`lyfD@kY1>VvQ z>GKyf{b$T?u5Xgk@$e7{e&rDf2$A@Qkc!=qnwXGr^O7^NF~r0(`USG6XR`~KaRBr< ze7fH8@NfbEoIcC%0mkpS{JG$sxOjrOLdLivwz**dJn7jyJ%4!l0DP8EzNjUB01Q80 zBtIXNpPydFJ{^%uA(Wf@>RUFN>W-u(mh{FDNg32kbHfU zqMD{+V~bK`w6de6il&a5mabaZswO~JGciRAz^w(i*Us70)s@k!ZZ`w~j3^n60i4D# zCdMqr#-Cx0%g#Q&4qN_@^;e&2w#@-A=F;-!{#E7?BNhOFCBVW8z;D$6wXw0Wdwtm3 z*^5To=QcPxI=cH6cyw)ga=!BtQ~7Qm;$sN#^YaS`jSJ|S3gqSv96Jxqa~3u{gV5|HMhAo&lr#w zZk#uKROIoac(SGV{Gz0!q_nKI?5jfA#d*c(c;z^#X7#YHDzM%XP;dL(5O3R%k!e%FU3HY7NeK8a+Y?smtLM% zO24ePrft5C^YyLMtL>4B?T5LYIbTOAUq-f6~OwBH~z5+=>Ip#|8J82FPj7j z3dltwm95I|3PgIt9Hf4z)&q+9ke_xPtHG@N|)if0N{bLBJT>r3WJb!%-` zhwDohDouLA$rKvO7Hh3%N{mJt%9k4*w+rwX8!J{@-LL+vjx<)Tclg1fk}EbjYPN*D zVKE+Us@@)mrBTRIOntXCobvwj+Gum_{zSF}?{C(Yy2F_wjZ)*WmU@Hficce1O05ki z%T3$et}S*k0qZEYtRqToO&8mPKUfIb(u==rOhQxasxM1Nmm zI4b{+-I7pY9o7@Z7s5>3r-3p#W2D~ke3f3U=t8v3_9%OR$;MzN8%Di8DLzEUAfSL; z*T9uq9;GnGU)(%&AmdOBO(==-VX&2_7hWR$Rsx!Onf_H@F6&j%F(8>z5hbd+j6IS}Ie?Vlea;JUP9epqwJ_YEEzK&m5=lj1V?;g>GIn-P84lqLnFTb2-+cD2d zeKX7LS}D*ioRO0f{FT1<;q(hHhrysjF^9T(eVc*@TzDaaKy(4~wPu#t4z~K~-IiQC z+O4_*bi1W6*|270(P2M&9!aUb{PE0mYBi~H3#-y?Q0auqC^v?_v`u5pJK`Jj#e6PG zSorc~WI=o_5&v|d?|1%`h?(@dsU-(5IZ)2}=ZCp#Y5B_c$GdJ=;y4yOMly}* z%~l$LDJDck)SRRoQ97!(9w;W00XUj;#A;if(MQv$=&scEjz=~VIAl9!__=RQ#{xxq z$Wt=vk+f7RtZ7?J_9>|ZNF7Q)z8TIS+2&>XY?Py(DzA3U=#;~66Jf0qNvj2r?W32! z40Ae)(SLc94P$B{?DK8HttO|pl5~u~uqv)4dTLFXbxJ(}rGXpQ#$#ZbnFPqfaCS09E#UxZ>VLoHLX4a9xb25Ie)(U4ZZ>VXU%h`IeyCRGJXG2&6+8MGBXzo zwYbl^9k$xPIi)Jq(aTH}B(yr%;j7fe?9{JI!1=Q@Sj*`$I_S#@{XFwb$$hLASGKx+ zmabLV=;h`prSrbtx0UHec2*j#xZc_RlBxBqpScb6i=Y_|mA6;Nc2XnDYs?{aO~Idq z=`Ro(my&9FzDrR5{xfHY1wps2vS-wGoiCB*ZT?0n&A0+sbsd8(%|2&-8ycarL{Haj zE`0V)#7*1Ro3~xXl=WlvqxPPyS)1NXxetVdutXoPZLa>T>zVX@6Y<6p zy9Gt9Bb*oaRD_W{xsDG5V&^C2tC}X=8wdn3BY=oV{J6fU-=x;k*EjT_R zw_)!2@R8c=Rz|yd6Ks^Y)>vms8trbFU1dQq$!*W=)r7*%ZK*Nm-f(JH0(9I(@f!

L^ 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

Q3lJ)vJQ*AGcoJjUXc1gzSt7W){Zr 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

>p+fQg!Q%A zM3!&>O5#`NUuP_sMt_9Ma=J)4zsQ>bs;N=x)z<5T?2OPe_PH0T94@qv?f=IaE8p@L zVg29T7P&0>*58D+&BoYo!dfhx^fzH$qE`Nkus&X_G5tkYH=VAwI3I6}w>STvA*{DU zsFEzVL+Lhn{Tbl&og+UGXLN1DvV0u+jC6C+WfIAAG}!(6>7eCVv``t+?rW(M(E=Zw zDd&PHx$XO%SdlUgs^~lV0LnyZhS0+IYNV~gQ3eZ^hCsca^}+%&lJwae#<2V`e9Arq z*-473{8KzqEd+)sXMo{e48aQr|Llw0QW`|2s~V&{_n!xfz&xglNghgDxWjikO}*VL zP?z9YT(a#$77C8?%mi#%#Kj~RWeVwo0SBmp@CfRT3FoKYO$#V

R=vbJp!^7I^<@ z+|B?tFnGVW_t)Rs+oAjS_9p(ly?QdR4>uW`$# zM8G{)giA!0FJda}_s99!nLy7;ppcG<%&>EzL`$2>X;aogue^-pCE-p39C3k}&XY|1 zrfywpTnFT@CDgxgw$d~g>z5Q7X=D^FR-P~8Ya2CE_Sc**dN&+y3a+uP_1|$U&0J43 zn?+!0Q;_Iu2W{fI;w1)~;~bK@V|&c&2kPH=Ac@M=SSz{{vqXMvwu4s<5jzC)d6_}2 zdjK254!bT{@%*f$k@_#|zSRpVBgCKvJLOhqGm0;3wspCkt%>~Y_W!P(I0QJrVE-1z z?r&pYgjcN(@?qvnaWH=A51U9YS7d8c7Xtf2R4=B&R4R&y*Nd1ybyqr?nmkK9wQgHB ziQF&?GPD&Zm-+&+sH`hsRv~r7trcr%%WyK3FQ6^IA*VzoTP6@iN7--VQ?axr1GU%f z(R4CbyH}t?4)$NA8HWH57<2$O)No`0@R-mOm{Pj}ke>hCc92Q!hM+T+ zZ0@3Oi-;h4DtjZvsxqKG;aXNKv2RI7Au~>mwoFq02u=T9qK60S~s(2?GRUy^}bD#%u;Ga7sPwjFd%{{Sow9?G>Y3%@+5zq%{t;< zhIqv69=n+0q?Wm5sxK>lxT2N8!NS1+pivSecmN*!9~S)( z;0gVRSkMQJ06d45S!=)U03M)2Q9)|G>cIbTV|2CrnBqgF^i6(o8lHlmPx(jJ_wC zGNMD%z+abNhjD{Dvr{^=+v6hsa-slt3=r7gXq zc~Vfz6VXyIX4?Cj40yF!5RoV2HzGNu)>5}8=SOc<=VHY{*_$TF$N)#6N-mT`YC2(- zf>zp}@vNKQyk+!Fza4`c^Jd{~vatJ^nGdR`nQ@yNXpLU{n5_UB*!X$bvU{SVAI-52 zM*ru?U%x+$DReP$ z0KEU)|3dws@Bep&8_N&s5Ysv{La{JnnHl53c-X{5XoVZ~fMEh3?03tUfYEe5{j3}5 zda_{3GA9%gFO}uNd})xz*Fj3U>0)I(icDDtc%dT2eCu_A#4=&Dryd?Cred{N1zQ=^ zuhYalQE$npr(Z4_z1q&Sr3h@-u+`}BWxra1I#gBNfzPpi7B;b}srXT9+AdCHnvW!{ z8#j$DItt{(iM{TSgjTo#7je1VnCvSK7LgT3Y3LR&SL~#Wj(I%1?iL%*`bf9BclyqD zVBcjczWa3q%j1z}`#5}qtvTZ>A-sIM8e%usOUq>VDo-Cc^vmFJsC0ZU1FRs~Qo65% z+<$$}k=i6I@$(5Tlv9+50S4bd_z#O`1a)BjVS4{_0sdQwpa(i&Fq-U_0Dn8M%wB&v zuxzFykXEOn@pL}tqc#3In#pXa155HSLko3ap(TRWQ*^(BMCONol?Vz{lr@$wRx7vq zLxV)NinSKdAdwsaw)L0$#}WG#z*4X#T|a-*!ROH2IA7)r~tR;G2 zv0-kUa%!(^T9$oh*DOX#cv=JMnv%=uHA%N^>Je7B3u#KaD0o+$y* zl{9fM)>Mwil{qwkKvWJniC$?nea&@khcS5fy7E@m1ln%JFA#iS@#)FQKEIg?*52-j0``?_LYTu#$Db_CJFUZ=2aA zLuZ)5PB>}i3K%(R7)4XC8C2+XxP^tbyW-+wE^fCU3y7=t<<@7)sYjcsV6$9sd-p^U z!%YIh=Hheuv|i5F&Ln?a*|^QbyP|=&i!uqUd78+g>Y)$*OjaWYkcgQ>qMIK-^+PT zTs37%G;&l2dR99=1o}Eto2&iqb488~oY!5ue~>ZnEhQ-9mIp3%-Epq%IK#84VDwdc zUID1pY8uY(g$NU3M9yKAvnY{tiAHimtjdIO4$;sjAB~vL@1J>;l%+m2-Bqjs50y)u z=DJ85g{5PyH5kOOk%SP~9lUKEDf>QGS~o?gM=D5XS}%>FTU3VBf(%$}2nu=;=IgXP z$JN@)G*K$Q^iXnuOyTPBF*Jw7)d?8%!qk>=rg>jUvY)9*>5;8cQTNw8DuXlQG&{N) z*(^FiCJrv9i$}LT6dNFO@EEv0gh~`GOxE~y2Tl_bZk0$~r8-4^YFRwQNB<&DRTa+rP zslc2ToH`n~yOj+4t&r^P_4D>?d_J)(GOrfRE*Oa1($fJiX zf!F4f*(`oeOwA_Uu(-tKhkQvY`HETGnP(CBt~=uvAVA>DW-|RgCs2-c22zrha?rnb zqOg%4-?BYFzf_(uoCeL5TV81s0Bzl&(1foARWk~E{aJ~WJr&EQuYNwWtF{2Ve#!{N z)%zA@J~+ZeP3}>GM(l(SB)ullprJ1Ga7M{Pqlgb%HS2y7$VT{H+kt!Y=D391hSIha z1yo=gu-R0w@cP_b9B!I8ZMw_Z;Z%k?j5UEC6$T-#RM3O=n?Povh9WSN0(8K1L=SRY zhM)bBak29ZVrgblULaj@o=@0OX+oJ-Y4}<{1H*Ae!-Dm3Wy`+oF^A;kLvr<+UoS}w z2x)YyrU~=iNp&sZsBPs0A<-YX6C=RC)CaHNn8pF7+XVr79ECXKiUpz*Nt#Jt=Jti- z(6Z>E+xtmDNI-7lL$PLj@pM92>Zx^9qsc6$RSC;Z`(x2S$G9@z4dP)y9`wUbf{6 zc6#kHViOm1ly3%|K=#HB0`5$@Wj?XEMbb+J+XD>G-Ck;%pTW8#xF4}CL|$n6!Mh^; zTq2-7D9I7?Vp6zro-8g^;$0KCUt7ye!s{A>_KL^d;OqIBQjP#_Bu;Ym5I1inJO}!I zspI!@IqLB%6I!{$7jkc1p9BXzWv^!5Q?2jx_S#F=F|FQQbWT3ndUbEC4YqOXZYZSx z0FG=~=;pB&9kxRy)?tD6__%K8 z{BN{_Nh2{#?8)}k$6(oaEf(C7wJoGQHs8~xfI&DZn;dA!mfD`A1OaC5v!0ONSVRhf z&w68_IJj?AskvX6NJ=K9h%9S2#mW#dv}}hKQe$hR3d-O{agLreljzose9$v!CF3iPyOHijkRb)s5(^ne^|b5x*}%|E6Frx@6E4 zoLvd&?@JIb?G|n(5r$mKW1)?XI5+`6IoQC zkAln2Tavkm9|*yGb7m?*DBa}ngU)_)eyaJnV{MJ)8WjTF{*Tt&+w*lgI8i{^M6ze5 ze6`yRVRd#=RqG{j2@i2L%h7I!cahHDYZZ*7V~`R=})UojTM>rhO9h{ZV_Dw|0%$Hxcua|4Qhk^Z6k%zxVy( zJlw{-Lw8k*5J@9|AJnCp02;#hvdH|Vb5Pkuh}}a`X^+f9-`kSiBUOC@(v577KtiJ{ zmOx;(@%9@(f~NGr4b^xcO;rk++g?Krz+c-qcpH`!vrh(p0$?7444>#ss=i7-M-j-Q z2my)su=kNA9L(hodMbS^p-iZtz9ElMLT;cEne7b8<>JJjljBAhZw8pYq~Kpp8m5-c zcs}LM3i6KQP+lQ5h zxFrE?)sJ$c0&ZwjFY_4crc%}=->^tJD9k5F#53`dWhj@Z^TJ-KY)oCjYw8kHZIfUU(JG1`fLdDa?;mL6IQ^2+GIx_~&RP$O3Me!`}py1+xA=ai~&wC+P_<*K#xXdEiz@Y?f^toT;disaxn-h zrD#S;%yw@W{tJq^A;)~F01^>sej#pGI*vjuZ5OF-OEQ_+FfYN=(Ly1Ki)5pMzf36xTuBSgdI!U`u!#qFyCkaH9G0oeS&H7!&Kt zW1h>_>`>b6S+<~CWPGJNim2DbasqfA*1sa0)0t5waH zx6|gWlqqRv7W;G>Uo}WEID+wH*V)2_zm6z6=-TFL>=dt3#cpfA(sa(4`Juv`;m4^< zT#z>@{t}6orr!~2L55_RN|QW)KWc-&3{sjTp?y#6+^FolpevF7cw?il6HF9Niqd95 zK)T+W+{CmH9jjZsP~G|Y4B;|@zQi!wZ~NquZ-9HbL3M>K6cMH0ZWHxJNw`PfRN zParF<_zx8nb_0^?b({0$LrvNaDQ=%smx!7ht z$8FK_WO3bDnXD}0l60h>lrwhYcu*LfO-tKtnZ}w^S!)3M&$>hrmF?Jk&Ru!40o1e? zc+*m#U+2qN3qwcZB!0OF>j1>u>tWuO4j8Z$!-=2Oq{l(b;FKc}C)X)Lo(DM(2_>sT zqY=eeVFDz9@n9n$j~YHa$H9~+`tVm`N7Sff+&7=dZ|7V*i6zY``~`4#v81?! zmi3}Vye!RaG|uQ|z$$UYF$v(X;Dvazw1YkHe$0M)Vh;7KsUtvusxTSZpnpI5?S6uV zB@YcGKSfSuE}oBFQ6ffzlR&^SS-YtqEYmWtO^>4olft(m=>4$TU&0E zY>Z1+Tj@&-Sdpe^-R<#PnSp0=_t(1NFA1uA81GlE=v&_3&JXkMAK5roGCv6eePAkD z7Ce=bkKNDozF>nrv0E75^nYv7#7{1Ieb4A$7YQLEY3Qf!(%atJ_qSbV^7Vhmwn>d? zU&4$oVKw*YqKF3yF^?5yY1t;{+q+ebK_kdhOSgT&f==$*5?Z1a>>(3CVX4;|OcWX; z!`a8}O5UumADp{5?!_@*vWoTTiHj%T0*~=VHbs zX3N%5_ri9ymNtg#b%O?8I!GFeoDX@QCrWRGTyrs!k3`#8PsO&EzzhwiX)Jb>OdL;Y zo$Z!Dd{kHi-6LokxDveWGK*0Rt8h)FikBNSS8NbkFRxjMYqlg(=V}JVQZK z9QPD=78<{5S#Vwfx?1uf_pt&||E^W_1aYZKO+#8zg+YhgF8B>n;Rvo?rVc38Od(d5 zP})EU{!C&Pp>0J`*k=_x2no!k9bPF~l_M#h!w&J4a z8Ik5j?}5b0vp$frtz#dKskh?*v6}70z~(>sLH(h+HFkb2HgL~r#4TfTdxAjF!{}>G zUT-)ivqhifg^^eQsEXMVNik>0k3uF5KK05-CYnyFO^-m0dMt*cx>GQ8mZrxKXdLFe zpi(THDw=tEB0aY&S3n!gg0tkZ-<2m{jK-|PQ81VzsLKFEi8~mwV@>yGv~*zVuA@XQ z;%?C>TFn8CjTFizSI$AGj|~dxQ4yp|v{m9r-o>BEH?yVt5bMp*?Z(G}?5|slB-e6u zcUa)HmCd$3zBSImM!wr=nuY7ucM(c;J&n>wbn<-XW+r3B@jhRIi0E!*gh7||3)9)5 z*qiY{mS}-Ys+-=A0q@X+i!;K3GflHkFmITvzBPBL*wruetG41$9;P&_p9p>>29f5# zlHP~e&Ui-BU@K>2QY(5U`8pFm+q+yCgZ(LjxT=Eg&za3Pb3itZ^7GO?5w!QM805jJ zXH04+b!svvQ>K2Ws&5+!`7HfBVmIs!SJWKH%|!$c_3f8=d_6t-R*HBo=8&c?_xwVa zP+>90x-PDv$fk`@O+Vhh4dj8!&D@9-|H9Sb*Rp|Nt9wkQcQH$eh=syMlrAo9BeQDm6? zB1L^5kT7Ae5*M## zVx*0stZGBYrmAM!nksJ*UACmO2yLY-w;ti0ZB9KQh_Sv8^TD>JUv|~1Zh=CVIZuM4 z?5HNCO4crKTvGR-Vl@S1TXvMUYF~Ta<5iL;3d=Z=H^R|QU)YspV_iD)lhL8&XAt8_ z2cUYjx(7M==)AKUt<@e4ws4az@4gKnUpBz-y$qC6wo=xD$eG3}@}-FJ?Qk!Gyu;`X zf($FkJq=7$!vquCgm5teqtgI9>*iSZ77A*8IXx}0<+NCFdMO|Os?B-HJ&HPa4mKXw z1PX|a%~AxS&U6Z!q+VGsY;ayNwE#jg3SEIie#t#pvd=^}&yEGpHDspwbSk$LD8Pv} zRH?zN$c4}i0QGNo*-dfxBlYoZ*C>XS=gF#_a_-sU!H0j*a2{pN-9_h`c!o&-AiNCR zBdPziDz9c!lN{mW-ia1&dRJ9>es&7mS49OQ&);#K*(~hcn;AXZh_o z5iVx~$%*5dnal=RrW;o8LeLLs)0Rk#pl*UXhR%Cj`4|qfSv9EoO(uhJ<&5SCAhBLO zutsH>0foZ8#nQV0=>rOzD-oaB|yC!|18xvTH9K_~6yR$fI<1gJ%^8Wd|`#ADw zrZ*+B?_+dIw(-zJ4oZ+&P(vC_77LFwIDD9yOj_#aZUm^gC1b0d;8wBc$Ofut7SO|* zI9Gbt=p>yo@TMJU&>M}qir|1}PH0ldMe!=1)?c`UVh@)?r!Oywg zn?9olkmGZtk_*FlANH)RD_1I!sh^)x;Bs#$UMRdx&&nmQp8#&Kn+zY2FB`7!j5a5s zyx)b0Bg25&=1@9ZfP-P-GCdY895jQwD;hc-*nq>vY~R~xM7-(ujtJAc%?Yn3n{jVO zZ&S9~EcF>RXpNFNxLXflklD9TGsDs^M}@U1O|`zKnjTa{s^wX2wz_>qv&*kMSl7{1 zStOYf)U?-806cnSsk&L{PpyrGtxpiK*0F&5*33hIN^bgh+%(S?)rA zXj5jD{FdxPhif0P42i<-v<)h|#Jq}w1YW8?CVQZ&lEx)9IDqOSjkXIl4iFr`lz3pI zUb$7Gt!|fFV5Y=NGM^#xTBb=Oo?jN6r^o!!ZBF!6+ij9`8q7Bhn~H98)hIm{NoslX ztPo>0o-6omYx&0lBWWQKE(;ZrF!8Bq(d`zkKXZ1*(BP!@?_R1;fMz>gwwTQ>e^_J| zwvrg~o&XTmD_c5t3h`iEdV`9POXHphL?G@7ofG+RG_8~db}1%>9JEtrkV}h-#dsXC z_QVa{rG-)?pO{y{@a%S9G_@5WkYByDJ6|Cmh5L|VQ8iB~8Dai`^H`%=KY%8~7_+F$ z5#)<1(Mpy)nyH3U=SmctJCo|pzMxO0SS8ae9he79!Z}{aV9mbED8oA50PbicxQeu# z4Arr5ni_<-b;FI#tk@59EYX=pGKAX>1dfTf6zG?DPS1|&6_}r zjy%?;)2Y)Tz>d=)%M@qIXnZf2h@fur^G@mMitV7W7n&8Hn3_2^fHJZ zcM`d&4r;q4?1rHsO}syWJEu56tBlL$E-ui8$mR!qX5nG#4QjB4p*j1aoEZ%aWuyxO zLCCsOtsO!DcxIkAR^MW4F4LCb!4+HD3D}fp$kn#1B}c!Vn4m>}Cp`lW?*a;|WdE^Y>z`i3a};RP+QQLfXg2m2PWV?gcDTOyuWYPr z!@nc@ZSsw(|7zI!H?q$|2QD-J6WK4nW%|{y^>1X~<`njSWMivzUH@v>nkBDYxjB-; z`3ooH+#k*Q8z-#HQThufoG<;|u(j#5HleQ@+db6cBebhK(@@y{u_V~pk`92Wg30$@( zsM6C)`^#%UO5n=~fqU^jGS)rIp_^L_ME!VLEX}u~EGpytT|aJwnQ6Rt=rt2?Fp_zR zNqCZV5k6%r2n3%T5%kD>Vd4zJmXcwFIr7L2MEI4B&1w{rapRr;GW&jrc@RnHTv%Ez zl3I58vml=}oJr!KWvj4IS%ayboC1fGk`P`TJ$1+=3Erk)A(Iq!EHoQSYl39Jk*y$m z*GC0`S@9Ts1sy<#Og$Bdr^om6WIHNtup=KuNC#6OBR8aNc^o#0#h2bCZl<@?LBJYG zrr5ox?5ND0oGz-|n+H1FD%&1S>N#h?T?j?tV9t>O{k4mKwgV$WK1zPUS(!pL3oKk`39I&<<8xm$4McBk$A5XlsxRHCnH!a@u6L*8 zc~5T?C2U;FDW;hN*{Q8wRo*V>RYNouje?n*OjV-o?v^ddCvD|G2(N^)zhOnM}-9h9<`?i}<%;33~^2T6uFU|eT z(>3D*%fmr+pyI<}NwkI6QAM-C@=?_w%R7^rN&D}o@8_ewpLGltzB}(iR9ZOi!Fwxc zYWSl1$CU%dC(S;xx%`j)014moZQ7;|i zkB^;o%`wzHVpkJD=CXz;Cf(B$Sp%WFSw&VG>S?R231o9w1({0s){oZ&@xc>;En=gH zAEpA{f6qmKLYBhO3fWN+lg~pI5eXw@xD55pA0g?2>1Q~L{2<+shx^5%o7wBq?nnD3 z-e5~3OWb8dFo=S1k*|TM?lSV&5jt9jkA#2bGOD4LlJtIwQ0NMZnq5+oArcUZU|z+f zu~Sjt@e@dJT*aEHQBu)rOUbBS#d$VR(eN%yDL7rl``u8{Noh-~#9bwXa#1sAE=z;! zt`cMANtxcH5=hNlCF#{tv$%WW=wDqWD_v5v1(#wQV_v67u+wlPe|x3Lah=-hOv6?D z4aZ#dI?X$tnx|PC*T(5OedEVIPcQw1Of^ZR2%Z*JLn`|luk#o z)a8>3QAvvl48_LXMAHZzlB$)>ysT>|boQo~|4cWVT2))bBSfj_EHIFHH5dNsu@pCe zVU7W_u|!FbK{dW)t`McRRPmNvJwL3sR5dY3qm$uTeHj?nsj-~y2ZNRj-9oK@O@+lC zna*rjcVnHazx{g~xE%&fxS7VPr*=kzd)o2N?fPn;by_31GJo}3^dCK0Uir2vkm zT9o%pW<(6j!=ep!NttvOoHojQoNEn>rZRVhZf=Z!HE!FZF*Nat~+f+MQ z+{(+=PfZ%zH`WSit z_=?@H9IeAQ?>Q3A8TaUqn@2RxSd;3XZ8AH1b{PgarUWl-vZq&$St#Zw&yKy~s&9R= zvG;K%fMfbH*WWs!*v^?nAoWEkT5-|`jW7pJzg`5(%OdC%R}W^TWdM8I^oAE#K`Zs4 zOnuo*k_Ju@=lfy>=QhQxpIot`%+}A1*yJ(W%`3OB z;G(wlo~Am+r*rPVa%X6)v>z*MU#~vq>1e$>^OP&vxC?sr@tQ==M^ky@=RRjUTvp3_ ztRHL$uRV-0t1i0PI<`J|^7T0*UWAUyZ{se41~{XVBb_r?NS|8tL|Lx(!5zB^Pp|k# zSSzm*ZQ7v2TDitd(T-AQz2|s7wU#7lm1%GKPt^LX4qU@4vFwpOn2#3C4FW%ewgu|AXD{=+-=Pb~K{ zeVu2A`7by6EAKm#+s}QZcsJob+4p?cISGos*~C&xZRgyejrt&{M8WErsr>PZuT^m0 zH1O;AXvcL{HUEKF^!0SS&zGXtos(+S4>|Q8Z^b_dokX*IUuImtGo2MYbA9`6V{+rZ z2GQp@u-a=od*f??l+Qupx##}djc+NzK6{0%o=2}Y9wG*Pwj1AioMCNz_e1=2_qqR* z`_<0+4_B#AYx7TTclGO!R>7Z^_g=d_1g!tmAN;g%`@!|6+WM0UqOT&Yue_A6%o|_H zU|+FfU*SPtp)bAyh~H*7g8dka{pbe$sK5A8Ao{}tC$dLu)OAutY2(mQ* z+1Q7yA_Okc1kOta&R7Ia1_h241r84c4(tc^A_R5O1a(RVwOIr;2L&}01=S7&RqY3r zBLtVw1Q)vD(mMuwqy&4l1bZ(9`+N=d#Sii43xQ~b5MrSJ0kHgMKH~4l(tq~gAGz9p LeDJ^NuU`H)zNx*` literal 0 HcmV?d00001 From 8c1315cde0c0d163a7c421b737f3b65bd06e5c48 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Thu, 13 Jun 2019 20:33:56 +0200 Subject: [PATCH 29/44] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ac248bd..be65a79 100644 --- a/README.md +++ b/README.md @@ -29,4 +29,5 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file ### Acknowledgments * Inspired by - [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) +* Thanks for helping me to improve my library - [per1234](https://github.com/per1234) * Screen-GIF recorded with - [ShareX](https://getsharex.com/) From 47ebf23975f6a9b22d25f9e69f67c35709e05860 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Mon, 7 Oct 2019 18:04:29 +0200 Subject: [PATCH 30/44] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index be65a79..96bd63f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,9 @@ This library can be installed through the Arduino IDE library manager like so: ![](installation.gif) ### Note -The Servo-Library was build to be compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. +Starting from version 1.2.0 this Servo-Library is compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. Besides that, following functions are added: +* attach(int pin, int min, int max, int defaultPos); +* detachAll(); ### Built With * [Visual Studio 2019](https://visualstudio.microsoft.com/) - IDE used for programming From d4418ef0bcce5ee7d08e94875623f688a5415963 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Mon, 7 Oct 2019 18:07:26 +0200 Subject: [PATCH 31/44] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 96bd63f..d1b7621 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ This library can be installed through the Arduino IDE library manager like so: ### Note Starting from version 1.2.0 this Servo-Library is compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. Besides that, following functions are added: -* attach(int pin, int min, int max, int defaultPos); -* detachAll(); +* ```attach(int pin, int min, int max, int defaultPos);``` +* ```detachAll()```; ### Built With * [Visual Studio 2019](https://visualstudio.microsoft.com/) - IDE used for programming From 34140d0014e19db4ccf97b76c9aa08da2aa87cab Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Mon, 7 Oct 2019 18:14:35 +0200 Subject: [PATCH 32/44] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d1b7621..1a0c538 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ This library can be installed through the Arduino IDE library manager like so: ![](installation.gif) ### Note -Starting from version 1.2.0 this Servo-Library is compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. Besides that, following functions are added: -* ```attach(int pin, int min, int max, int defaultPos);``` -* ```detachAll()```; +Starting from version 1.2.0 this Servo-Library is compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. In addition to these "standard"-functions, following commands are added: +* ``` attach(int pin, int min, int max, int defaultPos)``` - Besides the ability of setting the servo pin and the upper and lower pulse width limit, the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user defined angle instead of the middle position. +* ```detachAll()``` - This feature allows to detach all servos at once. ### Built With * [Visual Studio 2019](https://visualstudio.microsoft.com/) - IDE used for programming From fc443ee4f72289f3067222524be3022b80ae2862 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Mon, 7 Oct 2019 18:17:27 +0200 Subject: [PATCH 33/44] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a0c538..7218868 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Servo Hardware PWM Library for Arduino Mega This library allows Arduino/Genuino Mega boards to control up to **6 servos** with the integrated **16-bit hardware PWM timer/counter**. -This library uses the 16-bit hardware timer/counter (timer3, timer4 and timer5) to control the servos. +16-bit hardware timer/counter (timer3, timer4 and timer5) are used to control the servos. Unlike the original Servo.h library, this library does not use timer1. The advantage here is that when using the Wire.h library no fluctuations in the pulse width occur. From 184e6fb7c69c2e65a108ec7fa81b111f05e4cfc1 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Tue, 8 Oct 2019 20:23:04 +0200 Subject: [PATCH 34/44] Update functions_explained.adoc --- extras/functions_explained.adoc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/extras/functions_explained.adoc b/extras/functions_explained.adoc index 543c3e1..f9ce793 100644 --- a/extras/functions_explained.adoc +++ b/extras/functions_explained.adoc @@ -4,6 +4,20 @@ The functions of the library are: **attach(pin)** -- Attaches a servo motor to an i/o pin. (only **pin 2, 3, 7, 8, 44,** and **45**) -**writeMicroseconds(us)** -- Sets the servo pulse width in microseconds. (usable range between **500**us and **2500**us) +**attach(pin, min, max)** -- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. + +**attach(pin, min, max, defaultPos)** -- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. In addition the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user defined angle instead of the middle position. **detach()** -- Clears the used registers and stops the output of the attached pin. (**no pin number!**) + +**detachAll()** -- Clears the used registers and stops the output of ALL attached pins. (**no pin number!**) + +**write(degrees)** -- Sets the servo angle in degrees. (usable range between 0° and 180°) + +**writeMicroseconds(us)** -- Sets the servo pulse width in microseconds. (standard usable range between **500**us and **2500**us) + +**read()** -- Returns the current angle (in degrees) that gets transmitted to the servo. (return datatype: **int**) + +**readMicroseconds()** -- Returns the current angle (in microseconds) that gets transmitted to the servo. (return datatype: **int**) + +**attached()** -- Returns **true** if the servo is attached, otherwise the return value is **false**. (return datatype: **bool**) From 0bc1593fcf83b7ce4b106729251a2db1bb9bd394 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Tue, 8 Oct 2019 20:24:09 +0200 Subject: [PATCH 35/44] Update functions_explained.adoc --- extras/functions_explained.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/functions_explained.adoc b/extras/functions_explained.adoc index f9ce793..170ebfc 100644 --- a/extras/functions_explained.adoc +++ b/extras/functions_explained.adoc @@ -18,6 +18,6 @@ The functions of the library are: **read()** -- Returns the current angle (in degrees) that gets transmitted to the servo. (return datatype: **int**) -**readMicroseconds()** -- Returns the current angle (in microseconds) that gets transmitted to the servo. (return datatype: **int**) +**readMicroseconds()** -- Returns the current angle (in microseconds) that gets transmitted to the servo. (return type: **int**) -**attached()** -- Returns **true** if the servo is attached, otherwise the return value is **false**. (return datatype: **bool**) +**attached()** -- Returns **true** if the servo is attached, otherwise the return value is **false**. (return type: **bool**) From 141707543504c746b541741a0479405f20c838dd Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Tue, 8 Oct 2019 20:26:39 +0200 Subject: [PATCH 36/44] Update functions_explained.adoc --- extras/functions_explained.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/functions_explained.adoc b/extras/functions_explained.adoc index 170ebfc..abe15f9 100644 --- a/extras/functions_explained.adoc +++ b/extras/functions_explained.adoc @@ -6,7 +6,7 @@ The functions of the library are: **attach(pin, min, max)** -- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. -**attach(pin, min, max, defaultPos)** -- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. In addition the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user defined angle instead of the middle position. +**attach(pin, min, max, defaultPos)** -- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. In addition, the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user-defined angle instead of the middle position. **detach()** -- Clears the used registers and stops the output of the attached pin. (**no pin number!**) @@ -20,4 +20,4 @@ The functions of the library are: **readMicroseconds()** -- Returns the current angle (in microseconds) that gets transmitted to the servo. (return type: **int**) -**attached()** -- Returns **true** if the servo is attached, otherwise the return value is **false**. (return type: **bool**) +**attached()** -- Returns **true** if the servo is attached. (return type: **bool**) From f47d83e2f4e10c4bbc80605b35c8bdd8f2c63e29 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Wed, 9 Oct 2019 14:50:47 +0200 Subject: [PATCH 37/44] updated functions_explained.adoc --- extras/functions_explained.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/functions_explained.adoc b/extras/functions_explained.adoc index abe15f9..2255e05 100644 --- a/extras/functions_explained.adoc +++ b/extras/functions_explained.adoc @@ -16,7 +16,7 @@ The functions of the library are: **writeMicroseconds(us)** -- Sets the servo pulse width in microseconds. (standard usable range between **500**us and **2500**us) -**read()** -- Returns the current angle (in degrees) that gets transmitted to the servo. (return datatype: **int**) +**read()** -- Returns the current angle (in degrees) that gets transmitted to the servo. (return type: **int**) **readMicroseconds()** -- Returns the current angle (in microseconds) that gets transmitted to the servo. (return type: **int**) From 3760e628512b7148f944bbd30364b8be43e8514e Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Thu, 10 Oct 2019 18:49:20 +0200 Subject: [PATCH 38/44] updated the comments in Servo_Hardware_PWM.h --- src/Servo_Hardware_PWM.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 450f753..67ff323 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -37,13 +37,29 @@ The methods are: - Servo --- Class for manipulating servo motors connected to Arduino pins. (max. 6 elements) + Servo --- Class for manipulating servo motors connected to Arduino pins. (max. 6 elements) - attach(pin) --- Attaches a servo motor to an i/o pin. (only pin 2, 3, 7, 8, 44, and 45) + attach(pin) --- Attaches a servo motor to an i/o pin. (only pin 2, 3, 7, 8, 44, and 45) - writeMicroseconds(us) --- Sets the servo pulse width in microseconds. (usable range between 500us and 2500us) + attach(pin, min, max) --- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. - detach() --- Clears the used registers and stops the output of the attached pin. (no pin number!) + attach(pin, min, max, defaultPos) --- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. + In addition, the starting pulse width of the servo can bes set with the defaultPos. + This allows the servo to start from a user-defined angle instead of the middle position. + + detach() --- Clears the used registers and stops the output of the attached pin. (no pin number!) + + detachAll() --- Clears the used registers and stops the output of ALL attached pins. (no pin number!) + + write(degrees) --- Sets the servo angle in degrees. (usable range between 0° and 180°) + + writeMicroseconds(us) --- Sets the servo pulse width in microseconds. (usable range between 500us and 2500us) + + read() --- Returns the current angle (in degrees) that gets transmitted to the servo. (return type: int) + + readMicroseconds() --- Returns the current angle (in microseconds) that gets transmitted to the servo. (return type: int) + + attached() --- Returns true if the servo is attached. (return type: bool) */ #ifndef Servo_Hardware_PWM_h From 6e62a153b6da1f2df627c8846b365f6abbe86d1a Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Thu, 10 Oct 2019 19:13:35 +0200 Subject: [PATCH 39/44] changed version macro-name from "Servo_VERSION" to "VERSION" --- src/Servo_Hardware_PWM.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 67ff323..5b08f34 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -71,7 +71,7 @@ #error "This library only supports boards with an AVR processor." #endif -#define Servo_VERSION 1.0.1 //software version of this library +#define VERSION 1.0.1 //software version of this library #define MIN_PULSE_WIDTH 500 //the shortest pulse sent to a servo #define MAX_PULSE_WIDTH 2500 //the longest pulse sent to a servo From 71b6df161408d29e3438c9bd2bdbb8fc8192c890 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Fri, 11 Oct 2019 13:13:53 +0200 Subject: [PATCH 40/44] - bumped version numbers - changed date of last modification --- examples/Servo_Sweep/Servo_Sweep.ino | 3 ++- library.properties | 2 +- src/Servo_Hardware_PWM.h | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/Servo_Sweep/Servo_Sweep.ino b/examples/Servo_Sweep/Servo_Sweep.ino index 1b12465..402e70b 100644 --- a/examples/Servo_Sweep/Servo_Sweep.ino +++ b/examples/Servo_Sweep/Servo_Sweep.ino @@ -1,5 +1,6 @@ /* Servo Sweep - by Daniel Duller 12. January 2019 + Created by Daniel Duller, 12. January, 2019. + Changed by Daniel Duller, 11. October, 2019. This example code is in the public domain. */ diff --git a/library.properties b/library.properties index 86d1eaf..9668c10 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Servo Hardware PWM -version=1.0.1 +version=1.2.0 author=Daniel Duller maintainer=Daniel Duller sentence=Allows Arduino/Genuino Mega boards to control up to 6 servos with the integrated 16-bit hardware PWM timer/counter. diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 5b08f34..0dbe2c6 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -1,7 +1,7 @@ /* Servo_Hardware_PWM.h - This Library allows Arduino/Genuino Mega boards to control up to 6 servos with the integrated 16-bit hardware PWM timer/counter. Created by Daniel Duller, 11. January, 2019. - Changed by Daniel Duller, 14. January, 2019. + Changed by Daniel Duller, 11. October, 2019. ############################################################################### MIT License @@ -71,7 +71,7 @@ #error "This library only supports boards with an AVR processor." #endif -#define VERSION 1.0.1 //software version of this library +#define VERSION 1.2.0 //software version of this library #define MIN_PULSE_WIDTH 500 //the shortest pulse sent to a servo #define MAX_PULSE_WIDTH 2500 //the longest pulse sent to a servo From 9ccd1d56392adb52fcf04e5d278f4e3d98b833c6 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Fri, 11 Oct 2019 13:16:52 +0200 Subject: [PATCH 41/44] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7218868..88e2a90 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ This library can be installed through the Arduino IDE library manager like so: ### Note Starting from version 1.2.0 this Servo-Library is compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. In addition to these "standard"-functions, following commands are added: -* ``` attach(int pin, int min, int max, int defaultPos)``` - Besides the ability of setting the servo pin and the upper and lower pulse width limit, the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user defined angle instead of the middle position. -* ```detachAll()``` - This feature allows to detach all servos at once. +* ``` attach(int pin, int min, int max, int defaultPos)``` - Besides the ability of setting the servo pin and the upper and lower pulse width limit, the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user-defined angle instead of the middle position. +* ```detachAll()``` - This feature allows detaching all servos at once. ### Built With * [Visual Studio 2019](https://visualstudio.microsoft.com/) - IDE used for programming From 671db5ccfa8e044cf6c2d3e3b36ba5a798eeab98 Mon Sep 17 00:00:00 2001 From: Daniel Duller <46626392+dadul96@users.noreply.github.com> Date: Fri, 11 Oct 2019 13:17:59 +0200 Subject: [PATCH 42/44] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 88e2a90..86a2717 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This library can be installed through the Arduino IDE library manager like so: ### Note Starting from version 1.2.0 this Servo-Library is compatible with all the [original Arduino Servo Library](https://github.com/arduino-libraries/Servo) - commands available. In addition to these "standard"-functions, following commands are added: -* ``` attach(int pin, int min, int max, int defaultPos)``` - Besides the ability of setting the servo pin and the upper and lower pulse width limit, the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user-defined angle instead of the middle position. +* ``` attach(int pin, int min, int max, int defaultPos)``` - Besides the ability to set the servo pin and the upper and lower pulse width limit, the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user-defined angle instead of the middle position. * ```detachAll()``` - This feature allows detaching all servos at once. ### Built With From c313cb8d0b21a24d05a152720200144b94fa5644 Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Fri, 11 Oct 2019 13:25:01 +0200 Subject: [PATCH 43/44] corrected spelling mistakes --- src/Servo_Hardware_PWM.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index 0dbe2c6..fe61cee 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -44,7 +44,7 @@ attach(pin, min, max) --- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. attach(pin, min, max, defaultPos) --- Attaches a servo motor to an i/o pin with a custom lower and upper pulse width limit. - In addition, the starting pulse width of the servo can bes set with the defaultPos. + In addition, the starting pulse width of the servo can be set with the defaultPos. This allows the servo to start from a user-defined angle instead of the middle position. detach() --- Clears the used registers and stops the output of the attached pin. (no pin number!) From 95495c1b8c0d310fcfca5af7288a0ea40efad9da Mon Sep 17 00:00:00 2001 From: Daniel Duller Date: Fri, 11 Oct 2019 13:53:54 +0200 Subject: [PATCH 44/44] bugfix: defaultPos --- src/Servo_Hardware_PWM.cpp | 2 +- src/Servo_Hardware_PWM.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Servo_Hardware_PWM.cpp b/src/Servo_Hardware_PWM.cpp index 7a14379..153cdad 100644 --- a/src/Servo_Hardware_PWM.cpp +++ b/src/Servo_Hardware_PWM.cpp @@ -38,7 +38,7 @@ uint8_t Servo::attach(int pin, int min, int max) { uint8_t Servo::attach(int pin, int min, int max, int defaultPos) { this->min = min; this->max = max; - this->defaultPos = defaultPos; + this->defaultPos = defaultPos * 2; if (this->servoIndex < MAX_SERVOS) { diff --git a/src/Servo_Hardware_PWM.h b/src/Servo_Hardware_PWM.h index fe61cee..54891c7 100644 --- a/src/Servo_Hardware_PWM.h +++ b/src/Servo_Hardware_PWM.h @@ -75,7 +75,7 @@ #define MIN_PULSE_WIDTH 500 //the shortest pulse sent to a servo #define MAX_PULSE_WIDTH 2500 //the longest pulse sent to a servo -#define DEFAULT_PULSE_WIDTH 0 //default pulse width when servo is attached +#define DEFAULT_PULSE_WIDTH 1500 //default pulse width when servo is attached #define MAX_TIMER_COUNT 40000 //the timer TOP value (for creating 50Hz) #define MAX_SERVOS 6 //6 Servos can be attached