Combines Raspi and Non-Raspi code
This commit is contained in:
2
Non-RaspberryPi/build/tmp/jar/MANIFEST.MF
Normal file
2
Non-RaspberryPi/build/tmp/jar/MANIFEST.MF
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
|
||||||
6
Non-RaspberryPi/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
Non-RaspberryPi/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#Wed Jun 14 10:50:12 CDT 2017
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip
|
||||||
430
RaspberryPi/HPOCV11/HPOCV11.ino
Executable file
430
RaspberryPi/HPOCV11/HPOCV11.ino
Executable file
@@ -0,0 +1,430 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
#define ON 1
|
||||||
|
#define OFF 0
|
||||||
|
#define TIMREADA2D 0
|
||||||
|
#define TIMCLICKRELAY 1
|
||||||
|
#define TIMFLASHEDISONLED 2
|
||||||
|
#define TIMWRITED2A 3
|
||||||
|
#define TIMREADDIGS 4
|
||||||
|
|
||||||
|
void AnalogIn(void);
|
||||||
|
void AnalogOut(void);
|
||||||
|
void FlashEdisonLED(void);
|
||||||
|
void Relays(void);
|
||||||
|
void ReadDigitals(void);
|
||||||
|
void Timers(void);
|
||||||
|
|
||||||
|
unsigned int anout1; // Analog output value 1 - 0xFFFF (0 - 20mA)
|
||||||
|
unsigned int anout2; // Analog output value 2 - 0xFFFF (0 - 20mA)
|
||||||
|
unsigned int anin1; // Analog output value 1 - 0xFFFF (0-20mA, 0-10V, 0-5V)
|
||||||
|
unsigned int anin2; // Analog output value 2 - 0xFFFF (0-20mA, 0-10V, 0-5V)
|
||||||
|
unsigned int anin3; // Analog output value 3 - 0xFFFF (0-20mA, 0-10V, 0-5V)
|
||||||
|
unsigned int anin4; // Analog output value 4 - 0xFFFF (0-20mA, 0-10V, 0-5V)
|
||||||
|
|
||||||
|
// unsigned char edisonled; // flag for led on edison cannot use since messes with SPI
|
||||||
|
unsigned char redled; // flag for red status led
|
||||||
|
unsigned char greenled; // flag for green status led
|
||||||
|
unsigned char relay1, relay2, relay3, relay4, relay5, relay6; // Flags for control of relays
|
||||||
|
unsigned char digin1, digin2, digin3, digin4, digin5, digin6, digin7, digin8; // Flags show dig input state
|
||||||
|
unsigned long oldticker;
|
||||||
|
unsigned int ticker; // Millisecond counter
|
||||||
|
unsigned int timers[10];
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
anout1 = 0;
|
||||||
|
anout2 = 0;
|
||||||
|
relay1 = 0;
|
||||||
|
relay2 = 0;
|
||||||
|
relay3 = 0;
|
||||||
|
relay4 = 0;
|
||||||
|
relay5 = 0;
|
||||||
|
relay6 = 0;
|
||||||
|
redled = 0;
|
||||||
|
greenled = 0;
|
||||||
|
pinMode(0, OUTPUT); // Relay 1
|
||||||
|
pinMode(1, OUTPUT); // Relay 2
|
||||||
|
pinMode(2, OUTPUT); // Relay 3
|
||||||
|
pinMode(3, OUTPUT); // Relay 4
|
||||||
|
pinMode(4, OUTPUT); // Relay 5
|
||||||
|
pinMode(5, OUTPUT); // Relay 6
|
||||||
|
pinMode(6, OUTPUT); // D2A CS
|
||||||
|
pinMode(8, OUTPUT); // Red board LED
|
||||||
|
pinMode(9, OUTPUT); // Green board LED
|
||||||
|
pinMode(11, OUTPUT); // SPI Out data
|
||||||
|
pinMode(12, INPUT); // SPI In data
|
||||||
|
pinMode(13, OUTPUT); // SPI CLK & Board LED)
|
||||||
|
pinMode(A5, INPUT);
|
||||||
|
pinMode(A0, OUTPUT); // Channel select LSB
|
||||||
|
pinMode(A1, OUTPUT); // Channel select 2nd bit
|
||||||
|
pinMode(A2, OUTPUT); // Channel select MSB
|
||||||
|
pinMode(A3, INPUT); // Result from reading digital inputs
|
||||||
|
|
||||||
|
|
||||||
|
// SPISettings settingsA(2000000, MSBFIRST, SPI_MODE1);
|
||||||
|
// SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));
|
||||||
|
SPI.begin();
|
||||||
|
SPI.setBitOrder(MSBFIRST);
|
||||||
|
Serial.begin(9600);
|
||||||
|
pinMode(SS, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Relays(void)
|
||||||
|
{
|
||||||
|
if (relay1 == 1)
|
||||||
|
digitalWrite(0, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(0, LOW);
|
||||||
|
if (relay2 == 1)
|
||||||
|
digitalWrite(1, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(1, LOW);
|
||||||
|
if (relay3 == 1)
|
||||||
|
digitalWrite(2, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(2, LOW);
|
||||||
|
if (relay4 == 1)
|
||||||
|
digitalWrite(3, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(3, LOW);
|
||||||
|
if (relay5 == 1)
|
||||||
|
digitalWrite(4, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(4, LOW);
|
||||||
|
if (relay6 == 1)
|
||||||
|
digitalWrite(5, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(5, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LEDs(void)
|
||||||
|
{
|
||||||
|
if (redled == 1)
|
||||||
|
digitalWrite(8, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(8, LOW);
|
||||||
|
if (greenled == 1)
|
||||||
|
digitalWrite(9, HIGH);
|
||||||
|
else
|
||||||
|
digitalWrite(9, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Timers(void)
|
||||||
|
{
|
||||||
|
unsigned char x;
|
||||||
|
unsigned long milli;
|
||||||
|
milli = millis();
|
||||||
|
if (milli == oldticker)
|
||||||
|
return;
|
||||||
|
oldticker = milli;
|
||||||
|
ticker++;
|
||||||
|
for (x=0; x<10;x++)
|
||||||
|
{
|
||||||
|
if(timers[x] > 0) timers[x]--;
|
||||||
|
}
|
||||||
|
// anout1++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AnalogOut(void)
|
||||||
|
{
|
||||||
|
static unsigned char x = 8;
|
||||||
|
static unsigned char diff;
|
||||||
|
|
||||||
|
unsigned char val;
|
||||||
|
unsigned int val16;
|
||||||
|
unsigned int incomingByte;
|
||||||
|
if (timers[TIMWRITED2A])
|
||||||
|
return;
|
||||||
|
anout1++;
|
||||||
|
// SPI.beginTransaction(2000000, MSBFIRST, SPI_MODE1);
|
||||||
|
digitalWrite(6, LOW);
|
||||||
|
val = 16; // Chan A
|
||||||
|
SPI.transfer(x);
|
||||||
|
if (diff == 1) x++;
|
||||||
|
if (diff == 2) x--;
|
||||||
|
diff = 0;
|
||||||
|
val16 = anout1;
|
||||||
|
val16 = val16 >> 8;
|
||||||
|
val = val16 & 0xFF;
|
||||||
|
SPI.transfer(0);
|
||||||
|
// SPI.transfer(val);
|
||||||
|
val = anout1 & 0xFF;
|
||||||
|
SPI.transfer(val);
|
||||||
|
// SPI.transfer(0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Serial.print(x);
|
||||||
|
Serial.print("\n");
|
||||||
|
|
||||||
|
if (Serial.available() > 0)
|
||||||
|
{
|
||||||
|
incomingByte = Serial.read();
|
||||||
|
if (incomingByte == '.') diff = 1;
|
||||||
|
if (incomingByte == ',') diff = 2;
|
||||||
|
if (incomingByte == ' ') diff = 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
timers[TIMWRITED2A] = 100;
|
||||||
|
digitalWrite(6, HIGH);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void AnalogIn(void)
|
||||||
|
{
|
||||||
|
unsigned char a,b,c;
|
||||||
|
unsigned int x;
|
||||||
|
static unsigned char chan = 0;
|
||||||
|
if (timers[TIMREADA2D])
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(chan)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
digitalWrite(A0, LOW); // Need to set up mux for each A2D like the relays
|
||||||
|
digitalWrite(A1, LOW);
|
||||||
|
digitalWrite(A2, LOW);
|
||||||
|
a = SPI.transfer(0);
|
||||||
|
b = SPI.transfer(0);
|
||||||
|
c = SPI.transfer(0);
|
||||||
|
/* Serial.print(a);
|
||||||
|
Serial.print(",");
|
||||||
|
Serial.print(b);
|
||||||
|
Serial.print(",");
|
||||||
|
Serial.print(c);
|
||||||
|
Serial.print(",");
|
||||||
|
*/ if (c == 13) // 13 good reading, 45 overrange, anything else A2D not ready
|
||||||
|
{
|
||||||
|
x = (unsigned int) a * 256;
|
||||||
|
x = x + b;
|
||||||
|
if (x >= 32767) // wrong ref fix
|
||||||
|
{ // wrong ref fix
|
||||||
|
x = x - 32767; // wrong ref fix
|
||||||
|
x = x * 2; // wrong ref fix
|
||||||
|
} // wrong ref fix
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = 0;
|
||||||
|
anin1 = x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
digitalWrite(A0, HIGH); // Need to set up mux for each A2D like the relays
|
||||||
|
digitalWrite(A1, LOW);
|
||||||
|
digitalWrite(A2, LOW);
|
||||||
|
a = SPI.transfer(0);
|
||||||
|
b = SPI.transfer(0);
|
||||||
|
c = SPI.transfer(0);
|
||||||
|
if (c == 13) // 13 good reading, 45 overrange, anything else A2D not ready
|
||||||
|
{
|
||||||
|
x = (unsigned int) a * 256;
|
||||||
|
x = x + b;
|
||||||
|
if (x >= 32767) // wrong ref fix
|
||||||
|
{ // wrong ref fix
|
||||||
|
x = x - 32767; // wrong ref fix
|
||||||
|
x = x * 2; // wrong ref fix
|
||||||
|
} // wrong ref fix
|
||||||
|
else
|
||||||
|
x = 0;
|
||||||
|
anin2 = x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
digitalWrite(A0, LOW); // Need to set up mux for each A2D like the relays
|
||||||
|
digitalWrite(A1, HIGH);
|
||||||
|
digitalWrite(A2, LOW);
|
||||||
|
a = SPI.transfer(0);
|
||||||
|
b = SPI.transfer(0);
|
||||||
|
c = SPI.transfer(0);
|
||||||
|
if (c == 13) // 13 good reading, 45 overrange, anything else A2D not ready
|
||||||
|
{
|
||||||
|
x = (unsigned int) a * 256;
|
||||||
|
x = x + b;
|
||||||
|
if (x >= 32767) // wrong ref fix
|
||||||
|
{ // wrong ref fix
|
||||||
|
x = x - 32767; // wrong ref fix
|
||||||
|
x = x * 2; // wrong ref fix
|
||||||
|
} // wrong ref fix
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = 0;
|
||||||
|
anin3 = x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
digitalWrite(A0, HIGH); // Need to set up mux for each A2D like the relays
|
||||||
|
digitalWrite(A1, HIGH);
|
||||||
|
digitalWrite(A2, LOW);
|
||||||
|
a = SPI.transfer(0);
|
||||||
|
b = SPI.transfer(0);
|
||||||
|
c = SPI.transfer(0);
|
||||||
|
if (c == 13) // 13 good reading, 45 overrange, anything else A2D not ready
|
||||||
|
{
|
||||||
|
x = (unsigned int) a * 256;
|
||||||
|
x = x + b;
|
||||||
|
if (x >= 32767) // wrong ref fix
|
||||||
|
{ // wrong ref fix
|
||||||
|
x = x - 32767; // wrong ref fix
|
||||||
|
x = x * 2; // wrong ref fix
|
||||||
|
} // wrong ref fix
|
||||||
|
}
|
||||||
|
else
|
||||||
|
x = 0;
|
||||||
|
anin4 = x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
|
|
||||||
|
chan++;
|
||||||
|
if(chan > 3)
|
||||||
|
chan = 0;
|
||||||
|
|
||||||
|
Serial.print(anin1);
|
||||||
|
Serial.print(",");
|
||||||
|
Serial.print(anin2);
|
||||||
|
Serial.print(",");
|
||||||
|
Serial.print(anin3);
|
||||||
|
Serial.print(",");
|
||||||
|
Serial.print(anin4);
|
||||||
|
Serial.print("\n");
|
||||||
|
timers[TIMREADA2D] = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ReadDigitals(void)
|
||||||
|
{
|
||||||
|
if (timers[TIMREADDIGS])
|
||||||
|
return;
|
||||||
|
digitalWrite(A0, LOW);
|
||||||
|
digitalWrite(A1, LOW);
|
||||||
|
digitalWrite(A2, LOW);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin1 = 0;
|
||||||
|
else
|
||||||
|
digin1 = 1;
|
||||||
|
|
||||||
|
digitalWrite(A0, HIGH);
|
||||||
|
digitalWrite(A1, LOW);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin2 = 0;
|
||||||
|
else
|
||||||
|
digin2 = 1;
|
||||||
|
|
||||||
|
digitalWrite(A0, LOW);
|
||||||
|
digitalWrite(A1, HIGH);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin3 = 0;
|
||||||
|
else
|
||||||
|
digin3 = 1;
|
||||||
|
|
||||||
|
digitalWrite(A0, HIGH);
|
||||||
|
digitalWrite(A1, HIGH);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin4 = 0;
|
||||||
|
else
|
||||||
|
digin4 = 1;
|
||||||
|
|
||||||
|
digitalWrite(A0, LOW);
|
||||||
|
digitalWrite(A1, LOW);
|
||||||
|
digitalWrite(A2, HIGH);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin5 = 0;
|
||||||
|
else
|
||||||
|
digin5 = 1;
|
||||||
|
|
||||||
|
digitalWrite(A0, HIGH);
|
||||||
|
digitalWrite(A1, LOW);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin6 = 0;
|
||||||
|
else
|
||||||
|
digin6 = 1;
|
||||||
|
|
||||||
|
digitalWrite(A0, LOW);
|
||||||
|
digitalWrite(A1, HIGH);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin7 = 0;
|
||||||
|
else
|
||||||
|
digin7 = 1;
|
||||||
|
digitalWrite(A0, HIGH);
|
||||||
|
digitalWrite(A1, HIGH);
|
||||||
|
if (digitalRead(A3))
|
||||||
|
digin8 = 0;
|
||||||
|
else
|
||||||
|
digin8 = 1;
|
||||||
|
|
||||||
|
timers[TIMREADDIGS] = 500;
|
||||||
|
Serial.print(digin1);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print(digin2);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print(digin3);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print(digin4);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print(digin5);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print(digin6);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print(digin7);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print(digin8);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.print("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void loop() // the loop function runs over and over again forever
|
||||||
|
{
|
||||||
|
AnalogIn();
|
||||||
|
ReadDigitals();
|
||||||
|
LEDs();
|
||||||
|
Timers();
|
||||||
|
Relays();
|
||||||
|
AnalogOut();
|
||||||
|
|
||||||
|
anout1++;
|
||||||
|
|
||||||
|
if (timers[TIMCLICKRELAY] == 0)
|
||||||
|
{
|
||||||
|
if (relay1)
|
||||||
|
{
|
||||||
|
relay1 = 0;
|
||||||
|
relay2 = 1;
|
||||||
|
relay3 = 0;
|
||||||
|
relay4 = 1;
|
||||||
|
relay5 = 0;
|
||||||
|
relay6 = 1;
|
||||||
|
redled = 1;
|
||||||
|
greenled = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
relay1 = 1;
|
||||||
|
relay2 = 0;
|
||||||
|
relay3 = 1;
|
||||||
|
relay4 = 0;
|
||||||
|
relay5 = 1;
|
||||||
|
relay6 = 0;
|
||||||
|
redled = 0;
|
||||||
|
greenled = 1;
|
||||||
|
}
|
||||||
|
timers[TIMCLICKRELAY] = 5000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
138
RaspberryPi/boardtest.py
Normal file
138
RaspberryPi/boardtest.py
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
"""Test the IO Board."""
|
||||||
|
|
||||||
|
import mraa
|
||||||
|
import time
|
||||||
|
|
||||||
|
relay = []
|
||||||
|
|
||||||
|
for x in range(0, 6):
|
||||||
|
pin = mraa.Gpio(x)
|
||||||
|
pin.dir(mraa.DIR_OUT)
|
||||||
|
relay.append(pin)
|
||||||
|
pin.write(0)
|
||||||
|
|
||||||
|
pinRedLED = mraa.Gpio(8)
|
||||||
|
pinRedLED.dir(mraa.DIR_OUT)
|
||||||
|
|
||||||
|
pinGreenLED = mraa.Gpio(9)
|
||||||
|
pinGreenLED.dir(mraa.DIR_OUT)
|
||||||
|
|
||||||
|
input_mux = [
|
||||||
|
[],
|
||||||
|
[0, 0, 0], # Input 1
|
||||||
|
[1, 0, 0], # Input 2
|
||||||
|
[0, 1, 0], # Input 3
|
||||||
|
[1, 1, 0], # Input 4
|
||||||
|
[0, 0, 1], # Input 5
|
||||||
|
[1, 0, 1], # Input 6
|
||||||
|
[0, 1, 1], # Input 7
|
||||||
|
[1, 1, 1], # Input 8
|
||||||
|
]
|
||||||
|
|
||||||
|
pinA0 = mraa.Gpio(14)
|
||||||
|
pinA0.dir(mraa.DIR_OUT)
|
||||||
|
pinA1 = mraa.Gpio(15)
|
||||||
|
pinA1.dir(mraa.DIR_OUT)
|
||||||
|
pinA2 = mraa.Gpio(16)
|
||||||
|
pinA2.dir(mraa.DIR_OUT)
|
||||||
|
pinA3 = mraa.Gpio(17)
|
||||||
|
pinA3.dir(mraa.DIR_IN)
|
||||||
|
|
||||||
|
spi_bus = mraa.Spi(5)
|
||||||
|
print(spi_bus.lsbmode(False))
|
||||||
|
|
||||||
|
|
||||||
|
def red_LED(out):
|
||||||
|
"""Set the Red LED to the specified output."""
|
||||||
|
if out:
|
||||||
|
pinRedLED.write(1)
|
||||||
|
else:
|
||||||
|
pinRedLED.write(0)
|
||||||
|
|
||||||
|
|
||||||
|
def green_LED(out):
|
||||||
|
"""Set the Green LED to the specified output."""
|
||||||
|
if out:
|
||||||
|
pinGreenLED.write(1)
|
||||||
|
else:
|
||||||
|
pinGreenLED.write(0)
|
||||||
|
|
||||||
|
|
||||||
|
def relay_loop():
|
||||||
|
"""Loop through all relays."""
|
||||||
|
loops = 0
|
||||||
|
while loops < 10:
|
||||||
|
for p in relay:
|
||||||
|
p.write(1)
|
||||||
|
time.sleep(1)
|
||||||
|
p.write(0)
|
||||||
|
loops += 1
|
||||||
|
|
||||||
|
|
||||||
|
def read_dig_in(io_port):
|
||||||
|
"""Read IO Board digital input."""
|
||||||
|
if io_port == 0 or io_port > 8:
|
||||||
|
print("CANNOT READ A PORT THAT DOES NOT EXIST: {}".format(io_port))
|
||||||
|
return False
|
||||||
|
pin_values = input_mux[io_port]
|
||||||
|
pinA0.write(pin_values[0])
|
||||||
|
pinA1.write(pin_values[1])
|
||||||
|
pinA2.write(pin_values[2])
|
||||||
|
return pinA3.read() == 0
|
||||||
|
|
||||||
|
|
||||||
|
def dig_in_loop():
|
||||||
|
"""Read all digital inputs."""
|
||||||
|
for i in range(1, 9):
|
||||||
|
print("DIGIN {} = {}".format(i, read_dig_in(i)))
|
||||||
|
|
||||||
|
|
||||||
|
def led_flash(loops):
|
||||||
|
"""Flash the LED's from red to green."""
|
||||||
|
led_loops = 0
|
||||||
|
while led_loops < loops:
|
||||||
|
red_LED(True)
|
||||||
|
green_LED(False)
|
||||||
|
time.sleep(0.25)
|
||||||
|
red_LED(False)
|
||||||
|
green_LED(True)
|
||||||
|
time.sleep(0.25)
|
||||||
|
led_loops += 1
|
||||||
|
|
||||||
|
red_LED(False)
|
||||||
|
green_LED(False)
|
||||||
|
|
||||||
|
|
||||||
|
def read_analog_in(io_port):
|
||||||
|
"""Read IO Board digital input."""
|
||||||
|
global spi_bus
|
||||||
|
if io_port < 1 or io_port > 4:
|
||||||
|
print("CANNOT READ A PORT THAT DOES NOT EXIST: {}".format(io_port))
|
||||||
|
return False
|
||||||
|
pin_values = input_mux[io_port]
|
||||||
|
pinA0.write(pin_values[0])
|
||||||
|
pinA1.write(pin_values[1])
|
||||||
|
pinA2.write(pin_values[2])
|
||||||
|
ok_status = False
|
||||||
|
|
||||||
|
while ok_status is False:
|
||||||
|
pinA0.write(pin_values[0])
|
||||||
|
pinA1.write(pin_values[1])
|
||||||
|
pinA2.write(pin_values[2])
|
||||||
|
x = spi_bus.write(bytearray([0, 0, 0]))
|
||||||
|
print((x[0], x[1], x[2]))
|
||||||
|
c_bin = format(x[2], '#010b')[2:]
|
||||||
|
|
||||||
|
if c_bin[-3:] == "101":
|
||||||
|
ok_status = True
|
||||||
|
print("OK: {}, Status: {}".format(ok_status, c_bin))
|
||||||
|
print(x[0] * 256 + x[1])
|
||||||
|
time.sleep(10)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# led_flash(10)
|
||||||
|
|
||||||
|
print("Analog {}".format(1))
|
||||||
|
read_analog_in(1)
|
||||||
35
RaspberryPi/build.gradle
Normal file
35
RaspberryPi/build.gradle
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* This build file was generated by the Gradle 'init' task.
|
||||||
|
*
|
||||||
|
* This generated file contains a sample Java Library project to get you started.
|
||||||
|
* For more details take a look at the Java Libraries chapter in the Gradle
|
||||||
|
* user guide available at https://docs.gradle.org/3.5/userguide/java_library_plugin.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Apply the java-library plugin to add support for Java Library
|
||||||
|
apply plugin: 'java-library'
|
||||||
|
|
||||||
|
group = "com.henrypump"
|
||||||
|
version = '0.1'
|
||||||
|
|
||||||
|
// In this section you declare where to find the dependencies of your project
|
||||||
|
repositories {
|
||||||
|
// Use jcenter for resolving your dependencies.
|
||||||
|
// You can declare any Maven/Ivy/file repository here.
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// This dependency is exported to consumers, that is to say found on their compile classpath.
|
||||||
|
api 'org.apache.commons:commons-math3:3.6.1'
|
||||||
|
|
||||||
|
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
|
||||||
|
implementation 'com.google.guava:guava:21.0'
|
||||||
|
|
||||||
|
// Use JUnit test framework
|
||||||
|
testImplementation 'junit:junit:4.12'
|
||||||
|
|
||||||
|
compile group: 'io.mraa', name: 'mraa', version:'1.5.1'
|
||||||
|
compile group: 'com.pi4j', name: 'pi4j-core', version: '1.1'
|
||||||
|
}
|
||||||
|
|
||||||
2
RaspberryPi/build/tmp/jar/MANIFEST.MF
Normal file
2
RaspberryPi/build/tmp/jar/MANIFEST.MF
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
|
||||||
6
RaspberryPi/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
RaspberryPi/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#Wed Jun 14 10:50:12 CDT 2017
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip
|
||||||
127
RaspberryPi/pi_boardtest.py
Normal file
127
RaspberryPi/pi_boardtest.py
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
"""Test the IO Board using a Raspberry Pi."""
|
||||||
|
|
||||||
|
try:
|
||||||
|
import RPi.GPIO as GPIO
|
||||||
|
except RuntimeError:
|
||||||
|
print("Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using 'sudo' to run your script")
|
||||||
|
|
||||||
|
import time
|
||||||
|
import spidev
|
||||||
|
|
||||||
|
spi = spidev.SpiDev()
|
||||||
|
spi.open(0, 0)
|
||||||
|
|
||||||
|
GPIO.setmode(GPIO.BOARD)
|
||||||
|
|
||||||
|
if GPIO.getmode() == 11:
|
||||||
|
mux_channels = [5, 6, 13]
|
||||||
|
inp_channel = 19
|
||||||
|
relay_channels = [21, 20, 16, 12, 25, 24, 23, 18]
|
||||||
|
else:
|
||||||
|
mux_channels = [29, 31, 33]
|
||||||
|
inp_channel = 35
|
||||||
|
relay_channels = [40, 38, 36, 32, 22, 18, 16, 12]
|
||||||
|
|
||||||
|
GPIO.setup(mux_channels, GPIO.OUT)
|
||||||
|
GPIO.setup(relay_channels, GPIO.OUT)
|
||||||
|
GPIO.setup(inp_channel, GPIO.IN)
|
||||||
|
|
||||||
|
input_mux = [
|
||||||
|
[],
|
||||||
|
[0, 0, 0], # Input 1
|
||||||
|
[1, 0, 0], # Input 2
|
||||||
|
[0, 1, 0], # Input 3
|
||||||
|
[1, 1, 0], # Input 4
|
||||||
|
[0, 0, 1], # Input 5
|
||||||
|
[1, 0, 1], # Input 6
|
||||||
|
[0, 1, 1], # Input 7
|
||||||
|
[1, 1, 1], # Input 8
|
||||||
|
]
|
||||||
|
|
||||||
|
GPIO_mux = [
|
||||||
|
(),
|
||||||
|
(GPIO.LOW, GPIO.LOW, GPIO.LOW), # 1
|
||||||
|
(GPIO.HIGH, GPIO.LOW, GPIO.LOW), # 2
|
||||||
|
(GPIO.LOW, GPIO.HIGH, GPIO.LOW), # 3
|
||||||
|
(GPIO.HIGH, GPIO.HIGH, GPIO.LOW), # 4
|
||||||
|
(GPIO.LOW, GPIO.LOW, GPIO.HIGH), # 5
|
||||||
|
(GPIO.HIGH, GPIO.LOW, GPIO.HIGH), # 6
|
||||||
|
(GPIO.LOW, GPIO.HIGH, GPIO.HIGH), # 7
|
||||||
|
(GPIO.HIGH, GPIO.HIGH, GPIO.HIGH) # 8
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def relay_write(relay_number, status):
|
||||||
|
"""Write the specified status to the relay at the relay_number."""
|
||||||
|
write_val = GPIO.HIGH if status >= 1 else GPIO.LOW
|
||||||
|
if relay_number <= 8 and relay_number >= 1:
|
||||||
|
GPIO.output(relay_channels[relay_number - 1], write_val)
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print("CANNOT WRITE TO A RELAY THAT DOES NOT EXIST: {}".format(relay_number))
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def relay_loop():
|
||||||
|
"""Set all relays to 1 sequentially, then set all relays to 0 sequentially."""
|
||||||
|
for i in range(1, 9):
|
||||||
|
relay_write(i, 1)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
for i in range(1, 9):
|
||||||
|
relay_write(i, 0)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
def read_dig_in(io_port):
|
||||||
|
"""Read IO Board digital input."""
|
||||||
|
if io_port == 0 or io_port > 8:
|
||||||
|
print("CANNOT READ A PORT THAT DOES NOT EXIST: {}".format(io_port))
|
||||||
|
return False
|
||||||
|
GPIO.output(mux_channels, GPIO_mux[io_port])
|
||||||
|
return GPIO.input(inp_channel) == 0
|
||||||
|
|
||||||
|
|
||||||
|
def dig_in_loop():
|
||||||
|
"""Read all digital inputs."""
|
||||||
|
for i in range(1, 9):
|
||||||
|
print("DIGIN {} = {}".format(i, read_dig_in(i)))
|
||||||
|
|
||||||
|
|
||||||
|
def read_analog_in(io_port, verbose=False):
|
||||||
|
"""Read IO Board digital input."""
|
||||||
|
global spi_bus
|
||||||
|
if io_port < 1 or io_port > 4:
|
||||||
|
print("CANNOT READ A PORT THAT DOES NOT EXIST: {}".format(io_port))
|
||||||
|
return False
|
||||||
|
GPIO.output(mux_channels, GPIO_mux[io_port])
|
||||||
|
ok_status = False
|
||||||
|
|
||||||
|
tries = 0
|
||||||
|
while (ok_status is False) and (tries < 5):
|
||||||
|
GPIO.output(mux_channels, GPIO_mux[io_port])
|
||||||
|
x = spi.xfer2(bytearray([0, 0, 0]))
|
||||||
|
if verbose:
|
||||||
|
print((x[0], x[1], x[2]))
|
||||||
|
c_bin = format(x[2], '#010b')[2:]
|
||||||
|
|
||||||
|
if c_bin[-3:] == "101":
|
||||||
|
ok_status = True
|
||||||
|
if verbose:
|
||||||
|
print("OK: {}, Status: {}".format(ok_status, c_bin))
|
||||||
|
print(x[0] * 256 + x[1])
|
||||||
|
if ok_status:
|
||||||
|
return x[0] * 256 + x[1]
|
||||||
|
time.sleep(0.25)
|
||||||
|
tries += 1
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# led_flash(10)
|
||||||
|
# relay_loop()
|
||||||
|
dig_in_loop()
|
||||||
|
for x in range(0, 10):
|
||||||
|
for i in range(1, 5):
|
||||||
|
print("Analog {}".format(i))
|
||||||
|
print(read_analog_in(i))
|
||||||
|
GPIO.cleanup()
|
||||||
18
RaspberryPi/settings.gradle
Normal file
18
RaspberryPi/settings.gradle
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* This settings file was generated by the Gradle 'init' task.
|
||||||
|
*
|
||||||
|
* The settings file is used to specify which projects to include in your build.
|
||||||
|
* In a single project build this file can be empty or even removed.
|
||||||
|
*
|
||||||
|
* Detailed information about configuring a multi-project build in Gradle can be found
|
||||||
|
* in the user guide at https://docs.gradle.org/3.5/userguide/multi_project_builds.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
// To declare projects as part of a multi-project build use the 'include' method
|
||||||
|
include 'shared'
|
||||||
|
include 'api'
|
||||||
|
include 'services:webservice'
|
||||||
|
*/
|
||||||
|
|
||||||
|
rootProject.name = 'IOBoard'
|
||||||
157
RaspberryPi/src/main/java/com/henrypump/io/AnalogIn.java
Normal file
157
RaspberryPi/src/main/java/com/henrypump/io/AnalogIn.java
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
package com.henrypump.io;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by patrickjmcd on 6/14/17.
|
||||||
|
*/
|
||||||
|
public class AnalogIn {
|
||||||
|
|
||||||
|
private int channel;
|
||||||
|
private int rawValue;
|
||||||
|
private double lastValue;
|
||||||
|
private Instant lastStored = Instant.EPOCH;
|
||||||
|
private double rawMax, rawMin, euMax, euMin;
|
||||||
|
private List<Integer> channelMux;
|
||||||
|
private double m, b;
|
||||||
|
private double[] history = new double[100];
|
||||||
|
private long badReads = 0;
|
||||||
|
|
||||||
|
public AnalogIn(int channel, double rawMin, double rawMax, double euMin, double euMax) {
|
||||||
|
this.channel = channel;
|
||||||
|
if (channel != 99) {
|
||||||
|
this.channelMux = MuxSetup.muxValues.get(channel);
|
||||||
|
}
|
||||||
|
this.rawMax = rawMax;
|
||||||
|
this.rawMin = rawMin;
|
||||||
|
this.euMax = euMax;
|
||||||
|
this.euMin = euMin;
|
||||||
|
|
||||||
|
m = (euMax - euMin) / (rawMax - rawMin);
|
||||||
|
b = euMax - m * (rawMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getChannel() {
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getRawMax() {
|
||||||
|
return rawMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getRawMin() {
|
||||||
|
return rawMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getEuMax() {
|
||||||
|
return euMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getEuMin() {
|
||||||
|
return euMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getBadReads() {
|
||||||
|
return badReads;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRawValue() {
|
||||||
|
return rawValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getLastValue() {
|
||||||
|
return lastValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instant getLastStored() {
|
||||||
|
return lastStored;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getHistory(int pointIndex) {
|
||||||
|
return history[pointIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
double setValue(int value) {
|
||||||
|
// System.out.println(value);
|
||||||
|
this.rawValue = value;
|
||||||
|
double pv = m * rawValue + b;
|
||||||
|
lastValue = pv;
|
||||||
|
lastStored = Instant.now();
|
||||||
|
System.arraycopy(history, 0, history,1, history.length - 1);
|
||||||
|
history[0] = lastValue;
|
||||||
|
// System.out.println(value + " --> " + pv);
|
||||||
|
return pv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double read(MuxSetup mux){
|
||||||
|
mux.set(channelMux.get(0), channelMux.get(1), channelMux.get(2));
|
||||||
|
int rawIn = mux.readAnalog();
|
||||||
|
if (rawIn != -1){
|
||||||
|
badReads = 0;
|
||||||
|
return setValue(rawIn);
|
||||||
|
} else {
|
||||||
|
badReads++;
|
||||||
|
try {
|
||||||
|
Thread.sleep(5);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lastValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double readSim(double simRaw){
|
||||||
|
double pv = ((euMax - euMin)/(rawMax - rawMin)) * simRaw + (euMax - ((euMax - euMin)/(rawMax - rawMin)) * rawMax);
|
||||||
|
lastValue = pv;
|
||||||
|
System.arraycopy(history, 0, history,1, history.length - 1);
|
||||||
|
history[0] = lastValue;
|
||||||
|
return pv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap<String, Long> getStatus(){
|
||||||
|
HashMap<String, Long> status;
|
||||||
|
status = new HashMap<String, Long>();
|
||||||
|
|
||||||
|
status.put("badReads", badReads);
|
||||||
|
status.put("measurementAge", Duration.between(lastStored, Instant.now()).toMillis());
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
MuxSetup mux = null;
|
||||||
|
Instant now = Instant.now();
|
||||||
|
mux = new MuxSetup();
|
||||||
|
HashMap<String, Long> aI1status;
|
||||||
|
// HashMap<String, Long> aI2status;
|
||||||
|
|
||||||
|
System.out.println("Testing Analog Inputs");
|
||||||
|
|
||||||
|
AnalogIn aI1 = new AnalogIn(1, 32560, 65535, 0, 100);
|
||||||
|
// AnalogIn aI2 = new AnalogIn(2, 0, 65535, 0, 50000);
|
||||||
|
// AnalogIn aI3 = new AnalogIn(3, 0, 65535, 0, 100);
|
||||||
|
// AnalogIn aI4 = new AnalogIn(4, 0, 65535, 0, 100);
|
||||||
|
|
||||||
|
for (int i = 0; i < 500; i++) {
|
||||||
|
|
||||||
|
double a1Val = aI1.read(mux);
|
||||||
|
// double a2Val = aI2.read(mux);
|
||||||
|
aI1status = aI1.getStatus();
|
||||||
|
// aI2status = aI2.getStatus();
|
||||||
|
System.out.println("Input " + aI1.channel + ": " + aI1.lastValue + ", age= " + aI1status.get("measurementAge") + "ms" + ", badReads= " + aI1status.get("badReads"));
|
||||||
|
// System.out.println("Input " + aI2.channel + ": " + aI2.lastValue + ", age= " + aI2status.get("measurementAge") + "ms" + ", badReads= " + aI2status.get("badReads"));
|
||||||
|
// System.out.println("Input " + aI3.channel + ": " + aI3.lastValue + ", age= " + Duration.between(aI3.lastStored, now).toMillis() + "ms");
|
||||||
|
// System.out.println("Input " + aI4.channel + ": " + aI4.lastValue + ", age= " + Duration.between(aI4.lastStored, now).toMillis() + "ms");
|
||||||
|
// System.out.println("--");
|
||||||
|
// System.out.printf("%s,%s%n", aI1.lastValue, aI2.lastValue);
|
||||||
|
|
||||||
|
}
|
||||||
|
// for (int j = 0; j < 100; j++){
|
||||||
|
// System.out.println("History[" + j + "]= " + aI3.getHistory(j));
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
60
RaspberryPi/src/main/java/com/henrypump/io/AnalogOut.java
Normal file
60
RaspberryPi/src/main/java/com/henrypump/io/AnalogOut.java
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
package com.henrypump.io;
|
||||||
|
|
||||||
|
import mraa.Dir;
|
||||||
|
import mraa.Gpio;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.time.Instant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by patrickjmcd on 6/19/17.
|
||||||
|
*/
|
||||||
|
public class AnalogOut {
|
||||||
|
public int channel;
|
||||||
|
public int rawValue;
|
||||||
|
public double lastValue;
|
||||||
|
public Instant lastStored = Instant.EPOCH;
|
||||||
|
public double rawMax, rawMin, euMax, euMin;
|
||||||
|
private double m, b;
|
||||||
|
|
||||||
|
|
||||||
|
public AnalogOut(int channel, double rawMin, double rawMax, double euMin, double euMax){
|
||||||
|
this.channel = channel;
|
||||||
|
this.rawMin = rawMin;
|
||||||
|
this.rawMax = rawMax;
|
||||||
|
this.euMin = euMin;
|
||||||
|
this.euMax = euMax;
|
||||||
|
|
||||||
|
m = (rawMax - rawMin) / (euMax - euMin);
|
||||||
|
b = rawMax - m * euMax;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int write(MuxSetup mux, double writeVal){
|
||||||
|
rawValue = (int) (writeVal * m + b);
|
||||||
|
try {
|
||||||
|
mux.writeAnalog(channel, rawValue);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args){
|
||||||
|
try {
|
||||||
|
MuxSetup mux = new MuxSetup();
|
||||||
|
AnalogOut anOut1 = new AnalogOut(2, 0, 65535, 0, 100);
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
anOut1.write(mux, (double) (i + 1) * 10.0);
|
||||||
|
Thread.sleep(1000);
|
||||||
|
}
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
69
RaspberryPi/src/main/java/com/henrypump/io/DigitalIn.java
Normal file
69
RaspberryPi/src/main/java/com/henrypump/io/DigitalIn.java
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package com.henrypump.io;
|
||||||
|
|
||||||
|
import mraa.Dir;
|
||||||
|
import mraa.Gpio;
|
||||||
|
import mraa.Result;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by patrickjmcd on 6/14/17.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class DigitalIn {
|
||||||
|
public int channel;
|
||||||
|
public int value;
|
||||||
|
public List<Integer> channelMux;
|
||||||
|
public DigitalIn(int channel){
|
||||||
|
this.channel = channel;
|
||||||
|
this.channelMux = MuxSetup.muxValues.get(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int read(MuxSetup mux){
|
||||||
|
mux.set(channelMux.get(0), channelMux.get(1), channelMux.get(2));
|
||||||
|
value = mux.readDigital();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args){
|
||||||
|
MuxSetup mux = new MuxSetup();
|
||||||
|
System.out.println("Testing Digital Inputs");
|
||||||
|
|
||||||
|
|
||||||
|
DigitalIn dI1 = new DigitalIn(1);
|
||||||
|
DigitalIn dI2 = new DigitalIn(2);
|
||||||
|
DigitalIn dI3 = new DigitalIn(3);
|
||||||
|
DigitalIn dI4 = new DigitalIn(4);
|
||||||
|
DigitalIn dI5 = new DigitalIn(5);
|
||||||
|
DigitalIn dI6 = new DigitalIn(6);
|
||||||
|
DigitalIn dI7 = new DigitalIn(7);
|
||||||
|
DigitalIn dI8 = new DigitalIn(8);
|
||||||
|
|
||||||
|
dI1.read(mux);
|
||||||
|
System.out.println("Input " + dI1.channel + ": " + dI1.value);
|
||||||
|
|
||||||
|
dI2.read(mux);
|
||||||
|
System.out.println("Input " + dI2.channel + ": " + dI2.value);
|
||||||
|
|
||||||
|
dI3.read(mux);
|
||||||
|
System.out.println("Input " + dI3.channel + ": " + dI3.value);
|
||||||
|
|
||||||
|
dI4.read(mux);
|
||||||
|
System.out.println("Input " + dI4.channel + ": " + dI4.value);
|
||||||
|
|
||||||
|
dI5.read(mux);
|
||||||
|
System.out.println("Input " + dI5.channel + ": " + dI5.value);
|
||||||
|
|
||||||
|
dI6.read(mux);
|
||||||
|
System.out.println("Input " + dI6.channel + ": " + dI6.value);
|
||||||
|
|
||||||
|
dI7.read(mux);
|
||||||
|
System.out.println("Input " + dI7.channel + ": " + dI7.value);
|
||||||
|
|
||||||
|
dI8.read(mux);
|
||||||
|
System.out.println("Input " + dI8.channel + ": " + dI8.value);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
85
RaspberryPi/src/main/java/com/henrypump/io/DigitalOut.java
Normal file
85
RaspberryPi/src/main/java/com/henrypump/io/DigitalOut.java
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
package com.henrypump.io;
|
||||||
|
|
||||||
|
import mraa.Dir;
|
||||||
|
import mraa.Gpio;
|
||||||
|
import mraa.Result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by patrickjmcd on 6/14/17.
|
||||||
|
*/
|
||||||
|
public class DigitalOut {
|
||||||
|
int channel;
|
||||||
|
Gpio gpioPin;
|
||||||
|
|
||||||
|
public DigitalOut(int channel){
|
||||||
|
// if ((channel >=0 && channel <=5) || (channel == 8) || (channel == 9)) {
|
||||||
|
this.channel = channel;
|
||||||
|
gpioPin = new Gpio(channel);
|
||||||
|
gpioPin.dir(Dir.DIR_OUT);
|
||||||
|
// } else {
|
||||||
|
// System.err.println("Error: This channel does not exist,.");
|
||||||
|
// System.exit(Result.ERROR_INVALID_PARAMETER.swigValue());
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write(int value){
|
||||||
|
gpioPin.write(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args){
|
||||||
|
DigitalOut dO0 = new DigitalOut(21);
|
||||||
|
DigitalOut dO1 = new DigitalOut(20);
|
||||||
|
DigitalOut dO2 = new DigitalOut(16);
|
||||||
|
DigitalOut dO3 = new DigitalOut(12);
|
||||||
|
DigitalOut dO4 = new DigitalOut(25);
|
||||||
|
DigitalOut dO5 = new DigitalOut(24);
|
||||||
|
DigitalOut redLED = new DigitalOut(23);
|
||||||
|
DigitalOut greenLED = new DigitalOut(18);
|
||||||
|
System.out.println("Testing Digital Outputs");
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
dO0.write(1);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO1.write(1);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO2.write(1);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO3.write(1);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO4.write(1);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO5.write(1);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO5.write(0);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO4.write(0);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO3.write(0);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO2.write(0);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO1.write(0);
|
||||||
|
Thread.sleep(500);
|
||||||
|
dO0.write(0);
|
||||||
|
Thread.sleep(500);
|
||||||
|
|
||||||
|
System.out.println("Testing the status LEDs");
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
redLED.write(0);
|
||||||
|
greenLED.write(1);
|
||||||
|
Thread.sleep(250);
|
||||||
|
redLED.write(1);
|
||||||
|
greenLED.write(0);
|
||||||
|
Thread.sleep(250);
|
||||||
|
|
||||||
|
}
|
||||||
|
redLED.write(0);
|
||||||
|
greenLED.write(0);
|
||||||
|
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
133
RaspberryPi/src/main/java/com/henrypump/io/MuxSetup.java
Normal file
133
RaspberryPi/src/main/java/com/henrypump/io/MuxSetup.java
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
package com.henrypump.io;
|
||||||
|
|
||||||
|
import mraa.Dir;
|
||||||
|
import mraa.Gpio;
|
||||||
|
import mraa.Spi;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by patrickjmcd on 6/14/17.
|
||||||
|
*/
|
||||||
|
public class MuxSetup {
|
||||||
|
|
||||||
|
private int A0val = 0;
|
||||||
|
private int A1val = 0;
|
||||||
|
private int A2val = 0;
|
||||||
|
|
||||||
|
private Gpio gpioA0;
|
||||||
|
private Gpio gpioA1;
|
||||||
|
private Gpio gpioA2;
|
||||||
|
private Gpio gpioA3;
|
||||||
|
private Gpio gpioAnOutTrigger;
|
||||||
|
private Spi spi;
|
||||||
|
|
||||||
|
public static List<List<Integer>> muxValues = Arrays.asList(
|
||||||
|
Arrays.asList(),
|
||||||
|
Arrays.asList(0,0,0),
|
||||||
|
Arrays.asList(1,0,0),
|
||||||
|
Arrays.asList(0,1,0),
|
||||||
|
Arrays.asList(1,1,0),
|
||||||
|
Arrays.asList(0,0,1),
|
||||||
|
Arrays.asList(1,0,1),
|
||||||
|
Arrays.asList(0,1,1),
|
||||||
|
Arrays.asList(1,1,1)
|
||||||
|
);
|
||||||
|
|
||||||
|
public MuxSetup(){
|
||||||
|
gpioA0 = new Gpio(14);
|
||||||
|
gpioA0.dir(Dir.DIR_OUT);
|
||||||
|
|
||||||
|
gpioA1 = new Gpio(15);
|
||||||
|
gpioA1.dir(Dir.DIR_OUT);
|
||||||
|
|
||||||
|
gpioA2 = new Gpio(16);
|
||||||
|
gpioA2.dir(Dir.DIR_OUT);
|
||||||
|
|
||||||
|
gpioA3 = new Gpio(17);
|
||||||
|
gpioA3.dir(Dir.DIR_IN);
|
||||||
|
|
||||||
|
gpioAnOutTrigger = new Gpio(6);
|
||||||
|
gpioAnOutTrigger.dir(Dir.DIR_OUT);
|
||||||
|
gpioAnOutTrigger.write(1);
|
||||||
|
|
||||||
|
spi = new Spi(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int set(int a0val, int a1val, int a2val){
|
||||||
|
this.A0val = a0val;
|
||||||
|
this.A1val = a1val;
|
||||||
|
this.A2val = a2val;
|
||||||
|
return apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
int apply(){
|
||||||
|
gpioA0.write(A0val);
|
||||||
|
gpioA1.write(A1val);
|
||||||
|
gpioA2.write(A2val);
|
||||||
|
|
||||||
|
return A0val + A1val * 2 + A2val * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int readDigital(){
|
||||||
|
if (gpioA3.read() == 0){
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int readAnalog() {
|
||||||
|
int a = spi.writeByte((short) 0);
|
||||||
|
int b = spi.writeByte((short) 0);
|
||||||
|
int c = spi.writeByte((short) 0);
|
||||||
|
|
||||||
|
// System.out.println("a= " + a + ", b= " + b + ", c= " + c);
|
||||||
|
// System.out.println("Raw= " + (a * 256 + b));
|
||||||
|
|
||||||
|
if (c == 13){
|
||||||
|
int x = a * 256;
|
||||||
|
x = x + b;
|
||||||
|
return x;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void preAnalogWrite(){
|
||||||
|
gpioAnOutTrigger.write(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void postAnalogWrite(){
|
||||||
|
gpioAnOutTrigger.write(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static String toBinary( byte b )
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder(8);
|
||||||
|
for( int i = 0; i < 8; i++ )
|
||||||
|
sb.append((b << i % 8 & 0x80) == 0 ? '0' : '1');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int writeAnalog(int channel, int rawValue) throws IOException {
|
||||||
|
preAnalogWrite();
|
||||||
|
byte controlBits = (byte) 0b00010000;
|
||||||
|
|
||||||
|
if (channel == 2){
|
||||||
|
controlBits = (byte) 0b00100100;
|
||||||
|
}
|
||||||
|
byte anWrite[] = new byte[]{
|
||||||
|
controlBits,
|
||||||
|
(byte) (rawValue & 0xFF),
|
||||||
|
(byte) ((rawValue >> 8) & 0xFF)
|
||||||
|
};
|
||||||
|
byte[] result = spi.write(anWrite);
|
||||||
|
System.out.printf("writing %s, %s, %s%n", toBinary(anWrite[0]), toBinary(anWrite[1]), toBinary(anWrite[2]));
|
||||||
|
postAnalogWrite();
|
||||||
|
System.out.printf("0= %s, 1= %s, 2= %s%n", result[0] & 0xFF, result[1] & 0xFF, result[2] & 0xFF);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user