Multiswitch de Robbe y Arduino.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • tsenecal

    #46
    another web site also indicates that the large number of pins (32) that the documentation lists is not accurate:

    http://arduino.stackexchange.com/que...de-not-working

    again, that link shows you should be safe using A8-A15.

    Comment

    • pedro gomez
      • Sep 2007
      • 91

      #47
      Arduino PinchangeInt & MEGA

      Originally posted by tsenecal View Post
      another web site also indicates that the large number of pins (32) that the documentation lists is not accurate:

      http://arduino.stackexchange.com/que...de-not-working

      again, that link shows you should be safe using A8-A15.
      Hi Tim:
      Yes I saw this forum.
      Yes I tested in A8 ,A9,A10,A11, and A12, and it Runs.
      By the way, I would check all pins and I say you the results.

      Comment

      • kklee6
        Junior Member
        • Apr 2017
        • 1

        #48
        Thanks to tsenecal and pedro.
        I was able to construct an arduino multi switch prop 12+2 decoder based on their codes.

        Here is a short video of my results ( I am very happy about it. )





        Here is my code:

        #include <EnableInterrupt.h>
        #include <Servo.h>

        #define AUX_IN_PIN 2 //input pin for servo channel from RX
        volatile int current_output = 0;
        volatile unsigned long unAuxInShared;
        volatile unsigned long ulAuxStart;
        volatile int output_ready;
        volatile int multi_output[10]; // output 3 - 8 3-position switch , output 1 - 2 servo
        int output_pins[10];
        int outputB_pins[10];
        Servo servos[10];


        void setup() {

        // init array of outout pins,
        // 3 - 8 switch position A
        // 1 - 2 servo

        output_pins[0] = 0;
        output_pins[1] = 15; //ananlog pin A1 as servo output
        output_pins[2] = 16; //ananlog pin A2 as servo output
        output_pins[3] = 3;
        output_pins[4] = 5;
        output_pins[5] = 7;
        output_pins[6] = 9;
        output_pins[7] = 11;
        output_pins[8] = 13;
        output_pins[9] = 0;

        // 3 - 8 switch position B

        outputB_pins[0] = 0;
        outputB_pins[1] = 0;
        outputB_pins[2] = 0;
        outputB_pins[3] = 4;
        outputB_pins[4] = 6;
        outputB_pins[5] = 8;
        outputB_pins[6] = 10;
        outputB_pins[7] = 12;
        outputB_pins[8] = 14; // ananlog pin A0 as digital output
        outputB_pins[9] = 0;

        // assign output_pins 3 - 8 as output
        for (int outputnum = 3; outputnum < 9; outputnum++) {
        pinMode(output_pins[outputnum], OUTPUT);
        pinMode(outputB_pins[outputnum], OUTPUT);
        }


        //set up the array of switch and servo objects, and init switch to LOW and servo to a "centered" position
        for (int outputnum = 1; outputnum < 9; outputnum++) {


        if (outputnum > 2) {
        digitalWrite(output_pins[outputnum], LOW);
        digitalWrite(outputB_pins[outputnum], LOW);
        }

        if (outputnum == 1) {
        multi_output[outputnum] = 1500;
        servos[outputnum].attach(output_pins[outputnum]);
        servos[outputnum].writeMicroseconds(multi_output[outputnum]);
        }

        if (outputnum == 2) {
        multi_output[outputnum] = 1500;
        servos[outputnum].attach(output_pins[outputnum]);
        servos[outputnum].writeMicroseconds(multi_output[outputnum]);
        }
        }

        unAuxInShared = 0;

        output_ready = 0;

        //attach an interrupt to the RX input pin
        enableInterrupt(AUX_IN_PIN, calcAux, CHANGE);
        }


        void loop() {
        // put your main code here, to run repeatedly:
        int outputnum = 0;

        //if the interrupt routine flag is set... we have a set of servos to move
        if (output_ready == 1) {
        for (outputnum = 1; outputnum < 9; outputnum++) {
        if (outputnum > 2) {
        if ((multi_output[outputnum] >= 1020) && (multi_output[outputnum] <= 1070)) {
        digitalWrite(output_pins[outputnum], HIGH);
        }
        if ((multi_output[outputnum] >= 1940) && (multi_output[outputnum] <= 1980)) {
        digitalWrite(outputB_pins[outputnum], HIGH);
        }
        if ((multi_output[outputnum] >= 1480) && (multi_output[outputnum] <= 1540)) {
        digitalWrite(output_pins[outputnum], LOW);
        digitalWrite(outputB_pins[outputnum], LOW);
        }
        }


        if (outputnum == 1) {
        servos[outputnum].writeMicroseconds(multi_output[outputnum]);
        }
        if (outputnum == 2) {
        servos[outputnum].writeMicroseconds(multi_output[outputnum]);
        }
        }
        output_ready = 0;
        }
        }


        void calcAux()
        {
        if (digitalRead(AUX_IN_PIN) == HIGH)
        {
        ulAuxStart = micros();
        }
        else
        {
        unAuxInShared = (uint16_t)(micros() - ulAuxStart);
        current_output++;

        //if the servo positioning value is outside the normal range,
        //we have a "sync" signal, reset the array index
        if (unAuxInShared < 1000) {
        current_output = 0;
        output_ready = 1;
        }

        if (unAuxInShared > 2000) {
        current_output = 0;
        output_ready = 1;
        }

        if (current_output < 10) {
        multi_output[current_output] = unAuxInShared;
        }
        }
        }


        My next modification is to add a fail safe function. Any suggestions?

        KK
        Last edited by kklee6; 05-03-2017, 05:36 AM.

        Comment

        Working...