Avatar for FyberChris

FyberChris

Member since Mar 2014 • Last active Feb 2015
  • 3 conversations
  • 23 comments

Most recent activity

  • in News
    Avatar for FyberChris

    Congratulations on funding. I got some samples from my rep. I was originally worried it was a replacement, but ST is planning to keep both lines. Honestly, I am not sure which to finalize design on either. I think both are going to require factory orders as neither seems popular enough at the moment for distributors to keep on hand. Arrow has been really good to me with their quotes, but it may be the specific Seattle sales office.

  • in News
    Avatar for FyberChris

    Hey, have you thought of using the newer 411? It is a bit more efficient and fits in the same footprint.

  • in Projects
    Avatar for FyberChris

    We have some Flex Module prototypes for sale at our new Tindie store. We will be releasing more Flex Modules and demo projects utilizing them. We have STM32F401CC and STM32F411CC modules available (they have the same pin layout). The STM32 Flex Module along with the USB BiPower3.2 Flex Module provide USB connectivity.

  • in Projects
    Avatar for FyberChris

    I home etch using laser jet toner on glossy magazine paper. Laminating is easier since the board itself is much thinner. I'll be putting up a how-to, but it is the same as etching FR4.

    I have been working mostly with a 1960s material called Electroply (it was the only flexPCB available on ebay at the time). It is much thicker and robust than Kapton copper clad. Both have good uses for wearables. I have been trying to get a real source for something like a PET based flexible copper clad as that should be similar to the Electroply. If we do a kickstarter, I will budget for a kit which includes a large sheet of Kapton at least. It is expensive stuff and it is great Adafruit is selling it (ebay is still cheapest usually). Dupont only sells it in big rolls. Another alternative is silver deposition - http://www.cartesianco.com/product/the-a­rgentum/ .

    We are also using low temp solder paste - http://www.chipquik.com/store/prod_smdlt­fp.htm to attach the modules.

  • in Projects
    Avatar for FyberChris

    I have put the initial hardware up on Hackaday for feedback - http://hackaday.io/project/2236-Flex-Mod­ules . I am still working on board quality issues, but I think it is coming along.

  • in Projects
    Avatar for FyberChris

    Sorry, I have been busy working on hardware for the past couple of months. I spent some time trying to merge Espruino settings with the newer libraries, but no results. It looks doable. I'll try to work on it in the next couple of weeks as it is needed for our projects.

  • in Interfacing
    Avatar for FyberChris

    Yeah, it works. I tested against 1v60 and 1v62. I am still trying to clean it up and fix the 401 USB.

    //Sources:
    //https://github.com/technicalmachine/se­rvo-pca9685
    //https://github.com/adafruit/Adafruit-P­WM-Servo-Driver-Library
    //TODO:
    //Add additional modes and functions, ie.
    //such as from https://github.com/arc12/PCA9685/
    
    var C = {
        PCA9685_SUBADR1 : 0x02,
        PCA9685_SUBADR2 : 0x03,
        PCA9685_SUBADR3 : 0x04,
    
        MAX : 4096,
        PCA9685_MODE1 : 0x00,
        PCA9685_MODE2 : 0x01,
        PCA9685_PRESCALE : 0xFE,
    
        /* MODE1 bits */
        PCA9685_RESTART : 0x80, //!< Restart logic. Default disabled. Not used.
        PCA9685_EXTCLK : 0x40, //!< External clock. Default disabled. Not used.
        PCA9685_AI : 0x20, //!< Register auto-increment. Enabled by initialise()
        PCA9685_SLEEP : 0x10, //!< Sleep (osc off). Device is sleeping on POR, brought out of sleep by initialise()
        PCA9685_SUB1 : 0x08,//!< Sub-address 1 enable. Default disabled. Not used.
        PCA9685_SUB2 : 0x04, //!< Sub-address 2 enable. Default disabled. Not used.
        PCA9685_SUB3 : 0x02, //!< Sub-address 3 enable. Default disabled. Not used.
        PCA9685_ALLCALL : 0x01, //!< Respond to all-call. Default enabled. Not used.
    
        /* MODE2 bits. These are not actually used at present */
        PCA9685_INVRT : 0x10,
        PCA9685_OCH : 0x08,
        PCA9685_OUTDRV : 0x04,
        PCA9685_OUTNE1 : 0x02,
        PCA9685_OUTNE0 : 0x01,
    
        // I2C Address for "all call" (7 bit form)
        PCA9685_ALLCALLADR : 0x70, //!< 0xE0 default "all call" I2C write address (7bit => 0x70)
    
        LED0_ON_L : 0x06,
        LED0_ON_H : 0x07,
        LED0_OFF_L : 0x08,
        LED0_OFF_H : 0x09,
    
        ALLLED_ON_L : 0xFA,
        ALLLED_ON_H : 0xFB,
        ALLLED_OFF_L : 0xFC,
        ALLLED_OFF_H : 0xFD
    };
    
    exports.connect = function(_i2c,freq) {
        return new PCA9685(_i2c,freq);
    };
    
    function PCA9685(i2c, freq, address) {
      this.i2c = i2c;
      freq = typeof freq != 'undefined' ? freq : 50;
      this.setPWMFreq(freq);
      this.a = typeof address ! == 'undefined' ? address : 0x40;
    
      this.resetPCA9685();
    }
    
    PCA9685.prototype.resetPCA9685 = function() {
      this.i2c.writeTo(this.a, [C.PCA9685_MODE1, 0x0]);
    };
    
    PCA9685.prototype.setPWMFreq = function(freq) {
      var prescaleval = (25000000/C.MAX)/freq - 1;
      var prescale = Math.floor(prescaleval);
      
      var oldmode = this.i2c.readFrom(this.a, C.PCA9685_MODE1) | 0x10;
      var newmode = (oldmode & 0x7F) | 0x10; // sleep
      this.i2c.writeTo(this.a, [C.PCA9685_MODE1, newmode]); // go to sleep
      this.i2c.writeTo(this.a, [C.PCA9685_PRESCALE, prescale]); // set the prescaler
      this.i2c.writeTo(this.a, [C.PCA9685_MODE1, oldmode]);
      setTimeout(this.i2c.writeTo(this.a, [C.PCA9685_MODE1, oldmode | 0x80]),1);
    };
    
    PCA9685.prototype.setPWM = function(num, on, off) {
    
      if (num < 1 || num > 16) {
        throw "Servos are 1-indexed. Servos can be between 1-16.";
      }
    
      this.i2c.writeTo(this.a, [C.LED0_ON_L + (num-1)*4, on]);
      this.i2c.writeTo(this.a, [C.LED0_ON_H + (num-1)*4, on >> 8]);
      this.i2c.writeTo(this.a, [C.LED0_OFF_L + (num-1)*4, off]);
      this.i2c.writeTo(this.a, [C.LED0_OFF_H + (num-1)*4, off >> 8]);
    };
    
    // 0...180
    PCA9685.prototype.moveServo = function (num, val) {
      if (num < 1 || num > 16) {
        throw "Servos are 1-indexed. Servos can be between 1-16.";
      }
    
      this.setPWM(num, ((val/180) * (this.high - this.low)) + this.low, Math.floor(C.MAX/100*on));
    };
    
    //I2C1.setup({scl:B8, sda:B9});
    //var driver = connect(I2C1, 50);
    //driver.setPWM(1,400,20);
    
    • 5 comments
    • 3,268 views
  • in Interfacing
    Avatar for FyberChris

    Thanks. I can confirm the driver works with a generic breakout, so obviously something went wrong on the other test hardware.

Actions