mirror of https://github.com/nealey/proton
Added wand and 7seg displays
This commit is contained in:
parent
e58a19a2d1
commit
4068174d1a
|
@ -10,26 +10,44 @@
|
||||||
#include "Synchrotron.h"
|
#include "Synchrotron.h"
|
||||||
|
|
||||||
// Music Player
|
// Music Player
|
||||||
#define MUSIC_CS 7
|
#define MUSIC_MCS 7
|
||||||
#define MUSIC_DATA 6
|
#define MUSIC_DCS 6
|
||||||
#define MUSIC_CARDCS 4
|
#define MUSIC_CCS 4
|
||||||
#define MUSIC_REQ 3
|
#define MUSIC_DRQ 0 // Cut trace on board and wire to 0, so you can use 3 for SPI
|
||||||
MusicPlayer *music;
|
MusicPlayer *music;
|
||||||
|
|
||||||
|
// LED output scaling
|
||||||
|
#define brightness 255
|
||||||
|
|
||||||
// Synchrotron
|
// Synchrotron
|
||||||
#define SYNC1_NPIXELS 24
|
#define SYNC1_NPIXELS 24
|
||||||
#define SYNC1_DATA 5
|
#define SYNC1_DATA 5
|
||||||
Synchrotron *sync1;
|
Synchrotron *sync1;
|
||||||
|
|
||||||
|
// Neutrona Wand
|
||||||
|
#define WAND1_NPIXELS 14
|
||||||
|
#define WAND1_DATA 9
|
||||||
|
Synchrotron *wand1;
|
||||||
|
|
||||||
|
// Displays
|
||||||
|
Adafruit_7segment disp1;
|
||||||
|
Adafruit_7segment disp2;
|
||||||
|
|
||||||
// Debug LED
|
// Debug LED
|
||||||
#define DEBUG 13
|
#define DEBUG 13
|
||||||
|
|
||||||
// Inputs
|
// Inputs
|
||||||
#define TRIGGER 8
|
#define TRIGGER 8
|
||||||
|
#define POT1 A0
|
||||||
|
|
||||||
// global time counter
|
// global time counter
|
||||||
unsigned long jiffies = 0;
|
unsigned long jiffies = 0;
|
||||||
|
|
||||||
|
// 6 seems to be about what my overly-critical brain needs to buffer out
|
||||||
|
// any delays caused by NMI sections of music player code so that they're unnoticeable
|
||||||
|
#define MILLIS_PER_JIFFY 6
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
randomSeed(analogRead(12));
|
randomSeed(analogRead(12));
|
||||||
|
|
||||||
|
@ -40,10 +58,20 @@ void setup() {
|
||||||
pinMode(DEBUG, OUTPUT);
|
pinMode(DEBUG, OUTPUT);
|
||||||
|
|
||||||
// music player, this sets up SPI for us
|
// music player, this sets up SPI for us
|
||||||
music = new MusicPlayer(MUSIC_CS, MUSIC_DATA, MUSIC_REQ, MUSIC_CARDCS);
|
music = new MusicPlayer(MUSIC_MCS, MUSIC_DCS, MUSIC_DRQ, MUSIC_CCS);
|
||||||
|
|
||||||
// synchrotron
|
// synchrotron
|
||||||
sync1 = new Synchrotron(SYNC1_NPIXELS, SYNC1_DATA);
|
sync1 = new Synchrotron(SYNC1_NPIXELS, SYNC1_DATA);
|
||||||
|
|
||||||
|
// nuetrona wand
|
||||||
|
wand1 = new Synchrotron(WAND1_NPIXELS, WAND1_DATA);
|
||||||
|
|
||||||
|
// 7segment displays
|
||||||
|
disp1 = Adafruit_7segment();
|
||||||
|
disp1.begin(0x70);
|
||||||
|
|
||||||
|
disp2 = Adafruit_7segment();
|
||||||
|
disp2.begin(0x71);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,39 +84,39 @@ void flashDebug() {
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
static int state = 0;
|
static int state = 0;
|
||||||
// 6 seems to be about what my overly-critical brain needs to buffer out
|
static float disp2val = 40.83;
|
||||||
// any music player delays so that they're unnoticeable
|
unsigned long new_jiffies = millis() / MILLIS_PER_JIFFY;
|
||||||
unsigned long new_jiffies = millis() / 6;
|
|
||||||
boolean trigger = ! digitalRead(TRIGGER);
|
boolean trigger = ! digitalRead(TRIGGER);
|
||||||
|
|
||||||
music->poll(jiffies);
|
music->poll(jiffies);
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case 0:
|
case 0: // move to steady state
|
||||||
if (trigger && music->startPlayingFile("track001.mp3")) {
|
sync1->transition(400, 12, brightness, 0, 0);
|
||||||
state = 1;
|
wand1->transition(400, 24, brightness, 0, 0);
|
||||||
sync1->charge();
|
state = 10;
|
||||||
|
break;
|
||||||
|
case 10: // waiting for charge button
|
||||||
|
if (trigger && sync1->transitioned() && music->startPlayingFile("track001.mp3")) {
|
||||||
|
state = 20;
|
||||||
|
sync1->transition(700, 2, brightness, brightness/8, 0);
|
||||||
|
wand1->transition(700, 10, brightness, brightness/8, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 20: // charge button pressed
|
||||||
if (! music->isPlaying()) {
|
if (sync1->transitioned()) {
|
||||||
state = 3;
|
state = 30;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 30: // waiting for fire button
|
||||||
if (trigger && music->startPlayingFile("track003.mp3")) {
|
if (trigger && music->startPlayingFile("nutrona.mp3")) {
|
||||||
state = 4;
|
state = 40;
|
||||||
sync1->fire();
|
sync1->transition(40, 1, brightness/8, brightness/4, brightness/2);
|
||||||
|
wand1->transition(40, 5, brightness/6, brightness/2, brightness/6);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 40: // fire button pressed
|
||||||
if (! trigger && music->startPlayingFile("track002.mp3")) {
|
if (! trigger && music->startPlayingFile("track002.mp3")) {
|
||||||
state = 5;
|
|
||||||
sync1->discharge();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
if (! music->isPlaying()) {
|
|
||||||
state = 0;
|
state = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -97,6 +125,17 @@ void loop() {
|
||||||
if (new_jiffies > jiffies) {
|
if (new_jiffies > jiffies) {
|
||||||
jiffies = new_jiffies;
|
jiffies = new_jiffies;
|
||||||
sync1->tick(jiffies);
|
sync1->tick(jiffies);
|
||||||
|
wand1->tick(jiffies);
|
||||||
|
|
||||||
|
if (jiffies % 10 == 0) {
|
||||||
|
// This is expensive
|
||||||
|
disp1.printFloat(5198 * sync1->speed());
|
||||||
|
disp1.writeDisplay();
|
||||||
|
|
||||||
|
disp2val = analogRead(POT1) / 10.0;
|
||||||
|
disp2.printFloat(disp2val, 1);
|
||||||
|
disp2.writeDisplay();
|
||||||
|
}
|
||||||
flashDebug();
|
flashDebug();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,12 +39,22 @@ Synchrotron::transition(int duration, int final_tickrate, byte final_r, byte fin
|
||||||
initial_b = b;
|
initial_b = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Synchrotron::transitioned() {
|
||||||
|
return (transition_elapsed >= transition_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
Synchrotron::speed() {
|
||||||
|
return 1 / ftickrate;
|
||||||
|
}
|
||||||
|
|
||||||
Synchrotron::standby() {
|
Synchrotron::standby() {
|
||||||
transition(400, 12, brightness, 0, 0);
|
transition(400, 12, brightness, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Synchrotron::charge() {
|
Synchrotron::charge() {
|
||||||
transition(400, 2, brightness, brightness/8, 0);
|
transition(700, 2, brightness, brightness/8, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Synchrotron::fire() {
|
Synchrotron::fire() {
|
||||||
|
@ -75,10 +85,11 @@ Synchrotron::tick(unsigned long jiffies) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transition_length > transition_elapsed) {
|
if (transition_length > transition_elapsed) {
|
||||||
tickrate = initial_tickrate + (dtickrate * transition_elapsed);
|
transition_elapsed += 1;
|
||||||
|
ftickrate = initial_tickrate + (dtickrate * transition_elapsed);
|
||||||
|
tickrate = ftickrate;
|
||||||
r = initial_r + (dr * transition_elapsed);
|
r = initial_r + (dr * transition_elapsed);
|
||||||
g = initial_g + (dg * transition_elapsed);
|
g = initial_g + (dg * transition_elapsed);
|
||||||
b = initial_b + (db * transition_elapsed);
|
b = initial_b + (db * transition_elapsed);
|
||||||
transition_elapsed += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,9 +14,12 @@ class Synchrotron {
|
||||||
int transition_length, transition_elapsed;
|
int transition_length, transition_elapsed;
|
||||||
int initial_tickrate, initial_r, initial_g, initial_b;
|
int initial_tickrate, initial_r, initial_g, initial_b;
|
||||||
float dtickrate, dr, dg, db;
|
float dtickrate, dr, dg, db;
|
||||||
|
float ftickrate;
|
||||||
public:
|
public:
|
||||||
Synchrotron(uint16_t n, uint8_t p=6, neoPixelType t=NEO_GRB + NEO_KHZ800);
|
Synchrotron(uint16_t n, uint8_t p=6, neoPixelType t=NEO_GRB + NEO_KHZ800);
|
||||||
transition(int duration, int final_tickrate, byte final_r, byte final_g, byte final_b);
|
transition(int duration, int final_tickrate, byte final_r, byte final_g, byte final_b);
|
||||||
|
bool transitioned();
|
||||||
|
float speed();
|
||||||
standby();
|
standby();
|
||||||
charge();
|
charge();
|
||||||
fire();
|
fire();
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,119 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="141.89731mm"
|
||||||
|
height="141.89731mm"
|
||||||
|
viewBox="0 0 502.78573 502.78572"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="radlove.svg">
|
||||||
|
<defs
|
||||||
|
id="defs4" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1.4"
|
||||||
|
inkscape:cx="240.22136"
|
||||||
|
inkscape:cy="248.73745"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g4238"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1016"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-120.0357,-286.68361)">
|
||||||
|
<g
|
||||||
|
id="g4238">
|
||||||
|
<circle
|
||||||
|
r="242.39842"
|
||||||
|
cy="538.07648"
|
||||||
|
cx="371.42856"
|
||||||
|
id="path4136"
|
||||||
|
style="opacity:1;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:17.98888016;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||||
|
<path
|
||||||
|
d="m 479.19755,351.41513 a 215.53796,215.53796 0 0 1 107.76897,186.66135 l -215.53796,0 z"
|
||||||
|
sodipodi:end="0"
|
||||||
|
sodipodi:start="5.2359878"
|
||||||
|
sodipodi:ry="215.53796"
|
||||||
|
sodipodi:rx="215.53796"
|
||||||
|
sodipodi:cy="538.07648"
|
||||||
|
sodipodi:cx="371.42856"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.9955101;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
id="circle4161" />
|
||||||
|
<path
|
||||||
|
d="M 155.89059,538.07647 A 215.53796,215.53796 0 0 1 263.65958,351.41513 l 107.76898,186.66135 z"
|
||||||
|
sodipodi:end="4.1887902"
|
||||||
|
sodipodi:start="3.1415927"
|
||||||
|
sodipodi:ry="215.53796"
|
||||||
|
sodipodi:rx="215.53796"
|
||||||
|
sodipodi:cy="538.07648"
|
||||||
|
sodipodi:cx="371.42856"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
id="path4163"
|
||||||
|
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.9955101;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
|
||||||
|
<path
|
||||||
|
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.9955101;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
id="path4165"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="371.42856"
|
||||||
|
sodipodi:cy="538.07648"
|
||||||
|
sodipodi:rx="215.53796"
|
||||||
|
sodipodi:ry="215.53796"
|
||||||
|
sodipodi:start="1.0471976"
|
||||||
|
sodipodi:end="2.0943951"
|
||||||
|
d="m 479.19753,724.73783 a 215.53796,215.53796 0 0 1 -215.53795,0 L 371.42856,538.07648 Z" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(0.79020839,0,0,0.79020839,-76.502899,240.96985)"
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
id="layer1-7">
|
||||||
|
<g
|
||||||
|
transform="matrix(0.97556,0,0,0.97556,-18.264,24.845)"
|
||||||
|
style="stroke:#af024c;stroke-width:2.87529993"
|
||||||
|
id="g17152">
|
||||||
|
<path
|
||||||
|
d="m 540.37525,265.35878 c -29.691,0.61893 -55.518,19.25 -64.878,50.794 -15.808,81.974 75.349,116.47 125.55,165.46 43.586,-56.698 128.92,-71.353 124.66,-155.21 -3.7056,-18.7 -14.155,-33.925 -28.166,-44.632 -18.775,-14.365 -44.927,-19.303 -67.275,-10.718 -11.956,4.22 -22.844,11.552 -30.981,21.271 -14.141,-17.43 -36.494,-27.452 -58.909,-26.962 z"
|
||||||
|
style="fill:#d40055;stroke:#000000;stroke-width:15.06948352;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
sodipodi:nodetypes="cccccccc"
|
||||||
|
id="path8148"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.5 KiB |
Loading…
Reference in New Issue