Welcome to stockholmviews.com

My newest content fetched from Worpress posts!

March 20, 2020

A purpose-built camera support

This is my design for a  lightweight, portable, tripod substitute for use in wildlife blinds. It’s not an ordinary monopod, this one has to stand alone and support a fairly heavy 600/4 lens plus camera and tele-extender and whatever other accessories are needed.

Having struggled with arranging the legs of a tripod in the severely limited space of various small portable photo blinds, I finally figured out that a self-standing, fixed size monopod would give me a lot more room, be easier to setup and simple to make.

In this day of near-universal camera image-stabilizers, especially in the long focal-length lenses used for wildlife photography, it’s no longer absolutely necessary to have a rock-solid camera support all the time (nice to have, but not strictly necessary). A little motion is rather handily compensated for by the internal mechanics of the camera system. Note, however, that, if you need stability for longish exposures, this support may not be sufficient even with an image stabilized camera. I rarely use shutter speeds of longer than 1/125th and even that is very uncommon, birds simply don’t often stay still for that shutter speed to make sharp images no matter how stable the camera is.

Simple hardware-store variety supplies and only minimal mechanical skills are needed to get this item built: you’ll need measuring tools, a drill, a saw, and a couple of hand tools at most. You can get a lot of the material pre-cut by the supplier/store. The only moderately critical dimension is the length of the drain pipe to go with your blind(s), tripod head and camera/lens system. I just stood the pipe in the blind with me and marked the approximate length that would seat the lens just below the blind’s opening and made a 4 to 5″ (10 to 12cm) allowance for the height of the base and the feet, the caps, the head and the lens foot. You could do the same thing with a tape measure, a long rule, a stick or a piece of string. For me, accuracy to within an inch or two (2.5 to 5 cm) on the length was good enough. Be sure to use the seat you would ordinarily use in the blind for this estimation.

Materials:
  • 3″ diameter (~7-8 cm) plastic drain pipe (ABS or PVC or whatever is easily available and reasonably stiff) about 3′ (~0.9 m) long with matching flat end caps. I found ABS.
  • Baltic Birch plywood or anything similarly stiff of about 18″ (45 cm) square.
  • Assorted screws sized for the thickness of the base and the wall of the pipe.
Some construction notes:
  • The bottom cap needs extra screws to minimize flex. I initially used one 3/8″ (~10mm) machine screw and nut with a large washer in the middle of the bottom, but then added 3 self-tapping screws around the edge of the cap for attaching the bottom plywood. The large screw did not provide enough stiffness at first, so I added the 3 perimeter screws.

  • Attaching the column (drain pipe) to the bottom cap needed two sets of screws: I used 3 at the lower end of the cap and then added the 4 at the top end because I ran out of the larger screws. See the photo.
  • I intended to use the blinds on rough ground and figured that adjustable feets would be needed to stop it from rocking in any given situation, so I bought a set of 4 threaded 8mm rods with large plastic feet and matching threaded plastic knobs to go in the corners. Adjustment can be done by hand, no tools needed in the field. The threaded rods have hex nuts and washers below the plywood base to set adjustment height and the plastic knobs lock them. See detail photo.
  • The top flat end cap has only a clearance hole for a 3/8″ screw to mount the “tripod” head.

  • I used self-tapping sheet metal screws and pre-drilled clearance holes in the plywood base to allow the screws to tap into the bottom cap from below. Also, the sides of the lower end cap were clearance-drilled so they would tap themselves into the column.

I used Baltic Birch plywood, 3/4″ (10mm) thick because it’s stiff, flat and stable. The piece I used was left over from another project and was about the right length and width to stabilize the column, estimated by eye. It happened to be about 1/2 the length of the column, which seems right to me and, since it is on the floor of the blind, it’s out of the way of my feet so it doesn’t really matter in terms of the space it occupies. As long as it fits the blind and is big enough to keep the column upright with the camera system in use, it’s good enough. It will probably be close to or in contact with moist earth, so may warp; I don’t know how much of a problem that may be.

I ordered threaded adjustable feet which have wide round plastic pads on the ends for the corners. The column is 3″ (~7-8 cm) diameter ABS drain pipe with flat end-cap fittings. The caps have flat surfaces convenient for solid mounting, one to the plywood base and one for the head. The mount to the base is probably the most critical as it should be as stable as possible, so I use one 3/8″ (~10mm) through-bolt and nut in the center with a large washer inside the cap and 3 of the self-tapping screws around the periphery of the bottom threaded into the plastic. After that cap is attached, the main column drain pipe is tightly seated and then it is screwed to the cap with 7 screws directly into the plastic pipe (4 and 3, high and low on the cap). (I don’t have sizes, I just picked out some left over from other jobs that looked appropriate.)

I set the assembled column with the head in the blind to get the proper height to cut it for the opening and my sitting position.

The head is attached to the other end cap with a standard 3/8″ machine screw or exactly the right length and the cap is seated not-too-tightly, without fasteners or glue so it can be removed to change the head or for some other reason. It will take some hard blows on the cap to get it off, so keep that in mind, if you think you might have to remove it in the field.

A handle at the balance point or a mount for a shoulder strap would make it easier to carry.

If you have the skills and the means, to get more stiffness, you could also use even larger diameter drain pipe or steel or aluminum tube and plate. You could even work out a way to make the height adjustable with telescoping tube sizes and various clamping arrangements. For my case, the materials, sizes and weight seemed to be a reasonable combination of support, stiffness, leg-room, cost and my limited skills and tools.

Project By  Frank Kolwicz.  Thank you Frank!            

October 27, 2019

3D printable tonearm “NAIM ARO Inspired”

This project will run for a while and will be updated as frequently as i get time to produce new material.

The picture above shows the first print from the Fusion 360 cad file, the Uni-pivot cup is printed in one piece , so is the head shell. The aluminum tone arm tube in the picture are just a generic aluminum tube that I found in my metal surplus (a tent pole). For the next version I will use a aluminum bow arrow shaft just like the NAIM ARO.

One of the main goals with this project is to make it possible to complete with a minimum of tools and machines, that is also the reason for 3D printed as parts since almost everyone now someone that owns a 3D printer and if you don’t it is still possible to use an online service to get the parts printed :0)

Pivot cup Naim ARO style

Headshell 3D printed like moste parts

Bearing locator/guide

Arm base and counterweight

The arm rest 3D cad file contains printed parts for all plastic and version with plastic pillar + end cap for 3 mm steel/aluminum/titanium/carbon fiber etc 3 mm rod ;)

I will share all my work so that anyone can help out to improve the design.
Don’t forget to send me pics of your version of this tone arm, I would love to post them on my website ;)

Latest version the two files on top uploaded : 01NOV2019
22:30 Local time Stockholm.

1293 Downloads

387 Downloads

Arm rest (Alpha version) below.
342 Downloads

OLD files some dimensions not correct in files below!
328 Downloads

Note:
The file above does contain a file that will render ready to use parts however you may have to dowload new files and print new parts when updates arrive, but that’s part of being aDIY HiFi freek!

Some more work have now been done from top to bottom.
The main pivot cup housing, The cartridge head, a guide that press fit in to the housing to locate the pivot tip in to the cup and finally the counter weight also 3D printed and intended to be filled with a suitable amount of tungsten shots  (Tungsten beads or dust or beads to preferred for heavy cartridges) lead shots or other heavy stuff of your choice, maybe mixed with some silicon oil for dampening. The counterweight is a two part design that is suppose to be glued together, the hole in the circumference will take a 5 mm screw (when threaded) to seal it up. Please disregard scaling differences in the pictures above.

Base and bearing

Main bearing will for now make use of some common and easily obtainable parts, a ball pen cartridge and a M4 grub screw with cupped tip. This design is inverted compared to the NAIM ARO bearing design just because it was the easiest way to do it right now, however this is my choice for now and you and me might like a completely different bearing design in the future, tests will tell.
Main parts

Aftermath & Alternative design

  • The main goal with this project was to find out if it was possible to build a tonearm from mostly 3D printed parts, however it may be better and even easier to make some of the parts of cheep and easy obtainable off the shelf hardware like:
  • The counterweight could be realized by stacking large washers.
  • The pivot pillar base could be a simple wooden disk with a snug 5.8mm hole, or maybe a large washer with a M6 stand off .

No 3D printer?

I checked at a couple of online 3D print services for prices for you.
The example prices are based on a uploaded main part the Pivot Cup (The largest bit) in stl format.
craftcloud3d.com was like 25 Euros + shipping.
i.materialise.com Asked for 13 Euros for the same part.
There are lots of more services online and also some freelancers on 3D printing forums, however it’s more fun to print it on your own printer ;)

Further improvements.

The “all” 3D printed design with no hard to get or expensive parts was the primary reason for this project however the plan is to evolve the project to become a DIY tonearm with many different flavours when it comes to technical design and solutions. In short I will try to produce a smorgasbord of parts that you can chose from and produce with different kind of material, and why not build a 12″ version of this “Naim Aro clone”.
I’m sorry if this will make you create a pile of tonearms to find your preferred design :0)

Quick comments!

PETg CF filament and hardened steel nozzle ordered for my Ender 3 pro now its time to print in carbon fibre :D

Stay tuned for more updates / Stefan :D

This project are by no means completed yet :)

August 19, 2019

DIY LP Turntable tachometer

This Arduino based turntable tachometer is originally created at the DIY Audio forum my flavour is a OLED version of this simple but genius turntable tachometer.

How to build the tiny handy TT tacho

The easy part, put the hardware together the shopping list first, and because you love it you buy the parts by following my links ;)
And if you end up building this tachometer please send me a picture of your version of it and I will post it on my website.

I use a Arduino Nano V3.0 since it tiny and easy to use.

The OLED display in the top image is a 128×64 version.
My final version will be using the smaller 128×32 version as I find it sufficient and will make up a neat unit. Make sure to get an i2c SSD1306 unit that will support the Adafruit SSD1306 library in the code. You can use any Arduino compatible display but then you will need to tweak the code and change to a display library that will work with your chosen display.
The sensor can be chosen by taste I have tested 4 different reflex and fork style sensors and all works just fine. The one I use in the pics above is this one. You will also need a USB power supply and a USB mini cable + the usual stuff like soldering iron hook up wire and beer.

Now when the shopping is done we can start putting the bits together, this is best described with an image.

The diy turntable tachometer

Loading the Arduino Nano with software

The Arduino Nano will do nothing without some suitable instructions that will do the magic. If you not already have it is now time to download and install Arduino IDE it can be installed as a Windows 10 “App” but I suggest the stable installation version.

You will also need to get some additional libraries: Adafruit SD1306 V1.3.0 + Adafruit GFX Library V1.5.6 (Sketch/Include Library/Manage Library and then search and instal).

Set up the Arduino IDE by selecting the “Arduino Nano” (Tools/Board) and then select “ATmega328p Old bootloader” (Tools/Processor). now connect the Arduino Nano to your PC/MAC and hopefully you will find you Nano in (Tools/Port) if not search for drivers on the web and install as required.

Now load the sketch:

820 Downloads

Connected and ready to hit Upload (The arrow in the top left corner of Arduino IDE, when loaded you will see the display coming alive. Now its time to test the sensor and see if it works. By slowly moving a stip of black paper or similar across the sensor you should get some readings.

Short movie showing my Linn LP12 spinning a bit to fast! 

If the display does NOT come alive please download the i2c scanner here and upload it to your Arduino Nano, then while still connected with USB to you computer go to (In Arduino IDE) Tools/Serial monitor and look for address of i2c and change it in this section of the Tachometer sketch (row 37 in the IDE in my case) “if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {“
The 0x3C is the address of my display and are quite common.

The compact version of the Turntable tachometer with the IR sensor 3-pin mount installed with hot glue. this way it is easy to mod it for fixed installation.
The compact version of the Turntable tachometer, Wiring above. First image below shows the IR sensor that are removable and makes it possible for fixed installation of IR sensor with a 3 wire lead (I use a cutoff of an old USB cable). 2nd image below shows the start up splash screen, a bitmap of the iconic Naim ARO (Can be customized).
The IR sensor of the Turntable tachometerNaim ARO splash screen
//* Uses I2C OLED interface.  SDA and SCL left most pins on 18pin header next to AREF
//* Check I2C address using Scanner example file; address range 0x20-0x27 and 0x38-0x3f.
//* RPM is computed using COUNT developed in Timer2 interupt @ 32µSec rate.
//* Timer0 is disabled so delay(), millis() and micros() will no longer function (hangs the UNO).
//* RPM calculation is: CALIBRATE/COUNT.  CALIBRATE=freq at digital pin 2 (PB2) x 120
//* At timer2 = 32.000 µSec, PB2 should be 15,625 Hz and CALIBRATE should be 1,875,000.
//* If AVERAGE=true, display data will be averaged MAX_AVG times. Pratical MAX_AVG values: 2-8 
//* Set AVERAGE to false to disable averaging.
//* DO NOT average the data going to the PSU on serial port.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int TRIGGER=3;            //* input on PB3
const float CALIBRATE=1873440;  //*equals freq @ PB2 x 120
const byte MAX_AVG=8;           //* set # of averages
const boolean AVERAGE=true;     //* set to false to disable averaging
unsigned int COUNT, RPM_COUNT=0;
unsigned long MSEC=0, ACTIVITY=0;
byte MS_PRESCALE=0, AVG_IDX=0, AVG_COUNT=0;
float RPM, AVG[MAX_AVG], TOTAL; 
boolean UPDATE=false, DONE=true, STOPPED=true;

// the setup function runs once when you press reset or power the board
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);         
  pinMode(2,OUTPUT);                    //* Calibrate output
  pinMode(TRIGGER,INPUT_PULLUP);        //* PB3 trigger input  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();
  display.setTextColor(WHITE);  
  TCCR2A=0x02;    //* CTC mode
  TCCR2B=0x04;    //* ÷64 Prescalar
  TCNT2=0;
  OCR2A=7;        //* 32µSec rate
  TIMSK2=2;       //* enable OCR2A interrupts
  TIMSK0=0;       //* disable timer0 interrupts

  display.clearDisplay();
  display.setCursor(0,0);
  //display.print("Arduino Uno Tach");
  display.setTextSize(2);
  display.setCursor(0,5);
  display.print("RPM:--.---");
  display.display();
}
// the loop function runs over and over again forever
void loop() 
  { 
    if(UPDATE && DONE)
    { RPM=CALIBRATE/RPM_COUNT;      //* compute RPM
      if(RPM>28 && RPM<100)
      { Serial.print(RPM,3);        //* Dont average the serial data
        Serial.print('\n');
        Serial.print('\r');
        if(AVERAGE)                 //* check if we are averaging
        { AVG[AVG_IDX++]=RPM;       //* save current value in circular queue and move pointer
          if(AVG_IDX==MAX_AVG)      //* check for overflow
            AVG_IDX=0;              //* yes, reset pointer to beginning of queue
          if(AVG_COUNT==16)         //* Don't display average for at least 16 readings
          { TOTAL=0;                
            for(int x=0; x<MAX_AVG; x++)  //* Recompute RPM as average of last MAX_AVG readings
              TOTAL+=AVG[x];
            RPM=TOTAL/MAX_AVG;
            digitalWrite(LED_BUILTIN,HIGH);
          }
          else
            AVG_COUNT++;            //* leave RPM as is, increment count
        }
        display.clearDisplay();
        display.setTextSize(2);
        display.setCursor(0,5);
        display.print("RPM:");
        display.setCursor(47,5);
        display.print(RPM,3);
        display.display();        
      }
      DONE=false;                       //* reset trigger flag
      STOPPED=false;                    //* platter turning,reset flag
      ACTIVITY=MSEC;                    //* Start Activity timer
      display.setTextSize(1);
      display.setCursor(30,51);              //* display DISC Icon
      display.print(char(0));
      //display.display();
      mydelay(250);                     //* for at least 250mSec
    }
    if(!DONE)
      if(digitalRead(TRIGGER)==HIGH)    //* check for no trigger input
      { UPDATE=false;                   //*reset for interrupt routine
        DONE=true;
        display.setTextSize(2);
        display.setCursor(30,5);            //* turn off Icon
        display.write(byte(32));
        //display.display();
        mydelay(50);
      }
    if(!STOPPED)
      if(MSEC-ACTIVITY>2500)            //* check if platter stopped
      { STOPPED=true;
        display.clearDisplay();
        display.setTextSize(2);//* yes, flag it
        display.setCursor(0,5);             //* blank reading
        display.print("RPM:--.---");
        display.display();            
        AVG_COUNT=0;                    //* reset average count
        digitalWrite(LED_BUILTIN,LOW);       
      }
  }
void mydelay(int TIME)    //* range 1mSec to 65.535 Sec.
{ 
  for(int x=0; x<TIME; x++)
    delayMicroseconds(300);
}
//display
ISR(TIMER2_COMPA_vect)  //* timer 2 interrupt: 32µS rate 8 bit auto reload
{ COUNT++;  
  digitalWrite(2,!digitalRead(2));    //* Toggle TP PB2
  if(digitalRead(TRIGGER)==LOW && !UPDATE)
  { RPM_COUNT=COUNT;                  //* capture value
    COUNT=0;                          //* reset counter
    UPDATE=true;                      //* flag for main routine
  }

  if(++MS_PRESCALE==31)               //* check for msec update
  { MS_PRESCALE=0;                    //* reset counter
    MSEC++;                           //* increment msec count
  }
}

There might be more soon…

I’m planning to make a wifi enabled version that can log the long term speed deviation to a web server running Grafana
Why you may ask?
For fun I will answer ;0)

A few quick reference tests shows?

The Arduino DIY above (Set to 8x average by reading to minimize erratic readings due to wow&flutter) it shows 33.333 / 33.334 constantly during the run of the below compared test methods a fairly steady result.

Using 50Hz led strobe android app and a printed PDF test strobe disk looks great speed-vice but not rock steady.

Laser RPM meter shows 33.3 (Only one decimal on my device “6234P+ Digital tachometer)

Android RPM Speed & Wow app shows 33.52
A bit of at least with my Sony XZ1 Compact, this app would be perfect if it supported hall sensor. (https://play.google.com/store/apps/details?id=com.AM.AM.RPMSpeed)

Android Magnetic Counter – RPM Meter = 33.2/33.4
This app was very good and feels like the “Real McCoy” due to use of a phone built in hall sensor, you only need a tiny magnet on the platter to get it working. However it could be improved with a few decimals to become a great turntable tuning tool. https://play.google.com/store/apps/details?id=lt.magneticcounter)

Android PlatterSpeed Dr Feickert, Mean frequency (30sec) 3152.6hz = 33,360 (MAX -0,30% – +0.33% wow and flutter) (Test record with a 3150hz tone required https://apkpure.com/platterspeed-vinyl-tool/ch.progtec.PlatterSpeed) This is the benchmark tool for many HiFi nerds ;) My advice: This app works even better if you make a direct connection with a 3.5 mm microphone cable between the phone and your phono amp (It also more neighbor friendly). In my case I had to put a 1k resistor between microphone + and ground to get it to work. gnd/mic rings may be different for other phones.

Platter speed direct conection for Android.

The 0.6k resistors will substitute headphones and the 1.0k resistor was what was needed to get the output from my phono amp to be read by my Android phone. No luck for IOS friends since Apple have rules that makes it just noth worth the hassle to Dr Feickert

IOS Turtabulator = 33.38 Works with IOS about the same as the once for Android but are not free and have less features.

Phones used iPhone 5c / Sony XZ1 Compact both resting on a sponge ballanced in the center of TT platter.

The left display are hooked up to a Arduino Nano V3 and the one to the right is connected to a Arduino UNO

The above left display are hooked up to a Arduino Nano V3 and the one to the right is connected to a Arduino UNO both cards are feed from a digital waveform generator with a 0.556hz square wave. Both cards shows a steady (steady like frozen!) 33.329 vs 33.339 when the frequency changes they follow each other (variation is negligible, +- .001 in variation at room temperature). Maybe I will look in to coding a calibration funktion ;0)

3D Printed cover.

The cover is now designed to house the OLED display, Arduino Nano and the IR reflex interrupt sensor (Small blue things near the pointy part of the enclosure). The design has a radius side with the sensor that follows the radius of my Linn LP12 platter. I’m a rookie on 3D printing and CAD so bear with me if the quality of the enclosure in the picture isn’t perfect, the logo in particular is hard to get nicely printed. This project is open source so I will publish my print files for anyone to tweak.
Download STL:

325 Downloads

Download F360:
658 Downloads

Download G-code:
286 Downloads


Turntable tachometer enclosure
Further enclosure Ideas includes.
1. Simple display bezel for the display for if you like to build a turntable integrated version.
2. A version with built in small rechargeable battery for about 30-60min operational time to get rid of the bulky mini USB.
3. A version with a fixed “super slim” USB cable that can be hidden in the narrow space between TT top plate and platter.
4. Looking forward to your thoughts ;)

Some more pics below.

Boot up splash screen.
If you want this splash screen then you need to modify the splash.h file in the Adafruit_SSD1306 library (Click to download link to the NAIM ARO arm splash.h file).

Arduino nano inside the 3D printed box.
The board need to be trimmed a bit in the corner
facing the curved part of the box be careful to avoid
damaging the pcb.

Display show no rotation sensed or speed out of range.



Temporary installed.
A thin 2 wire usb power only cable can be wired directly to the Arduino Nano board and the be routed under the platter to be hidden, that will also allow us to close the lid with the tachometer in place :D

Bom:

Arduino nano
OLED Display 0.92 inch 32x124px
IR interrupt sensor
USB charger and USB mini cable of your taste.
Other display/sensor may work but those are the one I used.
3D Printer: I went for the Creality Ender 3 Pro, this is the first one I used and for the priced asked the quality is fantastic!

Notes&advices

  1. Use a flat black strip on the edge of your TT platter (Works on my linn LP12 standard flat silvery platter) try a reflex strip if your platter is black and report back to me so I can spread the word.
  2. Try different width of the strip and distance between the sensor and platter for best performance/reliability.

Next:

Data output for the upcoming motor controller is definitely in the pipeline!

Maybee also make it WIFI an/or data logging capable if that would be something asked for ;)

This might be multi version project!
1.Portable version with rechargeable battery.
2. Portable version powered by USB power supply.
3. Installation version, fixed sensor wired stand alone meter.
4. Installation version, fixed sensor unit to build in to TT.
5. As 3&4 + signal output for upcoming TT motor controller.
6.?

Just ask :D

April 4, 2019

Stealth home cinema screen

This project have been running for quite a long time about are now starting to get close to a closure. Letts start with some background info. (Last edit 6th of April 2019 and still writing pls be patient :0)

Prototype pcb for film screen linear actuator that will pull screen in or out of the top of a book shelf or wall cavity.

Controller.

Beta version of the film screen folding actuator and remote control electronics mounted on a Veroboard.
The Alpha version was a much bigger mess than this version.

This project started as what I though a simple project but ended up to become a bit mor than that as idéas kept popping up in my head.
First problem came up when we found out that the seating position would end up at a place where the screen must be positioned at a right hand offset in relation to the bookshelf. the picture above might give a hint about what i’m talking about.

Problem #2. I was a bit optimistic when I built the bookshelf and underestimated the space needed for the screen + links and actuators.

How my requirements specifications ended up in list form below

  • I wanted the screen to rest on top of the bookshelf with a front face that blends with the rest of the book shelf (teak wood).
  • The screen must move out from the book shelf top and then slide to the viewers right side to get in the right place for the cinema seats.
  • Must be motorised (screen already was) due to screen at a height I can’t reach without steps.
  • In the wish not must list was also total automatisation (screen out -screen down – projector on etc.)

The movie screen swing mechanism

Linear actuator with limit and position switches
The hidden or stealth home cinema screen fold out/in actuator in action

The Linear actuator of my choice came from Amazon (this one) in 300mm 12″ stroke length. For my set-up I also used a cheap ball rail for drawers, 4 micro switches and an old aluminum curtain rail that I had on hand to mount the micro switches on to make them position adjustable.

Film screen swing hinge 400mm long moves the movie screen about 50cm sideways

Above: the extended double hinge that carries the movie screen cassette. I have used some 4x ball bearing hinges to carry the weight of the 125″ screen. Midways of the sheet metal arm there is a PTFE glide shoe that are carrying some of the load as it rests on the top of the shelf. I might put a .5mm sheet of stainless steel on top of the shelf in the final build to avoid wear. Living in a 1938 building forced me to adjust the angles with some shim washers. The tre + screws in the “middle” holds an L-profile to attach the flat-bar pushrod to. (more about the linkage and why further down the page).

Up signal switch for movie screen

Up-switch

The screen up switch are activated as the screen lower weight bar (lower image) hits the microswitch and sends a OK to fold in signal to the Arduino Nano.

Video that shows the screen movement.

Above: Screen moves out from the top of the bookshelf and then starts to roll down. Screen can be commanded to position 1 and stay at most left position or commanded to position 2 far right in both cases the roll down starts as soon as the screen run free from the shelf . When the screen then is folding back on top of the shelf it stops and takes a pause until the screen is fully rolled up then fully folds on top of the shelf.

Linkage example for hidden cinema screen

Abov a animation showing how the swinout/in linkage can be configured.
This is not even close to the measurements that I use or the ones that will suite your build, it just a “how it works” sketch. Linkage and or the way the screen moves may need to be customized for your need but that is not really a problem, it’s more like a challenge. The ladder code might also need to be altered depending on your config.

The schematics

Schematics for the Movie screen controller and remote control circuit.
stockholmviews.com
Schematics for the Movie screen controller and remote control circuit.

The schematics for the Arduino+ESP8266 combination PCB layout will be published when completed.

The actuator and movie screen position switch schematics

The simple hook-up schematics for the Linear actuator micro switches.

The relay board 5 relays are needed in my version, you may chose a 8 relay board or a 4 relay board together with a single relay module.

The relay schematics if you prefers to build it by yourself , I use regular the
relay boards of the kind that can be bought at Amazon or the bay.

Images Below show the hardware needed for this project with links to all the gear.

SoapBox Snap Ladder logic's for my cinema screen automation.
SoapBox Snap Ladder logic’s for my cinema screen automation.

Above: SoapBox snap a fun and functional PLC style ladder logic graphic interface for Arduino Uno, Nano, Mega (officially ) I have also tested it with Arduino Mini pro and that worked to ;0) Ladder above are for the Arduino Nano in this project.

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h> SimpleTimer timer; char auth[] = "ad8fe2aafd7245f0b76291a1546949d3"; int value; //int relaypin1 = D5; // example digital pin for relay 1 void setup() { Serial.begin(9600); Blynk.begin(auth, "Timber", "greggan12", "192.168.1.40", 8080); pinMode (D8, OUTPUT); pinMode (D7, OUTPUT); pinMode (D6, OUTPUT); pinMode (D5, OUTPUT); pinMode (D2, OUTPUT); } BLYNK_WRITE(V1) { if (param.asInt() == 1) { // "SCREEN POS 1" act only on the HIGH and not the LOW of the momentary digitalWrite(D8, !digitalRead(D8)); // invert pin state just once timer.setTimeout(500L, []() { digitalWrite(D8, !digitalRead(D8)); // then invert it back after 100ms Blynk.virtualWrite(V1, LOW); // }); }); } } BLYNK_WRITE(V2) { if (param.asInt() == 1) { // "SCREEN POS 2" act only on the HIGH and not the LOW of the momentary digitalWrite(D7, !digitalRead(D7)); // invert pin state just once timer.setTimeout(500L, []() { digitalWrite(D7, !digitalRead(D7)); // then invert it back after 100ms Blynk.virtualWrite(V2, LOW); // }); }); } } BLYNK_WRITE(V3) { if (param.asInt() == 1) { // "SCREEN ROLL UP AND FOLD" act only on the HIGH and not the LOW of the momentary digitalWrite(D6, !digitalRead(D6)); // invert pin state just once timer.setTimeout(500L, []() { digitalWrite(D6, !digitalRead(D6)); // then invert it back after 100ms Blynk.virtualWrite(V3, LOW); // }); }); } } BLYNK_WRITE(V4) { // SCREEN EMERGENCY STOP Set to your Buttons vPin digitalWrite(D5, !digitalRead(D5)); // Panic STOP on/off // }); } BLYNK_WRITE(V5) { if (param.asInt() == 1) { // FUTURE FUNCTION act only on the HIGH and not the LOW of the momentary digitalWrite(D2, !digitalRead(D2)); // invert pin state just once timer.setTimeout(500L, []() { digitalWrite(D2, !digitalRead(D2)); // then invert it back after 100ms Blynk.virtualWrite(V5, LOW); // }); }); } } void loop() { Blynk.run(); timer.run(); }

Code above belongs to the WeMos D1 mini Pro and the Blynk app and can be copied to Arduino IDE for upload to the WeMos ESP8266 board.

Download ZIP file with codes for Arduino IDE and SoapBox Snap here!

Blynk app for stealth movie screen system

Image above: The Blynk app that is running in this case on my Android Nexus 7 tablet and is very basic. (Sorry for the Swedish labels. Läge V = Left position, Läge H = Right position, Nattinatti = God night = Roll-up and fold in, The red button is panic stop if anything goes bananas). In Blynk the buttons are configured as follows.
Läge V: V1 “Virtual 1” 0-1 Switch
Controls Arduino via ESP8266 .
Läge H: V2 0-1 Switch
Controls Arduino via ESP8266.
Nattinatti: V3 0-1 Switch
Controls Arduino via ESP8266.
Nödstopp: V4 0-1 Switch. Controls ESP8266 direct

March 27, 2019

Weight based coffee grinder with Blynk app

I have finally starting to reach my goal to modify a Rancilio Rocky coffee grinder to become a smart grinder .

WIFI enabled coffee grinder

This is the way the grinder hopefully will look. I will remove the portafilter holder. I rather use a long-drink glas to catch the ground beans the poured in to the portafilter or french press (less messy since I can transfer the ground coffee to the brewer/portafilter above the kitchen sink. ;0)

The glas will rest on the scale and scale tare’d before each grinding session .

Description of my grinder mod.

My grinder will have the following features when completely modified.

  • A smart scale that grind and then turns off the grinder at a preset weight.
  • A app to turn the coffee grinder on and off and that allow me to step-less adjustments of the preset for the final weight of grinding session.
  • Wifi interface.
  • A way to step-less adjustments of coffee grain size from the app and maybe also some presets (adjustable) like Espresso, French-press, Drip etc.
  • Future ideas to come.
  • the first ones above are already implemented, the italics are not!

For coding the ESP8266 (I mostly use dev units like WeMos D1 Mini) i have chosen Arduino IDE that are popular and quite easy to get started with. I will not publish any Arduino, Blynk or ESP8266 tutorials here, you can easily find hundres of them by searching the www.

The hardware for the smart grinder

Hardware used in this project (All product links below goes to AMAZON and will help me to run this website).

The code and the circuit

The code and circuit as it stands right now: 27 Mar 2019(Will be updated many times for sure so keep visiting this space).

Arduino Libraries used in this project

HX711_Arduino_Library at version 0.7.2
ESP8266WiFi at version 1.0
Blynk at version 0.6.1


Download Arduino sketch
//#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "HX711.h"
BlynkTimer timer;
int relayPin = D5;  // Change to suit your board.

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = D2; // Change to suit your board.
const int LOADCELL_SCK_PIN = D1; // Change to suit your board.

HX711 scale;
//Blynk project auth.
char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "YOUR-SSID";
char pass[] = "YOURPASS";

BLYNK_WRITE(V0) { scale.tare(); // Strain sensor tare
}
BLYNK_WRITE(V2){
  if (param.asInt()) {
    digitalWrite(relayPin, HIGH);  // Relay ON.
  } else {
    digitalWrite(relayPin, LOW);   // Relay OFF.
  }
}
BLYNK_WRITE(V3) {
  Blynk.virtualWrite(V2, 0);
  digitalWrite (relayPin, LOW);   // Grinder interupt (Emergecy stop), Relay OFF.
}
int slider;
BLYNK_WRITE(V11)
{
slider = param.asInt(); // Assigning incoming value from pin V11 (Slider value) to a global variable.
}

void setup() {

  Serial.begin(57600);
  Blynk.begin(auth, ssid, pass, "192.168.254.110", 8080);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale(1040.f);
  timer.setInterval(500L, HX711data);  // .5 sek delay to unstress the server and stabalize readout on numeric widget @ V1.
  timer.setInterval(60L, HX711relay);  // 60ms delay ono to keep fast stop grinder response and not overshoot grinding to much.
  digitalWrite(relayPin, LOW); // To make sure grinder doesn't start running during boot.
  pinMode(relayPin, OUTPUT);
  BLYNK_CONNECTED();
  Blynk.syncAll();
}
void HX711data()
{
  Blynk.virtualWrite(V1, scale.get_units(20));  // sending calibrated strain sensor value to Blynk value widget.
}
void HX711relay()
{
  if (scale.get_units(20) >= (slider-0)) {
  Blynk.virtualWrite(V2, 0);
  digitalWrite(relayPin, LOW); //Relay OFF change the (slider-0.0) number in seconds with one decimal to compensate if grinder overshoot "Grinder calibration".
}
}
void loop()
{
  Blynk.run();
  timer.run(); 
}
ESP8266 WeMos + Relay + HX711 = Coffee at the tenth of a gram
The hook-up
The ESP8266, HX711 a cheap kitchen scale and a relay become a D.I.Y wifi smart coffee grinder with Android and IOS App from Blynk.
My prototype setup of the weight based coffee grinder power on/off controller that actually works nearly perfect.
WiFi enabled coffee grinder
The project up and running still not fine tuned but works great with sufficient accuracy for Frenchpress brewing. Meny off app now with Swedish text and four different quick preset selection buttons

Above my wire nest test setup, the wires running from the 500g digial scale are soldered to the internal circuit board (The scale still operating normally in parallel no batteries needed and display works to !)

The Blynk Android interface for my prototype I will list the elements an their settings and functions below. V1 etc stand for virtual pins, se Arduino sketch above and read the Blynk manual for further info.

  1. The “Level V” widget will fill up with color as we grind. (V1 0-100 corresponds to grams in my version).
  2. The “Labled value” Widget here it shows the preset from the slider 3. (V11 0-80 ‘or your choice’, Push).
  3. The “Slider” Widget to adjust your desired amount of ground coffee (V11 7-80 ‘or your choice’ , send on release OFF, Show value OFF, #,# for one decimal adjustments).
  4. “Styled Button” Grind (V2 0-1 Switch button) I labeled my button Grind when off and Grinding on orange background when the grinder are running.
  5. “Styled Button” Stop (V3 0-1 Push button) can also be stoped by pushing “Grind/Grinding” button when it shows “Grinding”.
  6. “Styled Button” Tare (V0 0-1 Push button) to zero scale with empty canister resting on the scale surface do this before each grinding.
  7. Extra function Preset buttons that are not shown above can be added. Just use a “Styled button” in switch mode and put the preset gram numbers in the ON position and you have a quick select for different shots or French Press brewer sizes!

This project will be updated as it progress stay tuned and keep visit :0)

The grinder in action still some tuning to be done thought!

Update:2020-03-23
This is my Node-red dashboard control script and gui for the coffee grinder controller

Excuse me for the Swedish language dashboard but that will be easy enough for you to change as required. All about Node-Red (very useful together with Blynk, HAS, OpenHab) and how to install here:nodered.org

Node-red dashboard for coffee grinder

Below the node-Red flow that creates the dashboard above.

0 Downloads

Blynk nodes used in this project.
node-red-contrib-blynk-api
node-red-contrib-blynk-ws
node-red-contrib-ui-level
node-red-node-ui-lineargauge
node-red-dashboard

[
{
"id": "b5b3c1ca.3917b",
"type": "blynk-api-out-write",
"z": "c6996a65.051b98",
"name": "Tara",
"type_connect": "api",
"pin_type": "V",
"pin": 0,
"client": "36dc8ce1.15a254",
"x": 250,
"y": 20,
"wires": []
},
{
"id": "de46ba7c.a5ad38",
"type": "ui_template",
"z": "c6996a65.051b98",
"group": "8063faae.969a88",
"name": "Tara",
"order": 1,
"width": "2",
"height": "1",
"format": "<style>\n.nr-dashboard-template {\n padding: 0px;\n}\n</style>\n<div class=\"momentary\">\n <md-button style=\"width:100%; height:48px; margin: 0px; background-color: #5F9EA0\"><i class=\"fa fa-balance-scale fa-2x\"></i> Tara </md-button>\n</div>\n\n<script>\n\n(function($scope) {\n \n$('.momentary').on('touchstart mousedown', function(e) {\n e.preventDefault(); //prevent default behavior\n $scope.send({\"payload\": 1});\n});\n\n$('.momentary').on('touchend mouseup', function(e) {\n e.preventDefault(); //prevent default behavior\n $scope.send({\"payload\": 0});\n});\n \n})(scope);\n</script>",
"storeOutMessages": true,
"fwdInMessages": false,
"templateScope": "local",
"x": 110,
"y": 20,
"wires": [
[
"b5b3c1ca.3917b"
]
],
"icon": "font-awesome/fa-refresh"
},
{
"id": "dae6db62.4c4358",
"type": "blynk-api-out-write",
"z": "c6996a65.051b98",
"name": "kvarnen",
"type_connect": "api",
"pin_type": "V",
"pin": "2",
"client": "36dc8ce1.15a254",
"x": 300,
"y": 160,
"wires": []
},
{
"id": "510988f2.6b9fc8",
"type": "ui_button",
"z": "c6996a65.051b98",
"name": "",
"group": "8063faae.969a88",
"order": 2,
"width": "4",
"height": "1",
"passthru": false,
"label": "Starta kvarnen",
"tooltip": "",
"color": "",
"bgcolor": "",
"icon": "fa-play fa-2x",
"payload": "1",
"payloadType": "num",
"topic": "",
"x": 140,
"y": 120,
"wires": [
[
"dae6db62.4c4358"
]
]
},
{
"id": "11fb1765.031bc9",
"type": "ui_button",
"z": "c6996a65.051b98",
"name": "",
"group": "8063faae.969a88",
"order": 6,
"width": 0,
"height": 0,
"passthru": false,
"label": "Stopp",
"tooltip": "",
"color": "",
"bgcolor": "RED",
"icon": "fa-stop fa-2x",
"payload": "0",
"payloadType": "num",
"topic": "",
"x": 110,
"y": 160,
"wires": [
[
"dae6db62.4c4358"
]
]
},
{
"id": "3c2af8fa.746328",
"type": "blynk-api-out-write",
"z": "c6996a65.051b98",
"name": "",
"type_connect": "api",
"pin_type": "V",
"pin": "11",
"client": "36dc8ce1.15a254",
"x": 610,
"y": 220,
"wires": []
},
{
"id": "673ab496.6f611c",
"type": "blynk-api-in-write",
"z": "c6996a65.051b98",
"name": "",
"pin": "11",
"pin_type": "V",
"pin_all": 0,
"client": "36dc8ce1.15a254",
"x": 120,
"y": 260,
"wires": [
[
"e3030e5.07003f"
]
]
},
{
"id": "20d742f8.6d6ece",
"type": "blynk-api-out-read",
"z": "c6996a65.051b98",
"name": "",
"type_connect": "api",
"pin_type": "V",
"pin": "1",
"client": "36dc8ce1.15a254",
"x": 320,
"y": 80,
"wires": [
[
"559ec9.cb5ec138"
]
]
},
{
"id": "44e73406.d0dbfc",
"type": "ui_button",
"z": "c6996a65.051b98",
"name": "48g",
"group": "8063faae.969a88",
"order": 4,
"width": 0,
"height": 0,
"passthru": false,
"label": "Snabbval pressokanna 48g",
"tooltip": "",
"color": "",
"bgcolor": "GRAY",
"icon": "fa-coffee fa-2x",
"payload": "48",
"payloadType": "num",
"topic": "",
"x": 290,
"y": 220,
"wires": [
[
"3c2af8fa.746328"
]
]
},
{
"id": "559ec9.cb5ec138",
"type": "ui_gauge",
"z": "c6996a65.051b98",
"name": "",
"group": "8063faae.969a88",
"order": 5,
"width": 0,
"height": 0,
"gtype": "wave",
"title": "Mald mängd kaffe",
"label": " gr",
"format": "{{value | number:3}}gr",
"min": 0,
"max": "100",
"colors": [
"#00b500",
"#e6e600",
"#ca3838"
],
"seg1": "",
"seg2": "",
"x": 530,
"y": 80,
"wires": []
},
{
"id": "c77e2507.d1dcf8",
"type": "inject",
"z": "c6996a65.051b98",
"name": "",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "1",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 150,
"y": 80,
"wires": [
[
"20d742f8.6d6ece"
]
]
},
{
"id": "e3030e5.07003f",
"type": "ui_numeric",
"z": "c6996a65.051b98",
"name": "",
"label": "Önskad mängd kaffe i gram",
"tooltip": "",
"group": "8063faae.969a88",
"order": 3,
"width": 0,
"height": 0,
"wrap": false,
"passthru": true,
"topic": "",
"format": "",
"min": 0,
"max": "100",
"step": 1,
"x": 360,
"y": 260,
"wires": [
[
"3c2af8fa.746328"
]
]
},
{
"id": "36dc8ce1.15a254",
"type": "blynk-api-client",
"z": "",
"name": "KAFFE",
"api": "http://192.168.1.40:8080/",
"path": "ws://192.168.1.40:8080/websockets",
"key": "48066fc6d08742709d783cd691cad278"
},
{
"id": "8063faae.969a88",
"type": "ui_group",
"z": "",
"name": "KAFFE",
"tab": "61173baf.ef1624",
"disp": true,
"width": "6",
"collapse": false
},
{
"id": "61173baf.ef1624",
"type": "ui_tab",
"z": "",
"name": "KAFFE",
"icon": "dashboard",
"order": 1,
"disabled": false,
"hidden": false
}
]

Worpress posts ends here!


How to include Wordpress posts in a static HTML page
(Or how I did at least!)

This is the how to.

1.

I created a php file that i call ok.php (You can name it whatever)
This php file now rests in the same directory as my .html file and
contains this code:

***************************************************

<?php
$args = array( 'numberposts' => 6,

'post_status'=>"publish",'post_type'=>"post",'orderby'=>"post_date");
$postslist = get_posts( $args );
foreach ($postslist as $post) : setup_postdata($post); ?>
<div class="events">
<p><strong><?php the_date(); ?></strong></p>
<p><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?

><?php the_content(); ?></a></p>
</div>
<?php endforeach; ?>
*******************************************************
[GET THE CODE HERE opens in new window as pure text]

 

2.
In the html code between body tags i put this where I want the posts to show.

******************************************
<!--#include virtual="ok.php" -->
******************************************
[GET THE CODE HERE opens in new window as pure text]

That was the way I did it and the result can be found on
the top of this page HERE!

OK
OK2

Free hosting & domain name. 1000MB and .com or .co.uk domain free for 1 year.
Limited time only. Check www.one.com for more details

  
Google

 

Gallery | D.I.Y | Reviews | Shop | Blog | Contact