updated 7seg controls for new 7 seg boards
Dependencies: PixelArray WS2812 mbed
Fork of frdm_pong_table_controller by
Revision 0:f2b739e846ae, committed 2017-02-27
- Comitter:
- benswindell
- Date:
- Mon Feb 27 16:38:51 2017 +0000
- Child:
- 1:24bc4d8ed2ae
- Commit message:
- Added in trace;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PixelArray.lib Mon Feb 27 16:38:51 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/chris/code/PixelArray/#b45a70faaa83
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WS2812.lib Mon Feb 27 16:38:51 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/bridadan/code/WS2812/#6e647820f587
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Feb 27 16:38:51 2017 +0000
@@ -0,0 +1,407 @@
+#include "mbed.h"
+#include "WS2812.h"
+#include "PixelArray.h"
+
+#define WS2812_BUF 112
+#define NUM_COLORS 6
+#define NUM_LEDS_PER_COLOR 1
+
+//-------- Colours -----------
+#define RED 0x2f0000
+#define YELLOW 0x2f2f00
+#define GREEN 0x002f00
+#define LIGHTBLUE 0x002f2f
+#define DARKBLUE 0x00002f
+#define BLUE 0x0000ff // Player scored a goal
+#define PINK 0x2f002f
+#define OFF 0x000000
+#define WHITE 0xffffff
+#define ARMBLUE 0x128BAB
+#define PURPLE 0xff0055 // Player has conceded a goal
+
+// GPIO
+AnalogIn robotBreakBeam(A0);
+AnalogIn playerBreakBeam(A1);
+DigitalOut led_green(LED_GREEN, 1);
+
+// SERIAL
+Serial pc(USBTX, USBRX); // tx, rx
+
+// LED STRIPS
+// See the program page for information on the timing numbers
+// The given numbers are for the K64F
+WS2812 robotScoreLED(D9, WS2812_BUF, 0, 5, 5, 0);
+WS2812 playerScoreLED(D8,WS2812_BUF, 0, 5, 5, 0);
+WS2812 robotGoalLED(D7,WS2812_BUF, 0, 5, 5, 0);
+WS2812 playerGoalLED(D6,WS2812_BUF, 0, 5, 5, 0);
+
+// LED Variables
+bool seg1A, seg1B, seg1C, seg1D, seg1E, seg1F, seg1G;
+int seg1Array[112];
+int mainArray[11][122];
+PixelArray px(WS2812_BUF);
+
+// Score counters
+int robotScore;
+int playerScore;
+int scoreLimit = 3;
+bool finishedGame = false;
+int endFlashes = 0;
+int numFlashes;
+
+// Robot Bream Beam value
+double prevRbbValue; // Previous Robot break beam value
+double prevPbbValue; // Previous player break beam value
+
+// FUNCTION DECLERATIONS
+void Write7Seg(int num);
+void SetLEDArray(int x);
+void WriteRobotGoal(bool scored);
+void WritePlayerGoal(bool scored);
+void WriteScores();
+void HandleGoal(bool hasRobotScored);
+void WritePxScores(int line_num);
+void WritePxGoal(unsigned int colour);
+
+
+void setup()
+{
+ // Set brightness of the 4 LED strips
+ robotScoreLED.setII(0xFF);
+ robotScoreLED.useII(WS2812::GLOBAL);
+ playerScoreLED.setII(0xFF);
+ playerScoreLED.useII(WS2812::GLOBAL);
+ robotGoalLED.setII(0xFF);
+ robotGoalLED.useII(WS2812::GLOBAL);
+ playerGoalLED.setII(0xFF);
+ playerGoalLED.useII(WS2812::GLOBAL);
+
+ // Turn on green LED
+ led_green = 0;
+
+ // Fills 2D array with data
+ for(int i=0; i<10; i++) {
+ Write7Seg(i);
+ }
+
+ // Set scores to 0
+ robotScore = 0;
+ playerScore = 0;
+ numFlashes = 0;
+
+ // Set LEDS to start values
+ WriteScores();
+ wait(0.01);
+ WritePlayerGoal(true);
+ wait(0.01);
+ WriteRobotGoal(true);
+
+ // Turn off green LED
+ led_green = 1;
+}
+
+// Set segment variables
+void Write7Seg(int num)
+{
+ switch (num) {
+ case 0 :
+ // Off
+ seg1A = 1;
+ seg1B = 1;
+ seg1C = 1;
+ seg1D = 1;
+ seg1E = 1;
+ seg1F = 1;
+ seg1G = 0;
+
+ SetLEDArray(0);
+
+ break;
+
+ case 1 :
+ // 1
+ seg1A = 0;
+ seg1B = 1;
+ seg1C = 1;
+ seg1D = 0;
+ seg1E = 0;
+ seg1F = 0;
+ seg1G = 0;
+
+ SetLEDArray(1);
+ break;
+
+ case 2 :
+ // 2
+ seg1A = 1;
+ seg1B = 1;
+ seg1C = 0;
+ seg1D = 1;
+ seg1E = 1;
+ seg1F = 0;
+ seg1G = 1;
+
+ SetLEDArray(2);
+
+ break;
+
+ case 3 :
+ // 3
+ seg1A = 1;
+ seg1B = 1;
+ seg1C = 1;
+ seg1D = 1;
+ seg1E = 0;
+ seg1F = 0;
+ seg1G = 1;
+
+ SetLEDArray(3);
+ break;
+
+ case 4:
+ // 4
+ seg1A = 0;
+ seg1B = 1;
+ seg1C = 1;
+ seg1D = 0;
+ seg1E = 0;
+ seg1F = 1;
+ seg1G = 1;
+
+ SetLEDArray(4);
+
+ break;
+
+ case 5:
+ // 5
+ seg1A = 1;
+ seg1B = 0;
+ seg1C = 1;
+ seg1D = 1;
+ seg1E = 0;
+ seg1F = 1;
+ seg1G = 1;
+
+ SetLEDArray(5);
+
+ break;
+
+ case 6:
+ // 6
+ seg1A = 1;
+ seg1B = 0;
+ seg1C = 1;
+ seg1D = 1;
+ seg1E = 1;
+ seg1F = 1;
+ seg1G = 1;
+
+ SetLEDArray(6);
+
+ break;
+
+ case 7:
+ // 7
+ seg1A = 1;
+ seg1B = 1;
+ seg1C = 1;
+ seg1D = 0;
+ seg1E = 0;
+ seg1F = 0;
+ seg1G = 0;
+
+ SetLEDArray(7);
+
+ break;
+
+ case 8:
+ // 8
+ seg1A = 1;
+ seg1B = 1;
+ seg1C = 1;
+ seg1D = 1;
+ seg1E = 1;
+ seg1F = 1;
+ seg1G = 1;
+
+ SetLEDArray(8);
+ break;
+
+ case 9:
+ // 9
+ seg1A = 1;
+ seg1B = 1;
+ seg1C = 1;
+ seg1D = 0;
+ seg1E = 0;
+ seg1F = 1;
+ seg1G = 1;
+
+ SetLEDArray(9);
+ break;
+
+ case 10:
+ // OFF
+ seg1A = 0;
+ seg1B = 0;
+ seg1C = 0;
+ seg1D = 0;
+ seg1E = 0;
+ seg1F = 0;
+ seg1G = 0;
+
+ SetLEDArray(10);
+ break;
+
+ default :
+
+ break;
+
+ }
+}
+
+// Write segment config to main array
+void SetLEDArray(int x)
+{
+ for (int i = 0; i < WS2812_BUF; i++) {
+ if (i < 16) {
+ mainArray[x][i] = seg1A;
+ }
+
+ if ( i >= 16 && i < 32) {
+ mainArray[x][i] = seg1B;
+ }
+
+ if (i >= 32 && i < 48) {
+ mainArray[x][i] = seg1C;
+ }
+
+ if (i >= 48 && i < 64) {
+ mainArray[x][i]= seg1D;
+ }
+
+ if ( i >= 64 && i < 80) {
+ mainArray[x][i] = seg1E;
+ }
+
+ if (i >= 80 && i < 96) {
+ mainArray[x][i] = seg1F;
+ }
+
+ if ( i >= 96 && i < 112) {
+ mainArray[x][i] = seg1G;
+ }
+ }// FOR LOOP
+}
+
+// Write to player 1 LED (ROBOT)
+void WriteRobotGoal(bool scored)
+{
+ if(scored == true)
+ {
+ WritePxGoal(BLUE);
+ } else {
+ WritePxGoal(PURPLE);
+ }
+ robotGoalLED.write(px.getBuf());
+}
+
+// Write to player 1 LED (ROBOT)
+void WritePlayerGoal(bool scored)
+{
+ if(scored == true)
+ {
+ WritePxGoal(BLUE);
+ } else {
+ WritePxGoal(PURPLE);
+ }
+ playerGoalLED.write(px.getBuf());
+}
+
+void WriteGoalsOff()
+{
+ WritePxGoal(OFF);
+ robotGoalLED.write(px.getBuf());
+ WritePxGoal(OFF);
+ playerGoalLED.write(px.getBuf());
+}
+
+void WriteScores()
+{
+ WritePxScores(playerScore);
+ playerScoreLED.write(px.getBuf());
+ wait(0.01);
+ WritePxScores(robotScore);
+ robotScoreLED.write(px.getBuf());
+}
+
+// Write pixel array
+void WritePxScores(int line_num)
+{
+ for (int i = 0; i < WS2812_BUF; i++) {
+ if (mainArray[line_num][i] == 0) {
+ px.Set(i,OFF);
+ }
+
+ if (mainArray[line_num][i] == 1) {
+ px.Set(i,LIGHTBLUE);
+ }
+ }
+}
+
+void WritePxGoal(unsigned int colour)
+{
+ for (int i = 0; i < WS2812_BUF; i++) {
+ px.Set(i,colour);
+ }
+}
+
+void HandleGoal(bool hasRobotScored)
+{
+ if(hasRobotScored == true) {
+ robotScore++;
+ WriteRobotGoal(true);
+ wait(0.01);
+ WritePlayerGoal(false);
+ wait(0.01);
+ WriteScores();
+ } else {
+ playerScore++;
+ WriteRobotGoal(false);
+ wait(0.01);
+ WritePlayerGoal(true);
+ wait(0.01);
+ WriteScores();
+ }
+
+ wait(5);
+ WriteGoalsOff();
+}
+
+int main()
+{
+ while(1) {
+ double rbbValue = robotBreakBeam; // Read Robot Break beam
+ double pbbValue = playerBreakBeam; // Read Player Break beam
+
+ // IF PLAYER HAS SCORED A GOAL
+ if ((prevRbbValue - rbbValue)>0.01) {
+ pc.printf("Player has scored a goal \n\r");
+ HandleGoal(false);
+ }
+
+ // IF ROBOT HAS SCORED A GOAL
+ if ((prevPbbValue - pbbValue) > 0.01) {
+ pc.printf("Robot has scored a goal \n\r");
+ HandleGoal(true);
+ }
+
+ prevRbbValue = rbbValue;
+ prevPbbValue = pbbValue;
+
+ pc.printf("PlayerGoal: %f, RobotGoal: %f",pbbValue,rbbValue);
+ pc.printf("Player: %i v %i : Robot",playerScore,robotScore);
+ wait(0.01);
+
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Feb 27 16:38:51 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/ef9c61f8c49f \ No newline at end of file
