This is only part of forum, that is closest to my problem where i can post.
I'm new to Arduino or C++, but still managed to get my project started.
I'm building prototype for tank(alike, nothing like that actually). chassis is driven by motors, which are controlled by relays (no variable speed needed) and 6 channel RC-Controller controlling everything. There is allso option to flip switch on controller to put this device to follow line taped to floor. Steering is working and switch is reading properly on serial monitor. I have minor difficulties to get FAILSAFE working and creating "subrutine" to be activated via switch. I think that FAILSAFE should be own "rutine" and Line following allso. So any thoughts or suggestions how to build code?
THX For replays.
Ville
Finland
#include <EnableInterrupt.h>
//Serial nopeus ja kanavamäärä
#define SERIAL_PORT_SPEED 9600
#define RC_NUM_CHANNELS 4
//KanavaNimet
#define RC_CH1 0
#define RC_CH2 1
#define RC_CH3 2
#define RC_CH4 3
//KanavaInputit
#define RC_CH1_INPUT A0
#define RC_CH2_INPUT A1
#define RC_CH3_INPUT A2
#define RC_CH4_INPUT A3
//Keskeytykset
uint16_t rc_values[RC_NUM_CHANNELS];
uint32_t rc_start[RC_NUM_CHANNELS];
volatile uint16_t rc_shared[RC_NUM_CHANNELS];
void rc_read_values() {
noInterrupts();
memcpy(rc_values, (const void *)rc_shared, sizeof(rc_shared));
interrupts();
}
void calc_input(uint8_t channel, uint8_t input_pin) {
if (digitalRead(input_pin) == HIGH) {
rc_start[channel] = micros();
} else {
uint16_t rc_compare = (uint16_t)(micros() - rc_start[channel]);
rc_shared[channel] = rc_compare;
}
}
void calc_ch1() {
calc_input(RC_CH1, RC_CH1_INPUT);
}
void calc_ch2() {
calc_input(RC_CH2, RC_CH2_INPUT);
}
void calc_ch3() {
calc_input(RC_CH3, RC_CH3_INPUT);
}
void calc_ch4() {
calc_input(RC_CH4, RC_CH4_INPUT);
}
void setup() {
Serial.begin(SERIAL_PORT_SPEED);
//pinMode(2, INPUT);
//pinMode(3, INPUT);
pinMode(RC_CH1_INPUT, INPUT);
pinMode(RC_CH2_INPUT, INPUT);
pinMode(RC_CH3_INPUT, INPUT);
pinMode(RC_CH4_INPUT, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
//Ulostulot pois päältä käynnistyksessä
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
enableInterrupt(RC_CH1_INPUT, calc_ch1, CHANGE);
enableInterrupt(RC_CH2_INPUT, calc_ch2, CHANGE);
enableInterrupt(RC_CH3_INPUT, calc_ch3, CHANGE);
enableInterrupt(RC_CH4_INPUT, calc_ch4, CHANGE);
}
void loop() {
rc_read_values();
Serial.print("CH1:");
Serial.print(rc_values[RC_CH1]);
Serial.print("\t");
Serial.print("CH2:");
Serial.print(rc_values[RC_CH2]);
Serial.print("\t");
Serial.print("CH3:");
Serial.print(rc_values[RC_CH3]);
Serial.print("\t");
Serial.print("CH4:");
Serial.println(rc_values[RC_CH4]);
delay(200);
//Vedellään Releitä
if (rc_values[RC_CH1] < 1600) {
digitalWrite(9, HIGH);
} else digitalWrite(9, LOW);
if (rc_values[RC_CH1] > 1450) {
digitalWrite(10, HIGH);
} else digitalWrite(10, LOW);
if (rc_values[RC_CH2] > 1450) {
digitalWrite(11, HIGH);
} else digitalWrite(11, LOW);
if (rc_values[RC_CH2] < 1600) {
digitalWrite(12, HIGH);
} else digitalWrite(12, LOW);
//Lisäkanava kytkimellä(n.1100-1900)
if (rc_values[RC_CH3] > 1500) {
digitalWrite(13, HIGH);
} else digitalWrite(13, LOW);
//FAILSAFE
if (rc_values[RC_CH4] < 1800) {
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
}
}

