mirror of
				https://github.com/digistump/DigistumpArduino.git
				synced 2025-11-03 13:04:48 -08:00 
			
		
		
		
	Add OLED library - update tiny wire libraries - add support for all PWM channels and PWM on pin 8
This commit is contained in:
		@@ -17,7 +17,7 @@ This sequence uses:
 | 
			
		||||
IMPORTANT:
 | 
			
		||||
=========
 | 
			
		||||
For this sketch, which is using <DigiUSB> library:
 | 
			
		||||
1) Comment "#define RC_SEQ_WITH_SOFT_RC_PULSE_IN_SUPPORT" in "arduino-1.xx\libraries\RcSeq.h".
 | 
			
		||||
1) Comment "#define RC_SEQ_WITH_SOFT_RC_PULSE_IN_SUPPORT" AND #define RC_SEQ_CONTROL_SUPPORT in "arduino-1.xx\libraries\RcSeq.h".
 | 
			
		||||
   This will disable the code to manage incoming RC pulses and save some flash memory.
 | 
			
		||||
   RC_SEQ_WITH_SHORT_ACTION_SUPPORT and RC_SEQ_WITH_SOFT_RC_PULSE_OUT_SUPPORT shall be defined
 | 
			
		||||
2) Replace #define RING_BUFFER_SIZE 128 with #define RING_BUFFER_SIZE 32 in "arduino-1.xx\libraries\DigisparkUSB\DigiUSB.h".
 | 
			
		||||
@@ -38,17 +38,17 @@ static void ToggleLed(void); /* Declare Short Action: Toggle a LED */
 | 
			
		||||
#include <RcSeq.h>
 | 
			
		||||
#include <SoftRcPulseOut.h>
 | 
			
		||||
 | 
			
		||||
#define LED_PIN		                1
 | 
			
		||||
#define LED_PIN                     1
 | 
			
		||||
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
/* STEP #2: Enumeration of the servos used in the sequence       */
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
enum {ROTATION_SERVO=0, UP_DOWN_SERVO , SERVO_NB};
 | 
			
		||||
enum {ROTATION_SERVO=0, UP_DOWN_SERVO, SERVO_NB};
 | 
			
		||||
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
/* STEP #3: Servos Digital Pins assignment                       */
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
#define UP_DOWN_SERVO_PIN          2
 | 
			
		||||
#define UP_DOWN_SERVO_PIN           2
 | 
			
		||||
/* /!\ Do not use Pin 3 (used by USB) /!\ */
 | 
			
		||||
/* /!\ Do not use Pin 4 (used by USB) /!\ */
 | 
			
		||||
#define ROTATION_SERVO_PIN          5
 | 
			
		||||
@@ -56,12 +56,12 @@ enum {ROTATION_SERVO=0, UP_DOWN_SERVO , SERVO_NB};
 | 
			
		||||
/**************************************************************************************/
 | 
			
		||||
/* STEP #4: Declaration of the angles of the servos for the different motions (in °)  */
 | 
			
		||||
/**************************************************************************************/
 | 
			
		||||
#define UP_DOWN_ON_DECK_POS		120 /* Zodiac on the deck  */
 | 
			
		||||
#define UP_DOWN_ON_AIR_POS		180 /* Zodiac in the air   */
 | 
			
		||||
#define UP_DOWN_ON_SEA_POS		0   /* Zodiac at sea level */
 | 
			
		||||
#define UP_DOWN_ON_DECK_POS         120 /* Zodiac on the deck  */
 | 
			
		||||
#define UP_DOWN_ON_AIR_POS          180 /* Zodiac in the air   */
 | 
			
		||||
#define UP_DOWN_ON_SEA_POS          0   /* Zodiac at sea level */
 | 
			
		||||
 | 
			
		||||
#define ROTATION_ABOVE_DECK_POS	90  /* crane at deck side  */
 | 
			
		||||
#define ROTATION_ABOVE_SEA_POS		0   /* crane at sea  side  */
 | 
			
		||||
#define ROTATION_ABOVE_DECK_POS     90  /* crane at deck side  */
 | 
			
		||||
#define ROTATION_ABOVE_SEA_POS      0   /* crane at sea  side  */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************************************************************************************************************************************/
 | 
			
		||||
@@ -80,26 +80,26 @@ Order                  <--DECK_TO_AIR_DURATION_MS--> <--DECK_TO_SEA_ROTATION_DUR
 | 
			
		||||
/* STEP #6: With the help of the temporal diagram, declare start up time, the motion duration of servo and optional delay                         */
 | 
			
		||||
/**************************************************************************************************************************************************/
 | 
			
		||||
/* Tune below all the motion duration. Do not forget to add a trailer 'UL' for each value to force them in Unsigned Long type */
 | 
			
		||||
#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 */
 | 
			
		||||
#define DECK_TO_AIR_DURATION_MS		3000UL
 | 
			
		||||
#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 */
 | 
			
		||||
#define DECK_TO_AIR_DURATION_MS	           3000UL
 | 
			
		||||
 | 
			
		||||
#define START_UP_DECK_TO_SEA_ROTATION_MS	(START_UP_DECK_TO_AIR_MS + DECK_TO_AIR_DURATION_MS)
 | 
			
		||||
#define DECK_TO_SEA_ROTATION_DURATION_MS	3000UL
 | 
			
		||||
#define START_UP_DECK_TO_SEA_ROTATION_MS  (START_UP_DECK_TO_AIR_MS + DECK_TO_AIR_DURATION_MS)
 | 
			
		||||
#define DECK_TO_SEA_ROTATION_DURATION_MS  3000UL
 | 
			
		||||
 | 
			
		||||
#define START_UP_AIR_TO_SEA_FALLING_MS		(START_UP_DECK_TO_SEA_ROTATION_MS + DECK_TO_SEA_ROTATION_DURATION_MS)
 | 
			
		||||
#define AIR_TO_SEA_FALLING_DURATION_MS		9000UL
 | 
			
		||||
#define START_UP_AIR_TO_SEA_FALLING_MS    (START_UP_DECK_TO_SEA_ROTATION_MS + DECK_TO_SEA_ROTATION_DURATION_MS)
 | 
			
		||||
#define AIR_TO_SEA_FALLING_DURATION_MS    9000UL
 | 
			
		||||
 | 
			
		||||
#define DELAY_BEFORE_RISING_UP_MS		6000UL
 | 
			
		||||
#define DELAY_BEFORE_RISING_UP_MS         6000UL
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
#define SEA_TO_AIR_RISING_DURATION_MS		9000UL
 | 
			
		||||
#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)
 | 
			
		||||
#define SEA_TO_AIR_RISING_DURATION_MS     9000UL
 | 
			
		||||
 | 
			
		||||
#define START_UP_SEA_TO_DECK_ROTATION_MS	(START_UP_SEA_TO_AIR_RISING_MS + SEA_TO_AIR_RISING_DURATION_MS)
 | 
			
		||||
#define SEA_TO_DECK_ROTATION_DURATION_MS	3000UL
 | 
			
		||||
#define START_UP_SEA_TO_DECK_ROTATION_MS  (START_UP_SEA_TO_AIR_RISING_MS + SEA_TO_AIR_RISING_DURATION_MS)
 | 
			
		||||
#define SEA_TO_DECK_ROTATION_DURATION_MS  3000UL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define START_UP_AIR_TO_DECK_FALLING_MS	(START_UP_SEA_TO_DECK_ROTATION_MS + SEA_TO_DECK_ROTATION_DURATION_MS)
 | 
			
		||||
#define AIR_TO_DECK_FALLING_DURATION_MS	3000UL
 | 
			
		||||
#define START_UP_AIR_TO_DECK_FALLING_MS   (START_UP_SEA_TO_DECK_ROTATION_MS + SEA_TO_DECK_ROTATION_DURATION_MS)
 | 
			
		||||
#define AIR_TO_DECK_FALLING_DURATION_MS   3000UL
 | 
			
		||||
 | 
			
		||||
/********************************************************************************************************************/
 | 
			
		||||
/* STEP #7: Declare here the percentage of motion to be performed at half speed for servo start up and stop         */
 | 
			
		||||
@@ -118,7 +118,7 @@ Order                  <--DECK_TO_AIR_DURATION_MS--> <--DECK_TO_SEA_ROTATION_DUR
 | 
			
		||||
/* - Percentage of motion performed at half speed for servo start and servo stop (Soft start and Soft stop) */
 | 
			
		||||
/* Note: START_STOP_PER_CENT not used (MOTION_WITHOUT_SOFT_START_AND_STOP() macro used)                     */
 | 
			
		||||
/************************************************************************************************************/
 | 
			
		||||
SequenceSt_t ZodiacSequence[] PROGMEM = {
 | 
			
		||||
const SequenceSt_t ZodiacSequence[] PROGMEM = {
 | 
			
		||||
	SHORT_ACTION_TO_PERFORM(ToggleLed, START_UP_DECK_TO_AIR_MS) /* Switch ON the Led at the beginning of the sequence */
 | 
			
		||||
	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 */
 | 
			
		||||
	/* 1) The crane lifts the pneumatic Zodiac from the deck to the air and stops */
 | 
			
		||||
@@ -155,7 +155,7 @@ void setup()
 | 
			
		||||
/**************************************************************************************************************************/
 | 
			
		||||
/* STEP #11: declare the sequence command signal (0), the stick level (0), and the sequence to call                       */
 | 
			
		||||
/**************************************************************************************************************************/
 | 
			
		||||
    RcSeq_DeclareCommandAndSequence(0, 0, RC_SEQUENCE(ZodiacSequence)); /* 0,0 since there's no RC command */
 | 
			
		||||
    RcSeq_DeclareCommandAndSequence(0, 0, RC_SEQUENCE(ZodiacSequence)); /* 0, 0 since there's no RC command */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void loop()
 | 
			
		||||
@@ -172,12 +172,12 @@ char RxChar;
 | 
			
		||||
/****************************************************************************************************************/
 | 
			
		||||
    if(DigiUSB.available())
 | 
			
		||||
    {
 | 
			
		||||
        RxChar=DigiUSB.read();
 | 
			
		||||
        if(RxChar=='g') /* Go ! */
 | 
			
		||||
        RxChar = DigiUSB.read();
 | 
			
		||||
        if(RxChar == 'g') /* Go ! */
 | 
			
		||||
        {
 | 
			
		||||
            RcSeq_LaunchSequence(ZodiacSequence);
 | 
			
		||||
        }
 | 
			
		||||
        if(RxChar=='t') /* Toggle LED ! */
 | 
			
		||||
        if(RxChar == 't') /* Toggle LED ! */
 | 
			
		||||
        {
 | 
			
		||||
            RcSeq_LaunchShortAction(ToggleLed); /* You can toggle LED during Servo Motion! */
 | 
			
		||||
        }
 | 
			
		||||
@@ -187,7 +187,7 @@ char RxChar;
 | 
			
		||||
 | 
			
		||||
static void ToggleLed(void)
 | 
			
		||||
{
 | 
			
		||||
static boolean Status=LOW;
 | 
			
		||||
    Status=!Status; /* Toggle Status */
 | 
			
		||||
static boolean Status = LOW;
 | 
			
		||||
    Status = !Status; /* Toggle Status */
 | 
			
		||||
    digitalWrite(LED_PIN, Status);
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -81,11 +81,11 @@ enum {RC_CHANNEL, RC_CHANNEL_NB}; /* Here, as there is a single channel, we coul
 | 
			
		||||
/* Declaration of the custom keyboard": the pulse width of the push buttons do not need to be equidistant */
 | 
			
		||||
enum {PUSH_BUTTON1, PUSH_BUTTON2, PUSH_BUTTON3, PUSH_BUTTON4, PUSH_BUTTON5, PUSH_BUTTON_NBR};
 | 
			
		||||
#define TOLERANCE  40 /* Tolerance  +/- (in microseconds): CAUTION, no overlap allowed between 2 adjacent active areas . active area width = 2 x TOLERANCE (us) */
 | 
			
		||||
KeyMap_t CustomKeyboard[] PROGMEM ={ {CENTER_VALUE_US(1100,TOLERANCE)}, /* PUSH_BUTTON1: +/-40 us */
 | 
			
		||||
                                     {CENTER_VALUE_US(1300,TOLERANCE)}, /* PUSH_BUTTON2: +/-40 us */
 | 
			
		||||
                                     {CENTER_VALUE_US(1500,TOLERANCE)}, /* PUSH_BUTTON3: +/-40 us */
 | 
			
		||||
                                     {CENTER_VALUE_US(1700,TOLERANCE)}, /* PUSH_BUTTON4: +/-40 us */
 | 
			
		||||
                                     {CENTER_VALUE_US(1900,TOLERANCE)}, /* PUSH_BUTTON5: +/-40 us */
 | 
			
		||||
const KeyMap_t CustomKeyboard[] PROGMEM ={ {CENTER_VALUE_US(1100,TOLERANCE)}, /* PUSH_BUTTON1: +/-40 us */
 | 
			
		||||
                                           {CENTER_VALUE_US(1300,TOLERANCE)}, /* PUSH_BUTTON2: +/-40 us */
 | 
			
		||||
                                           {CENTER_VALUE_US(1500,TOLERANCE)}, /* PUSH_BUTTON3: +/-40 us */
 | 
			
		||||
                                           {CENTER_VALUE_US(1700,TOLERANCE)}, /* PUSH_BUTTON4: +/-40 us */
 | 
			
		||||
                                           {CENTER_VALUE_US(1900,TOLERANCE)}, /* PUSH_BUTTON5: +/-40 us */
 | 
			
		||||
                                  };
 | 
			
		||||
 | 
			
		||||
//==============================================================================================
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,307 @@
 | 
			
		||||
/*
 | 
			
		||||
This sketch illustrates 2 new features of the <RcSeq> library (since the V2.1 version):
 | 
			
		||||
1) the "control" capability: it's a function passed as argument to the RcSeq_DeclareCommandAndSequence() method.
 | 
			
		||||
   It is used to check if a sequence can be launched or not, depending of specific condition
 | 
			
		||||
   It is also used to inform the sequence is finished: this can be used to memorize in EEPROM the sequence id.
 | 
			
		||||
   Like that, at the next start-up the position of the servos can be restored according to the last position of the sequence.
 | 
			
		||||
2) the "timeout" capability:
 | 
			
		||||
   The RcSeq_Timeout() method can be used to check if the command signal remains constant (HIGH or LOW).
 | 
			
		||||
   It's then possible to launch the sequence based on the static state of the command pin rather than a Rc Pulse width.
 | 
			
		||||
   In practice, it's possible to use both manners to launch a sequence as done in the sketch below.
 | 
			
		||||
 | 
			
		||||
THE SKETCH:
 | 
			
		||||
==========
 | 
			
		||||
In this sketch, the first declared sequence opens the 2 doors with the help of 2 servos (1 per door).
 | 
			
		||||
The second declared sequence closes the 2 doors with the help of 2 servos (1 per door).
 | 
			
		||||
The 2 doors cannot open or close simultaneously with the same speed since there is a nosing secured to the right door.
 | 
			
		||||
This nosing forces to open and close the doors using sequences.
 | 
			
		||||
 | 
			
		||||
  Opening <-                        -> Opening
 | 
			
		||||
              .                  .
 | 
			
		||||
                .              .
 | 
			
		||||
                  .          .
 | 
			
		||||
                   .        .
 | 
			
		||||
                    .      .
 | 
			
		||||
                     .    .
 | 
			
		||||
                     .    .
 | 
			
		||||
 __       nosing -> .------.                 __
 | 
			
		||||
/  \----------------'---.  '----------------/  \
 | 
			
		||||
\__/-------------------''-------------------\__/
 | 
			
		||||
     Left door                 Right door
 | 
			
		||||
                   TOP VIEW
 | 
			
		||||
 | 
			
		||||
The opening sequence is like hereafter:
 | 
			
		||||
======================================
 | 
			
		||||
1) The servo assigned to the right door starts
 | 
			
		||||
2) Once rigth door slightly opened, the servo assigned to the left door starts, whilst the servo assigned to the right door resumes its travel
 | 
			
		||||
3) Once the 2 servos reached 90°, the 2 doors stop; the opening sequence is finished
 | 
			
		||||
 | 
			
		||||
The closing sequence is like hereafter:
 | 
			
		||||
======================================
 | 
			
		||||
1) The 2 servos assigned to the left and right doors start together but the left servo rotates more quickly than the right servo.
 | 
			
		||||
2) As a consequence, the left door is closed berfore the right door
 | 
			
		||||
3) Once the 2 servos reached 90°, the 2 doors stop; the closing sequence is finished
 | 
			
		||||
 | 
			
		||||
The sequences of this sketch can be launched either a RC channel either a regular ON/OFF switch:
 | 
			
		||||
===============================================================================================
 | 
			
		||||
A) Command from a RC channel:
 | 
			
		||||
   -------------------------                   _______________
 | 
			
		||||
   V                  _______________         |  __           |
 | 
			
		||||
   |  __________     |   ARDUINO:    |________| /  \  Left    |
 | 
			
		||||
   | |          |    |               |        | \__/  Servo   |
 | 
			
		||||
   | |    RC    |CH  |     UNO       |        |_______________|
 | 
			
		||||
   '-+ Receiver |----|     MEGA      |         _______________
 | 
			
		||||
     |          |    |   Digispark   |        |  __           |
 | 
			
		||||
     |__________|    | Digispark pro |________| /  \  Right   |
 | 
			
		||||
                     |_______________|        | \__/  Servo   |
 | 
			
		||||
                                              |_______________|
 | 
			
		||||
                      
 | 
			
		||||
B) Command from a ON/OFF switch:
 | 
			
		||||
   ----------------------------                _______________
 | 
			
		||||
                      _______________         |  __           |
 | 
			
		||||
                     |   ARDUINO:    |________| /  \  Left    |
 | 
			
		||||
                     |               |        | \__/  Servo   |
 | 
			
		||||
                     |     UNO       |        |_______________|
 | 
			
		||||
                .----|     MEGA      |         _______________
 | 
			
		||||
                |    |   Digispark   |        |  __           |
 | 
			
		||||
  ON/OFF Switch \    | Digispark pro |________| /  \  Right   |
 | 
			
		||||
                |    |_______________|        | \__/  Servo   |
 | 
			
		||||
               -+-                            |_______________|
 | 
			
		||||
               GND               
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*************************************************/
 | 
			
		||||
/* STEP #1: Include the required libraries       */
 | 
			
		||||
/*************************************************/
 | 
			
		||||
#include <RcSeq.h>
 | 
			
		||||
#include <TinyPinChange.h>
 | 
			
		||||
#include <SoftRcPulseIn.h>
 | 
			
		||||
#include <SoftRcPulseOut.h>
 | 
			
		||||
#include <EEPROM.h>
 | 
			
		||||
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
/* STEP #2: Enumeration of the RC Signals used in the sequence   */
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
enum {RC_SIGNAL = 0, SIGNAL_NB}; /* Here, a single RC signal is used */
 | 
			
		||||
 | 
			
		||||
/******************************************************************/
 | 
			
		||||
/* STEP #3: Enumeration of the different position of the RC stick */
 | 
			
		||||
/******************************************************************/
 | 
			
		||||
enum {RC_PULSE_LEVEL_MINUS_1 = 0, RC_PULSE_LEVEL_PLUS_1, RC_PULSE_NB};
 | 
			
		||||
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
/* STEP #4: Enumeration of the servos used in the sequences      */
 | 
			
		||||
/*****************************************************************/
 | 
			
		||||
enum {DOOR_SERVO_LEFT = 0, DOOR_SERVO_RIGHT, SERVO_NB}; /* In this sketch, 2 servos are declared */
 | 
			
		||||
 | 
			
		||||
/***************************************************/
 | 
			
		||||
/* STEP #5: Digital pin assignment for Command     */
 | 
			
		||||
/***************************************************/
 | 
			
		||||
#define COMMAND_PIN                        2 /* This pin can be connected to a channel of a RC Receiver or to a regular ON/OFF switch (switch wired between pin and Ground) */
 | 
			
		||||
 | 
			
		||||
/**************************************************/
 | 
			
		||||
/* STEP #6: Digital Pins assignment for Servos    */
 | 
			
		||||
/**************************************************/
 | 
			
		||||
#define DOOR_SERVO_LEFT_PIN                3
 | 
			
		||||
#define DOOR_SERVO_RIGHT_PIN               4
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************/
 | 
			
		||||
/* STEP #7: Declaration of the angle of the servos for the different motions (in °)  */
 | 
			
		||||
/*************************************************************************************/
 | 
			
		||||
#define DOOR_SERVO_OPENED_LEFT_POS         135 /* position of the left Servo when left door is opened */
 | 
			
		||||
#define DOOR_SERVO_CLOSED_LEFT_POS         45  /* position of the left Servo when left door is closed */
 | 
			
		||||
 | 
			
		||||
#define DOOR_SERVO_OPENED_RIGHT_POS        45  /* position of the right Servo when right door is opened */
 | 
			
		||||
#define DOOR_SERVO_CLOSED_RIGHT_POS        135 /* position of the right Servo when right door is closed */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************************************************************************************************************************************/
 | 
			
		||||
/* STEP #8: Do a temporal diagram showing the start up and the duration of each motions of each servo                                  */
 | 
			
		||||
/***************************************************************************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
1) OPENING MOTION OF THE DOORS
 | 
			
		||||
   ===========================
 | 
			
		||||
All the start up values (time stamp) have as reference the moment of the sequence startup order (t=0).
 | 
			
		||||
 | 
			
		||||
1.1 MOTION OF THE LEFT DOOR SERVO FOR OPENING
 | 
			
		||||
    =========================================
 | 
			
		||||
    
 | 
			
		||||
Order                            <---OPENING_DURATION_LEFT_MS---> 
 | 
			
		||||
  |-----------------------------|--------------------------------|-->Time Axis
 | 
			
		||||
  0                  OPENING_START_LEFT_MS
 | 
			
		||||
  
 | 
			
		||||
1.2 MOTION OF THE RIGHT DOOR SERVO FOR OPENING
 | 
			
		||||
    ==========================================
 | 
			
		||||
    
 | 
			
		||||
Order                  <--------OPENING_DURATION_RIGHT_MS-------> 
 | 
			
		||||
  |-------------------|------------------------------------------|-->Time Axis
 | 
			
		||||
  0        OPENING_START_RIGHT_MS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
2) CLOSING MOTION OF THE DOORS
 | 
			
		||||
   ===========================
 | 
			
		||||
All the start up values (time stamp) have as reference the moment of the sequence startup order (t=0).
 | 
			
		||||
 | 
			
		||||
2.1 MOTION OF THE LEFT DOOR SERVO FOR CLOSING
 | 
			
		||||
    =========================================
 | 
			
		||||
 | 
			
		||||
Order                  <---CLOSING_DURATION_LEFT_MS---> 
 | 
			
		||||
  |-------------------|--------------------------------|------------>Time Axis
 | 
			
		||||
  0         CLOSING_START_LEFT_MS
 | 
			
		||||
  
 | 
			
		||||
2.2 MOTION OF THE RIGTH DOOR SERVO FOR CLOSING
 | 
			
		||||
    ==========================================
 | 
			
		||||
 | 
			
		||||
Order                  <--------CLOSING_DURATION_RIGHT_MS-------> 
 | 
			
		||||
  |-------------------|------------------------------------------|-->Time Axis
 | 
			
		||||
  0        CLOSING_START_RIGHT_MS    
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/**************************************************************************************************************************************************/
 | 
			
		||||
/* STEP #9: With the help of the temporal diagram, declare start up time, the motion duration of servo and optional delay                         */
 | 
			
		||||
/**************************************************************************************************************************************************/
 | 
			
		||||
/* Tune below all the motion duration. Do not forget to add a trailer 'UL' for each value to force them in Unsigned Long type */
 | 
			
		||||
#define OPENING_START_LEFT_MS          500UL  //This means the left servo motion will be delayed of 500ms AFTER the order
 | 
			
		||||
#define OPENING_DURATION_LEFT_MS       2500UL //The left door motion ends after 500+2500=3s, as the right door
 | 
			
		||||
 | 
			
		||||
#define OPENING_START_RIGHT_MS         0UL    //Immediate start
 | 
			
		||||
#define OPENING_DURATION_RIGHT_MS      3000UL //The right door motion ends after 3s
 | 
			
		||||
 | 
			
		||||
#define CLOSING_START_LEFT_MS          0UL    //Immediate start
 | 
			
		||||
#define CLOSING_DURATION_LEFT_MS       3000UL //The left door will be closed BEFORE the right door
 | 
			
		||||
 | 
			
		||||
#define CLOSING_START_RIGHT_MS         0UL    //Immediate start
 | 
			
		||||
#define CLOSING_DURATION_RIGHT_MS      4000UL //The right door will be closed AFTER the left door
 | 
			
		||||
 | 
			
		||||
/********************************************************************************************************************/
 | 
			
		||||
/* STEP #10: Declare here the percentage of motion to be performed at half speed for servo start up and stop        */
 | 
			
		||||
/********************************************************************************************************************/
 | 
			
		||||
#define START_STOP_PER_CENT                 5 /* Percentage of motion performed at half-speed for starting and stopping the servos (Soft start et Soft stop) */
 | 
			
		||||
 | 
			
		||||
/************************************************************************************************************/
 | 
			
		||||
/* STEP #11: Use a "const SequenceSt_t" structure table to declare the servo sequence                       */
 | 
			
		||||
/* For each table entry, arguments are:                                                                     */
 | 
			
		||||
/* - Servo Index                                                                                            */
 | 
			
		||||
/* - Initial Servo Position in °                                                                            */
 | 
			
		||||
/* - Final   Servo Position in °                                                                            */
 | 
			
		||||
/* - Motion Start Time Stamp in ms                                                                          */
 | 
			
		||||
/* - Motion duration in ms between initial and final position                                               */
 | 
			
		||||
/* - Percentage of motion performed at half speed for servo start and servo stop (Soft start and Soft stop) */
 | 
			
		||||
/************************************************************************************************************/
 | 
			
		||||
/* Table describing the motions of the 2 servos for opening the 2 doors */
 | 
			
		||||
const SequenceSt_t OpeningSequence[] PROGMEM = {/*     Servo Id ,  Initial Angle             , Final Angle                , Delay after order     , Motion Duration          , Percentage at half speed */
 | 
			
		||||
/* 1st Servo */ MOTION_WITH_SOFT_START_AND_STOP(DOOR_SERVO_LEFT,  DOOR_SERVO_CLOSED_LEFT_POS,  DOOR_SERVO_OPENED_LEFT_POS,  OPENING_START_LEFT_MS,  OPENING_DURATION_LEFT_MS,  START_STOP_PER_CENT)
 | 
			
		||||
/* 2nd Servo */ MOTION_WITH_SOFT_START_AND_STOP(DOOR_SERVO_RIGHT, DOOR_SERVO_CLOSED_RIGHT_POS, DOOR_SERVO_OPENED_RIGHT_POS, OPENING_START_RIGHT_MS, OPENING_DURATION_RIGHT_MS, START_STOP_PER_CENT)
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
/* Table describing the motions of the 2 servos for closing the 2 doors */
 | 
			
		||||
const SequenceSt_t ClosingSequence[] PROGMEM = {/*    Servo Id  ,  Initial Angle             , Final Angle                , Delai after order     , Motion Duration          , Percentage at half speed */
 | 
			
		||||
/* 1st Servo */ MOTION_WITH_SOFT_START_AND_STOP(DOOR_SERVO_LEFT,  DOOR_SERVO_OPENED_LEFT_POS,  DOOR_SERVO_CLOSED_LEFT_POS,  CLOSING_START_LEFT_MS,  CLOSING_DURATION_LEFT_MS,  START_STOP_PER_CENT)
 | 
			
		||||
/* 2nd Servo */ MOTION_WITH_SOFT_START_AND_STOP(DOOR_SERVO_RIGHT, DOOR_SERVO_OPENED_RIGHT_POS, DOOR_SERVO_CLOSED_RIGHT_POS, CLOSING_START_RIGHT_MS, CLOSING_DURATION_RIGHT_MS, START_STOP_PER_CENT)
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
enum {COMMAND_OPEN = 0, COMMAND_CLOSE};
 | 
			
		||||
 | 
			
		||||
/* GLOBAL VARIABLES */
 | 
			
		||||
uint8_t LastExecutedSeqIdx;
 | 
			
		||||
 | 
			
		||||
void setup()
 | 
			
		||||
{
 | 
			
		||||
  
 | 
			
		||||
  #if !defined(__AVR_ATtiny24__) && !defined(__AVR_ATtiny44__) && !defined(__AVR_ATtiny84__) && !defined(__AVR_ATtiny25__) && !defined(__AVR_ATtiny45__) && !defined(__AVR_ATtiny85__) && !defined(__AVR_ATtiny167__)
 | 
			
		||||
  Serial.begin(9600);
 | 
			
		||||
  Serial.print(F("RcSeq library V"));Serial.print(RcSeq_LibTextVersionRevision());Serial.println(F(" demo: advanced doors sequences"));
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  /***************************************************************************/
 | 
			
		||||
  /* STEP #12: Init <RcSeq> library                                          */
 | 
			
		||||
  /***************************************************************************/
 | 
			
		||||
  RcSeq_Init();
 | 
			
		||||
   
 | 
			
		||||
  /****************************************************************************************/
 | 
			
		||||
  /* STEP #13: declare the servo command signals with their digital pin number            */
 | 
			
		||||
  /****************************************************************************************/
 | 
			
		||||
  RcSeq_DeclareSignal(RC_SIGNAL, COMMAND_PIN);
 | 
			
		||||
 | 
			
		||||
  /******************************************************************************************/
 | 
			
		||||
  /* STEP #14: declare a stick assigned to the RC signal having RC_PULSE_NB positions       */
 | 
			
		||||
  /******************************************************************************************/
 | 
			
		||||
  RcSeq_DeclareStick(RC_SIGNAL, 1000, 2000, RC_PULSE_NB);
 | 
			
		||||
    
 | 
			
		||||
  /****************************************************************************************/
 | 
			
		||||
  /* STEP #15: declare the servo command signals with their digital pin number            */
 | 
			
		||||
  /****************************************************************************************/
 | 
			
		||||
  RcSeq_DeclareServo(DOOR_SERVO_LEFT,  DOOR_SERVO_LEFT_PIN);
 | 
			
		||||
  RcSeq_DeclareServo(DOOR_SERVO_RIGHT, DOOR_SERVO_RIGHT_PIN);
 | 
			
		||||
    
 | 
			
		||||
  /*******************************************************************************************************/
 | 
			
		||||
  /* STEP #16: declare the sequence assigned to specific position of the stick assigned to the RC signal */
 | 
			
		||||
  /*******************************************************************************************************/
 | 
			
		||||
  RcSeq_DeclareCommandAndSequence(RC_SIGNAL, RC_PULSE_LEVEL_MINUS_1, RC_SEQUENCE(OpeningSequence), Control); // Declare a sequence triggered by a RC pulse Level Minus 1 (stick at extreme position during at least 250 ms)
 | 
			
		||||
  RcSeq_DeclareCommandAndSequence(RC_SIGNAL, RC_PULSE_LEVEL_PLUS_1,  RC_SEQUENCE(ClosingSequence), Control); // Declare a sequence triggered by a RC pulse Level  Plus 1 (stick at extreme position during at least 250 ms)
 | 
			
		||||
 | 
			
		||||
  /*******************************************************************************************/
 | 
			
		||||
  /* STEP #17: Initialize the position of the servos according to the last finished sequence */
 | 
			
		||||
  /*******************************************************************************************/
 | 
			
		||||
  LastExecutedSeqIdx = EEPROM.read(0);
 | 
			
		||||
  if (LastExecutedSeqIdx == COMMAND_OPEN)
 | 
			
		||||
  {
 | 
			
		||||
    RcSeq_ServoWrite(DOOR_SERVO_LEFT,  DOOR_SERVO_OPENED_LEFT_POS);
 | 
			
		||||
    RcSeq_ServoWrite(DOOR_SERVO_RIGHT, DOOR_SERVO_OPENED_RIGHT_POS);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    RcSeq_ServoWrite(DOOR_SERVO_LEFT,  DOOR_SERVO_CLOSED_LEFT_POS);
 | 
			
		||||
    RcSeq_ServoWrite(DOOR_SERVO_RIGHT, DOOR_SERVO_CLOSED_RIGHT_POS);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void loop()
 | 
			
		||||
{
 | 
			
		||||
  uint8_t RcSignalPinState;  
 | 
			
		||||
  /****************************************************************************************************************/
 | 
			
		||||
  /* STEP #18: call the refresh function inside the loop() to catch RC commands and to manage the servo positions */
 | 
			
		||||
  /****************************************************************************************************************/
 | 
			
		||||
  RcSeq_Refresh();
 | 
			
		||||
 | 
			
		||||
  /*********************************************************************************************************/
 | 
			
		||||
  /* STEP #19: optionally, allow launching the Sequences ou Actions on Timeout (cmd with a regular switch) */
 | 
			
		||||
  /*********************************************************************************************************/
 | 
			
		||||
  if (RcSeq_SignalTimeout(RC_SIGNAL, 250, &RcSignalPinState))
 | 
			
		||||
  {
 | 
			
		||||
    /* Launch the"OpeningSequence" sequence  if a LOW level is present during at least 250ms: this allows testing the sequence of servo without using a RC set, just using a regular switch */
 | 
			
		||||
    if((LastExecutedSeqIdx == COMMAND_CLOSE) && (RcSignalPinState == LOW))
 | 
			
		||||
    {
 | 
			
		||||
        RcSeq_LaunchSequence(OpeningSequence);
 | 
			
		||||
    }
 | 
			
		||||
    /* Launch the"ClosingSequence" sequence  if a HIGH level is present during at least 250ms: this allows testing the sequence of servo without using a RC set, just using a regular switch */
 | 
			
		||||
    if((LastExecutedSeqIdx == COMMAND_OPEN) && (RcSignalPinState == HIGH))
 | 
			
		||||
    {
 | 
			
		||||
        RcSeq_LaunchSequence(ClosingSequence);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The Control() fonction is automatically called by the RcSeq library */
 | 
			
		||||
uint8_t Control(uint8_t Action, uint8_t SeqIdx)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t Ret = 0;
 | 
			
		||||
  #if !defined(__AVR_ATtiny24__) && !defined(__AVR_ATtiny44__) && !defined(__AVR_ATtiny84__) && !defined(__AVR_ATtiny25__) && !defined(__AVR_ATtiny45__) && !defined(__AVR_ATtiny85__) && !defined(__AVR_ATtiny167__)
 | 
			
		||||
  Serial.print("Action=");Serial.print(Action);Serial.print(" SeqIdx=");Serial.println(SeqIdx);
 | 
			
		||||
  #endif
 | 
			
		||||
  switch(Action)
 | 
			
		||||
  {
 | 
			
		||||
    case RC_SEQ_START_CONDITION: /* RcSeq asks if the conditions are met to launch the sequence SeqIdx  */
 | 
			
		||||
    /* Put here a condition to allow RcSeq launching the sequence SeqIdx (Put Ret=1 if no specific condition) */
 | 
			
		||||
    Ret = (SeqIdx != LastExecutedSeqIdx); /* Allows RcSeq launching the sequence if the sequence to launch is different from the last one */
 | 
			
		||||
    break;
 | 
			
		||||
    
 | 
			
		||||
    case RC_SEQ_END_OF_SEQ: /* RcSeq informs the sequence SeqIdx is finished */
 | 
			
		||||
    /* We memorize the last finished sequence id in EEPROM memory. Like that, at next power-up, we will know how to position the servos ( done in the Setup() ) */  
 | 
			
		||||
    EEPROM.write(0, SeqIdx);
 | 
			
		||||
    LastExecutedSeqIdx = SeqIdx;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  return(Ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
#include <RcSeq.h>
 | 
			
		||||
#include <TinyPinChange.h>  /* Ne pas oublier d'inclure la librairie <TinyPinChange>  qui est utilisee par la librairie <RcSeq> */
 | 
			
		||||
#include <SoftRcPulseIn.h>  /* Ne pas oublier d'inclure la librairie <SoftRcPulseIn>  qui est utilisee par la librairie <RcSeq> */
 | 
			
		||||
#include <SoftRcPulseOut.h> /* Ne pas oublier d'inclure la librairie <SoftRcPulseOut> qui est utilisee par la librairie <RcSeq> */
 | 
			
		||||
#include <TinyPinChange.h>
 | 
			
		||||
#include <SoftRcPulseIn.h>
 | 
			
		||||
#include <SoftRcPulseOut.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
IMPORTANT:
 | 
			
		||||
@@ -25,16 +25,16 @@ enum {RC_VOIE1, RC_VOIE2, RC_VOIE3, NBR_VOIES_RC}; /* Declaration des voies */
 | 
			
		||||
 | 
			
		||||
enum {BP1, BP2, NBR_BP}; /* Declaration des Boutons-Poussoirs (On peut aller jusqu'à BP8) */
 | 
			
		||||
 | 
			
		||||
enum {POS_MINUS1, POS_PLUS1,NBR_POS}; /* Declaration des positions du Manche on peut aller de POS_MOINS2 à POS_PLUS2 (4 Positions actives Max)*/
 | 
			
		||||
enum {POS_MINUS1, POS_PLUS1, NBR_POS}; /* Declaration des positions du Manche on peut aller de POS_MOINS2 à POS_PLUS2 (4 Positions actives Max)*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Declaration d'un clavier "Maison": les impulsions des Boutons-Poussoirs n'ont pas besoin d'etre equidistantes */
 | 
			
		||||
enum {BP_MAISON1, BP_MAISON2, BP_MAISON3, NBR_BP_MAISON};
 | 
			
		||||
#define TOLERANCE  40 /* Tolerance en + ou en - (en micro-seconde) */
 | 
			
		||||
KeyMap_t ClavierMaison[] PROGMEM ={  {VALEUR_CENTRALE_US(1100,TOLERANCE)}, /* BP_MAISON1: 1100 +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1300,TOLERANCE)}, /* BP_MAISON2: 1300 +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1700,TOLERANCE)}, /* BP_MAISON3: 1700 +/-40 us */
 | 
			
		||||
                                  };
 | 
			
		||||
const KeyMap_t ClavierMaison[] PROGMEM ={  {VALEUR_CENTRALE_US(1100, TOLERANCE)}, /* BP_MAISON1: 1100 +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1300, TOLERANCE)}, /* BP_MAISON2: 1300 +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1700, TOLERANCE)}, /* BP_MAISON3: 1700 +/-40 us */
 | 
			
		||||
                                        };
 | 
			
		||||
 | 
			
		||||
enum {AZIMUT=0, ELEVATION , NBR_SERVO}; /* Delaration de tous les servos, 2 dans cet exemple (On peut déclaer jusqu'à 8 servos) */
 | 
			
		||||
 | 
			
		||||
@@ -80,23 +80,23 @@ enum {AZIMUT=0, ELEVATION , NBR_SERVO}; /* Delaration de tous les servos, 2 dans
 | 
			
		||||
#define DEM_ARRET_POUR_CENT                  5 /* Pourcentage du mouvement devant etre effectue a mi-vitesse pour demarrage servo et arret servo (Soft start et Soft stop) */
 | 
			
		||||
 | 
			
		||||
/* Declaration de la table de sequence des mouvements des servo et des actions courtes */
 | 
			
		||||
SequenceSt_t SequenceServoEtActionCourte[] PROGMEM = {
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_MONTEE_PONT_HAUT_MS)
 | 
			
		||||
const SequenceSt_t SequenceServoEtActionCourte[] PROGMEM = {
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_MONTEE_PONT_HAUT_MS)
 | 
			
		||||
    /* Montee du Zodiac du pont vers la position haute */
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_PONT,ELEVATION_POS_HAUT,DEMARRAGE_MONTEE_PONT_HAUT_MS,DUREE_MONTEE_PONT_HAUT_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_PONT, ELEVATION_POS_HAUT, DEMARRAGE_MONTEE_PONT_HAUT_MS, DUREE_MONTEE_PONT_HAUT_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
    /* Rotation Grue du pont vers la mer */
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT,AZIMUT_POS_PONT,AZIMUT_POS_MER,DEMARRAGE_ROTATION_PONT_MER_MS,DUREE_ROTATION_PONT_MER_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT, AZIMUT_POS_PONT, AZIMUT_POS_MER, DEMARRAGE_ROTATION_PONT_MER_MS, DUREE_ROTATION_PONT_MER_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
    /* Descente du Zodiac depuis la position haute vers la la mer */
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_HAUT,ELEVATION_POS_MER,DEMARRAGE_DESCENTE_HAUT_MER_MS,DUREE_DESCENTE_HAUT_MER_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_DESCENTE_HAUT_MER_MS+DUREE_DESCENTE_HAUT_MER_MS)
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_MONTEE_MER_HAUT_MS)
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_HAUT, ELEVATION_POS_MER, DEMARRAGE_DESCENTE_HAUT_MER_MS, DUREE_DESCENTE_HAUT_MER_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_DESCENTE_HAUT_MER_MS + DUREE_DESCENTE_HAUT_MER_MS)
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_MONTEE_MER_HAUT_MS)
 | 
			
		||||
    /* Montee du Zodiac de la mer vers la position haute */
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_MER,ELEVATION_POS_HAUT,DEMARRAGE_MONTEE_MER_HAUT_MS,DUREE_MONTEE_MER_HAUT_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_MER, ELEVATION_POS_HAUT, DEMARRAGE_MONTEE_MER_HAUT_MS, DUREE_MONTEE_MER_HAUT_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
    /* Rotation Grue de la mer vers le pont */
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT,AZIMUT_POS_MER,AZIMUT_POS_PONT,DEMARRAGE_ROTATION_MER_PONT_MS,DUREE_ROTATION_MER_PONT_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT, AZIMUT_POS_MER, AZIMUT_POS_PONT, DEMARRAGE_ROTATION_MER_PONT_MS, DUREE_ROTATION_MER_PONT_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
    /* Descente du Zodiac de la position haute vers le pont */
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_HAUT,ELEVATION_POS_PONT,DEMARRAGE_DESCENTE_HAUT_PONT_MS,DUREE_DESCENTE_HAUT_PONT_MS,DEM_ARRET_POUR_CENT)                                   
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_DESCENTE_HAUT_PONT_MS+DUREE_DESCENTE_HAUT_PONT_MS)
 | 
			
		||||
    MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_HAUT, ELEVATION_POS_PONT, DEMARRAGE_DESCENTE_HAUT_PONT_MS, DUREE_DESCENTE_HAUT_PONT_MS, DEM_ARRET_POUR_CENT)                                   
 | 
			
		||||
    ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_DESCENTE_HAUT_PONT_MS + DUREE_DESCENTE_HAUT_PONT_MS)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
#define LED		13
 | 
			
		||||
@@ -114,22 +114,22 @@ void setup()
 | 
			
		||||
    RcSeq_DeclareServo(AZIMUT,    BROCHE_SIGNAL_SERVO_AZ);
 | 
			
		||||
 | 
			
		||||
    /* Commande d'une action courte et d'une sequence de servos avec 2 BP du clavier de la VOIE1 */
 | 
			
		||||
    RcSeq_DeclareSignal(RC_VOIE1,BROCHE_SIGNAL_RECEPTEUR_VOIE1);
 | 
			
		||||
    RcSeq_DeclareSignal(RC_VOIE1, BROCHE_SIGNAL_RECEPTEUR_VOIE1);
 | 
			
		||||
    RcSeq_DeclareClavier(RC_VOIE1, 1000, 2000, NBR_BP);
 | 
			
		||||
    RcSeq_DeclareCommandeEtActionCourte(RC_VOIE1, BP1, InverseLed);
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(RC_VOIE1, BP2, RC_SEQUENCE(SequenceServoEtActionCourte));
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(RC_VOIE1, BP2, RC_SEQUENCE(SequenceServoEtActionCourte), NULL);
 | 
			
		||||
 | 
			
		||||
    /* Commande d'une action courte et d'une sequence de servos avec le manche de la VOIE2 */
 | 
			
		||||
    RcSeq_DeclareSignal(RC_VOIE2,BROCHE_SIGNAL_RECEPTEUR_VOIE2);
 | 
			
		||||
    RcSeq_DeclareSignal(RC_VOIE2, BROCHE_SIGNAL_RECEPTEUR_VOIE2);
 | 
			
		||||
    RcSeq_DeclareManche(RC_VOIE2, 1000, 2000, NBR_POS);
 | 
			
		||||
    RcSeq_DeclareCommandeEtActionCourte(RC_VOIE2, POS_MINUS1, InverseLed);
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(RC_VOIE2, POS_PLUS1, RC_SEQUENCE(SequenceServoEtActionCourte));
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(RC_VOIE2, POS_PLUS1, RC_SEQUENCE(SequenceServoEtActionCourte), NULL);
 | 
			
		||||
 | 
			
		||||
    /* Commande d'une action courte et d'une sequence de servos avec le clavier "maison" de la VOIE3 */
 | 
			
		||||
    RcSeq_DeclareSignal(RC_VOIE3,BROCHE_SIGNAL_RECEPTEUR_VOIE3);
 | 
			
		||||
    RcSeq_DeclareSignal(RC_VOIE3, BROCHE_SIGNAL_RECEPTEUR_VOIE3);
 | 
			
		||||
    RcSeq_DeclareClavierMaison(RC_VOIE3, RC_CLAVIER_MAISON(ClavierMaison));
 | 
			
		||||
    RcSeq_DeclareCommandeEtActionCourte(RC_VOIE3, BP_MAISON1, InverseLed);
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(RC_VOIE3, BP_MAISON3, RC_SEQUENCE(SequenceServoEtActionCourte));
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(RC_VOIE3, BP_MAISON3, RC_SEQUENCE(SequenceServoEtActionCourte), NULL);
 | 
			
		||||
 | 
			
		||||
    pinMode(LED, OUTPUT);
 | 
			
		||||
}
 | 
			
		||||
@@ -142,13 +142,13 @@ void loop()
 | 
			
		||||
/* Action associee au BP1 de la VOIE1 ou au manche position basse de la VOIE2 ou au BP_MAISON1 de la VOIE3 */
 | 
			
		||||
void InverseLed(void)
 | 
			
		||||
{
 | 
			
		||||
static uint32_t DebutMs=millis(); /* static, pour conserver l'etat entre 2 appels de la fonction */
 | 
			
		||||
static boolean Etat=HIGH;         /* static, pour conserver l'etat entre 2 appels de la fonction */
 | 
			
		||||
static uint32_t DebutMs = millis(); /* static, pour conserver l'etat entre 2 appels de la fonction */
 | 
			
		||||
static boolean Etat = HIGH;         /* static, pour conserver l'etat entre 2 appels de la fonction */
 | 
			
		||||
 | 
			
		||||
  if(millis() - DebutMs >= 500UL) /* Depuis RcSeq V2.0, la tempo inter-commande doit etre geree dans le sketch utilisateur */
 | 
			
		||||
  {
 | 
			
		||||
    DebutMs=millis();
 | 
			
		||||
    DebutMs = millis();
 | 
			
		||||
    digitalWrite(LED, Etat);
 | 
			
		||||
    Etat=!Etat; /* Au prochain appel de InverseLed(), l'etat de la LED sera inverse */
 | 
			
		||||
    Etat = !Etat; /* Au prochain appel de InverseLed(), l'etat de la LED sera inverse */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,9 +32,9 @@ Cette sequence utilise:
 | 
			
		||||
/* ETAPE N°1: Inclure les 4 librairies necessaires */
 | 
			
		||||
/***************************************************/
 | 
			
		||||
#include <RcSeq.h>
 | 
			
		||||
#include <TinyPinChange.h>  /* Ne pas oublier d'inclure la librairie <TinyPinChange>  qui est utilisee par la librairie <RcSeq> */
 | 
			
		||||
#include <SoftRcPulseIn.h>  /* Ne pas oublier d'inclure la librairie <SoftRcPulseIn>  qui est utilisee par la librairie <RcSeq> */
 | 
			
		||||
#include <SoftRcPulseOut.h> /* Ne pas oublier d'inclure la librairie <SoftRcPulseOut> qui est utilisee par la librairie <RcSeq> */
 | 
			
		||||
#include <TinyPinChange.h>
 | 
			
		||||
#include <SoftRcPulseIn.h>
 | 
			
		||||
#include <SoftRcPulseOut.h>
 | 
			
		||||
 | 
			
		||||
/*****************************************************/
 | 
			
		||||
/* ETAPE N°2: Enumeration des signaux de commande RC */
 | 
			
		||||
@@ -121,23 +121,23 @@ Ordre                  <---DUREE_MONTEE_PONT_HAUT_MS--> <--DUREE_ROTATION_PONT_M
 | 
			
		||||
/* Il est possible d'inclure des actions courtes. Il suffit d'utiliser la macro ACTION_COURTE_A_EFFECTUER() en donnant le nom de la fonction a appeler et le   */
 | 
			
		||||
/* moment ou l'action doit avoir lieu. Dans cet exemple, la LED s'allume pendant que les servos tournent et s'eteint pendant la pause de 6 secondes.           */
 | 
			
		||||
/***************************************************************************************************************************************************************/
 | 
			
		||||
SequenceSt_t SequencePlus2[] PROGMEM = {
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_MONTEE_PONT_HAUT_MS)
 | 
			
		||||
const SequenceSt_t SequencePlus2[] PROGMEM = {
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_MONTEE_PONT_HAUT_MS)
 | 
			
		||||
	/* Montee du Zodiac du pont vers la position haute */
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_PONT,ELEVATION_POS_HAUT,DEMARRAGE_MONTEE_PONT_HAUT_MS,DUREE_MONTEE_PONT_HAUT_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_PONT, ELEVATION_POS_HAUT, DEMARRAGE_MONTEE_PONT_HAUT_MS, DUREE_MONTEE_PONT_HAUT_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
	/* Rotation Grue du pont vers la mer */
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT,AZIMUT_POS_PONT,AZIMUT_POS_MER,DEMARRAGE_ROTATION_PONT_MER_MS,DUREE_ROTATION_PONT_MER_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT, AZIMUT_POS_PONT, AZIMUT_POS_MER, DEMARRAGE_ROTATION_PONT_MER_MS, DUREE_ROTATION_PONT_MER_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
	/* Descente du Zodiac depuis la position haute vers la la mer */
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_HAUT,ELEVATION_POS_MER,DEMARRAGE_DESCENTE_HAUT_MER_MS,DUREE_DESCENTE_HAUT_MER_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_DESCENTE_HAUT_MER_MS+DUREE_DESCENTE_HAUT_MER_MS)
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_MONTEE_MER_HAUT_MS)
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_HAUT, ELEVATION_POS_MER, DEMARRAGE_DESCENTE_HAUT_MER_MS, DUREE_DESCENTE_HAUT_MER_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_DESCENTE_HAUT_MER_MS + DUREE_DESCENTE_HAUT_MER_MS)
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_MONTEE_MER_HAUT_MS)
 | 
			
		||||
	/* Montee du Zodiac de la mer vers la position haute */
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_MER,ELEVATION_POS_HAUT,DEMARRAGE_MONTEE_MER_HAUT_MS,DUREE_MONTEE_MER_HAUT_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_MER, ELEVATION_POS_HAUT, DEMARRAGE_MONTEE_MER_HAUT_MS, DUREE_MONTEE_MER_HAUT_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
	/* Rotation Grue de la mer vers le pont */
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT,AZIMUT_POS_MER,AZIMUT_POS_PONT,DEMARRAGE_ROTATION_MER_PONT_MS,DUREE_ROTATION_MER_PONT_MS,DEM_ARRET_POUR_CENT)
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(AZIMUT, AZIMUT_POS_MER, AZIMUT_POS_PONT, DEMARRAGE_ROTATION_MER_PONT_MS, DUREE_ROTATION_MER_PONT_MS, DEM_ARRET_POUR_CENT)
 | 
			
		||||
	/* Descente du Zodiac de la position haute vers le pont */
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION,ELEVATION_POS_HAUT,ELEVATION_POS_PONT,DEMARRAGE_DESCENTE_HAUT_PONT_MS,DUREE_DESCENTE_HAUT_PONT_MS,DEM_ARRET_POUR_CENT)                                    
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed,DEMARRAGE_DESCENTE_HAUT_PONT_MS+DUREE_DESCENTE_HAUT_PONT_MS)
 | 
			
		||||
	MVT_AVEC_DEBUT_ET_FIN_MVT_LENTS(ELEVATION, ELEVATION_POS_HAUT, ELEVATION_POS_PONT, DEMARRAGE_DESCENTE_HAUT_PONT_MS, DUREE_DESCENTE_HAUT_PONT_MS, DEM_ARRET_POUR_CENT)                                    
 | 
			
		||||
	ACTION_COURTE_A_EFFECTUER(InverseLed, DEMARRAGE_DESCENTE_HAUT_PONT_MS + DUREE_DESCENTE_HAUT_PONT_MS)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
#define LED		13
 | 
			
		||||
@@ -158,7 +158,7 @@ void setup()
 | 
			
		||||
/**************************************************************************************/
 | 
			
		||||
/* ETAPE N°13: declarer le(s) signal(aux) de commande RC avec leur N° de pin digitale */
 | 
			
		||||
/**************************************************************************************/
 | 
			
		||||
    RcSeq_DeclareSignal(SIGNAL_RC,BROCHE_SIGNAL_RECEPTEUR);
 | 
			
		||||
    RcSeq_DeclareSignal(SIGNAL_RC, BROCHE_SIGNAL_RECEPTEUR);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************************/
 | 
			
		||||
/* ETAPE N°14: que le signal RC est associe a un manche qui a NBR_RC_IMPULSIONS positions */
 | 
			
		||||
@@ -174,7 +174,7 @@ void setup()
 | 
			
		||||
/**************************************************************************************************************************/
 | 
			
		||||
/* ETAPE N°16: declarer le signal de commande de sequence, le niveau du manche, et la sequence ou action courte a appeler */
 | 
			
		||||
/**************************************************************************************************************************/
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(SIGNAL_RC, RC_IMPULSION_NIVEAU_PLUS_2, RC_SEQUENCE(SequencePlus2)); // Voici comment declarer une sequence actionnee par une impulsion Niveau Plus 2 (manche en position extreme pendant au moins 250 ms)
 | 
			
		||||
    RcSeq_DeclareCommandeEtSequence(SIGNAL_RC, RC_IMPULSION_NIVEAU_PLUS_2, RC_SEQUENCE(SequencePlus2), NULL); // Voici comment declarer une sequence actionnee par une impulsion Niveau Plus 2 (manche en position extreme pendant au moins 250 ms)
 | 
			
		||||
 | 
			
		||||
    pinMode(LED, OUTPUT);
 | 
			
		||||
    RcSeq_DeclareCommandeEtActionCourte(SIGNAL_RC, RC_IMPULSION_NIVEAU_MOINS_1, InverseLed); // Voici comment declarer une action actionnee par une impulsion Niveau Moins 1 (manche en position mi-course pendant au moins 250 ms)
 | 
			
		||||
 
 | 
			
		||||
@@ -30,31 +30,31 @@ enum {RC_VOIE, NBR_VOIES_RC}; /* Ici, comme il n'y a qu'une voie, on aurait pu f
 | 
			
		||||
/* Declaration d'un clavier "Maison": les impulsions des Boutons-Poussoirs n'ont pas besoin d'etre equidistantes */
 | 
			
		||||
enum {BP1, BP2, BP3, BP4, BP5, BP6, BP7, BP8, NBR_BP};
 | 
			
		||||
#define TOLERANCE  40 /* Tolerance en + ou en - (en micro-seconde): ATTENTION, il ne doit pas y avoir recouvrement entre 2 zones actives adjascentes. Zone active = 2 x TOLERANCE (us) */
 | 
			
		||||
KeyMap_t ClavierMaison[] PROGMEM ={  {VALEUR_CENTRALE_US(1100,TOLERANCE)}, /* BP1: +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1200,TOLERANCE)}, /* BP2: +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1300,TOLERANCE)}, /* BP3: +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1400,TOLERANCE)}, /* BP4: +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1600,TOLERANCE)}, /* BP5: +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1700,TOLERANCE)}, /* BP6: +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1800,TOLERANCE)}, /* BP7: +/-40 us */
 | 
			
		||||
                                     {VALEUR_CENTRALE_US(1900,TOLERANCE)}, /* BP8: +/-40 us */
 | 
			
		||||
                                  };
 | 
			
		||||
const KeyMap_t ClavierMaison[] PROGMEM ={  {VALEUR_CENTRALE_US(1100,TOLERANCE)}, /* BP1: +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1200,TOLERANCE)}, /* BP2: +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1300,TOLERANCE)}, /* BP3: +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1400,TOLERANCE)}, /* BP4: +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1600,TOLERANCE)}, /* BP5: +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1700,TOLERANCE)}, /* BP6: +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1800,TOLERANCE)}, /* BP7: +/-40 us */
 | 
			
		||||
                                           {VALEUR_CENTRALE_US(1900,TOLERANCE)}, /* BP8: +/-40 us */
 | 
			
		||||
                                        };
 | 
			
		||||
 | 
			
		||||
//==============================================================================================
 | 
			
		||||
/* Astuce: une macro pour n'ecrire qu'une seule fois la fonction ActionX() */
 | 
			
		||||
#define DECLARE_ACTION(Idx)                              \
 | 
			
		||||
void Action##Idx(void)                                   \
 | 
			
		||||
{                                                        \
 | 
			
		||||
static uint32_t DebutMs=millis();                        \
 | 
			
		||||
static boolean Etat=HIGH;                                \
 | 
			
		||||
static uint32_t DebutMs = millis();                      \
 | 
			
		||||
static boolean Etat = HIGH;                              \
 | 
			
		||||
/* Depuis la version 2.0 de la lib <RcSeq>, pour      */ \
 | 
			
		||||
/* des raisons de reactivite, la tempo inter-commande */ \
 | 
			
		||||
/* doit etre geree dans le sketch utilisateur.        */ \
 | 
			
		||||
  if(millis() - DebutMs >= 500UL)                        \
 | 
			
		||||
  {                                                      \
 | 
			
		||||
    DebutMs=millis();                                    \
 | 
			
		||||
    DebutMs = millis();                                  \
 | 
			
		||||
    digitalWrite(Idx, Etat);                             \
 | 
			
		||||
    Etat=!Etat;                                          \
 | 
			
		||||
    Etat = !Etat;                                        \
 | 
			
		||||
  }                                                      \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user