Просмотр исходного кода

Use interrupt-based values + do graph output

Jason Tarka 4 лет назад
Родитель
Сommit
d9773a7280
2 измененных файлов с 34 добавлено и 29 удалено
  1. 26 28
      03_main.ino
  2. 8 1
      rc_receiver_driving.ino

+ 26 - 28
03_main.ino

@@ -1,63 +1,49 @@
 char outputStr[100];
-int16_t averages[AVG_PERIODS];
-
-#define INT_MODE
+int16_t averages[2][AVG_PERIODS];
 
 void loop() {
-#ifdef INT_MODE
+#ifdef SCAN_MODE
 	for(byte ch = LOW_CHANNEL; ch <= NUM_CHANNELS; ch++) {
 		int val = channelVals[ch];
 		sprintf(outputStr, "Channel-%d:%d\t", ch, val);
 		Serial.print(outputStr);
 	}
 	Serial.println();
-#elif SCAN_MODE
-	for(byte i = LOW_CHANNEL; i <= NUM_CHANNELS; i++) {
-		readChannel(i);
-	}
 #else
-	Serial.println("============");
 	int throttle = getThrottle();
 	throttle = restrictThrottlePower(throttle);
 	throttle = getAverage(throttle);
 
+	sprintf(outputStr, "Throttle:%d", throttle);
+	Serial.println(outputStr);
+
 	digitalWrite(LEFT_MOTOR_DIRECT_PIN, throttle > 0 ? HIGH : LOW);
 	analogWrite(LEFT_MOTOR_PIN, throttle > 0 ? throttle : -throttle);
 #endif
 
-	Serial.println();
 	delay(SCAN_DELAY);
 }
 
-#define TIMEOUT_MICROS 30000
-
-uint16_t readChannel(byte channel) {
-	int val = pulseIn(channels[channel], HIGH, TIMEOUT_MICROS);
-
-#ifdef SCAN_MODE
-	if(val > 100) val -= 1000;
-	if(channel > 1) Serial.print(" ");
-	Serial.print(val);
-#else
-	sprintf(outputStr, "Channel %d:\t%d", channel, val);
-	Serial.println(outputStr);
-#endif
-	return val;
-}
-
 const int throtDeadHigh = THROT_NONE + THROT_DEAD_ZONE,
 	throtDeadLow = THROT_NONE - THROT_DEAD_ZONE;
 
 int getThrottle() {
-	int val = readChannel(THROT_CHANNEL);
+	int val = channelVals[THROT_CHANNEL];
+#ifndef GRAPH
+	Serial.println();
 	Serial.print("Channel value: ");
 	Serial.print(val);
 	Serial.print("\t");
+#endif
 	if(val <= THROT_OFF) {
+#ifndef GRAPH
 		Serial.println("Throttle is off");
+#endif
 		return 0;
 	} else if(val < throtDeadHigh && val > throtDeadLow) {
+#ifndef GRAPH
 		Serial.println("Throttle in dead zone");
+#endif
 		return 0;
 	}
 	
@@ -67,26 +53,34 @@ int getThrottle() {
 		: map(val, THROT_NONE, THROT_MAX, 0, OUTPUT_RANGE);
 	
 	throttle = constrain(throttle, -OUTPUT_RANGE, OUTPUT_RANGE);
+#ifndef GRAPH
 	Serial.print("Throttle: ");
 	Serial.println(throttle);
+#endif
 	return throttle;
 }
 
 int restrictThrottlePower(int throttle) {
 	// Reduce the average voltage to something safe for the motor to consume.
 	throttle = (throttle * MAX_POWER_PERCENT) / 100;
+
+#ifndef GRAPH
 	Serial.print("Restricted throttle:\t");
 	Serial.println(throttle);
+#endif
 
 	// Use the current value of the knob to reduce the speed.
-	int speedKnob = readChannel(SPEED_CHANNEL);
+	int speedKnob = channelVals[SPEED_CHANNEL];
 	speedKnob = map(speedKnob, SPEED_MIN, SPEED_MAX, 0, 100);
 	speedKnob = constrain(speedKnob, 0, 100);
 	throttle = (throttle * speedKnob) / 100;
+
+#ifndef GRAPH
 	Serial.print("Speed knob:\t");
 	Serial.println(speedKnob);
 	Serial.print("Speed adjusted throttle:\t");
 	Serial.println(throttle);
+#endif
 	
 	return throttle;
 }
@@ -99,7 +93,11 @@ int getAverage(const int throttle) {
 	}
 	averages[AVG_PERIODS-1] = throttle;
 	total /= AVG_PERIODS;
+
+#ifndef GRAPH
 	Serial.print("Average adjusted throttle:\t");
 	Serial.println(total);
+#endif
+
 	return total;
 }

+ 8 - 1
rc_receiver_driving.ino

@@ -10,7 +10,14 @@
 ///////////////////////
 
 #define SCAN_DELAY 10 // Delay between updates in ms
-#define AVG_PERIODS 10 // Number of periods to average the speed over (reduces random variances)
+#define AVG_OVER_MILLIS 200 // Number of milliseconds to average the speed over
+#define AVG_PERIODS AVG_OVER_MILLIS/SCAN_DELAY // Number of periods to average the speed over (reduces random variances)
+
+/////////////////////////////////////////////////////////////////////////
+// Output config
+/////////////////////////////////////////////////////////////////////////
+
+#define GRAPH
 
 /////////////////////////////////////////////////////////////////////////
 // Channel pins