diff --git a/ESPMegaPROv3 Tester/.vscode/settings.json b/ESPMegaPROv3 Tester/.vscode/settings.json new file mode 100644 index 0000000..de67d8b --- /dev/null +++ b/ESPMegaPROv3 Tester/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "files.associations": { + "array": "cpp", + "deque": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "string_view": "cpp", + "initializer_list": "cpp" + } +} \ No newline at end of file diff --git a/ESPMegaPROv3 Tester/lib/ESPMegaPRO/ESPMegaPRO.cpp b/ESPMegaPROv3 Tester/lib/ESPMegaPRO/ESPMegaPRO.cpp new file mode 100644 index 0000000..5f04603 --- /dev/null +++ b/ESPMegaPROv3 Tester/lib/ESPMegaPRO/ESPMegaPRO.cpp @@ -0,0 +1,72 @@ +#include + +uint8_t inputBufferA; +uint8_t inputBufferB; + +PCF8574 inputBankA(INPUT_BANK_A_ADDRESS); +PCF8574 inputBankB(INPUT_BANK_B_ADDRESS); +Adafruit_PWMServoDriver pwmBank = Adafruit_PWMServoDriver(0x5F); + +void ESPMega_begin() +{ + Wire.begin(14, 33); + + inputBankA.begin(); + inputBankB.begin(); + pwmBank.begin(); + + #ifdef USE_INTERRUPT + attachInterrupt(digitalPinToInterrupt(INPUT_BANK_A_INTERRUPT),refreshInputBankA,FALLING); + attachInterrupt(digitalPinToInterrupt(INPUT_BANK_B_INTERRUPT),refreshInputBankB,FALLING); + #endif +} + +void ESPMega_loop() { + +} + +bool ESPMega_digitalRead(int id) +{ + if (id >= 0 && id <= 7) + { + #ifndef USE_INTERRUPT + refreshInputBankA(); //Only poll if interrupt is not enabled + #endif + + return ((inputBufferA>>id)&1); //Extract bit from buffer + } + if (id >= 8 && id <= 15) + { + id-=8; + + #ifndef USE_INTERRUPT + refreshInputBankB(); //Only poll if interrupt is not enabled + #endif + + return ((inputBufferB>>id)&1); //Extract bit from buffer + } + return false; +} + +void ESPMega_analogWrite(int id, int value) +{ + pwmBank.setPin(id, value); +} + +void ESPMega_digitalWrite(int id, bool value) +{ + if(value) + pwmBank.setPin(id, 4095); + else + pwmBank.setPin(id, 0); +} + +void IRAM_ATTR refreshInputBankA() +{ + inputBufferA = inputBankA.read8(); +} + +void IRAM_ATTR refreshInputBankB() +{ + inputBufferB = inputBankB.read8(); +} \ No newline at end of file diff --git a/ESPMegaPROv3 Tester/lib/ESPMegaPRO/ESPMegaPRO.h b/ESPMegaPROv3 Tester/lib/ESPMegaPRO/ESPMegaPRO.h new file mode 100644 index 0000000..054af53 --- /dev/null +++ b/ESPMegaPROv3 Tester/lib/ESPMegaPRO/ESPMegaPRO.h @@ -0,0 +1,61 @@ +#ifndef ESPMEGA +#define ESPMEGA + +#include +#include +#include +#include + +#define INPUT_BANK_A_ADDRESS 0x20 +#define INPUT_BANK_B_ADDRESS 0x21 +#define OUTPUT_BANK_ADDRESS 0x21 +#define EEPROM_ADDRESS 0x22 + +//#define USE_INTERRUPT +//#define INPUT_BANK_A_INTERRUPT 35 +//#define INPUT_BANK_B_INTERRUPT 39 + +/** + * Initiate ESPMega PRO Internal Components + * + * This function will initiate the PWM bank, Input banks, and the EEPROM. +*/ +void ESPMega_begin(); + +/** + * Run ESPMega PRO Internal Routines + * + * This function must be called regularly for the correct + * operation of the ESPMega! +*/ +void ESPMega_loop(); + +/** + * Read one of the ESPMega's Digital Input pins (I0-I15) + * + * @param id The number of the pin to be read + * @return The state of the pin (HIGH/LOW) +*/ +bool ESPMega_digitalRead(int id); + +/** + * Write a pulse wave modulated signal to one of the ESPMega's + * PWM pins (P0-P15) + * + * @param id The number of the pin to write to + * @param value the "HIGH" duty cycle of the PWM wave (0-4095) +*/ +void ESPMega_analogWrite(int id, int value); + +/** + * Write a digital signal to one of the ESPMega's + * PWM pins (P0-P15) + * + * @param id The number of the pin to write to + * @param value the new state for the pin (HIGH/LOW) +*/ +void ESPMega_digitalWrite(int id, bool value); +void IRAM_ATTR refreshInputBankA(); +void IRAM_ATTR refreshInputBankB(); + +#endif \ No newline at end of file diff --git a/ESPMegaPROv3 Tester/platformio.ini b/ESPMegaPROv3 Tester/platformio.ini index 03409ee..66bd033 100644 --- a/ESPMegaPROv3 Tester/platformio.ini +++ b/ESPMegaPROv3 Tester/platformio.ini @@ -12,4 +12,5 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = robtillaart/PCA9685@^0.4.1 \ No newline at end of file +lib_deps = adafruit/Adafruit PWM Servo Driver Library@^2.4.1 + robtillaart/PCF8574@^0.3.7 \ No newline at end of file diff --git a/ESPMegaPROv3 Tester/src/i2c_scanner.cpp.disabled b/ESPMegaPROv3 Tester/src/i2c_scanner.cpp.disabled new file mode 100644 index 0000000..a22a3a5 --- /dev/null +++ b/ESPMegaPROv3 Tester/src/i2c_scanner.cpp.disabled @@ -0,0 +1,84 @@ +#include +// -------------------------------------- +// i2c_scanner +// +// Version 1 +// This program (or code that looks like it) +// can be found in many places. +// For example on the Arduino.cc forum. +// The original author is not know. +// Version 2, Juni 2012, Using Arduino 1.0.1 +// Adapted to be as simple as possible by Arduino.cc user Krodal +// Version 3, Feb 26 2013 +// V3 by louarnold +// Version 4, March 3, 2013, Using Arduino 1.0.3 +// by Arduino.cc user Krodal. +// Changes by louarnold removed. +// Scanning addresses changed from 0...127 to 1...119, +// according to the i2c scanner by Nick Gammon +// https://www.gammon.com.au/forum/?id=10896 +// Version 5, March 28, 2013 +// As version 4, but address scans now to 127. +// A sensor seems to use address 120. +// Version 6, November 27, 2015. +// Added waiting for the Leonardo serial communication. +// +// +// This sketch tests the standard 7-bit addresses +// Devices with higher bit address might not be seen properly. +// + +#include + + +void setup() +{ + Wire.begin(14,33); + + Serial.begin(9600); + while (!Serial); // Leonardo: wait for serial monitor + Serial.println("\nI2C Scanner"); +} + + +void loop() +{ + byte error, address; + int nDevices; + + Serial.println("Scanning..."); + + nDevices = 0; + for(address = 1; address < 127; address++ ) + { + // The i2c_scanner uses the return value of + // the Write.endTransmisstion to see if + // a device did acknowledge to the address. + Wire.beginTransmission(address); + error = Wire.endTransmission(); + + if (error == 0) + { + Serial.print("I2C device found at address 0x"); + if (address<16) + Serial.print("0"); + Serial.print(address,HEX); + Serial.println(" !"); + + nDevices++; + } + else if (error==4) + { + Serial.print("Unknown error at address 0x"); + if (address<16) + Serial.print("0"); + Serial.println(address,HEX); + } + } + if (nDevices == 0) + Serial.println("No I2C devices found\n"); + else + Serial.println("done\n"); + + delay(5000); // wait 5 seconds for next scan +} \ No newline at end of file diff --git a/ESPMegaPROv3 Tester/src/input_demo.cpp.disabled b/ESPMegaPROv3 Tester/src/input_demo.cpp.disabled new file mode 100644 index 0000000..e1a6995 --- /dev/null +++ b/ESPMegaPROv3 Tester/src/input_demo.cpp.disabled @@ -0,0 +1,22 @@ +#include +#include + +PCF8574 inputbank1(0x21); + +void setup() { + Wire.begin(14,33); + Serial.begin(9600); + boolean connected = inputbank1.begin(); + Serial.println("connection state = "+String(connected)); + inputbank1.write(0, HIGH); + delay(50); + inputbank1.write(1, HIGH); + delay(50); +} + +void loop() { + for(int i=2;i<8;i++) { + Serial.println(inputbank1.read(i)); + delay(100); + } +} \ No newline at end of file diff --git a/ESPMegaPROv3 Tester/src/main.cpp b/ESPMegaPROv3 Tester/src/main.cpp index 1ed0b84..df9598d 100644 --- a/ESPMegaPROv3 Tester/src/main.cpp +++ b/ESPMegaPROv3 Tester/src/main.cpp @@ -1,32 +1,11 @@ -#include -#include "Wire.h" -#include "PCA9685.h" - -PCA9685 PCA(0x5F); +#include void setup() { - Wire.begin(); - PCA.begin(); - - + ESPMega_begin(); + } - void loop() { - PCA.digitalWrite(0,HIGH); - PCA.digitalWrite(1,LOW); - PCA.setPWM(2, 450); - PCA.setPWM(3, 600); - PCA.setPWM(4, 750); - PCA.setPWM(5, 900); - PCA.setPWM(6, 1050); - PCA.setPWM(7, 1200); - PCA.setPWM(8, 1350); - PCA.setPWM(9, 1500); - PCA.setPWM(10, 1650); - PCA.setPWM(11, 1800); - PCA.setPWM(12, 1950); - PCA.setPWM(13, 2100); - PCA.setPWM(14, 2250); - PCA.setPWM(15, 2400); +void loop() { + ESPMega_loop(); } \ No newline at end of file diff --git a/ESPMegaPROv3 Tester/src/pwm_demo.cpp.disabled b/ESPMegaPROv3 Tester/src/pwm_demo.cpp.disabled new file mode 100644 index 0000000..e4b2891 --- /dev/null +++ b/ESPMegaPROv3 Tester/src/pwm_demo.cpp.disabled @@ -0,0 +1,28 @@ +#include +#include "Wire.h" +#include + +Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x5F); + +void setup() { + Wire.begin(14,33); + pwm.begin(); + pwm.setPin(2, 500); + pwm.setPin(3, 1000); + pwm.setPin(4, 1500); + pwm.setPin(5, 2000); + pwm.setPin(6, 2500); + pwm.setPin(7, 3000); + pwm.setPin(8, 3500); + pwm.setPin(9, 4000); + pwm.setPin(10, 500); + pwm.setPin(11, 1000); + pwm.setPin(12, 1500); + pwm.setPin(13, 2000); + pwm.setPin(14, 2500); + pwm.setPin(15, 3000); + +} + + void loop() { +} \ No newline at end of file