diff --git a/firmware/.gitignore b/firmware/.gitignore new file mode 100644 index 0000000..03f4a3c --- /dev/null +++ b/firmware/.gitignore @@ -0,0 +1 @@ +.pio diff --git a/firmware/platformio.ini b/firmware/platformio.ini new file mode 100644 index 0000000..14417d7 --- /dev/null +++ b/firmware/platformio.ini @@ -0,0 +1,20 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:nano_33_iot] +platform = atmelsam +board = nano_33_iot +framework = arduino +build_flags="-DconfigTICK_RATE_HZ ((TickType_t)2000)" +lib_deps = + briscoetech/FreeRTOS_SAMD21@^2.3.0 + SPI + arduino-libraries/WiFiNINA@^1.8.13 + waspinator/AccelStepper@^1.61 diff --git a/firmware/src/main.cpp b/firmware/src/main.cpp new file mode 100644 index 0000000..428eb8c --- /dev/null +++ b/firmware/src/main.cpp @@ -0,0 +1,168 @@ +#include +#include +#include +#include +#include + +#define RED_PIN (9) +#define GREEN_PIN (6) +#define BLUE_PIN (5) +#define WHITE_PIN (3) +#define LASER_LEFT_PIN (A4) +#define LASER_RIGHT_PIN (A5) +#define FOG_LEFT_PIN (A6) +#define FOG_RIGHT_PIN (A7) + +void myDelayMs(int ms); +void reconnectThread(void *pvParameters); +void tcpThread(void *pvParametes); +void ledThread(void *pvParametes); + +char const * const ssid = "citronet"; +//char const * const ssid = "Free Hill-Fi 2.4"; +//char const * const ssid = "telenet-D6A9117"; +char const * const password = "Ni3lsG33nsRul3z"; +//char const * const password = "gewoonzonderhoofdletters"; + +unsigned int const udpPort = 2390; +IPAddress udpAddress(224, 0, 0, 123); +unsigned int const tcpPort = 2390; +IPAddress tcpAddress; + +uint8_t dmxBuffer[512]; +uint8_t dmxAddress = 0; + +wl_status_t status = WL_IDLE_STATUS; +SemaphoreHandle_t wifiMutex; + +TaskHandle_t reconnectThreadHandle; +TaskHandle_t tcpThreadHandle; +TaskHandle_t ledThreadHandle; + +void setup() { + Serial.begin(115200); + //while(!Serial); + Serial.println("setup"); + pinMode(LED_BUILTIN, OUTPUT); + pinMode(RED_PIN, OUTPUT); + pinMode(GREEN_PIN, OUTPUT); + pinMode(BLUE_PIN, OUTPUT); + pinMode(WHITE_PIN, OUTPUT); + pinMode(LASER_LEFT_PIN, OUTPUT); + pinMode(LASER_RIGHT_PIN, OUTPUT); + pinMode(FOG_LEFT_PIN, OUTPUT); + pinMode(FOG_RIGHT_PIN, OUTPUT); + wifiMutex = xSemaphoreCreateMutex(); + while( wifiMutex == NULL ); + xSemaphoreGive(wifiMutex); + xTaskCreate(reconnectThread, "Reconnect Thread", 256, NULL, tskIDLE_PRIORITY + 3, &reconnectThreadHandle); + xTaskCreate(tcpThread, "Tcp Thread", 256, NULL, tskIDLE_PRIORITY + 1, &tcpThreadHandle); + xTaskCreate(ledThread, "Led Thread", 256, NULL, tskIDLE_PRIORITY + 4, &ledThreadHandle); + Serial.println("starting scheduler"); + vTaskStartScheduler(); + Serial.println("scheduler failed"); +} + +void loop() { + delay(10); + //Serial.println("loop"); +} + +void myDelayMs(int ms) { + vTaskDelay((ms*1000)/portTICK_PERIOD_US); +} + +void reconnectThread(void *pvParameters) { + for(;;) { + if(xSemaphoreTake(wifiMutex, portMAX_DELAY)) { + status = (wl_status_t) WiFi.status(); + Serial.print("wifi status: "); + Serial.println(status); + if(WL_CONNECTED != status) { + Serial.print("connecting to: "); + Serial.println(ssid); + status = (wl_status_t) WiFi.begin(ssid, password); + if(WL_CONNECTED == status) { + Serial.println("wifi connected"); + WiFiUDP udp; + udp.beginMulticast(udpAddress, udpPort); + char ipBuffer[16]; + for(int i = 0; i < 5; i++) { + Serial.println("waiting for udp packet"); + int packetSize = udp.parsePacket(); + if(packetSize) { + udp.read(ipBuffer, sizeof(ipBuffer)); + ipBuffer[packetSize] = 0; + break; + } + myDelayMs(1000); + } + String ipString = ipBuffer; + tcpAddress.fromString(ipString); + if(tcpAddress) { + Serial.print("ip address: "); + Serial.println(ipString); + } else { + WiFi.end(); + } + } + } + xSemaphoreGive(wifiMutex); + } + myDelayMs(10000); + } +} + +void tcpThread(void *pvParametes) { + for(;;) { + WiFiClient client; + for(;;) { + while(!tcpAddress) myDelayMs(1000); + Serial.println("starting tcp connection"); + bool connected = false; + if(xSemaphoreTake(wifiMutex, portMAX_DELAY)) { + connected = client.connect(tcpAddress, tcpPort); + xSemaphoreGive(wifiMutex); + } + if(connected) { + Serial.println("tcp connected"); + break; + } else { + Serial.println("could not connect tcp socket"); + myDelayMs(1000); + } + } + client.setTimeout(5000); + for(;;) { + if(xSemaphoreTake(wifiMutex, portMAX_DELAY)) { + unsigned int bufferLen = 0; + unsigned long readStart = millis(); + while(bufferLen != sizeof(dmxBuffer)) { + signed int readLen = client.read(dmxBuffer + bufferLen, sizeof(dmxBuffer) - bufferLen); + if(readLen < 0) break; + if(millis() - readStart > 1000) break; + bufferLen += readLen; + } + xSemaphoreGive(wifiMutex); + if(bufferLen < sizeof(dmxBuffer)) break; + } + } + Serial.println("disconnected"); + } +} + + +void ledThread(void *pvParametes) { + for(;;) { + digitalWrite(LED_BUILTIN, dmxBuffer[dmxAddress + 0]); + analogWrite(RED_PIN, dmxBuffer[dmxAddress + 0]); + analogWrite(GREEN_PIN, dmxBuffer[dmxAddress + 1]); + analogWrite(BLUE_PIN, dmxBuffer[dmxAddress + 2]); + analogWrite(WHITE_PIN, dmxBuffer[dmxAddress + 3]); + digitalWrite(LASER_LEFT_PIN, dmxBuffer[dmxAddress + 4] > 0); + digitalWrite(LASER_RIGHT_PIN, dmxBuffer[dmxAddress + 5] > 0); + digitalWrite(FOG_LEFT_PIN, dmxBuffer[dmxAddress + 6] > 0); + digitalWrite(FOG_RIGHT_PIN, dmxBuffer[dmxAddress + 7] > 0); + myDelayMs(10); + } +} diff --git a/fp-lib-table b/hardware/fp-lib-table similarity index 100% rename from fp-lib-table rename to hardware/fp-lib-table diff --git a/led-zebra.kicad_pcb b/hardware/led-zebra.kicad_pcb similarity index 100% rename from led-zebra.kicad_pcb rename to hardware/led-zebra.kicad_pcb diff --git a/led-zebra.kicad_pro b/hardware/led-zebra.kicad_pro similarity index 100% rename from led-zebra.kicad_pro rename to hardware/led-zebra.kicad_pro diff --git a/led-zebra.kicad_sch b/hardware/led-zebra.kicad_sch similarity index 100% rename from led-zebra.kicad_sch rename to hardware/led-zebra.kicad_sch diff --git a/libraries/A6FR_0104.step b/hardware/libraries/A6FR_0104.step similarity index 100% rename from libraries/A6FR_0104.step rename to hardware/libraries/A6FR_0104.step diff --git a/libraries/Arduino Nano 33 IoT.stp b/hardware/libraries/Arduino Nano 33 IoT.stp similarity index 100% rename from libraries/Arduino Nano 33 IoT.stp rename to hardware/libraries/Arduino Nano 33 IoT.stp diff --git a/libraries/DO-221.step b/hardware/libraries/DO-221.step similarity index 100% rename from libraries/DO-221.step rename to hardware/libraries/DO-221.step diff --git a/libraries/IHLP3232CZ.STEP b/hardware/libraries/IHLP3232CZ.STEP similarity index 100% rename from libraries/IHLP3232CZ.STEP rename to hardware/libraries/IHLP3232CZ.STEP diff --git a/libraries/MSOP10-3-0.5mm.STEP b/hardware/libraries/MSOP10-3-0.5mm.STEP similarity index 100% rename from libraries/MSOP10-3-0.5mm.STEP rename to hardware/libraries/MSOP10-3-0.5mm.STEP diff --git a/libraries/arduino.kicad_sym b/hardware/libraries/arduino.kicad_sym similarity index 100% rename from libraries/arduino.kicad_sym rename to hardware/libraries/arduino.kicad_sym diff --git a/libraries/arduino.pretty/NANO 33 IOT.kicad_mod b/hardware/libraries/arduino.pretty/NANO 33 IOT.kicad_mod similarity index 100% rename from libraries/arduino.pretty/NANO 33 IOT.kicad_mod rename to hardware/libraries/arduino.pretty/NANO 33 IOT.kicad_mod diff --git a/libraries/maxim.kicad_sym b/hardware/libraries/maxim.kicad_sym similarity index 100% rename from libraries/maxim.kicad_sym rename to hardware/libraries/maxim.kicad_sym diff --git a/libraries/maxim.pretty/MAX668EUB&plus_T.kicad_mod b/hardware/libraries/maxim.pretty/MAX668EUB&plus_T.kicad_mod similarity index 100% rename from libraries/maxim.pretty/MAX668EUB&plus_T.kicad_mod rename to hardware/libraries/maxim.pretty/MAX668EUB&plus_T.kicad_mod diff --git a/libraries/microchip.kicad_sym b/hardware/libraries/microchip.kicad_sym similarity index 100% rename from libraries/microchip.kicad_sym rename to hardware/libraries/microchip.kicad_sym diff --git a/libraries/omron.pretty/SW_A6FR-0104.kicad_mod b/hardware/libraries/omron.pretty/SW_A6FR-0104.kicad_mod similarity index 100% rename from libraries/omron.pretty/SW_A6FR-0104.kicad_mod rename to hardware/libraries/omron.pretty/SW_A6FR-0104.kicad_mod diff --git a/libraries/reprap.kicad_sym b/hardware/libraries/reprap.kicad_sym similarity index 100% rename from libraries/reprap.kicad_sym rename to hardware/libraries/reprap.kicad_sym diff --git a/libraries/reprap.pretty/stepstick.kicad_mod b/hardware/libraries/reprap.pretty/stepstick.kicad_mod similarity index 100% rename from libraries/reprap.pretty/stepstick.kicad_mod rename to hardware/libraries/reprap.pretty/stepstick.kicad_mod diff --git a/libraries/st.kicad_sym b/hardware/libraries/st.kicad_sym similarity index 100% rename from libraries/st.kicad_sym rename to hardware/libraries/st.kicad_sym diff --git a/libraries/stepstick.STEP b/hardware/libraries/stepstick.STEP similarity index 100% rename from libraries/stepstick.STEP rename to hardware/libraries/stepstick.STEP diff --git a/libraries/vishay.kicad_sym b/hardware/libraries/vishay.kicad_sym similarity index 100% rename from libraries/vishay.kicad_sym rename to hardware/libraries/vishay.kicad_sym diff --git a/libraries/vishay.pretty/IHLP3232CZ.kicad_mod b/hardware/libraries/vishay.pretty/IHLP3232CZ.kicad_mod similarity index 100% rename from libraries/vishay.pretty/IHLP3232CZ.kicad_mod rename to hardware/libraries/vishay.pretty/IHLP3232CZ.kicad_mod diff --git a/libraries/vishay.pretty/VSS8D3M6-M3_I.kicad_mod b/hardware/libraries/vishay.pretty/VSS8D3M6-M3_I.kicad_mod similarity index 100% rename from libraries/vishay.pretty/VSS8D3M6-M3_I.kicad_mod rename to hardware/libraries/vishay.pretty/VSS8D3M6-M3_I.kicad_mod diff --git a/sym-lib-table b/hardware/sym-lib-table similarity index 100% rename from sym-lib-table rename to hardware/sym-lib-table