1
+ /*
2
+ Sketch using <RcSeq> library, for automatically dropping a pneumatic Zodiac at sea and returning for it back to the deck of a supply vessel.
3
+ The sequence is launched after sending the 'g' (Go) character at the USB interface.
4
+
5
+ In this example, the declared sequence is:
6
+ 1) The crane lifts the pneumatic Zodiac from the deck to the air and stops
7
+ 2) The crane rotates (90°) to locate the pneumatic Zodiac above the sea
8
+ 3) The crane drops down the pneumatic Zodiac at sea level
9
+ 4) The crane stops during 6 seconds
10
+ 5) The crane lifts up the pneumatic Zodiac from sea level to the air and stops
11
+ 6) The crane rotates (90°) to locate the pneumatic Zodiac above the deck
12
+ 7) The crane drops down the pneumatic Zodiac on the deck and stops. The sequence ends.
13
+ This sequence uses:
14
+ - 2 commands from USB interface ('g' and 't' characters from Digiterm or Digi Monitor)
15
+ - 2 servos (a "ROTATION" servo for the crane rotation and an "UP/DOWN" servo to drop and lift the pneumatic Zodiac)
16
+
17
+ IMPORTANT:
18
+ =========
19
+ For this sketch, which is using <DigiUSB> library:
20
+ 1) Comment "#define RC_SEQ_WITH_SOFT_RC_PULSE_IN_SUPPORT" in "arduino-1.xx\libraries\RcSeq.h".
21
+ This will disable the code to manage incoming RC pulses and save some flash memory.
22
+ 2) Replace #define RING_BUFFER_SIZE 128 with #define RING_BUFFER_SIZE 32 in "arduino-1.xx\libraries\DigisparkUSB\DigiUSB.h".
23
+ 3) The sequence will be launch by sending "g" character through USB link (using Digiterm or Digi Monitor).
24
+ To check all the sequence is performed asynchronously, you can send 't' to toggle the LED during servo motion!
25
+ If step 1) and 2) are not done, this sketch won't compile because won't fit in programm memory of the DigiSpark!
26
+
27
+ RC Navy 2013
28
+ http://p.loussouarn.free.fr
29
+ */
30
+
31
+ static void ToggleLed (void ); /* Declare Short Action: Toggle a LED */
32
+
33
+ /* ************************************************/
34
+ /* STEP #1: Include the needed libraries */
35
+ /* ************************************************/
36
+ #include < DigiUSB.h> /* The Servo Sequence will be launched by sending "g" character (Go) at the USB interface */
37
+ #include < RcSeq.h>
38
+ #include < SoftRcPulseOut.h>
39
+
40
+ #define LED_PIN 1
41
+
42
+ /* ****************************************************************/
43
+ /* STEP #2: Enumeration of the servos used in the sequence */
44
+ /* ****************************************************************/
45
+ enum {ROTATION_SERVO=0 , UP_DOWN_SERVO , SERVO_NB};
46
+
47
+ /* ****************************************************************/
48
+ /* STEP #3: Servos Digital Pins assignment */
49
+ /* ****************************************************************/
50
+ #define UP_DOWN_SERVO_PIN 2
51
+ /* /!\ Do not use Pin 3 (used by USB) /!\ */
52
+ /* /!\ Do not use Pin 4 (used by USB) /!\ */
53
+ #define ROTATION_SERVO_PIN 5
54
+
55
+ /* *************************************************************************************/
56
+ /* STEP #4: Declaration of the angles of the servos for the different motions (in °) */
57
+ /* *************************************************************************************/
58
+ #define UP_DOWN_ON_DECK_POS 120 /* Zodiac on the deck */
59
+ #define UP_DOWN_ON_AIR_POS 180 /* Zodiac in the air */
60
+ #define UP_DOWN_ON_SEA_POS 0 /* Zodiac at sea level */
61
+
62
+ #define ROTATION_ABOVE_DECK_POS 90 /* crane at deck side */
63
+ #define ROTATION_ABOVE_SEA_POS 0 /* crane at sea side */
64
+
65
+
66
+ /* **************************************************************************************************************************************/
67
+ /* STEP #5: Do a temporal diagram showing the start up and the duration of each motions of each servo */
68
+ /* **************************************************************************************************************************************/
69
+ /*
70
+ All the start up values (time stamp) have as reference the moment of the sequence startup order (t=0).
71
+
72
+ UP_DOWN_SERVO MOTION ROTATION_SERVO MOTION UP_DOWN_SERVO MOTION NO MOTION MOUVEMENT(WAITING) UP_DOWN_SERVO MOTION ROTATION_SERVO MOTION UP_DOWN_SERVO MOTION
73
+ Order <--DECK_TO_AIR_DURATION_MS--> <--DECK_TO_SEA_ROTATION_DURATION_MS--> <--AIR_TO_SEA_FALLING_DURATION_MS--> <--DELAY_BEFORE_RISING_UP_MS--> <--SEA_TO_AIR_RISING_DURATION_MS--> <--SEA_TO_DECK_ROTATION_DURATION_MS--> <--AIR_TO_DECK_FALLING_DURATION_MS-->
74
+ |-------------------|-----------------------------|--------------------------------------|------------------------------------|-------------------------------|-----------------------------------|--------------------------------------|-------------------------------------|-->Time Axis
75
+ 0 START_UP_DECK_TO_AIR_MS START_UP_DECK_TO_SEA_ROTATION_MS START_UP_AIR_TO_SEA_FALLING_MS START_UP_SEA_TO_AIR_RISING_MS START_UP_SEA_TO_DECK_ROTATION_MS START_UP_AIR_TO_DECK_FALLING_MS
76
+ */
77
+
78
+ /* *************************************************************************************************************************************************/
79
+ /* STEP #6: With the help of the temporal diagram, declare start up time, the motion duration of servo and optional delay */
80
+ /* *************************************************************************************************************************************************/
81
+ /* Tune below all the motion duration. Do not forget to add a trailer 'UL' for each value to force them in Unsigned Long type */
82
+ #define START_UP_DECK_TO_AIR_MS 0UL /* 0 for immediate start up, but you can put a delay here. Ex: 2000UL, will delay the startup of the whole sequence after 2 seconds */
83
+ #define DECK_TO_AIR_DURATION_MS 3000UL
84
+
85
+ #define START_UP_DECK_TO_SEA_ROTATION_MS (START_UP_DECK_TO_AIR_MS + DECK_TO_AIR_DURATION_MS)
86
+ #define DECK_TO_SEA_ROTATION_DURATION_MS 3000UL
87
+
88
+ #define START_UP_AIR_TO_SEA_FALLING_MS (START_UP_DECK_TO_SEA_ROTATION_MS + DECK_TO_SEA_ROTATION_DURATION_MS)
89
+ #define AIR_TO_SEA_FALLING_DURATION_MS 9000UL
90
+
91
+ #define DELAY_BEFORE_RISING_UP_MS 6000UL
92
+
93
+ #define START_UP_SEA_TO_AIR_RISING_MS (START_UP_AIR_TO_SEA_FALLING_MS + AIR_TO_SEA_FALLING_DURATION_MS + DELAY_BEFORE_RISING_UP_MS)
94
+ #define SEA_TO_AIR_RISING_DURATION_MS 9000UL
95
+
96
+ #define START_UP_SEA_TO_DECK_ROTATION_MS (START_UP_SEA_TO_AIR_RISING_MS + SEA_TO_AIR_RISING_DURATION_MS)
97
+ #define SEA_TO_DECK_ROTATION_DURATION_MS 3000UL
98
+
99
+
100
+ #define START_UP_AIR_TO_DECK_FALLING_MS (START_UP_SEA_TO_DECK_ROTATION_MS + SEA_TO_DECK_ROTATION_DURATION_MS)
101
+ #define AIR_TO_DECK_FALLING_DURATION_MS 3000UL
102
+
103
+ /* *******************************************************************************************************************/
104
+ /* STEP #7: Declare here the percentage of motion to be performed at half speed for servo start up and stop */
105
+ /* *******************************************************************************************************************/
106
+ #define START_STOP_PER_CENT 5L /* Percentage of motion performed at half speed for servo start and servo stop (Soft start and Soft stop) */
107
+ /* Note: due to the lack of programm memory on the DigiSpark, this feature is not used */
108
+
109
+ /* ***********************************************************************************************************/
110
+ /* STEP #11: Use a "SequenceSt_t" structure table to declare the servo sequence */
111
+ /* For each table entry, arguments are: */
112
+ /* - Servo Index */
113
+ /* - Initial Servo Position in ° */
114
+ /* - Final Servo Position in ° */
115
+ /* - Motion Start Time Stamp in ms */
116
+ /* - Motion duration in ms between initial and final position */
117
+ /* - Percentage of motion performed at half speed for servo start and servo stop (Soft start and Soft stop) */
118
+ /* Note: START_STOP_PER_CENT not used (MOTION_WITHOUT_SOFT_START_AND_STOP() macro used) */
119
+ /* ***********************************************************************************************************/
120
+ SequenceSt_t ZodiacSequence[] PROGMEM = {
121
+ SHORT_ACTION_TO_PERFORM (ToggleLed, START_UP_DECK_TO_AIR_MS) /* Switch ON the Led at the beginning of the sequence */
122
+ SHORT_ACTION_TO_PERFORM (ToggleLed, START_UP_AIR_TO_DECK_FALLING_MS+AIR_TO_DECK_FALLING_DURATION_MS) /* Switch OFF the Led at the beginning of the sequence: You are not obliged to put this line at the end of the table */
123
+ /* 1) The crane lifts the pneumatic Zodiac from the deck to the air and stops */
124
+ MOTION_WITHOUT_SOFT_START_AND_STOP (UP_DOWN_SERVO, UP_DOWN_ON_DECK_POS, UP_DOWN_ON_AIR_POS, START_UP_DECK_TO_AIR_MS, DECK_TO_AIR_DURATION_MS)
125
+ /* 2) The crane rotates (90°) to locate the pneumatic Zodiac above the sea */
126
+ MOTION_WITHOUT_SOFT_START_AND_STOP (ROTATION_SERVO, ROTATION_ABOVE_DECK_POS, ROTATION_ABOVE_SEA_POS, START_UP_DECK_TO_SEA_ROTATION_MS, DECK_TO_SEA_ROTATION_DURATION_MS)
127
+ /* 3) The crane drops down the pneumatic Zodiac at sea level */
128
+ MOTION_WITHOUT_SOFT_START_AND_STOP (UP_DOWN_SERVO, UP_DOWN_ON_AIR_POS, UP_DOWN_ON_SEA_POS, START_UP_AIR_TO_SEA_FALLING_MS, AIR_TO_SEA_FALLING_DURATION_MS)
129
+ /* 4) The crane stops during 6 seconds and 5) The crane lifts up the pneumatic Zodiac from sea level to the air and stops */
130
+ MOTION_WITHOUT_SOFT_START_AND_STOP (UP_DOWN_SERVO, UP_DOWN_ON_SEA_POS, UP_DOWN_ON_AIR_POS, START_UP_SEA_TO_AIR_RISING_MS, SEA_TO_AIR_RISING_DURATION_MS)
131
+ /* 6) The crane rotates (90°) to locate the pneumatic Zodiac above the deck */
132
+ MOTION_WITHOUT_SOFT_START_AND_STOP (ROTATION_SERVO, ROTATION_ABOVE_SEA_POS, ROTATION_ABOVE_DECK_POS, START_UP_SEA_TO_DECK_ROTATION_MS, SEA_TO_DECK_ROTATION_DURATION_MS)
133
+ /* 7) The crane drops down the pneumatic Zodiac on the deck and stops. The sequence ends. */
134
+ MOTION_WITHOUT_SOFT_START_AND_STOP (UP_DOWN_SERVO, UP_DOWN_ON_AIR_POS, UP_DOWN_ON_DECK_POS, START_UP_AIR_TO_DECK_FALLING_MS, AIR_TO_DECK_FALLING_DURATION_MS)
135
+ };
136
+
137
+ void setup ()
138
+ {
139
+ pinMode (LED_PIN, OUTPUT);
140
+
141
+ DigiUSB.begin ();
142
+
143
+ /* **************************************************************************/
144
+ /* STEP #9: Init <RcSeq> library */
145
+ /* **************************************************************************/
146
+ RcSeq_Init ();
147
+
148
+ /* ***************************************************************************************/
149
+ /* STEP #10: declare the servo command signals with their digital pin number */
150
+ /* ***************************************************************************************/
151
+ RcSeq_DeclareServo (UP_DOWN_SERVO, UP_DOWN_SERVO_PIN);
152
+ RcSeq_DeclareServo (ROTATION_SERVO, ROTATION_SERVO_PIN);
153
+
154
+ /* *************************************************************************************************************************/
155
+ /* STEP #11: declare the sequence command signal (0), the stick level (0), and the sequence to call */
156
+ /* *************************************************************************************************************************/
157
+ RcSeq_DeclareCommandAndSequence (0 , 0 , RC_SEQUENCE (ZodiacSequence)); /* 0,0 since there's no RC command */
158
+ }
159
+
160
+ void loop ()
161
+ {
162
+ char RxChar;
163
+
164
+ /* **********************************************************************************************************************************/
165
+ /* STEP #12: call the refresh function inside the loop() to catch RC commands and to manage the servo positions */
166
+ /* **********************************************************************************************************************************/
167
+ RcSeq_Refresh ();
168
+
169
+ /* ***************************************************************************************************************/
170
+ /* STEP #13: the sequence can be launched directly by calling the RcSeq_LaunchSequence() function */
171
+ /* ***************************************************************************************************************/
172
+ if (DigiUSB.available ())
173
+ {
174
+ RxChar=DigiUSB.read ();
175
+ if (RxChar==' g' ) /* Go ! */
176
+ {
177
+ RcSeq_LaunchSequence (ZodiacSequence);
178
+ }
179
+ if (RxChar==' t' ) /* Toggle LED ! */
180
+ {
181
+ RcSeq_LaunchShortAction (ToggleLed); /* You can toggle LED during Servo Motion! */
182
+ }
183
+ }
184
+ DigiUSB.refresh ();
185
+ }
186
+
187
+ static void ToggleLed (void )
188
+ {
189
+ static boolean Status=LOW;
190
+ Status=!Status; /* Toggle Status */
191
+ digitalWrite (LED_PIN, Status);
192
+ }
0 commit comments