Serial Wombat Arduino Library
SerialWombatServo.h
Go to the documentation of this file.
1 #pragma once
2 /*
3 Copyright 2020-2023 Broadwell Consulting Inc.
4 
5 "Serial Wombat" is a registered trademark of Broadwell Consulting Inc. in
6 the United States. See SerialWombat.com for usage guidance.
7 
8 Permission is hereby granted, free of charge, to any person obtaining a
9  copy of this software and associated documentation files (the "Software"),
10  to deal in the Software without restriction, including without limitation
11  the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  and/or sell copies of the Software, and to permit persons to whom the
13  Software is furnished to do so, subject to the following conditions:
14 
15 The above copyright notice and this permission notice shall be included in
16  all copies or substantial portions of the Software.
17 
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24  OTHER DEALINGS IN THE SOFTWARE.
25 */
26 
27 #include "SerialWombat.h"
28 
29 
69 {
70 public:
77  {
79  }
80 
92  void attach(uint8_t pin, bool reverse)
93  {
94  _pin = pin;
96  _reverse = reverse;
98  }
99 
111  void attach(uint8_t pin, uint16_t min = 544, uint16_t max = 2400, bool reverse = false)
112  {
113  _pin = pin;
114  _min = min;
115  _max = max;
116  _reverse = reverse;
118  initializeServo();
119  }
120 
129  void write(uint8_t angle)
130  {
131  if (angle < 180)
132  {
133  write16bit((uint16_t)(65536uL * angle / 180));
134  }
135  else
136  {
137  write16bit(65535uL);
138  }
139 
140  }
141 
149  void write16bit(uint16_t position)
150  {
151  _position = position;
153  }
154 
160  uint8_t read(void)
161  {
162  uint32_t returnval = _position;
163  returnval *= 180;
164  return (uint8_t)(returnval >> 16);
165  }
166 
167 protected:
168 
169  uint16_t _position = 0;
170  uint16_t _min = 544; // Default for Arduino Servo library
171  uint16_t _max = 2400; // Default for Arduino Servo Library
172  bool _reverse = false;
174  {
175  uint8_t tx[] = { 200,_pin,_pinMode,_pin,SW_LE16(_position), _reverse,0x55 };
176  uint8_t rx[8];
177  _sw.sendPacket(tx, rx);
178  uint8_t tx2[] = { 201,_pin,_pinMode,SW_LE16(_min), SW_LE16(_max-_min),0x55, 0x55 };
179  _sw.sendPacket(tx2, rx);
180 
181  }
182 };
183 
209 {
210 public:
212  {
213  }
214  uint8_t pin() {return SerialWombatPin::_pin;}
216 };
217 
254 {
255 
256 public:
264  void attach(uint8_t pin, bool reverse);
265 
266 
279  void attach(uint8_t pin, uint16_t min , uint16_t max , bool reverse = false)
280  {
281  _pin = pin;
282  _min = min;
283  _max = max;
284  _reverse = reverse;
286  initializeServo();
287  }
288 
289  int16_t writeFrequency_Hz(uint16_t frequency_hZ)
290  {
291  return writePeriod_uS((uint16_t)(1000000ul / frequency_hZ));
292  }
293  int16_t writePeriod_uS(uint16_t period_uS)
294  {
295  uint8_t tx[] = { 203,_pin,_pinMode,SW_LE16(period_uS), 0x55,0x55,0x55 };
296  uint8_t rx[8];
297  return _sw.sendPacket(tx, rx);
298  }
299 };
SerialWombatServo
A class to control Servos attached to the Serial Wombat chip.
Definition: SerialWombatServo.h:68
SerialWombatChip
Class for a Serial Wombat chip. Each Serial Wombat chip on a project should have its own instance.
Definition: SerialWombat.h:279
SerialWombatHighFrequencyServo
A class for the Serial Wombat 18AB Chip that adds support for high frequency hobby Servos(200 Hz,...
Definition: SerialWombatServo.h:253
SerialWombatServo::read
uint8_t read(void)
returns the last position of the servo scaled to a number from 0 to 180.
Definition: SerialWombatServo.h:160
SerialWombatServo::initializeServo
void initializeServo()
Definition: SerialWombatServo.h:173
SerialWombatServo_18AB::swPinModeNumber
uint8_t swPinModeNumber()
Facilitates inheritance.
Definition: SerialWombatServo.h:215
SerialWombatServo::_min
uint16_t _min
Definition: SerialWombatServo.h:170
SerialWombatHighFrequencyServo::SerialWombatHighFrequencyServo
SerialWombatHighFrequencyServo(SerialWombatChip &serialWombat)
Definition: SerialWombatServo.h:257
SerialWombatPin::_sw
SerialWombatChip & _sw
Definition: SerialWombat.h:1566
SerialWombatAbstractScaledOutput
SerialWombatServo, SerialWombatPWM and other proportional ouptut classes inherit from this class....
Definition: SerialWombatAbstractScaledOutput.h:62
PIN_MODE_SERVO
@ PIN_MODE_SERVO
(3)
Definition: SerialWombat.h:241
SerialWombatServo::_position
uint16_t _position
Definition: SerialWombatServo.h:169
SerialWombatServo::attach
void attach(uint8_t pin, bool reverse)
Initialize a servo on the specified pin.
Definition: SerialWombatServo.h:92
SerialWombatHighFrequencyServo::writeFrequency_Hz
int16_t writeFrequency_Hz(uint16_t frequency_hZ)
Definition: SerialWombatServo.h:289
SerialWombat.h
SerialWombatServo_18AB::pin
uint8_t pin()
Facilitates inheritance.
Definition: SerialWombatServo.h:214
SerialWombatServo::SerialWombatServo
SerialWombatServo(SerialWombatChip &sw)
Constructor for the SerialWombatServo Class.
Definition: SerialWombatServo.h:76
SerialWombatServo_18AB::SerialWombatServo_18AB
SerialWombatServo_18AB(SerialWombatChip &serialWombat)
Definition: SerialWombatServo.h:211
SerialWombatHighFrequencyServo::attach
void attach(uint8_t pin, bool reverse)
Do not use this interface for High Frequency Servos.
SerialWombatPin
Describes a Serial Wombat Pin. Is base class for other pin modes.
Definition: SerialWombat.h:1470
SerialWombatServo::_max
uint16_t _max
Definition: SerialWombatServo.h:171
SerialWombatPin::_pinMode
uint8_t _pinMode
Definition: SerialWombat.h:1567
SerialWombatChip::sendPacket
int sendPacket(uint8_t tx[], uint8_t rx[])
Send an 8 byte packet to the Serial Wombat chip and wait for 8 bytes back.
Definition: SerialWombat.cpp:139
SerialWombatServo::write
void write(uint8_t angle)
Writes a value to the servo.
Definition: SerialWombatServo.h:129
SerialWombatHighFrequencyServo::attach
void attach(uint8_t pin, uint16_t min, uint16_t max, bool reverse=false)
Initialize a high Speed servo on the specified pin.
Definition: SerialWombatServo.h:279
SerialWombatServo::_reverse
bool _reverse
Definition: SerialWombatServo.h:172
SerialWombatChip::writePublicData
uint16_t writePublicData(uint8_t pin, uint16_t value)
Write a 16 bit value to a Serial Wombat pin Mode.
Definition: SerialWombat.h:625
SerialWombatServo::attach
void attach(uint8_t pin, uint16_t min=544, uint16_t max=2400, bool reverse=false)
Initialize a servo on the specified pin.
Definition: SerialWombatServo.h:111
SerialWombatPin::pin
uint8_t pin()
Returns the current SW pin number. Used primarily for virtual calls by derived classes.
Definition: SerialWombat.h:1553
SerialWombatServo_18AB
A derived class that adds additional Servo Functionality for the Serial Wombat 18AB Chip.
Definition: SerialWombatServo.h:208
SerialWombatPin::_pin
uint8_t _pin
Definition: SerialWombat.h:1565
SerialWombatServo::write16bit
void write16bit(uint16_t position)
Writes a 16 bit value to the servo.
Definition: SerialWombatServo.h:149
SerialWombatHighFrequencyServo::writePeriod_uS
int16_t writePeriod_uS(uint16_t period_uS)
Definition: SerialWombatServo.h:293
SW_LE16
#define SW_LE16(_a)
Convert a uint16_t to two bytes in little endian format for array initialization.
Definition: SerialWombat.h:41
PIN_MODE_HS_SERVO
@ PIN_MODE_HS_SERVO
(26)
Definition: SerialWombat.h:260