diff shore/shore.ino @ 0:fe0a2f223e10

Initial commit of split brain code for the Sea Dragon.
author Daniel O'Connor <darius@dons.net.au>
date Sat, 11 Jul 2015 15:20:05 +0930
parents
children 7d4ec58da1d8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/shore/shore.ino	Sat Jul 11 15:20:05 2015 +0930
@@ -0,0 +1,136 @@
+#include <avr/pgmspace.h>
+
+#include <Servo.h>
+#include <Wire.h>
+#include <LiquidCrystal_I2C.h>
+#include "log_lookup.h"
+
+// DFRobot I/O Expansion Shield V7 - http://www.dfrobot.com/wiki/index.php/IO_Expansion_Shield_for_Arduino_V7_SKU:DFR0265
+// 2xPS3 joysticks connected like so
+// Joy 1 Horizontal - Left/right   - AD0
+// Joy 1 Vertical   - Forward/back - AD1
+// Joy 1 Button     - Unused       - D2
+// Joy 2 Horizontal - Unused       - AD2
+// Joy 2 Vertical   - Up/down      - AD3
+// Joy 2 Button     - Unused       - D3
+
+// LCD panel
+LiquidCrystal_I2C lcd(0x27, 16, 2);  // I/O expander is at 0x27, LCD is 16x2
+
+void setup() {
+	int byte;
+
+	Serial.begin(115200);
+
+	// Set joystick button pins as inputs
+	pinMode(7, INPUT);
+	pinMode(8, INPUT);
+
+	lcd.init();
+	lcd.backlight();
+	lcd.print("Hello world!");
+}
+
+void loop() {
+	int joy1X, joy1Y, joy2X, joy2Y, but1, but2;
+	int lint, rint, vint, ldir, rdir, vdir, ethrot;
+	float k, l, r, v, x, y;
+	char lcdbuf[16 + 1]; // Buffer 1 line
+
+	k = 1.5;
+
+	joy1X = analogRead(A0);
+	joy1Y = analogRead(A1);
+	but1 = !digitalRead(7); // Buttons are active low
+	joy2X = analogRead(A2);
+	joy2Y = analogRead(A3);
+	but2 = !digitalRead(8);
+
+#if 0
+	Serial.print("Joy 1 X: "); Serial.print(joy1X); Serial.print("  ");
+	Serial.print("Y: "); Serial.print(joy1Y); Serial.print("   Button:  ");
+	Serial.println(but1);
+	Serial.print("Joy 2 X: "); Serial.print(joy2X); Serial.print("  ");
+	Serial.print("Y: "); Serial.print(joy2Y); Serial.print("   Button:  ");
+	Serial.println(but2);
+#endif
+	// Create deadband in the centre because they don't sit at 512
+	if (joy1X > 500 && joy1X < 510) // Sits at 505
+		joy1X = 512;
+	if (joy1Y > 516 && joy1Y < 526) // Sits at 521
+		joy1Y = 512;
+	if (joy2X > 500 && joy2X < 510) // Sits at 505
+		joy2X = 512;
+	if (joy2Y > 520 && joy2Y < 530) // Sits at 525
+		joy2Y = 512;
+
+	// Mix 'joystick' input to left/right thrust (elevon mixing)
+	// http://eastbay-rc.blogspot.com.au/2011/05/elevon-v-tail-mixing-calculations.html
+	x = (joy1X - 512.0) / 512.0; // More positive = right
+	y = (joy1Y - 512.0) / 512.0; // More positive = forward, convert to -1..1
+
+	l =  1 * (x / 2 + y / 2);
+        r = -1 * (x / 2 - y / 2);
+
+	v = ((float)(joy2Y - 512) / 512.0);
+
+	// Apply some gain
+	l *= 2.2;
+	r *= 2.2;
+
+	// Limit
+	if (l > 1)
+		l = 1;
+	if (l < -1)
+		l = -1;
+	if (r > 1)
+		r = 1;
+	if (r < -1)
+		r = -1;
+	if (v < -1)
+		v = -1;
+	if (v > 1)
+		v = 1;
+
+	// Map values to -255..255
+	lint = l * 255;
+	rint = r * 255;
+	vint = v * 255;
+
+	// Apply log transfer function
+	ldir = lint < 0 ? 0 : 1; // 0 = reverse, 1 = forward
+	lint = pgm_read_byte_near(log_lookup + abs(lint));
+	rdir = rint < 0 ? 0 : 1;
+	rint = pgm_read_byte_near(log_lookup + abs(rint));
+	vdir = vint < 0 ? 0 : 1;
+	vint = pgm_read_byte_near(log_lookup + abs(vint));
+
+#if 0
+	Serial.print("l = "); Serial.print(l); Serial.print(" "); Serial.print(lint); Serial.print(" "); Serial.print(ldir);
+	Serial.print(" r = "); Serial.print(r); Serial.print(" "); Serial.print(rint); Serial.print(" "); Serial.print(r);
+	Serial.print(" v = "); Serial.print(vint); Serial.print(" "); Serial.println(vdir);
+#else
+	Serial.print("L:");
+	Serial.print(lint * (ldir == 0 ? -1 : 1));
+	Serial.print(" R:");
+	Serial.print(rint * (rdir == 0 ? -1 : 1));
+	Serial.print(" V:");
+	Serial.print(vint * (vdir == 0 ? -1 : 1));
+	Serial.println();
+#endif
+
+	snprintf(lcdbuf, sizeof(lcdbuf) - 1, "L%c%3dR%c%3dV%c%3d", ldir == 0 ? '-' : '+', lint,
+	    rdir == 0 ? '-' : '+', rint, vdir == 0 ? '-' : '+', vint);
+	lcd.setCursor(0, 0);
+	lcd.print(lcdbuf);
+	snprintf(lcdbuf, sizeof(lcdbuf) - 1, "  B1: %d  B2: %d   ", but1, but2);
+	lcd.setCursor(0, 1);
+	lcd.print(lcdbuf);
+	delay(200);
+}
+
+/*
+ * Local variables:
+ * mode: c++
+ * End:
+ */