I’ve started designing my own, slightly different approach to the commercially available one, specifically having several satellite motors connected to one controller. As mentioned in previous posts I have 12 independent sections of blinds per door, and I will require about 50 motors all up.
![PXL_20230717_132433085](https://community-assets.home-assistant.io/original/4X/b/8/7/b8756bb3a70802bab014469bca2d22646aabee19.jpeg)
![PXL_20230717_111503175](https://community-assets.home-assistant.io/original/4X/4/0/8/4084cb92b36eba8770e9268292d2626e2db49658.jpeg)
This was the initial plan, just a small N20 gearmotor, a motor driver board, and a current sensor.
![PXL_20230717_120720975](https://community-assets.home-assistant.io/original/4X/6/e/e/6ee69140506b351c74268aa9cbfe80b0c6fc1900.jpeg)
I’ve also got a small solar panel, and LiPo charger with a small 1100mAh cell, might need to up the capacity but will see how it goes once I get things up and running and figure out sleeping and battery saving. I’ve also ordered a few 110mmx60mm panels with the aim of making a long thin panel thats less obtrusive in the window,
![PXL_20230717_120659112](https://community-assets.home-assistant.io/original/4X/b/3/9/b395013b8a0a4852d98ed716fbece5e7fb71f251.jpeg)
The N20 gearmotor I have mounted on a base plate, it clips in nicely and has a clamp to secure it properly. I also put in some cable clamps, although they are tiny… kind of lose track of how small things are when you can zoom in so much! The plan is to use one of those pull to release sticky things that come with wall hooks, and not need any modification or drilling of holes to the shutters.
![PXL_20230717_102856166](https://community-assets.home-assistant.io/original/4X/d/5/3/d531f202ae1755cd07f36918122e713deec1bad4.jpeg)
Here is the lever arm and the pin that clips onto the bar. I have designed a couple of different clips as I have a few different designs of bars that link the shutters around the house, all have needed a little tweak with a file to fit.
![PXL_20230717_103901198](https://community-assets.home-assistant.io/original/4X/e/a/1/ea1ed2e2c9e5bc026de82f0b73312adac71b463d.jpeg)
This design is easily back-driveable, however its right on the limit of the motors torque (298:1 ratio @ 5v) im going to order a 1000:1 ratio motor and see how it goes. The other issue is the length of the motor, I will need to grind about 4mm off the shaft so that it can be stuck on without hitting the inside frame.
There is still a load of changes needed to my design, this is just Rev 1. First thing will be to add a tiny bit more room at the back of the motor, currently the wires are pushing the lid back and its not aligning perfectly at the front… almost 0.75mm out! Also the cable clamp needs to be beefed up as its a bit thin around the screw holes. I’m also going to add a bit more room inside the cover, my plan is to use white cat5 cable and loop it through each motor so I just need to run one cable to each panel with 3 motors, you can see the breakout windows in the cover where the cable can come in and out… there just isn’t the room inside to actually do it.
I forgot to countersink the screw holes for the cable clamp, and i ran out of micro screws so ended up needing to use M2 pan heads with nuts, the nuts didnt fit under the cover so they stick out the bottom increasing the standoff by 1mm , this changes the length required in the slot (I did allow a bit for the foam double sided tape things). while it is nice to keep everything as compact as possible I think an extra bit of play may help and make alignment less critical.
Next version will also have some tactile switches in the mounting plate, ill figure out some sort of multiplexing with resistors and use an analog input to read end stops. adjustment will probably be with a little set screw in the lever arm.
I’m also designing a linear actuator version, this will allow me to change the orientation of the motor, and give me more flexibility with space. plan is to use a rack and pinion, and to have a ramp in the slot to assist with the extra torque required to start opening the blinds and to fully close them. this should also slow it down a bit and give better position control, with the current ratio motor and no feedback its +/- 10%
One other thing is 3d printing, and while I much prefer the detail and finish on resin prints they are not as durable as FDM prints. My old wooden Flashforge from 2011 may need to be dusted off again and put back to use! the cover and mounting bracket I think will be ok, its more the lever arm and pins that need the durability. already with just a few minutes testing its already wearing out the flat for the motor shaft.
Once I get to a stage where I’m happy with the design ill release the print files here, they are drawn on Onshape, its the first thing I have designed with them, its a big change from Sketchup which I have used for many years.
The code I’m using is pretty simple at the moment, just a current sensor, and a current based cover, and no endstops… just using the overcurrent to stop it with no rollback. It would be really nice to get some sort of soft start with the motor controller, but this would need to be accounted for in the way the time is taken into account for the shutter position. anyway, here is the code
i2c:
sda: D2
scl: D1
scan: true
id: bus_a
sensor:
- platform: ina219
address: 0x40
shunt_resistance: 0.1 ohm
current:
internal: true
id: current_sensor
max_voltage: 7.2V
max_current: 3.2A
update_interval: 0.1s
cover:
- platform: current_based
name: "Blinds Cover"
malfunction_detection: false
open_sensor: current_sensor
open_moving_current_threshold: 0.002
open_obstacle_current_threshold: 0.15
open_duration: 0.7s
open_action:
- lambda: |-
Wire.beginTransmission(0x30);
Wire.write(0x00 | (byte)0x10);
Wire.write(0x01);
uint16_t _pwm_val=uint16_t(10000);
if(_pwm_val>10000)
_pwm_val=10000;
Wire.write((byte)(_pwm_val >> 8));
Wire.write((byte)_pwm_val);
Wire.endTransmission();
close_sensor: current_sensor
close_moving_current_threshold: 0.002
close_obstacle_current_threshold: 0.15
close_duration: 0.7s
close_action:
- lambda: |-
Wire.beginTransmission(0x30);
Wire.write(0x00 | (byte)0x10);
Wire.write(0x02);
uint16_t _pwm_val=uint16_t(10000);
if(_pwm_val>10000)
_pwm_val=10000;
Wire.write((byte)(_pwm_val >> 8));
Wire.write((byte)_pwm_val);
Wire.endTransmission();
stop_action:
- lambda: |-
Wire.beginTransmission(0x30);
Wire.write(0x00 | (byte)0x10);
Wire.write(0x04);
uint16_t _pwm_val=uint16_t(10000);
if(_pwm_val>10000)
_pwm_val=10000;
Wire.write((byte)(_pwm_val >> 8));
Wire.write((byte)_pwm_val);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(0x30);
uint32_t freq= 10000;
Wire.write(((byte)(freq >> 16)) & (byte)0x0f);
Wire.write((byte)(freq >> 16));
Wire.write((byte)(freq >> 8));
Wire.write((byte)freq);
Wire.endTransmission(); // stop transmitting
delay(100);
obstacle_rollback: 0%
start_sensing_delay: 0.3s