Showing posts with label arduino. Show all posts
Showing posts with label arduino. Show all posts

Friday, January 11, 2013

My Failed Fan Controller Design

I've spent all the time and resources I'm willing to on this project for now. I may complete it at a later date. It all works except the input voltage from the furnace transformer is too high after rectification (38-40v).  The 78M05 I'm using is 35v max and it doesn't tolerate any more. It doesn't seem to damage it, as even after testing as bad on the furnace it works fine on 18v (max on my lab PS) I tried to build a SMPS replacement based on Roman Black's design, that also worked fine on 18v and blew at least a zener diode when on the furnace. I used parts I had on hand, so sometime I will get precise values and try again. For now I'm ordering a snap-disk. Perhaps some of this design may be useful to someone for other purposes. It really sucks, as the controller works fine, I just can't get the voltage regulated to 5v. If you have any ideas feel free to comment. It's probably easy and I'm just not seeing it :)

My Dad's woodstove is ducted into his furnace. It works OK, but he has to manually turn the blower fan on to circulate the air through the house. This is OK when they're up and keep the fire going, but if they don't get up during the night the fire burns down and it circulates cold basement air. Brrrr



I realize I could just use a therm-o-disk, but what fun is that?

Plus I get a bit more practice making boards. NOTE: I bumped the zone fill clearance from .020 to .025, that definitely helped me not bridge pins to ground. It's a simple board and I used mostly .025 traces with a few .012 and .080 ones as needed. I can etch .012 very consistently, even .008 fairly well, but I keep tearing pads off drilling. The extra copper seems to help considerably. Extra copper around pad make things much easier drilling and mounting. Essential for wire connections. My first board's traces got torn up where wires mounted (all .012 traces). Notice the pads across the top of the following image compared with the bottom of the board above:



 Requirements:
  • Run off furnace power (28VAC)
  • Switch fan on at approx 120F, off at 90f
  • Make sure fan runs at least 10 minutes when turned on.
  • Cheap, hopefully less than a $15 T-O-D
Specs:
  • Controlled by a attiny85
  • PCB was done for a full-bridge rectifier, but we may use a half-bridge to keep the voltage under control. (use 2 diodes instead of 4) (Note: Didn't Work)
  • Used Salvaged Components where possible
Parts List:
  • Attiny85 ($1.30) 
  • lm335a Sensor ($1.00) (I had some of these, I would use a mcp9700-e/to($0.25) in the future. the board supports it, just omit the 2k resistor)
  • lm7805 Regulator ($0.50)
  • 2n7000 mosfet ($0.60)
  • 2x 1n4007 diodes ($0.50x2)
  • 330u 50v cap (salvage)
  • 10u cap(salvage)
  • 0.1u cap
  • 10K resistor
  • 2K Resistor (omit for mcp9700)
  • RY5W-K Relay (salvage)(you can get ones with ~30ma coils for less than $2.50 and drop the mosfet, though a mosfet does make it more robust IMO) You could also try a solid state relay
Schematic

The 7805 was a bit close to the cap, that will be fixed in the linked files. I intended to use a to-92 regulator, but the one I had was rated for 100MA. I thought my relay was 150MA. It was a last minute change. As it turns out it uses about 9MA idle and 54MA with relay powered. I could have used the to-92 after all.Total cost was under $5, though to buy all the parts would be more like $10, the cheapest T-O-D I found was $8. If I have the wrong temp with this I just reflash the chip, with a T-O-D I buy a different one.



Code is in Arduino, you will need the attiny85 hardware files, a programmer or an arduino, some wires and bits. See this guide for more information. I may redo it in AVR C sometime, I just wanted it up and running. I didn't need to do anything special.

 /*  
  Fan Controller intended for a attiny85, but takes ~3k, change pins below for arduino and uncomment the serial for debugging on the arduino.  
  it's intended for a furnace, so no fancy pwm or anything, thought it wouldn't be hard to add.  
  Stephen Evans - stevesfixitshop.blogspot.com  
  */  
    
 #define INPIN 3  
 #define OUTPIN 2  
 #define ONTEMP 48  
 #define OFFTEMP 32  
 #define DEL 600000  
   
 unsigned long wait = 0;  
 int avread = 0;  
 int ain[10];  
 int i = 0;  
 void setup() {  
 // Serial.begin(9600);  
  pinMode(OUTPIN, OUTPUT);  
 }  
   
 void loop() {  
  //make 10 readings  
  while(i<=9){  
   ain[i] = analogRead(INPIN);  
   delay(10); // wait for adc to stabilise  
   i++;  
  }  
  i=0;  
    
  //average the readings  
  avread = 0;  
  while(i<=9){  
   avread = avread + ain[i];  
   i++;  
  }  
  i=0;  
  avread = avread / 10;  
    
  //Convert reading to degrees C  
  float sensorValue = ((avread*4.8)/10)-284.15;  
 // Serial.println(sensorValue);  
    
  // turn fan on  
  if(sensorValue >= ONTEMP){  
   digitalWrite(OUTPIN, HIGH);  
   wait = millis() + DEL;  
  }  
    
  // turn fan off if below set temp and delay has passed.  
  else if (sensorValue <= OFFTEMP && millis() >= wait){  
   digitalWrite(OUTPIN,LOW);  
  }  
  // every 50 days millis rolls over to 0, this makes sure it doesn't mess things up  
  else if (millis() <= (wait-DEL-50)){  
   wait = millis();  
  }  
    
 }  

Monday, January 16, 2012

ArduinoISP

Intro:
If you read Part 2 of my Sanguinololu Build you saw my arduino ISP (in Circuit Programmer) built on a breadboard to burn bootloaders my 1284p's. It worked really good, but I had to be really careful not to bump any wires loose or pull them out accidentally.
Some day I may buy a proper ISP, but until then it would be nice to have something that would work on the rather rare occasion I actually need one. So I decided to make something more permanent but not require a dedicated Arduino either.

The Project:
  • Connect an Arduino to any 6 pin AVRISP header
  • Include status LED's
  • Be completely removable (mounted on headers)
There you have it, 3 led's (Pulse, Error, Data?) Schematic was figured from the Burning the Sanguino Bootloader using Arduino as ISP page.  LED's are dead bugged on the header, not sure if you even need the cap. just plug in the 2 headers, the 6 pin ISP plug and burn away!

Seems to work so far, Tried it on my other arduino, not really extensive testing, but seems to work.I'd like to make a couple pcb's for various chips with the 6 pin ISP header on them, but that's all for now.

UPDATE:
Just built a second one, decided to move the ground from the power side to the io pin side, that allows selection of 5v or 3.3v on the VCC wire. or you can leave it disconnected if your target is self powered.


Wednesday, December 14, 2011

Sanguinololu 1.3a - Part 2: Trouble in Paradise

See Also:
Part 1 - Build
Part 3 - Not Out of the Woods Yet

Part 2 of my RepRap build. As noted in part 1 I had some trouble right off the bat.

NOTE: Part 3 include additional information concerning the bootloader and fuse settings. I highly recommend you read it before burning your bootloader


FTDI 
 According to the Sanguinololu wiki page, you should test the FTDI chip after installing the USB port and related components. all you have to do is:

1. Plug the board into your computer.
2. Install the driver software.
3. Connect to the COM port with something like Putty
4. Short the RX0 and TX0 pins together (use a piece of wire or something, it needs to work for about 1 second, don't worry about soldering it or anything.)
5. Type stuff on your keyboard, it should show up when the pins are shorted, and stop when disconnected.
6. If this worked your FTDI chip is operating properly.



 Of course this did not happen for me. The first board my brain wasn't fully engaged and I forgot to add flux, then tried to solder it with an iron, even though I had a hot air reflow station just sitting there. Stupid! I managed to bend a couple pins slightly up, just enough that they wouldn't connect.

 So after a half hour of fixing it all looked good, but the computer didn't recognize anything attached. I went over the pins one at a time with a soldering iron with a really fine tip, just putting a little down pressure on each one. Now the computer recognized it, loaded up putty and the loopback worked fine. 


The second board I did with the hot air and a good dose of flux. It looked beautiful compared to my first attempt, like a factory placed chip. It was immediately recognized by the computer, but the loopback didn't work. I took it off, ran a blob of solder across the pads to wet them, removed the excess, and replaced the chip on the board. Then it worked fine.

 Bootloader


 The wiki said the ATMEGA1284p was a drop in replacement for the 644p. I checked the specs, for a dollar or so more I'd go for the 1284p. Now, I'm not quite sure what they mean by "drop in compatible", it does indeed fit in the slot and it does indeed work with the board. After 5 hours of hacking. The first problem was the bootloader. I downloaded the 0023 version from here (the options were 0018, which doesn't support the 1284p and 0023 which does). I had arduino version 0022 and that didn't work. I downloaded 1.0, that seemed to. I burned the bootloader with the Arduino ISP as noted in the wiki. At some point I changed the last 3 line of hardware /  Sanguino / boards.txt to:


atmega1284.build.mcu=atmega1284p
atmega1284.build.f_cpu=16000000L
atmega1284.build.core=arduino


It seemed to burn fine, no errors.

 Using an Arduino to Flash the bootloader onto a 1284p

I put the chip in the Sanguinololu plugged it in and loaded the Sprinter firmware into arduino 1.0 (despite it claiming to not work with 1.0) Surprise! it errored out on the compile, couldn't find "arduino.h". Also wouldn't compile with 0022 (don't remember the exact error), but claimed to be compatible with 0018, so I downloaded that.

UPDATE: The "arduino.h" error can be corrected by creating "INSTALL_LOCATION/Arduino-1.0/hardware/Sanguino/cores/arduino/Arduino.h" and putting "<#include WProgram.h>" in it. I didn't figure this out, but I lost the reference. (Semi off-topic note: replace "Sanguino" with "Arduino" for other boards - uno, duemilanove, etc.)

It compiled fine with 0018, I copied the Sanguino files from the hardware folder of 1.0 over and tryed to upload it to the board. Nope, 0018 has no idea what a 1284p is. I finally managed to get the following fron 1.0's hardware/tools/avr/etc/avrdude.conf:


#------------------------------------------------------------
# ATmega1284P
#------------------------------------------------------------

# similar to ATmega164p

part
    id               = "m1284p";
    desc             = "ATMEGA1284P";
    has_jtag         = yes;
    stk500_devcode   = 0x82; # no STK500v1 support, use the ATmega16 one
    avr910_devcode   = 0x74;
    signature        = 0x1e 0x97 0x05;
    pagel            = 0xd7;
    bs2              = 0xa0;
    chip_erase_delay = 9000;
    pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                       "x x x x  x x x x    x x x x  x x x x";

    chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                       "x x x x  x x x x    x x x x  x x x x";

    timeout        = 200;
    stabdelay        = 100;
    cmdexedelay        = 25;
    synchloops        = 32;
    bytedelay        = 0;
    pollindex        = 3;
    pollvalue        = 0x53;
    predelay        = 1;
    postdelay        = 1;
    pollmethod        = 1;

    pp_controlstack     =
        0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
        0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
        0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 6;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    idr                 = 0x31;
    spmcr               = 0x57;
    allowfullpagebitstream = no;

    memory "eeprom"
        paged           = no; /* leave this "no" */
        page_size       = 8;  /* for parallel programming */
        size            = 4096;
        min_write_delay = 9000;
        max_write_delay = 9000;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
    read            = "  1   0   1   0      0   0   0   0",
                          "  0   0   x   x    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

    write           = "  1   1   0   0      0   0   0   0",
                          "  0   0   x   x    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

    loadpage_lo    = "  1   1   0   0      0   0   0   1",
              "  0   0   0   0      0   0   0   0",
              "  0   0   0   0      0  a2  a1  a0",
              "  i   i   i   i      i   i   i   i";

    writepage    = "  1   1   0   0      0   0   1   0",
              "  0   0   x   x    a11 a10  a9  a8",
              " a7  a6  a5  a4     a3   0   0   0",
              "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay        = 10;
    blocksize    = 128;
    readsize    = 256;
      ;

    memory "flash"
        paged           = yes;
        size            = 131072;
        page_size       = 256;
        num_pages       = 512;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
        read_lo         = "  0   0   1   0      0   0   0   0",
                          "a15 a14 a13 a12    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

        read_hi         = "  0   0   1   0      1   0   0   0",
                          "a15 a14 a13 a12    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

        loadpage_lo     = "  0   1   0   0      0   0   0   0",
                          "  0   0   x   x      x   x   x   x",
                          "  x  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        loadpage_hi     = "  0   1   0   0      1   0   0   0",
                          "  0   0   x   x      x   x   x   x",
                          "  x  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        writepage       = "  0   1   0   0      1   1   0   0",
                          "a15 a14 a13 a12    a11 a10  a9  a8",
                          " a7   x   x   x      x   x   x   x",
                          "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay        = 10;
    blocksize    = 256;
    readsize    = 256;
      ;

    memory "lock"
        size            = 1;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   x x o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 1 1 x  x x x x",
                          "x x x x  x x x x   1 1 i i  i i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "lfuse"
        size            = 1;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  0 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "hfuse"
        size            = 1;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  1 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  1 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "efuse"
        size            = 1;

        read            = "0 1 0 1  0 0 0 0  0 0 0 0  1 0 0 0",
                          "x x x x  x x x x  o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 1 0 0",
                          "x x x x  x x x x  1 1 1 1  1 i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "signature"
        size            = 3;
        read            = "0  0  1  1   0  0  0  0   x  x  x  x   x  x  x  x",
                          "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
      ;

    memory "calibration"
        size            = 1;

        read            = "0 0 1 1  1 0 0 0   0 0 0 x  x x x x",
                          "0 0 0 0  0 0 0 0   o o o o  o o o o";
        ;
  ;

It goes right above:
#------------------------------------------------------------
# ATmega162
#------------------------------------------------------------
Now I get a
avrdude: stk500_getsync(): not in sync: resp=0x00 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Which basically means "something is wrong". It can't connect to the chip at all. I fought with this for a while, and it just wouldn't connect. Even 1.0 refused, not even the "blink" sample code.

I reburned the bootloader with the 8mhz and 16mhz options (the 644p option errored as not the right chip, so the arduino isp was communicating), neither worked, I changed the
"atmega1284.build.f_cpu=16000000L" to "atmega1284.build.f_cpu=8000000L" (as it was 
originally), commented the last 3 lines out (as they were originally), nothing worked.

Finally, when I was thinking I had bricked the chip I found a different bootloader for the 1284, the Mighty 1284p. I burned the bootloader, popped the chip back in the Sanguinololu, and uploaded the blink code.  It Worked! I had a square wave on the scope and everything!

Unfortunately Mighty 1284p is only compatible with arduino 1.0. Using the Sanguino 1284p 16mhz setting in 0018 couldn't upload sprinter. I changed the settings in the Sanguinololu boards.txt to match the Mighty 1284p and Sprinter uploaded fine.

I don't know if the Sanguino bootloader would have worked with 0023, I'm assuming it's something with my setup. The 644p is compatible with 0018, as is Sprinter, if I had known the trouble it would be to get Sprinter on the 1284p I'd have bought 644p's. But it's done, and I'm happy.
Steve


UPDATE
I decided I hadn't given the Sanguino bootloader a fair chance, it was for 0023 and I didn't use that.

I downloaded Arduino 0023, decompressed the Sanguino files into the hardware directory. Same thing, had to do both of the above hacks to get it to write the bootloader, which it again completed successfully. Exactly the same problem too, unable to upload Sprinter (or blink) to it.

I put the Mighty 1284p bootloader back on and uploaded Sprinter fine. Is something different about my chips? My ISP? Who knows? I sure don't.
Steve