Navigation

    • Register
    • Login
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. slarti
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    slarti

    @slarti

    9
    Reputation
    27
    Posts
    1593
    Profile views
    0
    Followers
    0
    Following
    Joined Last Online

    slarti Follow

    Best posts made by slarti

    • [contest] Yet another servo blind control project

      Hello all.

      POST UPDATED 13.2.2015

      UPDATE 2: Noticed there's a competition going on and as I think this project qualifies, I'm entering it. So there.

      I've been following this site for a while now and finally decided to register and share my little project.

      I've had a Vera for ages which I've been using for my zwave lights. I really wanted to be able to control my curtains and blinds with it as well, but since it's next to impossible to get moderately priced motors for home automation here in Finland, I started exploring DIY solutions.

      I actually thought I had an original idea about using an Arduino and a servo to tilt my blinds but it turned out I'm late to the party.

      Anyways, here's my project so far and why it isn't finished: (edit: It is now...)

      First of all, blinds in Finland are almost always what the Americans call mini-blinds because we put them between the outer and inner windows and they are almost identical everywhere. This means my solution should work for most Finns... 😉

      THE MECHANICAL PART:

      The blinds are adjusted with a rod directly linked to the shaft that tilts the slats.

      IMG_8043.jpg

      This is removed. (Nevermind the dirt.)

      IMG_8044.jpg

      The little connecting springrod needs to removed as well.

      IMG_8050.jpg

      The D-shaft in the middle is the thing the servo needs to move.

      IMG_8049.jpg

      So we need some way to connect the servo spline to the shaft. There are shaft couplers available for servos but they cost about three times as much as the servos! So I swiped an idea from the guys making sail winch servos. Bobbins!

      IMG_8054.jpg
      IMG_8056.jpg

      Needs a little persuasion.

      IMG_8057.jpg
      IMG_8058.jpg
      IMG_8060.jpg
      IMG_8061.jpg

      Cut the coupler with the little set screw from the little springrod.

      IMG_8062.jpg
      IMG_8064.jpg

      I was going to glue this together but I couldn't find any, so I soldered it. Don't know how well that is going to hold.

      IMG_8065.jpg

      I installed the coupler to the opposite side so that the servo won't interfere with the strings used to pull up the blinds. The D-shaft slides with little force.

      IMG_8067.jpg

      I adjusted the slats to where I think they are closed (slat outer edge down). Some people have different views about the matter but they're just wrong 🙂 I didn't attach the servo just yet.

      IMG_8074.jpg

      The servo lined up perfectly in the housing and with the D-shaft after I de-tabbed it.

      IMG_8069.jpg
      IMG_8070.jpg

      After this, I gently disconnected the wires from the servo extension cable connector so I could thread it back through the rod hole. (The string goes through the lower hole in a spring tunnel)

      IMG_8075.jpg
      IMG_8077.jpg
      IMG_8078.jpg

      I put the connector back on the other side.

      IMG_8087.jpg

      ELECTRICAL PART

      UPDATE The finished sensor

      I really wanted to have a physical button to adjust the blinds so I put one in this temporary box along with a 5v pro mini.

      IMG_8032.jpg
      IMG_8031.jpg
      IMG_8034.jpg

      I spliced in to another servo extension cable 5v from a phone charger. (Note to self: don't cut the wires so damn close to the connector!)

      IMG_8035.jpg

      This makes it easy to connect the button box with the servo cable and both are powered.

      IMG_8040.jpg

      The final version will have a DC socket at the junction so I can just run an easily disconnectable plug to every window. The holes are always on the hinge side so the window can be opened even without unplugging. I'll also wrap everything nicely in white heat shrink tubing and the box will be nicer, too.

      THE CODE PART

      This one was/is the most difficult for me because I had exactly zero experience with C++. Or any C. I've used a bit of python and some simple shell scripts but this was new. Anyways, I managed to write this:

      **UPDATE:**This is just test code for use without the Mysensors stuff. Scroll down for working code.

      link text

      Why this is bit complicated is because I wanted the button to do two things:

      • Press once; toggle open/close

      • Keep pressing the button; sweep back and forth until button is released and stop there.

      At the moment it does just that.

      I connected the servo to the shaft once I figured out with the button which way was closed and which way was open. 180 degrees was exactly the difference between open and closed.

      Now some of you may be thinking, "what the hell has this got to do with mysensors?" That's why the title is tagged [WIP]. I've been waiting for my NRF24L01+ -modules to arrive for a month and finally today they arrived.

      And they're not NRF24L01+ -modules.

      BUY YOUR RADIOS FROM THE MYSENSORS EBAY STORE LINK

      IMG_8093.jpg

      They were sold as NRF24L01+'s but they definitely are not. So now I have to wait again.

      Meanwhile, could someone tell me if they see something horribly wrong with this sketch I've been planning to use once I do get the radios? I can't really test it. (This works well now)

      UPDATE: Code is VERY much refactored and improved (works well)
      link text

      Oh yeah, some video:

      link text

      link text

      Sorry for the long post.

      posted in My Project
      slarti
      slarti
    • RE: [contest] Yet another servo blind control project

      After soldering three ratsnests like the one in the previous post, I decided there has to be a simpler way to do things. So after a day of watching eagle cad tutorials and messing about with the software I came up with a board of my own.

      top_osh.png
      bot_osh.png

      I didn't want to add any stuff I didn't need except for a pin header for raw input, A0-breakout and a choice of 5V/3.3V output for A0 and D4 with a jumper. I also don't want to solder every pin on the pro mini so I can use them possibly elsewhere.

      Am I shooting a fly with a cannon? Do I need something else on the board? DirtyPCB and other chinese manufacturers are closed at the moment but are there alternatives besides OSHPARK?

      BTW, three arduinos and servos seem to be the maximum simultaneous capacity for the little Nokia charger. They all work but get a bit flaky after a few tests. We'll see what happens when I add the fourth 😉

      posted in My Project
      slarti
      slarti

    Latest posts made by slarti

    • RE: [contest] Yet another servo blind control project

      My ethernet gateway died and I made another one on a Raspberry Pi so I updated all of my sensors from 1.4 libraries to 2.2. Here's the updated sketch for these servo blind control nodes:

      // A sketch to control a servo with a button and MySensors messages
      //#define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      #include <SPI.h>
      #include <MySensors.h>
      
      #include <Servo.h>
      #include <Button.h>        	//https://github.com/JChristensen/Button
      
      #define BUTTON_PIN 4       	//Connect a tactile button switch (or something similar)
                                  //from Arduino pin 4 to ground.
      #define PULLUP true        	//To keep things simple, we use the Arduino's internal pullup resistor.
      #define INVERT true        	//Since the pullup resistor will keep the pin high unless the
                                 	//switch is closed, this is negative logic, i.e. a high state
                                 	//means the button is NOT pressed. (Assuming a normally open switch.)
      #define DEBOUNCE_MS 20     	//A debounce time of 20 milliseconds usually works well for tactile button switches.
      #define LONG_PRESS_PERIOD 700   //How long to keep button pressed until sweeping starts
      
      #define MAX_DEGREES 180         //Servo limits. Whatever works for you.     
      #define MIN_DEGREES 0
      
      #define CHILD_ID 3
      
      Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS);    //Declare the button
      
      Servo myservo;
      enum {DECREASING, INCREASING};      //On a servo mounted on the left, with outer slat edge down as closed,
                                          // closing is going toward 180, opening toward 0 (on my fake futaba s3003's)
      
      boolean invertConversions = true;   // false if opening toward 180
      boolean servoDirection = INCREASING;     //A variable that keeps the current servo direction
      int servoPin = 3;                  
      int servoPosition;
      int servoSpeed = 1;                 // The bigger, the faster. 1=slow 5=fast
      
      
      MyMessage msg(CHILD_ID, V_PERCENTAGE);
      
      
      
      void setup(void)
      {
        
      }
      
      void presentation()  {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Servo", "1.3");
      
        // Register all sensors to gw (they will be created as child devices)
        present(CHILD_ID, S_COVER);
      }
      
      void loop(void)
      {
          myBtn.read();                    		//Read the button
      
          if (myBtn.wasReleased()){                   //If the button was pressed once sweep to end of current direction
              SweepToDirectionEnd();
              send(msg.set(ConvertDegToPercent(servoPosition)));
          }
          if (myBtn.pressedFor(LONG_PRESS_PERIOD)){   //If the button is held down the servo will start to sweep
              SweepUntilStop();
              send(msg.set(ConvertDegToPercent(servoPosition)));
          }
      }
      
      
      int ConvertPercentToDeg(int percent)
      {
          int degree;
          if (invertConversions)
              degree = map(percent, 0, 100, MAX_DEGREES, MIN_DEGREES);
          if (!invertConversions)
              degree = map(percent, 0, 100, MIN_DEGREES, MAX_DEGREES);
          return degree;
      }
      
      
      int ConvertDegToPercent(int degree)
      {
          int percent;
          if (invertConversions)
              percent = map(degree, MAX_DEGREES, MIN_DEGREES, 0, 100);
          if (!invertConversions)
              percent = map(degree, MIN_DEGREES, MAX_DEGREES, 0, 100);
          return percent;
      }
      
      void receive(const MyMessage &message) {
          myservo.attach(servoPin);
          if (message.type==V_PERCENTAGE) {
              int val = message.getInt();
              SweepToPosition(ConvertPercentToDeg(val)); //In this case the value has to be inverted because 0 = open
              send(msg.set(val));
          }
          else if (message.type==V_STATUS) {
              if (message.getInt() == 1){
              SweepToPosition(ConvertPercentToDeg(100));
              send(msg.set(100));
            }
              else if(message.getInt() == 0) {
              SweepToPosition(ConvertPercentToDeg(0));
              send(msg.set(0));
            }
          }
          else
              myservo.detach();
      }
      
      
      
      
      void ServoMoveUp()
      {
          if ((myservo.attached()) && servoPosition < MAX_DEGREES){
              servoDirection = INCREASING;
              servoPosition += servoSpeed;
              myservo.write(servoPosition);
              delay(10);
              Serial.print("Servo Position: ");
              Serial.println(servoPosition);
          }
          if (!myservo.attached()){      
              Serial.println("Servo stopped while moving toward MAX, direction unchanged");
              delay(100 * servoSpeed);
          }    
          if (servoPosition >= MAX_DEGREES){
              Serial.println("MAX reached, changing direction toward MIN");
              servoDirection = DECREASING;
              delay(100 * servoSpeed);			// Wait for the last movement to finish
          }
      }
      
      
      void ServoMoveDown()
      {
          if ((myservo.attached()) && servoPosition > MIN_DEGREES){
              servoDirection = DECREASING;
              servoPosition -= servoSpeed;
              delay(10);
              myservo.write(servoPosition);
              Serial.print("Servo Position: ");
              Serial.println(servoPosition);
          }
          if (!myservo.attached()){
              Serial.println("Servo stopped while moving toward MIN, direction unchanged");
              delay(100 * servoSpeed);
          }    
          if (servoPosition == MIN_DEGREES){
              Serial.println("MIN reached, changing direction toward MAX");
              servoDirection = INCREASING;
              delay(100 * servoSpeed);
          }
      }
      
      
      void SweepToDirectionEnd()
      {
          myservo.attach(servoPin);
          if (servoDirection == INCREASING){
              Serial.println("Going to MAX and stopping there");
              while (servoPosition < MAX_DEGREES){
                  ServoMoveUp();
              }
              delay(20 * servoSpeed);
              myservo.detach();
          }
          else if (servoDirection == DECREASING){
              Serial.println("Going to MIN and stopping there");
              while (servoPosition > MIN_DEGREES){
                  ServoMoveDown();
              }
              delay(20 * servoSpeed);
              myservo.detach();
          }
      }
      
      
      void SweepUntilStop()
      {
          myservo.attach(servoPin);
          while (myBtn.isPressed()){
              myBtn.read();
              if (myBtn.isReleased())
                  myservo.detach();
              if (servoDirection == INCREASING)
                  ServoMoveUp();
              if (servoDirection == DECREASING)
                  ServoMoveDown();
          }
      }
      
      
      void SweepToPosition(int destination)
      {
          if (abs(destination - servoPosition) >= servoSpeed)    //Don't move if destination is close to position
              myservo.attach(servoPin);
          if (destination > servoPosition && myservo.attached()){
              Serial.print("Going to ");
              Serial.print(destination);
              Serial.println(" and stopping there");
              while (servoPosition < destination){
                  ServoMoveUp();
              }
              delay(20 * servoSpeed);
              myservo.detach();
          }
          if (destination < servoPosition && myservo.attached()){
              Serial.print("Going to ");
              Serial.print(destination);
              Serial.println(" and stopping there");
              while (servoPosition > destination){
                  ServoMoveDown();
              }
              delay(20 * servoSpeed);
              myservo.detach();
          }
      }```
      posted in My Project
      slarti
      slarti
    • RE: [contest] Yet another servo blind control project

      @Nuubi Yes, I've been happy with them but MySensoring the rest of them is on hold. I've been extremely busy with a new job for a long time and I was supposed to do a few more improvements and tweaks before doing the rest of them. Also, my tinkering space (the kitchen table) is always under heavy pressure from other activities. Maybe I can get some time during the winter.

      TL;DR I've been lazy

      posted in My Project
      slarti
      slarti
    • RE: [contest] Yet another servo blind control project

      @Nuubi Can you show your connections?

      posted in My Project
      slarti
      slarti
    • RE: [contest] Yet another servo blind control project

      @exosteph I would think so since these are just MySensors actuator nodes.

      The sketches are made using MySensors 1.4 libraries so they might not work with 1.5. I've been really busy lately and haven't had any time for this stuff 😢

      I did make some helper boards earlier to make it easier to solder these sensors (nevermind the horrible soldering)

      IMG_20150314_195847.jpg
      IMG_20150319_173009.jpg IMG_20150319_172532.jpg IMG_20150319_173020.jpg

      posted in My Project
      slarti
      slarti
    • RE: Step-up / Boost regulator PCBs

      @bjornhallberg Good to know, thanks! Seems we had the same problems.

      posted in Hardware
      slarti
      slarti
    • RE: Step-up / Boost regulator PCBs

      Oh, yeah. Did you get a .gml file (milling)? If I included one of those every viewer went nuts and DirtyPCB wouldn't accept the file. When I left it out, everything was fine except for the problem described above.

      posted in Hardware
      slarti
      slarti
    • RE: Step-up / Boost regulator PCBs

      @bjornhallberg No, I only have the outline in the .gko file. It shows up fine in the picture generated by the panelizer but not in (almost) any viewer I've tried. Well, I sent the files in already so I guess we'll see what happens... 😉

      posted in Hardware
      slarti
      slarti
    • RE: Step-up / Boost regulator PCBs

      @bjornhallberg I'm trying to make some boards with the panelizer as well but I can't get the slots in the middle to show up in most gerber viewers. Did you have this problem? If so, how did you resolve it?

      Example:

      sfgfdsf.PNG

      The slots ARE in the .gko file but won't show up.

      posted in Hardware
      slarti
      slarti
    • RE: Windows GUI/Controller for MySensors

      Hi and thanks for a cool piece of software!

      I finally got around to soldering an ethernet gateway and decided to give this a spin. It worked like a charm for a while but now I get this error everytime any message goes through the gateway to Vera:

      myscontroller error.PNG

      OS is 32-bit Windows 7

      I can only get rid of this behaviour if I delete the configuration settings file and start over. It seems it only happens if I have logging enabled and exit the program and restart it.

      I'll have to start playing with the bootloader soon to get the OTA capabilities.

      posted in Controllers
      slarti
      slarti
    • RE: Servo issues - Weird things happening!!

      Sorry, no idea. I think your servo is faulty somehow.

      Here's my current sketch I use with my fake futaba 3003's which works fine with them. I got some TowerPro MG996R's but they don't move the whole 180 degrees for some reason. Went with the futabas and modified the TowerPros to continuous rotation.

      https://codebender.cc/sketch:79845

      posted in Troubleshooting
      slarti
      slarti