diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7bcaed --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/LICENSE b/LICENSE index 8000a6f..5f7a7c4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,504 +1,373 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/README.md b/README.md index 5cca3dc..ee99531 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ -# Arduino_Robot_Firmware -firmware +# Arduino_AlvikCarrier + + +W.I.P. diff --git a/examples/.DS_Store b/examples/.DS_Store deleted file mode 100644 index f785ebf..0000000 Binary files a/examples/.DS_Store and /dev/null differ diff --git a/examples/blink/.DS_Store b/examples/blink/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/examples/blink/.DS_Store and /dev/null differ diff --git a/examples/blink/blink.ino b/examples/blink/blink.ino index dbf135c..add88db 100644 --- a/examples/blink/blink.ino +++ b/examples/blink/blink.ino @@ -1,29 +1,22 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + // This example makes the rear orange led blink. It is also called LED_BUILTIN -#include "Arduino_Alvik_Firmware.h" +#include "Arduino_AlvikCarrier.h" -Arduino_Alvik_Firmware alvik; +Arduino_AlvikCarrier alvik; void setup(){ alvik.begin(); diff --git a/examples/firmware_01/firmware_01.ino b/examples/firmware_01/firmware_01.ino index a61011b..255b98b 100644 --- a/examples/firmware_01/firmware_01.ino +++ b/examples/firmware_01/firmware_01.ino @@ -1,30 +1,23 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ -#include "Arduino_Alvik_Firmware.h" + +#include "Arduino_AlvikCarrier.h" #include "sensor_line.h" #include "sensor_tof_matrix.h" #include "ucPack.h" -Arduino_Alvik_Firmware robot; +Arduino_AlvikCarrier alvik; SensorLine line(EXT_A2,EXT_A1,EXT_A0); -SensorTofMatrix tof(robot.wire, EXT_GPIO3, EXT_GPIO2); +SensorTofMatrix tof(alvik.wire, EXT_GPIO3, EXT_GPIO2); ucPack packeter(200); @@ -51,17 +44,17 @@ float kp, ki, kd; void setup(){ Serial.begin(115200); - robot.begin(); - robot.setLedBuiltin(HIGH); + alvik.begin(); + alvik.setLedBuiltin(HIGH); line.begin(); tof.begin(); uint8_t version[3]; - robot.getVersion(version[0], version[1], version[2]); + alvik.getVersion(version[0], version[1], version[2]); msg_size = packeter.packetC3B(0x7E, version[0], version[1], version[2]); - robot.serial->write(packeter.msg,msg_size); + alvik.serial->write(packeter.msg,msg_size); - robot.setLedBuiltin(LOW); + alvik.setLedBuiltin(LOW); code=0; @@ -72,33 +65,33 @@ void setup(){ } void loop(){ - while(robot.serial->available() > 0) { - packeter.buffer.push(robot.serial->read()); + while(alvik.serial->available() > 0) { + packeter.buffer.push(alvik.serial->read()); } if (packeter.checkPayload()) { code = packeter.payloadTop(); switch (code){ case 'J': packeter.unpacketC2F(code,left,right); - robot.setRpm(left, right); + alvik.setRpm(left, right); break; /* case 'S': - robot.setRpm(0,0); + alvik.setRpm(0,0); break; */ case 'L': packeter.unpacketC1B(code,leds); - robot.setAllLeds(leds); + alvik.setAllLeds(leds); break; case 'P': packeter.unpacketC1B3F(code,pid,kp,ki,kd); if (pid=='L'){ - robot.setKPidLeft(kp,ki,kd); + alvik.setKPidLeft(kp,ki,kd); } if (pid=='R'){ - robot.setKPidRight(kp,ki,kd); + alvik.setKPidRight(kp,ki,kd); } break; } @@ -110,27 +103,27 @@ void loop(){ case 0: line.update(); msg_size = packeter.packetC3I('l', line.getLeft(), line.getCenter(), line.getRight()); - robot.serial->write(packeter.msg,msg_size); + alvik.serial->write(packeter.msg,msg_size); break; case 1: - robot.updateTouch(); - msg_size = packeter.packetC1B('t', robot.getTouchKeys()); - robot.serial->write(packeter.msg,msg_size); + alvik.updateTouch(); + msg_size = packeter.packetC1B('t', alvik.getTouchKeys()); + alvik.serial->write(packeter.msg,msg_size); break; case 2: - robot.updateAPDS(); - msg_size = packeter.packetC3I('c', robot.getRed(), robot.getGreen(), robot.getBlue()); - robot.serial->write(packeter.msg,msg_size); + alvik.updateAPDS(); + msg_size = packeter.packetC3I('c', alvik.getRed(), alvik.getGreen(), alvik.getBlue()); + alvik.serial->write(packeter.msg,msg_size); break; case 3: if (tof.update_rois()){ msg_size = packeter.packetC7I('f', tof.getLeft(), tof.getCenterLeft(), tof.getCenter(), tof.getCenterRight(), tof.getRight(), tof.get_min_range_top_mm(), tof.get_max_range_bottom_mm()); - robot.serial->write(packeter.msg,msg_size); + alvik.serial->write(packeter.msg,msg_size); } break; case 4: - msg_size = packeter.packetC3F('q', robot.getRoll(), robot.getPitch(), robot.getYaw()); - robot.serial->write(packeter.msg,msg_size); + msg_size = packeter.packetC3F('q', alvik.getRoll(), alvik.getPitch(), alvik.getYaw()); + alvik.serial->write(packeter.msg,msg_size); break; } sensor_id++; @@ -141,17 +134,17 @@ void loop(){ if (millis()-tmotor>20){ tmotor=millis(); - robot.updateMotors(); - robot.updateImu(); - msg_size = packeter.packetC2F('j', robot.getRpmLeft(),robot.getRpmRight()); - robot.serial->write(packeter.msg,msg_size); + alvik.updateMotors(); + alvik.updateImu(); + msg_size = packeter.packetC2F('j', alvik.getRpmLeft(),alvik.getRpmRight()); + alvik.serial->write(packeter.msg,msg_size); } if (millis()-timu>10){ timu=millis(); - robot.updateImu(); - msg_size = packeter.packetC6F('i', robot.getAccelerationX(), robot.getAccelerationY(), robot.getAccelerationZ(), robot.getAngularVelocityX(), robot.getAngularVelocityY(), robot.getAngularVelocityZ()); - robot.serial->write(packeter.msg,msg_size); + alvik.updateImu(); + msg_size = packeter.packetC6F('i', alvik.getAccelerationX(), alvik.getAccelerationY(), alvik.getAccelerationZ(), alvik.getAngularVelocityX(), alvik.getAngularVelocityY(), alvik.getAngularVelocityZ()); + alvik.serial->write(packeter.msg,msg_size); } } \ No newline at end of file diff --git a/examples/imu/.DS_Store b/examples/imu/.DS_Store deleted file mode 100644 index 6bf5312..0000000 Binary files a/examples/imu/.DS_Store and /dev/null differ diff --git a/examples/imu/imu.ino b/examples/imu/imu.ino index 86076db..b162b09 100644 --- a/examples/imu/imu.ino +++ b/examples/imu/imu.ino @@ -1,30 +1,23 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + // This example shows IMU data, accelerations are in Gs, angular velocities in deg/s and orientation is in degrees. -#include "Arduino_Alvik_Firmware.h" +#include "Arduino_AlvikCarrier.h" unsigned long time_imu_update=0; -Arduino_Alvik_Firmware alvik; +Arduino_AlvikCarrier alvik; void setup(){ Serial.begin(115200); diff --git a/examples/kinematics/kinematics.ino b/examples/kinematics/kinematics.ino new file mode 100644 index 0000000..48e526a --- /dev/null +++ b/examples/kinematics/kinematics.ino @@ -0,0 +1,66 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + +// WIP + +#include "Arduino_AlvikCarrier.h" + +Arduino_AlvikCarrier alvik; + +unsigned long tmotor=0; +unsigned long ttask=0; +uint8_t task=0; + +void setup() { + Serial.begin(115200); + alvik.begin(); + ttask=millis(); + tmotor=millis(); + task=0; +} + +void loop() { + if (millis()-tmotor>20){ + tmotor=millis(); + alvik.updateMotors(); + alvik.kinematics->updatePose(alvik.motor_control_left->getTravel(), alvik.motor_control_right->getTravel()); + Serial.print("\t"); + Serial.print(alvik.kinematics->getDeltaX()); + Serial.print("\t"); + Serial.print(alvik.kinematics->getDeltaY()); + Serial.print("\t"); + Serial.print(alvik.kinematics->getTheta()); + Serial.print("\n"); + } + + if (millis()-ttask>2000){ + ttask=millis(); + switch (task){ + case 0: + alvik.drive(50,0); + break; + case 1: + alvik.drive(0,0); + break; + case 2: + alvik.drive(0,-90); + break; + case 3: + alvik.drive(0,0); + break; + } + task++; + if (task>3){ + task=0; + } + } + +} diff --git a/examples/motor/.DS_Store b/examples/motor/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/examples/motor/.DS_Store and /dev/null differ diff --git a/examples/motor/motor.ino b/examples/motor/motor.ino index bae1937..02568ec 100644 --- a/examples/motor/motor.ino +++ b/examples/motor/motor.ino @@ -1,25 +1,18 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. + This file is part of the Arduino_AlvikCarrier library. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + Copyright (c) 2023 Arduino SA - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ -#include "Arduino_Alvik_Firmware.h" -Arduino_Alvik_Firmware robot; +#include "Arduino_AlvikCarrier.h" + +Arduino_AlvikCarrier alvik; unsigned long t=0; unsigned long t_change = 0; @@ -29,10 +22,10 @@ float reference = 0.0; void setup(){ Serial.begin(115200); - robot.begin(); + alvik.begin(); t=millis(); t_change=millis(); - robot.setRpm(reference,reference); + alvik.setRpm(reference,reference); Serial.print("reference"); Serial.print(" "); @@ -66,16 +59,16 @@ void loop(){ if (status>5){ status=0; } - robot.setRpm(reference,reference); + alvik.setRpm(reference,reference); } if (millis()-t>20){ t=millis(); - robot.updateMotors(); + alvik.updateMotors(); Serial.print(reference); Serial.print(" "); - Serial.print(robot.getRpmRight()); + Serial.print(alvik.getRpmRight()); Serial.print(" "); - Serial.println(robot.getRpmLeft()); + Serial.println(alvik.getRpmLeft()); } } \ No newline at end of file diff --git a/library.properties b/library.properties index 8d0d158..f53b988 100644 --- a/library.properties +++ b/library.properties @@ -1,10 +1,11 @@ -name=Arduino_Robot_Firmware -version=0.0.6 +name=Arduino Alvik Carrier +version=0.1.0 author=Arduino, Giovanni di Dio Bruno, Lucio Rossi maintainer=Arduino -sentence=Library and firmware for Arduino Alvik -paragraph=This library is used to build the firmware used by Arduino Alvik, examples show you how to customize the firmware. +sentence=Library and firmware for Arduino Alvik Carrier board +paragraph=This library is used to build the firmware used by Arduino Alvik Carrier, examples show you how to customize the firmware. category=Robotics -url=https://github.com/gbr1/Arduino_Alvik_Firmware -includes=Arduino_Alvik_Firmware.h +url=https://github.com/arduino-libraries/Arduino_AlvikCarrier +architectures=stm32 +includes=Arduino_AlvikCarrier.h depends=Arduino_APDS9960, Arduino_MAX17332, STM32duino_LSM6DSO, STM32duino_MotionFX, STM32duino_VL53L7CX, AT42QT, ucPack \ No newline at end of file diff --git a/src/Arduino_Alvik_Firmware.cpp b/src/Arduino_AlvikCarrier.cpp similarity index 68% rename from src/Arduino_Alvik_Firmware.cpp rename to src/Arduino_AlvikCarrier.cpp index 4a0be0d..5c1354a 100644 --- a/src/Arduino_Alvik_Firmware.cpp +++ b/src/Arduino_AlvikCarrier.cpp @@ -1,28 +1,20 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ -#include "Arduino_Alvik_Firmware.h" -#include "HAL_custom_init.h" +#include "Arduino_AlvikCarrier.h" +#include "./utilities/HAL_custom_init.h" -Arduino_Alvik_Firmware::Arduino_Alvik_Firmware(){ +Arduino_AlvikCarrier::Arduino_AlvikCarrier(){ // I2C internal bus wire = new TwoWire(I2C_1_SDA, I2C_1_SCL); @@ -71,9 +63,13 @@ Arduino_Alvik_Firmware::Arduino_Alvik_Firmware(){ version_high = VERSION_BYTE_HIGH; version_mid = VERSION_BYTE_MID; version_low = VERSION_BYTE_LOW; + + // kinematics + kinematics = new Kinematics(WHEEL_TRACK_MM,WHEEL_DIAMETER_MM); + } -int Arduino_Alvik_Firmware::begin(){ +int Arduino_AlvikCarrier::begin(){ beginLeds(); serial->begin(UART_BAUD); @@ -127,7 +123,7 @@ int Arduino_Alvik_Firmware::begin(){ return 0; } -void Arduino_Alvik_Firmware::getVersion(uint8_t &high_byte, uint8_t &mid_byte, uint8_t &low_byte){ +void Arduino_AlvikCarrier::getVersion(uint8_t &high_byte, uint8_t &mid_byte, uint8_t &low_byte){ high_byte=version_high; mid_byte=version_mid; low_byte=version_low; @@ -138,7 +134,7 @@ void Arduino_Alvik_Firmware::getVersion(uint8_t &high_byte, uint8_t &mid_byte, u /* Color sensor, APDS9960 */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginAPDS(){ +int Arduino_AlvikCarrier::beginAPDS(){ pinMode(APDS_LED,OUTPUT); enableIlluminator(); if (!apds9960->begin()){ @@ -147,7 +143,7 @@ int Arduino_Alvik_Firmware::beginAPDS(){ return 0; } -void Arduino_Alvik_Firmware::updateAPDS(){ +void Arduino_AlvikCarrier::updateAPDS(){ if (apds9960->proximityAvailable()){ bottom_proximity=apds9960->readProximity(); } @@ -158,31 +154,31 @@ void Arduino_Alvik_Firmware::updateAPDS(){ //digitalWrite(APDS_LED,LOW); } -void Arduino_Alvik_Firmware::setIlluminator(uint8_t value){ +void Arduino_AlvikCarrier::setIlluminator(uint8_t value){ digitalWrite(APDS_LED,value); } -void Arduino_Alvik_Firmware::enableIlluminator(){ +void Arduino_AlvikCarrier::enableIlluminator(){ setIlluminator(HIGH); } -void Arduino_Alvik_Firmware::disableIlluminator(){ +void Arduino_AlvikCarrier::disableIlluminator(){ setIlluminator(LOW); } -int Arduino_Alvik_Firmware::getRed(){ +int Arduino_AlvikCarrier::getRed(){ return bottom_red; } -int Arduino_Alvik_Firmware::getGreen(){ +int Arduino_AlvikCarrier::getGreen(){ return bottom_green; } -int Arduino_Alvik_Firmware::getBlue(){ +int Arduino_AlvikCarrier::getBlue(){ return bottom_blue; } -int Arduino_Alvik_Firmware::getProximity(){ +int Arduino_AlvikCarrier::getProximity(){ return bottom_proximity; } @@ -190,17 +186,17 @@ int Arduino_Alvik_Firmware::getProximity(){ /* RC Servo A & B */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginServo(){ +int Arduino_AlvikCarrier::beginServo(){ servo_A->attach(SERVO_A); servo_B->attach(SERVO_B); return 0; } -void Arduino_Alvik_Firmware::setServoA(int position){ +void Arduino_AlvikCarrier::setServoA(int position){ servo_A->write(position); } -void Arduino_Alvik_Firmware::setServoB(int position){ +void Arduino_AlvikCarrier::setServoB(int position){ servo_B->write(position); } @@ -210,19 +206,19 @@ void Arduino_Alvik_Firmware::setServoB(int position){ /* External I2C */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginI2Cselect(){ +int Arduino_AlvikCarrier::beginI2Cselect(){ pinMode(SELECT_I2C_BUS,OUTPUT); } -void Arduino_Alvik_Firmware::setExternalI2C(uint8_t state){ +void Arduino_AlvikCarrier::setExternalI2C(uint8_t state){ digitalWrite(SELECT_I2C_BUS,state); } -void Arduino_Alvik_Firmware::connectExternalI2C(){ +void Arduino_AlvikCarrier::connectExternalI2C(){ setExternalI2C(LOW); } -void Arduino_Alvik_Firmware::disconnectExternalI2C(){ +void Arduino_AlvikCarrier::disconnectExternalI2C(){ setExternalI2C(HIGH); } @@ -232,22 +228,22 @@ void Arduino_Alvik_Firmware::disconnectExternalI2C(){ /* Battery Management System, MAX17332 */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginBMS(){ +int Arduino_AlvikCarrier::beginBMS(){ bms->begin(); return 0; } -void Arduino_Alvik_Firmware::updateBMS(){ +void Arduino_AlvikCarrier::updateBMS(){ voltage = bms->readVCell(); state_of_charge = bms->readSoc(); } -float Arduino_Alvik_Firmware::getBatteryVoltage(){ +float Arduino_AlvikCarrier::getBatteryVoltage(){ return voltage; } -float Arduino_Alvik_Firmware::getBatteryChargePercentage(){ +float Arduino_AlvikCarrier::getBatteryChargePercentage(){ return state_of_charge; } @@ -257,7 +253,7 @@ float Arduino_Alvik_Firmware::getBatteryChargePercentage(){ /* Motor controls */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginMotors(){ +int Arduino_AlvikCarrier::beginMotors(){ motor_left->begin(); motor_right->begin(); motor_left->stop(); @@ -273,45 +269,45 @@ int Arduino_Alvik_Firmware::beginMotors(){ return 0; } -void Arduino_Alvik_Firmware::updateMotors(){ +void Arduino_AlvikCarrier::updateMotors(){ motor_control_left->update(); motor_control_right->update(); } -bool Arduino_Alvik_Firmware::setRpmLeft(const float rpm){ +bool Arduino_AlvikCarrier::setRpmLeft(const float rpm){ return motor_control_left->setRPM(rpm); } -float Arduino_Alvik_Firmware::getRpmLeft(){ +float Arduino_AlvikCarrier::getRpmLeft(){ return motor_control_left->getRPM(); } -bool Arduino_Alvik_Firmware::setRpmRight(const float rpm){ +bool Arduino_AlvikCarrier::setRpmRight(const float rpm){ return motor_control_right->setRPM(rpm); } -float Arduino_Alvik_Firmware::getRpmRight(){ +float Arduino_AlvikCarrier::getRpmRight(){ return motor_control_right->getRPM(); } -bool Arduino_Alvik_Firmware::setRpm(const float left, const float right){ +bool Arduino_AlvikCarrier::setRpm(const float left, const float right){ motor_control_left->setRPM(left); motor_control_right->setRPM(right); return true; } -void Arduino_Alvik_Firmware::getRpm(float & left, float & right){ +void Arduino_AlvikCarrier::getRpm(float & left, float & right){ left=motor_control_left->getRPM(); right=motor_control_right->getRPM(); } -void Arduino_Alvik_Firmware::setKPidRight(const float kp, const float ki, const float kd){ +void Arduino_AlvikCarrier::setKPidRight(const float kp, const float ki, const float kd){ motor_control_right->setKP(kp); motor_control_right->setKI(ki); motor_control_right->setKD(kd); } -void Arduino_Alvik_Firmware::setKPidLeft(const float kp, const float ki, const float kd){ +void Arduino_AlvikCarrier::setKPidLeft(const float kp, const float ki, const float kd){ motor_control_left->setKP(kp); motor_control_left->setKI(ki); motor_control_left->setKD(kd); @@ -323,7 +319,7 @@ void Arduino_Alvik_Firmware::setKPidLeft(const float kp, const float ki, const f /* Touch pads */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginTouch(){ +int Arduino_AlvikCarrier::beginTouch(){ touch_sensor->begin(); if (!touch_sensor->communicating()){ return ERROR_TOUCH; @@ -346,25 +342,25 @@ int Arduino_Alvik_Firmware::beginTouch(){ return 0; } -void Arduino_Alvik_Firmware::updateTouch(){ +void Arduino_AlvikCarrier::updateTouch(){ touch_status = touch_sensor->getStatus(); } -bool Arduino_Alvik_Firmware::getAnyTouchPressed(){ +bool Arduino_AlvikCarrier::getAnyTouchPressed(){ if (touch_sensor->touched(touch_status,TOUCH_PAD_GUARD)){ return true; } return false; } -bool Arduino_Alvik_Firmware::getTouchKey(const uint8_t key){ +bool Arduino_AlvikCarrier::getTouchKey(const uint8_t key){ if (touch_sensor->touched(touch_status,key)&&touch_sensor->touched(touch_status,TOUCH_PAD_GUARD)){ return true; } return false; } -uint8_t Arduino_Alvik_Firmware::getTouchKeys(){ +uint8_t Arduino_AlvikCarrier::getTouchKeys(){ touch_value=0; if (getAnyTouchPressed()){ touch_value|=1; @@ -379,31 +375,31 @@ uint8_t Arduino_Alvik_Firmware::getTouchKeys(){ return touch_value; } -bool Arduino_Alvik_Firmware::getTouchUp(){ +bool Arduino_AlvikCarrier::getTouchUp(){ return getTouchKey(TOUCH_PAD_UP); } -bool Arduino_Alvik_Firmware::getTouchRight(){ +bool Arduino_AlvikCarrier::getTouchRight(){ return getTouchKey(TOUCH_PAD_RIGHT); } -bool Arduino_Alvik_Firmware::getTouchDown(){ +bool Arduino_AlvikCarrier::getTouchDown(){ return getTouchKey(TOUCH_PAD_DOWN); } -bool Arduino_Alvik_Firmware::getTouchLeft(){ +bool Arduino_AlvikCarrier::getTouchLeft(){ return getTouchKey(TOUCH_PAD_LEFT); } -bool Arduino_Alvik_Firmware::getTouchCenter(){ +bool Arduino_AlvikCarrier::getTouchCenter(){ return getTouchKey(TOUCH_PAD_CENTER); } -bool Arduino_Alvik_Firmware::getTouchOk(){ +bool Arduino_AlvikCarrier::getTouchOk(){ return getTouchKey(TOUCH_PAD_OK); } -bool Arduino_Alvik_Firmware::getTouchDelete(){ +bool Arduino_AlvikCarrier::getTouchDelete(){ return getTouchKey(TOUCH_PAD_DELETE); } @@ -413,7 +409,7 @@ bool Arduino_Alvik_Firmware::getTouchDelete(){ /* Leds */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginLeds(){ +int Arduino_AlvikCarrier::beginLeds(){ pinMode(LED_BUILTIN,OUTPUT); // turn off leds led1->clear(); @@ -421,61 +417,61 @@ int Arduino_Alvik_Firmware::beginLeds(){ return 0; } -void Arduino_Alvik_Firmware::setLedBuiltin(const uint8_t value){ +void Arduino_AlvikCarrier::setLedBuiltin(const uint8_t value){ digitalWrite(LED_BUILTIN,value); } -void Arduino_Alvik_Firmware::setLedLeft(const uint32_t color){ +void Arduino_AlvikCarrier::setLedLeft(const uint32_t color){ led1->set(color); } -void Arduino_Alvik_Firmware::setLedLeft(const uint32_t red, const uint32_t green, const uint32_t blue){ +void Arduino_AlvikCarrier::setLedLeft(const uint32_t red, const uint32_t green, const uint32_t blue){ led1->set(red,green,blue); } -void Arduino_Alvik_Firmware::setLedLeftRed(const uint32_t red){ +void Arduino_AlvikCarrier::setLedLeftRed(const uint32_t red){ led1->setRed(red); } -void Arduino_Alvik_Firmware::setLedLeftGreen(const uint32_t green){ +void Arduino_AlvikCarrier::setLedLeftGreen(const uint32_t green){ led1->setGreen(green); } -void Arduino_Alvik_Firmware::setLedLeftBlue(const uint32_t blue){ +void Arduino_AlvikCarrier::setLedLeftBlue(const uint32_t blue){ led1->setBlue(blue); } -void Arduino_Alvik_Firmware::setLedRight(const uint32_t color){ +void Arduino_AlvikCarrier::setLedRight(const uint32_t color){ led2->set(color); } -void Arduino_Alvik_Firmware::setLedRight(const uint32_t red, const uint32_t green, const uint32_t blue){ +void Arduino_AlvikCarrier::setLedRight(const uint32_t red, const uint32_t green, const uint32_t blue){ led2->set(red,green,blue); } -void Arduino_Alvik_Firmware::setLedRightRed(const uint32_t red){ +void Arduino_AlvikCarrier::setLedRightRed(const uint32_t red){ led2->setRed(red); } -void Arduino_Alvik_Firmware::setLedRightGreen(const uint32_t green){ +void Arduino_AlvikCarrier::setLedRightGreen(const uint32_t green){ led2->setGreen(green); } -void Arduino_Alvik_Firmware::setLedRightBlue(const uint32_t blue){ +void Arduino_AlvikCarrier::setLedRightBlue(const uint32_t blue){ led2->setBlue(blue); } -void Arduino_Alvik_Firmware::setLeds(const uint32_t color){ +void Arduino_AlvikCarrier::setLeds(const uint32_t color){ setLedLeft(color); setLedRight(color); } -void Arduino_Alvik_Firmware::setLeds(const uint32_t red, const uint32_t green, const uint32_t blue){ +void Arduino_AlvikCarrier::setLeds(const uint32_t red, const uint32_t green, const uint32_t blue){ setLedLeft(red,green,blue); setLedRight(red,green,blue); } -void Arduino_Alvik_Firmware::setAllLeds(const uint8_t value){ +void Arduino_AlvikCarrier::setAllLeds(const uint8_t value){ setLedBuiltin(value&1); setIlluminator((value>>1)&1); setLedLeftRed(((value>>2)&1)); @@ -492,7 +488,7 @@ void Arduino_Alvik_Firmware::setAllLeds(const uint8_t value){ /* IMU */ /******************************************************************************************************/ -int Arduino_Alvik_Firmware::beginImu(){ +int Arduino_AlvikCarrier::beginImu(){ imu->begin(); imu->Set_X_ODR(100.0); imu->Set_X_FS(4); @@ -519,7 +515,7 @@ int Arduino_Alvik_Firmware::beginImu(){ ipKnobs->output_type = MFX_ENGINE_OUTPUT_ENU; ipKnobs->LMode = 1; - ipKnobs->modx = DECIMATION; + ipKnobs->modx = MOTION_FX_DECIMATION; MotionFX_setKnobs(mfxstate, ipKnobs); MotionFX_enable_6X(mfxstate, MFX_ENGINE_ENABLE); @@ -528,7 +524,7 @@ int Arduino_Alvik_Firmware::beginImu(){ return 0; } -void Arduino_Alvik_Firmware::updateImu(){ +void Arduino_AlvikCarrier::updateImu(){ imu->Get_X_Axes(accelerometer); imu->Get_G_Axes(gyroscope); imu_data.gyro[0] = (float)gyroscope[0] * FROM_MDPS_TO_DPS; @@ -538,7 +534,7 @@ void Arduino_Alvik_Firmware::updateImu(){ imu_data.acc[1] = (float)accelerometer[1] * FROM_MG_TO_G; imu_data.acc[2] = (float)accelerometer[2] * FROM_MG_TO_G; - if (sample_to_discard>SAMPLETODISCARD){ + if (sample_to_discard>MOTION_FX_SAMPLETODISCARD){ MotionFX_propagate(mfxstate, &filter_data, &imu_data, &imu_delta_time); MotionFX_update(mfxstate, &filter_data, &imu_data, &imu_delta_time, NULL); }else{ @@ -547,39 +543,39 @@ void Arduino_Alvik_Firmware::updateImu(){ } -float Arduino_Alvik_Firmware::getAccelerationX(){ +float Arduino_AlvikCarrier::getAccelerationX(){ return -imu_data.acc[1]; } -float Arduino_Alvik_Firmware::getAccelerationY(){ +float Arduino_AlvikCarrier::getAccelerationY(){ return -imu_data.acc[0]; } -float Arduino_Alvik_Firmware::getAccelerationZ(){ +float Arduino_AlvikCarrier::getAccelerationZ(){ return imu_data.acc[2]; } -float Arduino_Alvik_Firmware::getAngularVelocityX(){ +float Arduino_AlvikCarrier::getAngularVelocityX(){ return imu_data.gyro[1]; } -float Arduino_Alvik_Firmware::getAngularVelocityY(){ +float Arduino_AlvikCarrier::getAngularVelocityY(){ return imu_data.gyro[0]; } -float Arduino_Alvik_Firmware::getAngularVelocityZ(){ +float Arduino_AlvikCarrier::getAngularVelocityZ(){ return -imu_data.gyro[2]; } -float Arduino_Alvik_Firmware::getRoll(){ +float Arduino_AlvikCarrier::getRoll(){ return -filter_data.rotation[1]; } -float Arduino_Alvik_Firmware::getPitch(){ +float Arduino_AlvikCarrier::getPitch(){ return -filter_data.rotation[2]; } -float Arduino_Alvik_Firmware::getYaw(){ +float Arduino_AlvikCarrier::getYaw(){ return 360.0-filter_data.rotation[0]; } @@ -589,7 +585,7 @@ float Arduino_Alvik_Firmware::getYaw(){ /* Error */ /******************************************************************************************************/ -void Arduino_Alvik_Firmware::errorLed(const int error_code){ +void Arduino_AlvikCarrier::errorLed(const int error_code){ while(true){ for (int i = 0; iforward(linear, angular); + setRpm(kinematics->getLeftVelocity(),kinematics->getRightVelocity()); +} + +void Arduino_AlvikCarrier::rotate(const float angle){ + float initial_angle=kinematics->getTheta(); + float error=angle-initial_angle; + unsigned long t=millis(); + while(abs(error)>2){ + if (millis()-t>20){ + t=millis(); + updateMotors(); + kinematics->updatePose(motor_control_left->getAngle(),motor_control_right->getAngle()); + error=angle-kinematics->getTheta(); + Serial.println(error); + } + if (error>0){ + drive(0,40); + }else{ + drive(0,-40); + } + + } + drive(0,0); + updateMotors(); +} + diff --git a/src/Arduino_AlvikCarrier.h b/src/Arduino_AlvikCarrier.h new file mode 100644 index 0000000..6941245 --- /dev/null +++ b/src/Arduino_AlvikCarrier.h @@ -0,0 +1,207 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + + +#ifndef __ARDUINO_ALVIKCARRIER_H__ +#define __ARDUINO_ALVIKCARRIER_H__ + +#include "Arduino.h" +#include "./definitions/pinout_definitions.h" +#include "./motor_control/encoder.h" +#include "./utilities/rgb_led.h" +#include "./motor_control/dcmotor.h" +#include "./motor_control/motor_control.h" +#include "Arduino_APDS9960.h" +#include +#include "Arduino_MAX17332.h" +#include "AT42QT2120.h" +#include "LSM6DSOSensor.h" +#include "motion_fx.h" +#include "./robotics/kinematics.h" + + + +class Arduino_AlvikCarrier{ + private: + RGBled * led1; + RGBled * led2; + + + APDS9960 * apds9960; + int bottom_red, bottom_green, bottom_blue, bottom_clear, bottom_proximity; + + + Servo * servo_A; + Servo * servo_B; + + + MAX17332 * bms; + float voltage, state_of_charge; + + + AT42QT2120 * touch_sensor; + AT42QT2120::Status touch_status; + uint8_t touch_value; + + + LSM6DSOSensor * imu; + int32_t accelerometer[3]; + int32_t gyroscope[3]; + + float imu_delta_time; + MFX_knobs_t iKnobs; + MFX_knobs_t *ipKnobs; + uint8_t mfxstate[STATE_SIZE]; + MFX_input_t imu_data; + MFX_output_t filter_data; + uint16_t sample_to_discard; + + uint8_t version_high; + uint8_t version_mid; + uint8_t version_low; + + + + public: + Kinematics * kinematics; + + MotorControl * motor_control_right; + MotorControl * motor_control_left; + + + DCmotor * motor_left; + DCmotor * motor_right; + Encoder * encoder_left; + Encoder * encoder_right; + + + TwoWire * wire; + TwoWire * ext_wire; + HardwareSerial * serial; + + + + Arduino_AlvikCarrier(); + + int begin(); // initialize the robot + + + void getVersion(uint8_t &high_byte, uint8_t &mid_byte, uint8_t &low_byte); // get firmware version + + + // Color sensor, APDS9960 + int beginAPDS(); // initialize all components required by color detection + void updateAPDS(); // refresh data + void setIlluminator(uint8_t value); // set white leds + void enableIlluminator(); // white leds on + void disableIlluminator(); // white leds off + int getRed(); // red value 0-4095 + int getGreen(); // green value 0-4095 + int getBlue(); // blue value 0-4095 + int getProximity(); // proximity value 0-127 + + + // Servo + int beginServo(); // initialize Servo interfaces + void setServoA(int position); // 0°-180° servo position + void setServoB(int position); // 0°-180° servo position + + + // I2C select + int beginI2Cselect(); // initialize I2C bus selector + void setExternalI2C(uint8_t state); // set A4,A5 connection on I2C bus 2 + void connectExternalI2C(); // allow A4,A5 on nano connector to be attached to I2C bus 2 + void disconnectExternalI2C(); // disable the connection on A4,A5 + + + // BMS, MAX17332 + int beginBMS(); // initialize BMS + void updateBMS(); // update the BMS + float getBatteryVoltage(); // get Voltage + float getBatteryChargePercentage(); // get battery percentage + + + + // Motors + int beginMotors(); // initialize motor controls + void updateMotors(); // update motor control + bool setRpmLeft(const float rpm); // set RPM of left motor + float getRpmLeft(); // get RPM of left motor + bool setRpmRight(const float rpm); // set RPM of right motor + float getRpmRight(); // get RPM of right motor + bool setRpm(const float left, const float right); // sets RPMs on left and right wheels + void getRpm(float & left, float & right); // get RPMs on left and right wheels + void setKPidRight(const float kp, const float ki, const float kd); // set PID parameters for right wheel + void setKPidLeft(const float kp, const float ki, const float kd); // set PID parameters for left wheel + + + + // Touch + int beginTouch(); // initialize touch + void updateTouch(); // update touch status + bool getAnyTouchPressed(); // get any touch pressed + bool getTouchKey(const uint8_t key); // return true if key touch is pressed + uint8_t getTouchKeys(); // return touched pads as byte + bool getTouchUp(); // get nav pad up + bool getTouchRight(); // get nav pad right + bool getTouchDown(); // get nav pad down + bool getTouchLeft(); // get nav pad left + bool getTouchCenter(); // get nav pad enter (center circle) + bool getTouchOk(); // get nav pad ok (right check) + bool getTouchDelete(); // get nav pad delete (right x) + + + + // Leds + int beginLeds(); // initialize leds + void setLedBuiltin(const uint8_t value); // set built-in led + void setLedLeft(const uint32_t color); // set left led by color + void setLedLeft(const uint32_t red, const uint32_t green, const uint32_t blue); // set left led by RGB (only boolean values) + void setLedLeftRed(const uint32_t red); // set red left led + void setLedLeftGreen(const uint32_t green); // set green left led + void setLedLeftBlue(const uint32_t blue); // set blue left led + void setLedRight(const uint32_t color); // set right led by color + void setLedRight(const uint32_t red, const uint32_t green, const uint32_t blue);// set right led by RGB (only boolean values) + void setLedRightRed(const uint32_t red); // set red right led + void setLedRightGreen(const uint32_t green); // set green right led + void setLedRightBlue(const uint32_t blue); // set blue right led + void setLeds(const uint32_t color); // set both leds by color + void setLeds(const uint32_t red, const uint32_t green, const uint32_t blue); // set both leds by RGB (only boolean values) + void setAllLeds(const uint8_t value); // set all leds by a byte + + + // Imu + int beginImu(); // initialize LSD6DSOX- + void updateImu(); // update accelerometer and gyroscope data. Update sensor fusion + float getAccelerationX(); // get acceleration on x axis + float getAccelerationY(); // get acceleration on y axis + float getAccelerationZ(); // get acceleration on z axis + float getAngularVelocityX(); // get angular velocity on x axis + float getAngularVelocityY(); // get angular velocity on y axis + float getAngularVelocityZ(); // get angular velocity on z axis + float getRoll(); // get robot roll + float getPitch(); // get robot pitch + float getYaw(); // get robot yaw + + void errorLed(const int error_code); // error routine, locks on code blinking led + + + // Kinematics + void drive(const float linear, const float angular); // set mm/s and deg/s of the robot + + void rotate(const float angle); + + + + +}; + +#endif \ No newline at end of file diff --git a/src/Arduino_Alvik_Firmware.h b/src/Arduino_Alvik_Firmware.h deleted file mode 100644 index b94602f..0000000 --- a/src/Arduino_Alvik_Firmware.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef __ARDUINO_ALVIK_FIRMWARE_H__ -#define __ARDUINO_ALVIK_FIRMWARE_H__ - -#include "Arduino.h" -#include "./definitions/pinout_definitions.h" -#include "./motor_control/encoder.h" -#include "rgb_led.h" -#include "./motor_control/dcmotor.h" -#include "./motor_control/motor_control.h" -#include "Arduino_APDS9960.h" -#include -#include "Arduino_MAX17332.h" -#include "AT42QT2120.h" -#include "LSM6DSOSensor.h" -#include "motion_fx.h" - - -class Arduino_Alvik_Firmware{ - private: - RGBled * led1; - RGBled * led2; - - - APDS9960 * apds9960; - int bottom_red, bottom_green, bottom_blue, bottom_clear, bottom_proximity; - - - Servo * servo_A; - Servo * servo_B; - - - MAX17332 * bms; - float voltage, state_of_charge; - - - AT42QT2120 * touch_sensor; - AT42QT2120::Status touch_status; - uint8_t touch_value; - - - LSM6DSOSensor * imu; - int32_t accelerometer[3]; - int32_t gyroscope[3]; - - float imu_delta_time; - MFX_knobs_t iKnobs; - MFX_knobs_t *ipKnobs; - uint8_t mfxstate[STATE_SIZE]; - MFX_input_t imu_data; - MFX_output_t filter_data; - uint16_t sample_to_discard; - - uint8_t version_high; - uint8_t version_mid; - uint8_t version_low; - - - public: - - MotorControl * motor_control_right; - MotorControl * motor_control_left; - - - DCmotor * motor_left; - DCmotor * motor_right; - Encoder * encoder_left; - Encoder * encoder_right; - - - TwoWire * wire; - TwoWire * ext_wire; - HardwareSerial * serial; - - - - Arduino_Alvik_Firmware(); - - int begin(); - - - void getVersion(uint8_t &high_byte, uint8_t &mid_byte, uint8_t &low_byte); - - - //custom class???? - - // Color sensor, APDS9960 - int beginAPDS(); // initialize all components required by color detection - void updateAPDS(); // refresh data - void setIlluminator(uint8_t value); // set white leds - void enableIlluminator(); // white leds on - void disableIlluminator(); // white leds off - int getRed(); // red value 0-4095 - int getGreen(); // green value 0-4095 - int getBlue(); // blue value 0-4095 - int getProximity(); // proximity value 0-127 - - - // Servo - int beginServo(); // initialize Servo interfaces - void setServoA(int position); // 0°-180° servo position - void setServoB(int position); // 0°-180° servo position - - - // I2C select - int beginI2Cselect(); // initialize I2C bus selector - void setExternalI2C(uint8_t state); // set A4,A5 connection on I2C bus 2 - void connectExternalI2C(); // allow A4,A5 on nano connector to be attached to I2C bus 2 - void disconnectExternalI2C(); // disable the connection on A4,A5 - - - // BMS, MAX17332 - int beginBMS(); - void updateBMS(); - float getBatteryVoltage(); - float getBatteryChargePercentage(); - - - // Motors - int beginMotors(); - void updateMotors(); - bool setRpmLeft(const float rpm); - float getRpmLeft(); - bool setRpmRight(const float rpm); - float getRpmRight(); - bool setRpm(const float left, const float right); // sets RPMs on left and right wheels - void getRpm(float & left, float & right); // get RPMs on left and right wheels - void setKPidRight(const float kp, const float ki, const float kd); // set PID parameters for right wheel - void setKPidLeft(const float kp, const float ki, const float kd); // set PID parameters for left wheel - - - // Touch - int beginTouch(); // initialize touch - void updateTouch(); // update touch status - bool getAnyTouchPressed(); // get any touch pressed - bool getTouchKey(const uint8_t key); // return true if key touch is pressed - uint8_t getTouchKeys(); // return touched pads as byte - bool getTouchUp(); // get nav pad up - bool getTouchRight(); // get nav pad right - bool getTouchDown(); // get nav pad down - bool getTouchLeft(); // get nav pad left - bool getTouchCenter(); // get nav pad enter (center circle) - bool getTouchOk(); // get nav pad ok (right check) - bool getTouchDelete(); // get nav pad delete (right x) - - - // Leds - int beginLeds(); - void setLedBuiltin(const uint8_t value); - void setLedLeft(const uint32_t color); - void setLedLeft(const uint32_t red, const uint32_t green, const uint32_t blue); - void setLedLeftRed(const uint32_t red); - void setLedLeftGreen(const uint32_t green); - void setLedLeftBlue(const uint32_t blue); - void setLedRight(const uint32_t color); - void setLedRight(const uint32_t red, const uint32_t green, const uint32_t blue); - void setLedRightRed(const uint32_t red); - void setLedRightGreen(const uint32_t green); - void setLedRightBlue(const uint32_t blue); - void setLeds(const uint32_t color); - void setLeds(const uint32_t red, const uint32_t green, const uint32_t blue); - void setAllLeds(const uint8_t value); - - - // Imu - int beginImu(); // initialize LSD6DSOX- - void updateImu(); // update accelerometer and gyroscope data. Update sensor fusion - float getAccelerationX(); // get acceleration on x axis - float getAccelerationY(); // get acceleration on y axis - float getAccelerationZ(); // get acceleration on z axis - float getAngularVelocityX(); // get angular velocity on x axis - float getAngularVelocityY(); // get angular velocity on y axis - float getAngularVelocityZ(); // get angular velocity on z axis - float getRoll(); // get robot roll - float getPitch(); // get robot pitch - float getYaw(); // get robot yaw - - void errorLed(const int error_code); // error routine, locks on code blinking led - - - - - - - -}; - -#endif \ No newline at end of file diff --git a/src/definitions/pinout_definitions.h b/src/definitions/pinout_definitions.h index 1e14124..aa42545 100644 --- a/src/definitions/pinout_definitions.h +++ b/src/definitions/pinout_definitions.h @@ -1,22 +1,15 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + #ifndef __PINOUT_DEFINITIONS_H__ #define __PINOUT_DEFINITIONS_H__ diff --git a/src/definitions/robot_definitions.h b/src/definitions/robot_definitions.h index af7a1a6..6bb1796 100644 --- a/src/definitions/robot_definitions.h +++ b/src/definitions/robot_definitions.h @@ -1,22 +1,15 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + #ifndef __ROBOT_DEFINITIONS_H__ #define __ROBOT_DEFINITIONS_H__ @@ -25,7 +18,7 @@ #define MOTOR_LIMIT 70.0 // Mechanical RPM limit speed of used motors #define MOTOR_CPR 6.0 // Resolution of the encoder -#define MOTOR_GEAR_RATIO 150.0 // Gear ratio of the motor +#define MOTOR_GEAR_RATIO 150.0 // Gear ratio of the motor, maybe 150.58? const float MOTOR_RATIO = MOTOR_CPR*MOTOR_GEAR_RATIO; @@ -47,14 +40,19 @@ const float MOTOR_RATIO = MOTOR_CPR*MOTOR_GEAR_RATIO; const float MOTION_FX_PERIOD = (1000U / MOTION_FX_FREQ); #define MOTION_FX_ENGINE_DELTATIME 0.01f #define STATE_SIZE (size_t)(2432) -#define SAMPLETODISCARD 15 +#define MOTION_FX_SAMPLETODISCARD 15 #define GBIAS_ACC_TH_SC (2.0f*0.000765f) #define GBIAS_GYRO_TH_SC (2.0f*0.002f) -#define DECIMATION 1U -#define STATE_SIZE (size_t)(2432) +#define MOTION_FX_DECIMATION 1U +//#define STATE_SIZE (size_t)(2432) #define VERSION_BYTE_HIGH 0 -#define VERSION_BYTE_MID 0 -#define VERSION_BYTE_LOW 6 +#define VERSION_BYTE_MID 1 +#define VERSION_BYTE_LOW 0 + + + +#define WHEEL_TRACK_MM 89 +#define WHEEL_DIAMETER_MM 34 #endif \ No newline at end of file diff --git a/src/motor_control/dcmotor.cpp b/src/motor_control/dcmotor.cpp new file mode 100644 index 0000000..ea3e826 --- /dev/null +++ b/src/motor_control/dcmotor.cpp @@ -0,0 +1,58 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + +#include "dcmotor.h" + + +DCmotor::DCmotor(const uint32_t _pinA, const uint32_t _chA, const uint32_t _pinB, const uint32_t _chB, + const bool flip, TIM_TypeDef * _tim, const uint32_t _frequency){ + if (!flip){ + pinA=_pinA; + chA=_chA; + pinB=_pinB; + chB=_chB; + } + else{ + pinA=_pinB; + chA=_chB; + pinB=_pinA; + chB=_chA; + } + htimX.Instance = _tim; + frequency=_frequency; + pinMode(MOTORS_ENABLE,OUTPUT); +} + +void DCmotor::begin(){ + timX = new HardwareTimer(htimX.Instance); + timX->setPWM(chA, pinA, frequency, 0); + timX->setPWM(chB, pinB, frequency, 0); + digitalWrite(MOTORS_ENABLE,HIGH); +} + +void DCmotor::disable(){ + digitalWrite(MOTORS_ENABLE,LOW); +} + +void DCmotor::setSpeed(const int speed){ + if (speed>=0){ + pwmWrite(chA,speed); + pwmWrite(chB,0); + } + else{ + pwmWrite(chA,0); + pwmWrite(chB,-speed); + } +} + +void DCmotor::stop(){ + setSpeed(0); +} \ No newline at end of file diff --git a/src/motor_control/dcmotor.h b/src/motor_control/dcmotor.h index df02fcd..9942d52 100644 --- a/src/motor_control/dcmotor.h +++ b/src/motor_control/dcmotor.h @@ -1,26 +1,19 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. + This file is part of the Arduino_AlvikCarrier library. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + Copyright (c) 2023 Arduino SA - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ #ifndef __DC_MOTOR_H__ #define __DC_MOTOR_H__ #include "Arduino.h" +#include "../definitions/pinout_definitions.h" class DCmotor{ private: @@ -38,49 +31,15 @@ class DCmotor{ public: DCmotor(const uint32_t _pinA, const uint32_t _chA, const uint32_t _pinB, const uint32_t _chB, - const bool flip=false, TIM_TypeDef * _tim = TIM2, const uint32_t _frequency=20000){ - if (!flip){ - pinA=_pinA; - chA=_chA; - pinB=_pinB; - chB=_chB; - } - else{ - pinA=_pinB; - chA=_chB; - pinB=_pinA; - chB=_chA; - } - htimX.Instance = _tim; - frequency=_frequency; - pinMode(MOTORS_ENABLE,OUTPUT); - } + const bool flip=false, TIM_TypeDef * _tim = TIM2, const uint32_t _frequency=20000); - void begin(){ - timX = new HardwareTimer(htimX.Instance); - timX->setPWM(chA, pinA, frequency, 0); - timX->setPWM(chB, pinB, frequency, 0); - digitalWrite(MOTORS_ENABLE,HIGH); - } + void begin(); - void disable(){ - digitalWrite(MOTORS_ENABLE,LOW); - } + void disable(); - void setSpeed(const int speed){ - if (speed>=0){ - pwmWrite(chA,speed); - pwmWrite(chB,0); - } - else{ - pwmWrite(chA,0); - pwmWrite(chB,-speed); - } - } + void setSpeed(const int speed); - void stop(){ - setSpeed(0); - } + void stop(); }; #endif \ No newline at end of file diff --git a/src/motor_control/encoder.cpp b/src/motor_control/encoder.cpp new file mode 100644 index 0000000..07aaaa3 --- /dev/null +++ b/src/motor_control/encoder.cpp @@ -0,0 +1,58 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + +#include "encoder.h" + +Encoder::Encoder(TIM_TypeDef * _tim, bool _flip){ + memset(&htimX, 0, sizeof(htimX)); + htimX.Instance = _tim; + flip = _flip; +} + +void Encoder::begin(){ + + //htimX.Instance= TIM2; + htimX.Init.Prescaler=0; + htimX.Init.CounterMode= TIM_COUNTERMODE_UP; + htimX.Init.Period = 65535; + htimX.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + + + TIM_Encoder_InitTypeDef encoder_config; + encoder_config.EncoderMode = TIM_ENCODERMODE_TI2; + + if (flip){ + encoder_config.IC1Polarity=TIM_ICPOLARITY_FALLING; + } + else{ + encoder_config.IC1Polarity=TIM_ICPOLARITY_RISING; + } + + encoder_config.IC1Selection=TIM_ICSELECTION_DIRECTTI; + encoder_config.IC1Prescaler=TIM_ICPSC_DIV1; + encoder_config.IC1Filter=0; + encoder_config.IC2Polarity=TIM_ICPOLARITY_RISING; + encoder_config.IC2Selection=TIM_ICSELECTION_DIRECTTI; + encoder_config.IC2Prescaler=TIM_ICPSC_DIV1; + encoder_config.IC2Filter=0; + + + HAL_TIM_Encoder_Init(&htimX, &encoder_config); + HAL_TIM_Encoder_Start(&htimX, TIM_CHANNEL_ALL); +} + +int Encoder::getCount(){ + return int16_t(__HAL_TIM_GET_COUNTER(&htimX)); // it gives the sign +} + +void Encoder::reset(){ + htimX.Instance->CNT=0; +} \ No newline at end of file diff --git a/src/motor_control/encoder.h b/src/motor_control/encoder.h index a8c6ebb..8225eec 100644 --- a/src/motor_control/encoder.h +++ b/src/motor_control/encoder.h @@ -1,20 +1,12 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. + This file is part of the Arduino_AlvikCarrier library. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + Copyright (c) 2023 Arduino SA - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ #ifndef __ENCODER_H__ @@ -27,51 +19,13 @@ class Encoder{ TIM_HandleTypeDef htimX; bool flip; public: - Encoder(TIM_TypeDef * _tim, bool _flip=false){ - memset(&htimX, 0, sizeof(htimX)); - htimX.Instance = _tim; - flip = _flip; - } - - void begin(){ - - //htimX.Instance= TIM2; - htimX.Init.Prescaler=0; - htimX.Init.CounterMode= TIM_COUNTERMODE_UP; - htimX.Init.Period = 65535; - htimX.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - - - TIM_Encoder_InitTypeDef encoder_config; - encoder_config.EncoderMode = TIM_ENCODERMODE_TI2; - - if (flip){ - encoder_config.IC1Polarity=TIM_ICPOLARITY_FALLING; - } - else{ - encoder_config.IC1Polarity=TIM_ICPOLARITY_RISING; - } - - encoder_config.IC1Selection=TIM_ICSELECTION_DIRECTTI; - encoder_config.IC1Prescaler=TIM_ICPSC_DIV1; - encoder_config.IC1Filter=0; - encoder_config.IC2Polarity=TIM_ICPOLARITY_RISING; - encoder_config.IC2Selection=TIM_ICSELECTION_DIRECTTI; - encoder_config.IC2Prescaler=TIM_ICPSC_DIV1; - encoder_config.IC2Filter=0; - + Encoder(TIM_TypeDef * _tim, bool _flip=false); - HAL_TIM_Encoder_Init(&htimX, &encoder_config); - HAL_TIM_Encoder_Start(&htimX, TIM_CHANNEL_ALL); - } + void begin(); - int getCount(){ - return int16_t(__HAL_TIM_GET_COUNTER(&htimX)); // it gives the sign - } + int getCount(); - void reset(){ - htimX.Instance->CNT=0; - } + void reset(); }; diff --git a/src/motor_control/motor_control.cpp b/src/motor_control/motor_control.cpp new file mode 100644 index 0000000..72a1d6f --- /dev/null +++ b/src/motor_control/motor_control.cpp @@ -0,0 +1,207 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + +#include "motor_control.h" + +MotorControl::MotorControl(DCmotor * _motor, Encoder * _encoder, const float _kp, const float _ki, const float _kd, + const float _controller_period, + const uint8_t _control_mode, const float _step_size){ + motor = _motor; + encoder = _encoder; + + control_mode = _control_mode; + + + kp = _kp; + ki = _ki; + kd = _kd; + + controller_period = _controller_period; + + travel=0.0; + angle=0.0; + reference = 0.0; + + trip=0.0; + iterations=0.0; + start_value=0.0; + end_value=0.0; + step_size=_step_size; + step=0.0; + step_index=0; + interpolation=0.0; + + measure = 0.0; + last_measure = 0.0; + + id_memory=0; + mean=0.0; + + conversion_factor_travel = (1.0/MOTOR_RATIO); + conversion_factor = 60.0*(1.0/MOTOR_RATIO)/(controller_period); + vel_pid = new PidController(kp,ki,kd,controller_period,CONTROL_LIMIT); +} + +void MotorControl::begin(){ + motor->begin(); + encoder->begin(); + encoder->reset(); + vel_pid->reset(); + clearMemory(); +} + +float MotorControl::checkLimits(float value){ + if (value>CONTROL_LIMIT){ + return CONTROL_LIMIT; + } + if (value<-CONTROL_LIMIT){ + return -CONTROL_LIMIT; + } + return value; +} + +void MotorControl::addMemory(float _val){ + if (id_memory>=MEM_SIZE){ + id_memory=0; + } + measure_memory[id_memory]=_val; + id_memory++; +} + +float MotorControl::meanMemory(){ + mean=0.0; + for (i=0; i=-MOTOR_LIMIT)){ + reference = ref; + if (control_mode==CONTROL_MODE_LINEAR){ + start_value=interpolation; + end_value=reference; + trip=0.0; + iterations=abs(end_value-start_value)/step_size; + step=1.0/iterations; + step_index=0; + } + else if(control_mode==CONTROL_MODE_NORMAL){ + vel_pid->setReference(reference); + } + return true; + } + return false; +} + +void MotorControl::update(){ + + measure = encoder->getCount(); + encoder->reset(); + angle = measure*conversion_factor_travel; + travel += angle; + measure = measure*conversion_factor; + + /* experimental + if (abs(measure)-abs(reference)>5){ + clearMemory(reference); + } + end */ + + addMemory(measure); + + /* + if (abs(reference)<1.0){ + vel_pid->reset(); + motor->setSpeed(0); + clearMemory(); + } + */ + + measure = meanMemory(); + + //vel_pid->update(measure); + //motor->setSpeed(vel_pid->getControlOutput()); + + if (control_mode==CONTROL_MODE_LINEAR){ + if (step_indexabs(reference)){ + interpolation=reference; + } + } + vel_pid->setReference(interpolation); + } + else if(control_mode==CONTROL_MODE_NORMAL){ + vel_pid->setReference(reference); + } + + vel_pid->update(measure); + motor->setSpeed(vel_pid->getControlOutput()); +} + +void MotorControl::setKP(const float _kp){ + vel_pid->setKp(_kp); +} + +void MotorControl::setKI(const float _ki){ + vel_pid->setKi(_ki); +} + +void MotorControl::setKD(const float _kd){ + vel_pid->setKd(_kd); +} + +float MotorControl::getError(){ + return vel_pid->getError(); +} + +void MotorControl::brake(){ + reference=0.0; + trip=0.0; + iterations=0.0; + start_value=0.0; + end_value=0.0; + step=0.0; + step_index=0; + interpolation=0.0; + clearMemory(); + + motor->setSpeed(0); + vel_pid->setReference(0.0); + vel_pid->reset(); +} + +void MotorControl::resetTravel(){ + travel=0; +} + +float MotorControl::getTravel(){ + return travel; +} + +float MotorControl::getAngle(){ + return angle; +} \ No newline at end of file diff --git a/src/motor_control/motor_control.h b/src/motor_control/motor_control.h index d3de918..9998fa6 100644 --- a/src/motor_control/motor_control.h +++ b/src/motor_control/motor_control.h @@ -1,22 +1,15 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + #ifndef __MOTOR_CONTROL_H__ #define __MOTOR_CONTROL_H__ @@ -42,6 +35,7 @@ class MotorControl{ float kd; float travel; + float angle; float reference; float trip; @@ -55,6 +49,7 @@ class MotorControl{ float controller_period; float conversion_factor; + float conversion_factor_travel; float measure; float last_measure; @@ -73,258 +68,37 @@ class MotorControl{ MotorControl(DCmotor * _motor, Encoder * _encoder, const float _kp, const float _ki, const float _kd, const float _controller_period, - const uint8_t _control_mode = CONTROL_MODE_LINEAR, const float _step_size=5.0){ - motor = _motor; - encoder = _encoder; - - control_mode = _control_mode; - - - kp = _kp; - ki = _ki; - kd = _kd; - - controller_period = _controller_period; - - travel=0.0; - reference = 0.0; - - trip=0.0; - iterations=0.0; - start_value=0.0; - end_value=0.0; - step_size=_step_size; - step=0.0; - step_index=0; - interpolation=0.0; - - measure = 0.0; - last_measure = 0.0; - - id_memory=0; - mean=0.0; - - conversion_factor = 60.0*(1/MOTOR_RATIO)/(controller_period); - vel_pid = new PidController(kp,ki,kd,controller_period,CONTROL_LIMIT); - } - - void begin(){ - motor->begin(); - encoder->begin(); - encoder->reset(); - vel_pid->reset(); - clearMemory(); - } -/* - bool setRPM(const float ref){ - if ((ref-MOTOR_LIMIT)){ - reference = ref; - vel_pid->setReference(reference); - return true; - } - return false; - } -*/ + const uint8_t _control_mode = CONTROL_MODE_LINEAR, const float _step_size=5.0); - float checkLimits(float value){ - if (value>CONTROL_LIMIT){ - return CONTROL_LIMIT; - } - if (value<-CONTROL_LIMIT){ - return -CONTROL_LIMIT; - } - return value; - } - - void addMemory(float _val){ - if (id_memory>=MEM_SIZE){ - id_memory=0; - } - measure_memory[id_memory]=_val; - id_memory++; - } - - float meanMemory(){ - mean=0.0; - for (i=0; isetSpeed(2000); - delay(1000); - motor->setSpeed(-2000); - delay(1000); - } + void begin(); + float checkLimits(float value); -/* - void update(){ - measure = encoder->getCount(); + void addMemory(float _val); - encoder->reset(); - measure = measure*conversion_factor; + float meanMemory(); - addMemory(measure); + void clearMemory(const float reset_value=0.0); - measure = meanMemory(); + float getRPM(); - error = reference - measure; + bool setRPM(const float ref); - ctrl_p = kp * error; - ctrl_i = checkLimits(ctrl_i+ki*error); - ctrl_d = kd * (error-prev_error); + void update(); - prev_error = error; + void setKP(const float _kp); + void setKI(const float _ki); + void setKD(const float _kd); - actuation = checkLimits(ctrl_p+ctrl_i+ctrl_d); + float getError(); - motor->setSpeed(-actuation); - } + void brake(); - */ - + void resetTravel(); + + float getTravel(); - /* - void update(){ - measure = encoder->getCount(); - encoder->reset(); - measure = measure*conversion_factor; - error = reference-measure; - error_sum+=error*controller_period; - error_rate=(measure-last_measure)/controller_period; - last_measure=measure; - ctrl_p = error*kp; - ctrl_i = checkLimits(error_sum*ki); - ctrl_d = error_rate*kd; - actuation = checkLimits(ctrl_p+ctrl_i-ctrl_d); - motor->setSpeed(-actuation); - } - - */ - - - bool setRPM(const float ref){ - if ((ref<=MOTOR_LIMIT)&&(ref>=-MOTOR_LIMIT)){ - reference = ref; - if (control_mode==CONTROL_MODE_LINEAR){ - start_value=interpolation; - end_value=reference; - trip=0.0; - iterations=abs(end_value-start_value)/step_size; - step=1.0/iterations; - step_index=0; - } - else if(control_mode==CONTROL_MODE_NORMAL){ - vel_pid->setReference(reference); - } - return true; - } - return false; - } - - void update(){ - - measure = encoder->getCount(); - encoder->reset(); - measure = measure*conversion_factor; - - /* experimental - if (abs(measure)-abs(reference)>5){ - clearMemory(reference); - } - end */ - - - addMemory(measure); - - /* - if (abs(reference)<1.0){ - vel_pid->reset(); - motor->setSpeed(0); - clearMemory(); - } - - */ - - - measure = meanMemory(); - - /* - measure = encoder->getCount(); - encoder->reset(); - measure = measure*conversion_factor; - */ - - - //vel_pid->update(measure); - //motor->setSpeed(vel_pid->getControlOutput()); - - - if (control_mode==CONTROL_MODE_LINEAR){ - if (step_indexabs(reference)){ - interpolation=reference; - } - } - vel_pid->setReference(interpolation); - } - else if(control_mode==CONTROL_MODE_NORMAL){ - vel_pid->setReference(reference); - } - - - vel_pid->update(measure); - motor->setSpeed(vel_pid->getControlOutput()); - } - - void setKP(const float _kp){ - vel_pid->setKp(_kp); - } - - void setKI(const float _ki){ - vel_pid->setKi(_ki); - } - - void setKD(const float _kd){ - vel_pid->setKd(_kd); - } - - float getError(){ - return vel_pid->getError(); - } - - void brake(){ - reference=0.0; - trip=0.0; - iterations=0.0; - start_value=0.0; - end_value=0.0; - step=0.0; - step_index=0; - interpolation=0.0; - clearMemory(); - - motor->setSpeed(0); - vel_pid->setReference(0.0); - vel_pid->reset(); - } + float getAngle(); }; diff --git a/src/motor_control/pid_controller.cpp b/src/motor_control/pid_controller.cpp new file mode 100644 index 0000000..5e86940 --- /dev/null +++ b/src/motor_control/pid_controller.cpp @@ -0,0 +1,96 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + +#include "pid_controller.h" + +PidController::PidController(const float _kp, const float _ki, const float _kd, const float _ctrl_period, const int _ctrl_limit){ + kp=_kp; + ki=_ki; + kd=_kd; + ctrl_period=_ctrl_period; + ctrl_limit=_ctrl_limit; + + reference=0.0; + error=0.0; + error_rate=0.0; + previous_error=0.0; + error_sum=0.0; + last_measure=0.0; + + ctrl_p=0.0; + ctrl_i=0.0; + ctrl_d=0.0; + ctrl_output=0.0; +} + +void PidController::setReference(const float _reference){ + reference=_reference; +} + +float PidController::getControlOutput(){ + return ctrl_output; +} + +float PidController::getError(){ + return error; +} + +void PidController::setKPid(const float _kp, const float _ki, const float _kd){ + kp=_kp; + ki=_ki; + kd=_kd; +} + +void PidController::setKp(const float _k){ + kp=_k; +} + +void PidController::setKi(const float _k){ + ki=_k; +} + +void PidController::setKd(const float _k){ + kd=_k; +} + +void PidController::update(const float measure){ + error = reference - measure; + error_sum += error*ctrl_period; + error_rate = (measure-last_measure)/ctrl_period; + last_measure=measure; + ctrl_p = error*kp; + ctrl_i = checkLimits(error_sum*ki); + ctrl_d = error_rate*kd; + ctrl_output = checkLimits(ctrl_p+ctrl_i-ctrl_d); +} + +float PidController::checkLimits(float value){ + if (value>ctrl_limit){ + return ctrl_limit; + } + if (value<-ctrl_limit){ + return -ctrl_limit; + } + return value; +} + +void PidController::reset(){ + error=0.0; + error_sum=0.0; + previous_error=0.0; + error_rate=0.0; + reference=0.0; + last_measure=0.0; + ctrl_p=0.0; + ctrl_i=0.0; + ctrl_d=0.0; + ctrl_output=0.0; +} \ No newline at end of file diff --git a/src/motor_control/pid_controller.h b/src/motor_control/pid_controller.h index 5531679..5444a10 100644 --- a/src/motor_control/pid_controller.h +++ b/src/motor_control/pid_controller.h @@ -1,22 +1,15 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + #ifndef __PID_CONTROLLER_H__ #define __PID_CONTROLLER_H__ @@ -45,89 +38,23 @@ class PidController{ public: - PidController(const float _kp, const float _ki, const float _kd, const float _ctrl_period, const int _ctrl_limit = 4095){ - kp=_kp; - ki=_ki; - kd=_kd; - ctrl_period=_ctrl_period; - ctrl_limit=_ctrl_limit; - - reference=0.0; - error=0.0; - error_rate=0.0; - previous_error=0.0; - error_sum=0.0; - last_measure=0.0; - - ctrl_p=0.0; - ctrl_i=0.0; - ctrl_d=0.0; - ctrl_output=0.0; - } - - void setReference(const float _reference){ - reference=_reference; - } - - float getControlOutput(){ - return ctrl_output; - } - - float getError(){ - return error; - } - - void setKPid(const float _kp, const float _ki, const float _kd){ - kp=_kp; - ki=_ki; - kd=_kd; - } - - void setKp(const float _k){ - kp=_k; - } - - void setKi(const float _k){ - ki=_k; - } - - void setKd(const float _k){ - kd=_k; - } - - void update(const float measure){ - error = reference - measure; - error_sum += error*ctrl_period; - error_rate = (measure-last_measure)/ctrl_period; - last_measure=measure; - ctrl_p = error*kp; - ctrl_i = checkLimits(error_sum*ki); - ctrl_d = error_rate*kd; - ctrl_output = checkLimits(ctrl_p+ctrl_i-ctrl_d); - } - - float checkLimits(float value){ - if (value>ctrl_limit){ - return ctrl_limit; - } - if (value<-ctrl_limit){ - return -ctrl_limit; - } - return value; - } - - void reset(){ - error=0.0; - error_sum=0.0; - previous_error=0.0; - error_rate=0.0; - reference=0.0; - last_measure=0.0; - ctrl_p=0.0; - ctrl_i=0.0; - ctrl_d=0.0; - ctrl_output=0.0; - } + PidController(const float _kp, const float _ki, const float _kd, const float _ctrl_period, const int _ctrl_limit = 4095); + + void setReference(const float _reference); + + float getControlOutput(); + float getError(); + + void setKPid(const float _kp, const float _ki, const float _kd); + void setKp(const float _k); + void setKi(const float _k); + void setKd(const float _k); + + void update(const float measure); + + float checkLimits(float value); + + void reset(); }; diff --git a/src/rgb_led.h b/src/rgb_led.h deleted file mode 100644 index dc8c3d9..0000000 --- a/src/rgb_led.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#ifndef __RGB_LED_H__ -#define __RGB_LED_H__ - -#include "Arduino.h" - -#define COLOR_BLACK 0 -#define COLOR_RED 1 -#define COLOR_GREEN 2 -#define COLOR_ORANGE 3 -#define COLOR_BLUE 4 -#define COLOR_VIOLET 5 -#define COLOR_TEAL 6 -#define COLOR_WHITE 7 - -class RGBled{ - private: - uint8_t R; - uint8_t G; - uint8_t B; - public: - RGBled(const uint8_t _Red, const uint8_t _Green, const uint8_t _Blue){ - R=_Red; - G=_Green; - B=_Blue; - pinMode(R,OUTPUT); - pinMode(G,OUTPUT); - pinMode(B,OUTPUT); - digitalWrite(R,LOW); - digitalWrite(G,LOW); - digitalWrite(B,LOW); - } - - void setRed(const uint32_t red){ - digitalWrite(R, red); - } - - void setGreen(const uint32_t green){ - digitalWrite(G, green); - } - - void setBlue(const uint32_t blue){ - digitalWrite(B, blue); - } - - void set(const uint32_t red, const uint32_t green, const uint32_t blue){ - setRed(red); - setGreen(green); - setBlue(blue); - } - - void set(const uint32_t color){ - switch(color){ - case COLOR_RED: - set(HIGH,LOW,LOW); - break; - case COLOR_GREEN: - set(LOW,HIGH,LOW); - break; - case COLOR_BLUE: - set(LOW,LOW,HIGH); - break; - case COLOR_ORANGE: - set(HIGH,HIGH,LOW); - break; - case COLOR_VIOLET: - set(HIGH,LOW,HIGH); - break; - case COLOR_TEAL: - set(LOW,HIGH,HIGH); - break; - case COLOR_WHITE: - set(HIGH,HIGH,HIGH); - break; - case COLOR_BLACK: - default: - set(LOW,LOW,LOW); - } - } - - void clear(){ - setRed(0); - setGreen(0); - setBlue(0); - } -}; - - - -#endif \ No newline at end of file diff --git a/src/robotics/kinematics.h b/src/robotics/kinematics.h new file mode 100644 index 0000000..ced4bb9 --- /dev/null +++ b/src/robotics/kinematics.h @@ -0,0 +1,170 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + +#ifndef __KINEMATICS_H__ +#define __KINEMATICS_H__ + +#include "Arduino.h" + +class Kinematics{ + private: + float left_velocity; + float right_velocity; + float linear_velocity; + float angular_velocity; + float wheel_track; + float wheel_diameter; + float wheel_radius; + float wheel_circumference; + float rads_to_rpm; + float rpm_to_rads; + float rads_to_degs; + float degs_to_rads; + float rotations_to_rads; + float rads_to_rotations; + float w; + + float theta, delta_theta; + float x, y; + float delta_left, delta_right; + float delta_travel; + float delta_x, delta_y; + float travel; + + + + public: + Kinematics(const float _wheel_track, const float _wheel_diameter){ + w=0.0; + left_velocity=0.0; + right_velocity=0.0; + linear_velocity=0.0; + angular_velocity=0.0; + wheel_track=_wheel_track; + wheel_diameter=_wheel_diameter; + wheel_radius=wheel_diameter/2.0; + wheel_circumference=wheel_diameter*PI; + + rads_to_rpm=60.0/(2.0*PI); + rpm_to_rads=2.0*PI/60.0; + + rads_to_degs=180.0/PI; + degs_to_rads=PI/180.0; + + rads_to_rotations=1/(2.0*PI); + rotations_to_rads=2.0*PI; + + theta=0.0; + x=0.0; + y=0.0; + + delta_x=0.0; + delta_y=0.0; + delta_theta=0.0; + delta_left=0.0; + delta_right=0.0; + delta_travel=0.0; + travel=0.0; + + } + + void forward(const float linear, const float angular){ + w = angular*degs_to_rads; + left_velocity=(2*linear-w*wheel_track)/(wheel_diameter); + left_velocity=rads_to_rpm*left_velocity; + right_velocity=(2*linear+w*wheel_track)/(wheel_diameter); + right_velocity=rads_to_rpm*right_velocity; + } + + void inverse(const float left_vel, const float right_vel){ + linear_velocity=(left_vel+right_vel)*wheel_radius/2.0; + angular_velocity=(-left_vel+right_vel)*wheel_radius/wheel_track; + } + + float getLeftVelocity(){ + return left_velocity; + } + + float getRightVelocity(){ + return right_velocity; + } + + float getLinearVelocity(){ + return linear_velocity; + } + + float getAngularVelocity(){ + return angular_velocity; + } + + void updatePose(const float left_rotation, const float right_rotation){ + delta_left=left_rotation*wheel_circumference; + delta_right=right_rotation*wheel_circumference; + delta_travel=(delta_left+delta_right)/2.0; + delta_theta=(-delta_left+delta_right)/(2.0*wheel_track); + delta_x=delta_travel*cos(theta+delta_theta/2.0); + delta_y=delta_travel*sin(theta+delta_theta/2.0); + x+=delta_x; + y+=delta_y; + theta+=delta_theta; + travel+=delta_travel; + } + + void resetPose(const float initial_x=0.0, const float initial_y=0.0, const float initial_theta=0.0){ + x=initial_x; + y=initial_y; + theta=degs_to_rads*initial_theta; + travel=0.0; + delta_x=0.0; + delta_y=0.0; + delta_theta=0.0; + delta_left=0.0; + delta_right=0.0; + delta_travel=0.0; + + } + + float getX(){ + return x; + } + + float getY(){ + return y; + } + + float getTheta(){ + return rads_to_degs*theta; + } + + float getTravel(){ + return travel; + } + + float getDeltaX(){ + return delta_x; + } + + float getDeltaY(){ + return delta_y; + } + + float getDeltaTheta(){ + return rads_to_degs*delta_theta; + } + + + + +}; + + + +#endif \ No newline at end of file diff --git a/src/sensor_line.h b/src/sensor_line.h index 1a54f5e..50d482a 100644 --- a/src/sensor_line.h +++ b/src/sensor_line.h @@ -1,22 +1,15 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + #ifndef __SENSOR_LINE_H__ #define __SENSOR_LINE_H__ diff --git a/src/sensor_tof_matrix.h b/src/sensor_tof_matrix.h index dbb88b8..c065af1 100644 --- a/src/sensor_tof_matrix.h +++ b/src/sensor_tof_matrix.h @@ -1,22 +1,15 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + #ifndef __SENSOR_TOF_MATRIX_H__ #define __SENSOR_TOF_MATRIX_H__ diff --git a/src/HAL_custom_init.h b/src/utilities/HAL_custom_init.h similarity index 79% rename from src/HAL_custom_init.h rename to src/utilities/HAL_custom_init.h index 425c0b9..09481f9 100644 --- a/src/HAL_custom_init.h +++ b/src/utilities/HAL_custom_init.h @@ -1,22 +1,15 @@ /* - This file is part of the Arduino Alvik library. - Copyright (c) 2023 Arduino SA. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + #ifndef __HAL_CUSTOM_INIT_H__ #define __HAL_CUSTOM_INIT_H__ diff --git a/src/utilities/rgb_led.cpp b/src/utilities/rgb_led.cpp new file mode 100644 index 0000000..d2e25ac --- /dev/null +++ b/src/utilities/rgb_led.cpp @@ -0,0 +1,77 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + +#include "rgb_led.h" + +RGBled::RGBled(const uint8_t _Red, const uint8_t _Green, const uint8_t _Blue){ + R=_Red; + G=_Green; + B=_Blue; + pinMode(R,OUTPUT); + pinMode(G,OUTPUT); + pinMode(B,OUTPUT); + digitalWrite(R,LOW); + digitalWrite(G,LOW); + digitalWrite(B,LOW); +} + +void RGBled::setRed(const uint32_t red){ + digitalWrite(R, red); +} + +void RGBled::setGreen(const uint32_t green){ + digitalWrite(G, green); +} + +void RGBled::setBlue(const uint32_t blue){ + digitalWrite(B, blue); +} + +void RGBled::set(const uint32_t red, const uint32_t green, const uint32_t blue){ + setRed(red); + setGreen(green); + setBlue(blue); +} + +void RGBled::set(const uint32_t color){ + switch(color){ + case COLOR_RED: + set(HIGH,LOW,LOW); + break; + case COLOR_GREEN: + set(LOW,HIGH,LOW); + break; + case COLOR_BLUE: + set(LOW,LOW,HIGH); + break; + case COLOR_ORANGE: + set(HIGH,HIGH,LOW); + break; + case COLOR_VIOLET: + set(HIGH,LOW,HIGH); + break; + case COLOR_TEAL: + set(LOW,HIGH,HIGH); + break; + case COLOR_WHITE: + set(HIGH,HIGH,HIGH); + break; + case COLOR_BLACK: + default: + set(LOW,LOW,LOW); + } +} + +void RGBled::clear(){ + setRed(0); + setGreen(0); + setBlue(0); +} \ No newline at end of file diff --git a/src/utilities/rgb_led.h b/src/utilities/rgb_led.h new file mode 100644 index 0000000..c9f07b9 --- /dev/null +++ b/src/utilities/rgb_led.h @@ -0,0 +1,47 @@ +/* + This file is part of the Arduino_AlvikCarrier library. + + Copyright (c) 2023 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +*/ + + +#ifndef __RGB_LED_H__ +#define __RGB_LED_H__ + +#include "Arduino.h" + +#define COLOR_BLACK 0 +#define COLOR_RED 1 +#define COLOR_GREEN 2 +#define COLOR_ORANGE 3 +#define COLOR_BLUE 4 +#define COLOR_VIOLET 5 +#define COLOR_TEAL 6 +#define COLOR_WHITE 7 + +class RGBled{ + private: + uint8_t R; + uint8_t G; + uint8_t B; + public: + RGBled(const uint8_t _Red, const uint8_t _Green, const uint8_t _Blue); + + void setRed(const uint32_t red); + void setGreen(const uint32_t green); + void setBlue(const uint32_t blue); + + void set(const uint32_t red, const uint32_t green, const uint32_t blue); + void set(const uint32_t color); + + void clear(); +}; + + + +#endif \ No newline at end of file