Page 5 of 5 FirstFirst ... 345
Results 41 to 45 of 45

Thread: SparkFun EL Wire Sequencer Shield on Wemos D1

  1. #41
    Join Date
    Dec 2013
    Location
    Williamsburg, VA
    Posts
    904
    Post Thanks / Like

    Default Re: SparkFun EL Wire Sequencer Shield on Wemos D1

    Quote Originally Posted by Rices1984 View Post
    The Arduino Uno WiFi have the advantage compared to the Wemos D1 R2 that all PINs could be used.
    I used the Wemos D1 R2 board and so did Jthrock. To use the Sparkfun El Escudo Dos, you need a 1k ressitor between GND and D4 and it will work fine.

    I would like to control the costumes via WiFi and Vixen.
    I used Vixen to sequence but then ran the sequence with FPP on a Raspberry Pi3 and a tiny 3g router to connect all of the suits together. We had 3 costumes completely wireless from each other.

    Here is my final sketch. It is pretty simple as the E1.31 library from Sporadic does all of the heavy lifting. It worked great for me. I used it at Halloween then in a Christmas boat parade of lights too.

    Code:
    // Wemos D1 E1.31 - 8 channel sketch for Sparkfun EL Escudo Dos shield
    //Spark Fun link https://www.sparkfun.com/products/10878
    
    #include <ESP8266WiFi.h>
    #include <E131.h> // Copyright (c) 2015 Shelby Merrick http://www.forkineye.com
    
    // ***** USER SETUP STUFF *****
    const char ssid[] = "MYSSID";  // replace with your SSID.
    const char passphrase[] = "12345678"; // replace with your passphrase.
    
    const int universe = 12; // this sets the universe number you are using.
    //The IP setup is only required if you are using Unicast and/or you want a static IP for multicast.
    //In multicast this IP is only for network connectivity not multicast data
    IPAddress ip (192,168,1,222);  // xx,xx,xx,xx
    IPAddress netmask (255,255,255,0);  //255,255,255,0 is common
    IPAddress gateway (192,168,1,1);  // xx,xx,xx,xx normally your router / access piont IP address
    IPAddress dns (192,168,1,1); //  // xx,xx,xx,xx normally your router / access point IP address
    
    // this sets the pin numbers to use as outputs.
    //for Wemos D1 R1 pins are 16,5,4,14,12,13,0,2
    //for Wemos D1 R2 pins are 16,5,4,0,2,14,12,13
    const int output_1 = 16; //the pin to use as output 1 (D0)
    const int output_2 = 5;  //the pin to use as output 2 (D1)
    const int output_3 = 4;  //the pin to use as output 3 (D2)
    const int output_4 = 0;  //the pin to use as output 4 (D3)
    const int output_5 = 2;  //the pin to use as output 5 (D4)
    const int output_6 = 14; //the pin to use as output 6 (D5)
    const int output_7 = 12; //the pin to use as output 7 (D6)
    const int output_8 = 13; //the pin to use as output 8 (D7)
    
    
    E131 e131;
    
    void setup() {
      Serial.begin(115200);
      // set the pins chosen above as outputs.
      pinMode(output_1, OUTPUT);
      pinMode(output_2, OUTPUT);
      pinMode(output_3, OUTPUT);
      pinMode(output_4, OUTPUT);
      pinMode(output_5, OUTPUT);
      pinMode(output_6, OUTPUT);
      pinMode(output_7, OUTPUT);
      pinMode(output_8, OUTPUT);
    
      // set the pins chosen above to low / off.
      digitalWrite(output_1, LOW);
      digitalWrite(output_2, LOW);
      digitalWrite(output_3, LOW);
      digitalWrite(output_4, LOW);
      digitalWrite(output_5, LOW);
      digitalWrite(output_6, LOW);
      digitalWrite(output_7, LOW);
      digitalWrite(output_8, LOW);
      
      /* Choose one to begin listening for E1.31 data */
      //e131.begin(ssid, passphrase, ip, netmask, gateway, dns); /* via Unicast on the default port */
      e131.beginMulticast(ssid, passphrase, universe, ip, netmask, gateway, dns); /* via Multicast with static IP Address */
      //e131.beginMulticast(ssid, passphrase, universe); /* via Multicast  with DHCP IP Address */  
    }
    
    void loop() {
      /* Parse a packet */
      uint16_t num_channels = e131.parsePacket();
    
      /* Process channel data if we have it */
      if (num_channels) {
        Serial.println("we have data");
    
        digitalWrite(output_1, (e131.data[0] > 127) ? HIGH : LOW);
        digitalWrite(output_2, (e131.data[1] > 127) ? HIGH : LOW);
        digitalWrite(output_3, (e131.data[2] > 127) ? HIGH : LOW);
        digitalWrite(output_4, (e131.data[3] > 127) ? HIGH : LOW);
        digitalWrite(output_5, (e131.data[4] > 127) ? HIGH : LOW);
        digitalWrite(output_6, (e131.data[5] > 127) ? HIGH : LOW);
        digitalWrite(output_7, (e131.data[6] > 127) ? HIGH : LOW);
        digitalWrite(output_8, (e131.data[7] > 127) ? HIGH : LOW);
        }//end we have data
    
    } // end void loop

  2. #42
    Join Date
    Dec 2013
    Location
    Williamsburg, VA
    Posts
    904
    Post Thanks / Like

    Default Re: SparkFun EL Wire Sequencer Shield on Wemos D1

    Quote Originally Posted by MartinMueller2003 View Post
    I think you are going to have to find an E1.31 implementation that will work with your CPU or find an equivalent to the ESP async communications library used on the ESP. If you are using only 8 channels, the WeMos supports that just fine.
    Looking in the e131.h file it appears it only supports ESP8266 and Ethernet

    this is from the E131.h file
    Code:
    /* Network interface detection.  WiFi for ESP8266 and Ethernet for AVR */
    #if defined (ARDUINO_ARCH_ESP8266)
    #   include <ESP8266WiFi.h>
    #   include <ESP8266WiFiMulti.h>
    #   include <WiFiUdp.h>
    #   include <lwip/ip_addr.h>
    #   include <lwip/igmp.h>
    #   define _UDP WiFiUDP
    #   define INT_ESP8266
    #   define INT_WIFI
    #elif defined (ARDUINO_ARCH_AVR)
    #   include <Ethernet.h>
    #   include <EthernetUdp.h>
    #   include <avr/pgmspace.h>
    #   include <utility/util.h>
    #   define _UDP EthernetUDP
    #   define INT_ETHERNET
    #   define NO_DOUBLE_BUFFER
    #endif

  3. #43
    Join Date
    Dec 2013
    Location
    Williamsburg, VA
    Posts
    904
    Post Thanks / Like

    Default Re: SparkFun EL Wire Sequencer Shield on Wemos D1

    Quote Originally Posted by Rices1984 View Post
    Yes, I have the library E1.31 installed. The first problem was the Wifi comand (#include <ESP8266WiFi.h>) doesn´t work with this arduino board and I have installed the library WiFiNINA and testet it with the Blynk App https://www.instructables.com/id/How...sing-Blynk-Ap/. With the Blynk App I can turn on/off all 8 EL-Channels.
    For this Arduino Uno Wifi Board, there are not so much information in the internet yet.
    That blinker app is only sending a command to turn on/off the output which is very straight forward. The BIG different between that and the sketch we provided here is that ours receives E131 data and processes that data to control the outputs.

    I created the sketch below to perform similar testing. Again it uses the Wemos D1 R2 board but sets it up to connect to my WIFI OR it can be setup as an Access point itself. The user interface is just a button for each Channel A-f.

    Code:
    /*
     * SIMPLE SKETCH TO TEST THE OUTPUTS OF THE SPARK FUN EL SCUDO DOS EL WIRE SHIELD.
     * CAN BE USED IN ACCESS POINT MODE OR STATION MODE OR BOTH AT THE SAME TIME.
     */
    // Load Wi-Fi library
    #include <ESP8266WiFi.h>
    
    
    // SETTINGS FOR CONNECTING TO YOUR WIFI ROUTER WITH STATIS IP
    const char* ssid     = "MYSSID";
    const char* password = "12345678";
    IPAddress ip (192,168,1,120);  // xx,xx,xx,xx
    IPAddress subnet (255,255,255,0);  //255,255,255,0 is common
    IPAddress gateway (192,168,1,1);  // xx,xx,xx,xx normally your router / access piont IP address
    IPAddress dns (192,168,1,1); //  // xx,xx,xx,xx normally your router / access point IP address
    
    //SSID and Password to your ESP Access Point
    const char* APssid = "ELWIRE";
    const char* APpassword = "12345678";
    IPAddress APip (192,168,10,10);  // cannot be in same range as WIFI  defualt is 192.168.4.1
    IPAddress APsubnet (255,255,255,0);  //255,255,255,0 is common
    
    // Set web server port number to 80
    WiFiServer server(80);
    
    // Variable to store the HTTP request
    String header;
    
    // Auxiliar variables to store the current output state
    String ChanAState = "off";
    String ChanBState = "off";
    String ChanCState = "off";
    String ChanDState = "off";
    String ChanEState = "off";
    String ChanFState = "off";
    String ChanGState = "off";
    String ChanHState = "off";
    String BlinkState = "off";
    // Assign output variables to GPIO pins
    const int ChanA = 16;
    const int ChanB = 5;
    const int ChanC = 4;
    const int ChanD = 0;
    const int ChanE = 2;
    const int ChanF = 14;
    const int ChanG = 12;
    const int ChanH = 13;
    int NoChannels = 8;
    int Channels[] = {16,5,4,0,2,14,12,13};
    int timer = 300;
    int BlinkCnt  = 0;  
    int BlinkMax = 5;// can change this to blink as lang as you want
    void setup() {
      Serial.begin(115200);
      // Initialize the output variables as outputs
      pinMode(ChanA, OUTPUT);
      pinMode(ChanB, OUTPUT);
      pinMode(ChanC, OUTPUT);
      pinMode(ChanD, OUTPUT);
      pinMode(ChanE, OUTPUT);
      pinMode(ChanF, OUTPUT);
      pinMode(ChanG, OUTPUT);
      pinMode(ChanH, OUTPUT);
      // Set outputs to LOW
      digitalWrite(ChanA, LOW);
      digitalWrite(ChanB, LOW);
      digitalWrite(ChanC, LOW);
      digitalWrite(ChanD, LOW);
      digitalWrite(ChanE, LOW);
      digitalWrite(ChanF, LOW);
      digitalWrite(ChanG, LOW);
      digitalWrite(ChanH, LOW);
      
      WiFi.mode(WIFI_AP_STA); //Access point &  client
      Serial.print("Setting up Access Point...");
      Serial.println("");
      WiFi.softAPConfig(APip, APip, APsubnet);   
      WiFi.softAP(APssid, APpassword);  //Start HOTspot removing password will disable security
      IPAddress myIP = WiFi.softAPIP(); //Get IP address
      Serial.print("HotSpt IP:");
      Serial.println(myIP);
      Serial.println("");
      // Connect to Wi-Fi network with SSID and password
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.disconnect();  //Prevent connecting to wifi based on previous configuration
      WiFi.config(ip, dns, gateway, subnet);
     
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
          if (WiFi.status() == WL_NO_SSID_AVAIL) {
            Serial.print("");
            Serial.print("SSID NOT FOUND");
            break;
          } else if (WiFi.status() == WL_CONNECT_FAILED) {
            Serial.print("");
            Serial.print("INCORRECT PASSWORD");
            break;
          }
      } 
        if (WiFi.status() == WL_CONNECTED) {
          // Print local IP address and start web server
          Serial.println("");
          Serial.println("WiFi connected.");
          Serial.println("IP address: ");
          Serial.println(WiFi.localIP());
        }
     server.begin();
    }
    
    void Blink() {
        // loop through pin array
        blink:
        Serial.println("..........");
        if (BlinkCnt < BlinkMax) { 
          for (int thisChan = 0; thisChan < NoChannels; thisChan++) {
            // turn the pin on:
            digitalWrite(Channels[thisChan], HIGH);
            Serial.println(Channels[thisChan]);
            Serial.println("");
            delay(timer);
            // turn the pin off:
            digitalWrite(Channels[thisChan], LOW);
    
          }//for
          BlinkCnt ++;
          //Blink();
          goto blink;
        }//if
            BlinkState = "off";
            ChanAState = "off";
            ChanBState = "off";
            ChanCState = "off";
            ChanDState = "off";
            ChanEState = "off";
            ChanFState = "off";
            ChanGState = "off";
            ChanHState = "off";
        
        Serial.println("Blink Done.");
        
      }//blink
      
    void loop(){
      WiFiClient client = server.available();   // Listen for incoming clients
    
      if (client) {                             // If a new client connects,
        //Serial.println("New Client.");          // print a message out in the serial port
        String currentLine = "";                // make a String to hold incoming data from the client
        while (client.connected()) {            // loop while the client's connected
          if (client.available()) {             // if there's bytes to read from the client,
            char c = client.read();             // read a byte, then
            //Serial.write(c);                    // print it out the serial monitor
            header += c;
            if (c == '\n') {                    // if the byte is a newline character
              // if the current line is blank, you got two newline characters in a row.
              // that's the end of the client HTTP request, so send a response:
              if (currentLine.length() == 0) {
                // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
                // and a content-type so the client knows what's coming, then a blank line:
                client.println("HTTP/1.1 200 OK");
                client.println("Content-type:text/html");
                client.println("Connection: close");
                client.println();
                
                // turns the GPIOs on and off
                if (header.indexOf("GET /A/on") >= 0) {
                  Serial.println("Channel A on");
                  ChanAState = "on";
                  digitalWrite(ChanA, HIGH);
                } else if (header.indexOf("GET /A/off") >= 0) {
                  Serial.println("Channel A off");
                  ChanAState = "off";
                  digitalWrite(ChanA, LOW);
                } else if (header.indexOf("GET /B/on") >= 0) {
                  Serial.println("Channel B on");
                  ChanBState = "on";
                  digitalWrite(ChanB, HIGH);
                } else if (header.indexOf("GET /B/off") >= 0) {
                  Serial.println("Channel B off");
                  ChanBState = "off";
                  digitalWrite(ChanB, LOW);            
                } else if (header.indexOf("GET /C/on") >= 0) {
                  Serial.println("Channel C on");
                  ChanCState = "on";
                  digitalWrite(ChanC, HIGH);
                } else if (header.indexOf("GET /C/off") >= 0) {
                  Serial.println("Channel C off");
                  ChanCState = "off";
                  digitalWrite(ChanC, LOW);
                } else if (header.indexOf("GET /D/on") >= 0) {
                  Serial.println("Channel D on");
                  ChanDState = "on";
                  digitalWrite(ChanD, HIGH);
                } else if (header.indexOf("GET /D/off") >= 0) {
                  Serial.println("Channel D off");
                  ChanDState = "off";
                  digitalWrite(ChanD, LOW);
                }else if (header.indexOf("GET /E/on") >= 0) {
                  Serial.println("Channel E on");
                  ChanEState = "on";
                  digitalWrite(ChanE, HIGH);
                } else if (header.indexOf("GET /E/off") >= 0) {
                  Serial.println("Channel E off");
                  ChanEState = "off";
                  digitalWrite(ChanE, LOW);
                }else if (header.indexOf("GET /F/on") >= 0) {
                  Serial.println("Channel F on");
                  ChanFState = "on";
                  digitalWrite(ChanF, HIGH);
                } else if (header.indexOf("GET /F/off") >= 0) {
                  Serial.println("Channel F off");
                  ChanFState = "off";
                  digitalWrite(ChanF, LOW);
                }else if (header.indexOf("GET /G/on") >= 0) {
                  Serial.println("Channel G on");
                  ChanGState = "on";
                  digitalWrite(ChanG, HIGH);
                } else if (header.indexOf("GET /G/off") >= 0) {
                  Serial.println("Channel G off");
                  ChanGState = "off";
                  digitalWrite(ChanG, LOW);
                }else if (header.indexOf("GET /H/on") >= 0) {
                  Serial.println("Channel H on");
                  ChanHState = "on";
                  digitalWrite(ChanH, HIGH);
                } else if (header.indexOf("GET /H/off") >= 0) {
                  Serial.println("Channel H off");
                  ChanHState = "off";
                  digitalWrite(ChanH, LOW);
                } else if (header.indexOf("GET /Blink/on") >= 0) {
                  Serial.println("Blink on");
                  BlinkState = "on";  
                  BlinkCnt =0;
                  Blink();
                } 
                
                // Display the HTML web page
                client.println("<!DOCTYPE html><html>");
                client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
                client.println("<link rel=\"icon\" href=\"data:,\">");
                // CSS to style the on/off buttons 
                // Feel free to change the background-color and font-size attributes to fit your preferences
                client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
                client.println(".button { background-color: #1bc16e; border-radius: 5px;border: none; color: white; padding: 5px 5px; width:90px;"); //on color
                client.println("text-decoration: none; font-size: 20px; margin: 2px; cursor: pointer;}");
                client.println(".button2 {background-color: #ff0000; border-radius: 5px; padding: 5px 5px; width:90px;}"); //off color
                client.println(".button3 {background-color: #0b63ef; border-radius: 5px; padding: 5px 5px; width:90px;}</style></head>"); // color
              
                // Web Page Heading
                client.println("<body><h2>EL Escudo Dos Tester</h2>");
                client.println("<h2>Wemos D1 R2</h2>");
                //client.println("<h2>Channel Tester </h2>");
                
                if (WiFi.status() == WL_CONNECTED) {
                   client.println("<p>Local IP Address: ");
                    client.println(WiFi.localIP());
                } else {
                client.println(APip);
                }
                //client.println(WiFi.localIP());
                client.println("</p>");
                //print table
                //client.println(" ");
                client.println("<table align=\"center\" border=\"1\" cellpadding=\"5\" cellspacing=\"0\"><tr bgcolor=\"99ccff\"><th width=\"100px\">Channel</th><th width=\"100px\">Status</th></tr> ");
                
                // Display current state, and ON/OFF buttons for BLINK 
                client.println("<tr><td>");
                client.println("Blink All");
                client.println("</td><td>");
                // displays the Blink button       
                client.println("<a href=\"/Blink/on\"><button class=\"button button3\">Blink</button></a>");
                client.println("</td</tr>");
    
    
    
                
                // Display current state, and ON/OFF buttons for Channel A  
                client.println("<tr><td>");
                //client.println("<p>Channel A - State " + ChanBState + "</p>");
                client.println("Channel A");
                client.println("</td><td>");
                
                // If the ChanAState is off, it displays the Off button       
                if (ChanAState=="on") {
                  client.println("<a href=\"/A/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/A/on\"><button class=\"button button2\">OFF</button></a>");
                } 
                  client.println("</td</tr>");
    
                // Display current state, and ON/OFF buttons for Channel B  
                client.println("<tr><td>");
                //client.println("<p>Channel B - State " + ChanBState + "</p>");
                client.println("Channel B");
                client.println("</td><td>");
                // If the ChanBState is off, it displays the Off button       
                if (ChanBState=="on") {
                  client.println("<a href=\"/B/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/B/on\"><button class=\"button button2\">OFF</button></a>");
                } 
                  client.println("</td</tr>");
                  
                // Display current state, and ON/OFF buttons for Channel C 
                client.println("<tr><td>");
                client.println("Channel C");
                client.println("</td><td>");
                // If the ChanCState is off, it displays the Off button       
                if (ChanCState=="on") {
                  client.println("<a href=\"/C/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/C/on\"><button class=\"button button2\">OFF</button></a>");
                }
                client.println("</td</tr>");
                // Display current state, and ON/OFF buttons for Channel D 
                client.println("<tr><td>");
                client.println("Channel D");
                client.println("</td><td>");
                // If the ChanDState is off, it displays the Off button       
                if (ChanDState=="on") {
                  client.println("<a href=\"/D/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/D/on\"><button class=\"button button2\">OFF</button></a>");
                }
                client.println("</td</tr>");
                // Display current state, and ON/OFF buttons for Channel E 
                client.println("<tr><td>");
                client.println("Channel E");
                client.println("</td><td>");
                // If the ChanEState is off, it displays the Off button       
                if (ChanEState=="on") {
                  client.println("<a href=\"/E/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/E/on\"><button class=\"button button2\">OFF</button></a>");
                }
                client.println("</td</tr>");
                // Display current state, and ON/OFF buttons for Channel F 
                client.println("<tr><td>");
                client.println("Channel F");
                client.println("</td><td>");
                // If the ChanFState is off, it displays the Off button       
                if (ChanFState=="on") {
                  client.println("<a href=\"/F/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/F/on\"><button class=\"button button2\">OFF</button></a>");
                }
                client.println("</td</tr>");
                // Display current state, and ON/OFF buttons for Channel G 
                client.println("<tr><td>");
                client.println("Channel G");
                client.println("</td><td>");
                // If the ChanGState is off, it displays the Off button       
                if (ChanGState=="on") {
                  client.println("<a href=\"/G/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/G/on\"><button class=\"button button2\">OFF</button></a>");
                }
                client.println("</td</tr>");
                // Display current state, and ON/OFF buttons for Channel H 
                client.println("<tr><td>");
                client.println("Channel H");
                client.println("</td><td>");
                // If the ChanHState is off, it displays the Off button       
                if (ChanHState=="on") {
                  client.println("<a href=\"/H/off\"><button class=\"button\">ON</button></a>");
                } else {
                  client.println("<a href=\"/H/on\"><button class=\"button button2\">OFF</button></a>");
                }
                client.println("</td</tr>");
                client.println("</table>");
                client.println("</body></html>");
    
                // The HTTP response ends with another blank line
                client.println();
                // Break out of the while loop
                break;
              } else { // if you got a newline, then clear currentLine
                currentLine = "";
              }
            } else if (c != '\r') {  // if you got anything else but a carriage return character,
              currentLine += c;      // add it to the end of the currentLine
            }
          }
        }
    
        
        // Clear the header variable
        header = "";
        // Close the connection
        client.stop();
        //Serial.println("Client disconnected.");
        Serial.println("");
      }
    }

  4. #44
    Join Date
    Dec 2012
    Location
    Hudson MA
    Posts
    3,523
    Post Thanks / Like

    Default Re: SparkFun EL Wire Sequencer Shield on Wemos D1

    Quote Originally Posted by JCook View Post
    Looking in the e131.h file it appears it only supports ESP8266 and Ethernet

    this is from the E131.h file
    Code:
    /* Network interface detection.  WiFi for ESP8266 and Ethernet for AVR */
    #if defined (ARDUINO_ARCH_ESP8266)
    #   include <ESP8266WiFi.h>
    #   include <ESP8266WiFiMulti.h>
    #   include <WiFiUdp.h>
    #   include <lwip/ip_addr.h>
    #   include <lwip/igmp.h>
    #   define _UDP WiFiUDP
    #   define INT_ESP8266
    #   define INT_WIFI
    #elif defined (ARDUINO_ARCH_AVR)
    #   include <Ethernet.h>
    #   include <EthernetUdp.h>
    #   include <avr/pgmspace.h>
    #   include <utility/util.h>
    #   define _UDP EthernetUDP
    #   define INT_ETHERNET
    #   define NO_DOUBLE_BUFFER
    #endif
    you can see that it supports two cpu architectures. i suspect it could support others with the proper headers.


    2019 - Going to visit my Daughter in New Zealand (again). I will be dark for the 2nd year in a row. Sigh..

  5. #45
    Join Date
    Dec 2018
    Posts
    7
    Post Thanks / Like

    Default Re: SparkFun EL Wire Sequencer Shield on Wemos D1

    hi all!

    i really love this 8 channel controller. just build one to test and works like a charm.
    i can work with arduino but i am not a coding wizard.
    a little offtopic but cant find another threat with this code..
    What can i do to this code to use PWM instead of just on/off.

    in my case i wanna drive some led strips connected to transistors. so pwm would be a great feature.

Page 5 of 5 FirstFirst ... 345

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •